From a125e69c8ce0a2764b1e50b2dad0a4fa9d141ef4 Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Tue, 6 Sep 2022 18:00:40 +0200 Subject: Symcoord version of nissy. Interesting idea, but performance are actually slower. AT THIS STAGE NISSY IS NOT USABLE. --- src/steps.h | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 268 insertions(+), 8 deletions(-) (limited to 'src/steps.h') diff --git a/src/steps.h b/src/steps.h index da5c041..341be98 100644 --- a/src/steps.h +++ b/src/steps.h @@ -3,15 +3,275 @@ #include "pruning.h" -extern Step * steps[]; +bool check_centers(Cube *cube); +bool check_coud_HTM(Cube *cube); +bool check_coud_URF(Cube *cube); +bool check_cp_HTM(Cube *cube); +bool check_corners_HTM(Cube *cube); +bool check_corners_URF(Cube *cube); +bool check_cornershtr(Cube *cube); +bool check_eofb(Cube *cube); +bool check_drud(Cube *cube); +bool check_htr(Cube *cube); +void compute_ind(StepAlt *a, Cube *cube, Movable *ind); +int estimate_stepalt(StepAlt *a, Movable *ind, int goal); +void prepare_step(Step *step, SolveOptions *opts); +bool always_valid(Alg *alg); +bool validate_singlecw_ending(Alg *alg); -/* Two steps used directly by two-phase solver */ -extern Step drany_HTM; -extern Step dranyfin_DR; +#ifndef STEPS_C -void copy_estimatedata(EstimateData *s, EstimateData *d); -void invert_estimatedata(EstimateData *ed); -void reset_estimatedata(EstimateData *ed); -void prepare_step(Step *step, SolveOptions *opts); +extern char check_centers_msg[100]; +extern char check_eo_msg[100]; +extern char check_dr_msg[100]; +extern char check_htr_msg[100]; +extern char check_drany_msg[100]; + +extern StepAlt sa_nxopt31_HTM; +extern StepAlt sa_eofb_HTM; +extern StepAlt sa_drud_HTM; +extern StepAlt sa_drfin_drud; + +extern Step optimal_HTM; +extern Step eoany_HTM; +extern Step eofb_HTM; +extern Step eorl_HTM; +extern Step eoud_HTM; +extern Step drany_HTM; +extern Step drud_HTM; +extern Step drrl_HTM; +extern Step drfb_HTM; +extern Step dranyfin_DR; +extern Step drudfin_drud; +extern Step drrlfin_drrl; +extern Step drfbfin_drfb; + +extern Step *steps[]; + +#else + +char check_centers_msg[100] = "cube must be oriented (centers solved)"; +char check_eo_msg[100] = "EO must be solved on given axis"; +char check_dr_msg[100] = "DR must be solved on given axis"; +char check_htr_msg[100] = "HTR must be solved"; +char check_drany_msg[100] = "DR must be solved on at least one axis"; + +/* Optimal solvers *******************/ +/* TODO: build options for smaller optimal solvers */ + +StepAlt +sa_nxopt31_HTM = { + .ready = check_centers, + .final = true, + .moveset = &moveset_HTM, + .n_coord = 6, + .coord = {&coord_nxopt31, &coord_nxopt31, &coord_nxopt31, + &coord_eposepe, &coord_eposepe, &coord_eposepe}, + /* TODO: use khuge as fallback? */ + .coord_trans = {uf, rd, bl, uf, rd, bl}, + .compact_pd = {true, true, true, false, false, false}, + .fallback_coord = {&coord_drud_sym16, &coord_drud_sym16, + &coord_drud_sym16}, + .fbmod = {BINOM8ON4, BINOM8ON4, BINOM8ON4}, + .n_dbtrick = 1, /* TODO: change to 2 when khuge */ + .dbtrick = {{0, 1, 2}}, + .is_valid = NULL, +}; +Step +optimal_HTM = { + .shortname = "optimal", + .name = "Optimal solve (in HTM)", + .alt = {&sa_nxopt31_HTM, NULL}, + .t = {uf}, + .ready_msg = check_centers_msg, +}; + +/* Optimal after EO ******************/ +/* TODO: eofin_eo (generic), eofbfin_eofb, eorlfin_eorl, eoudfin_eoud */ + +/* EO steps **************************/ +/* TODO: eoany_HTM (generic), eofb_HTM, eorl_HTM, eoud_HTM */ + +StepAlt +sa_eofb_HTM = { + .ready = check_centers, + .final = false, + .moveset = &moveset_HTM, + .n_coord = 1, + .coord = {&coord_eofb}, + .coord_trans = {uf}, + .compact_pd = {false}, + .n_dbtrick = 0, + .is_valid = validate_singlecw_ending, +}; +Step +eoany_HTM = { + .shortname = "eo", + .name = "EO on any axis", + .alt = {&sa_eofb_HTM, &sa_eofb_HTM, &sa_eofb_HTM, NULL}, + .t = {uf, ur, fd}, + .ready_msg = check_centers_msg, +}; +Step +eofb_HTM = { + .shortname = "eofb", + .name = "EO on F/B", + .alt = {&sa_eofb_HTM, NULL}, + .t = {uf}, + .ready_msg = check_centers_msg, +}; +Step +eorl_HTM = { + .shortname = "eorl", + .name = "EO on R/L", + .alt = {&sa_eofb_HTM, NULL}, + .t = {ur}, + .ready_msg = check_centers_msg, +}; +Step +eoud_HTM = { + .shortname = "eoud", + .name = "EO on U/D", + .alt = {&sa_eofb_HTM, NULL}, + .t = {fd}, + .ready_msg = check_centers_msg, +}; + +/* CO steps **************************/ +/* TODO: coany_HTM (generic), cofb_HTM, corl_HTM, coud_HTM */ +/* TODO: coany_URF (generic), cofb_URF, corl_URF, coud_URF */ + +/* Misc corner steps *****************/ +/* TODO: cornershtr_HTM, cornershtr_URF, corners_HTM, corners_URF */ +/* TODO (new): corners_drud */ + +/* DR steps **************************/ +/* TODO: dr_eo (generic) */ +/* TODO: dr_eofb (generic), dr_eorl (generic), dr_eoud (generic) */ +/* TODO: drud_eofb, drrl_eofb, drud_eorl, drfb_eorl, drrl_eoud, drfb_eoud */ + +StepAlt +sa_drud_HTM = { + .ready = check_centers, + .final = false, + .moveset = &moveset_HTM, + .n_coord = 1, + .coord = {&coord_drud_sym16}, + .coord_trans = {uf}, + .compact_pd = {false}, /* TODO: maybe compactify */ + .n_dbtrick = 0, + .is_valid = validate_singlecw_ending, +}; +Step +drany_HTM = { + .shortname = "dr", + .name = "DR on any axis", + .alt = {&sa_drud_HTM, &sa_drud_HTM, &sa_drud_HTM, NULL}, + .t = {uf, rf, fd}, + .ready_msg = check_centers_msg, +}; +Step +drud_HTM = { + .shortname = "drud", + .name = "DR on U/D", + .alt = {&sa_drud_HTM, NULL}, + .t = {uf}, + .ready_msg = check_centers_msg, +}; +Step +drrl_HTM = { + .shortname = "drrl", + .name = "DR on R/L", + .alt = {&sa_drud_HTM, NULL}, + .t = {rf}, + .ready_msg = check_centers_msg, +}; +Step +drfb_HTM = { + .shortname = "drfb", + .name = "DR on F/B", + .alt = {&sa_drud_HTM, NULL}, + .t = {fd}, + .ready_msg = check_centers_msg, +}; + +/* DR finish steps */ +StepAlt +sa_drfin_drud = { + .ready = check_drud, + .final = true, + .moveset = &moveset_drud, + .n_coord = 1, + .coord = {&coord_drudfin_noE_sym16}, /* TODO: maybe no noE */ + .coord_trans = {uf}, + .compact_pd = {false}, /* TODO: maybe compactify */ + .n_dbtrick = 0, + .is_valid = NULL, +}; +Step +dranyfin_DR = { + .shortname = "drfin", + .name = "DR finish on any axis without breaking DR", + .alt = {&sa_drfin_drud, &sa_drfin_drud, &sa_drfin_drud, NULL}, + .t = {uf, rf, fd}, + .ready_msg = check_dr_msg, +}; +Step +drudfin_drud = { + .shortname = "drudfin", + .name = "DR finis on U/D without breaking DR", + .alt = {&sa_drfin_drud, NULL}, + .t = {uf}, + .ready_msg = check_dr_msg, +}; +Step +drrlfin_drrl = { + .shortname = "drrlfin", + .name = "DR finish on R/L without breaking DR", + .alt = {&sa_drfin_drud, NULL}, + .t = {rf}, + .ready_msg = check_dr_msg, +}; +Step +drfbfin_drfb = { + .shortname = "drfbfin", + .name = "DR finish on F/B without breaking DR", + .alt = {&sa_drfin_drud, NULL}, + .t = {fd}, + .ready_msg = check_dr_msg, +}; + +/* HTR from DR */ +/* TODO: htr_any (generic), htr_drud, htr_drrl, htr_drfb */ + +/* HTR finish */ +/* TODO: htrfin_htr */ + +Step *steps[] = { + &optimal_HTM, /* first is default */ + + &eoany_HTM, &eofb_HTM, &eorl_HTM, &eoud_HTM, + &drany_HTM, &drud_HTM, &drrl_HTM, &drfb_HTM, + &dranyfin_DR, &drudfin_drud, &drrlfin_drrl, &drfbfin_drfb, + +/* TODO: + &optimal_light_HTM, + + &eofin_eo, &eofbfin_eofb, &eorlfin_eorl, &eoudfin_eoud, + &coany_HTM, &coud_HTM, &corl_HTM, &cofb_HTM, + &coany_URF, &coud_URF, &corl_URF, &cofb_URF, + &dr_eo, &dr_eofb, &dr_eorl, &dr_eoud, + &drud_eofb, &drrl_eofb, + &drud_eorl, &drfb_eorl, + &drfb_eoud, &drrl_eoud, + &htr_any, &htr_drud, &htr_drrl, &htr_drfb, + &htrfin_htr, + &cornershtr_HTM, &cornershtr_URF, &corners_HTM, &corners_URF, + NULL +*/ + +}; + +#endif #endif -- cgit v1.3