nissy-core

The "engine" of nissy, including the H48 optimal solver.
git clone https://git.tronto.net/nissy-core
Download | Log | Files | Refs | README | LICENSE

commit 10632e9fa6e8037cd584a29536e6ab1be9ca359b
parent a107b58dc4c34c187e31065293124e722158b919
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Fri,  1 Aug 2025 11:26:49 +0200

Reworked coordinate solver axis specification

Diffstat:
Msrc/core/transform.h | 13+++++++++++++
Msrc/solvers/coord/checkdata.h | 2+-
Msrc/solvers/coord/dr.h | 5-----
Msrc/solvers/coord/dreo.h | 5-----
Msrc/solvers/coord/drfinnoe.h | 5-----
Msrc/solvers/coord/drslice.h | 5-----
Msrc/solvers/coord/eo.h | 5-----
Msrc/solvers/coord/gendata.h | 2+-
Msrc/solvers/coord/solve.h | 23+++++++++++------------
Msrc/solvers/coord/types_macros.h | 1-
Msrc/solvers/coord/utils.h | 32+++++++++++---------------------
11 files changed, 37 insertions(+), 61 deletions(-)

diff --git a/src/core/transform.h b/src/core/transform.h @@ -18,6 +18,7 @@ TRANS_CUBE_ ## T ## _INVERSE)) STATIC uint8_t readtrans(const char [static NISSY_SIZE_TRANSFORMATION]); +STATIC uint8_t readrotation(const char [static 2]); STATIC void writetrans(uint8_t, char [static NISSY_SIZE_TRANSFORMATION]); STATIC cube_t transform_edges(cube_t, uint8_t); @@ -39,6 +40,18 @@ readtrans(const char buf[static NISSY_SIZE_TRANSFORMATION]) return UINT8_ERROR; } +STATIC uint8_t +readrotation(const char buf[static 2]) +{ + char trans_str[NISSY_SIZE_TRANSFORMATION]; + + strcpy(trans_str, "rotation xx"); + trans_str[9] = buf[0]; + trans_str[10] = buf[1]; + + return readtrans(trans_str); +} + STATIC void writetrans(uint8_t t, char buf[static NISSY_SIZE_TRANSFORMATION]) { diff --git a/src/solvers/coord/checkdata.h b/src/solvers/coord/checkdata.h @@ -19,7 +19,7 @@ checkdata_coord( return NISSY_ERROR_DATA; } - parse_coord_and_axis(solver, &coord, NULL); + parse_coord_and_trans(solver, &coord, NULL); if (coord == NULL) { LOG("[cehckdata] Unknown coordinate solver '%s'\n", solver); return NISSY_ERROR_DATA; diff --git a/src/solvers/coord/dr.h b/src/solvers/coord/dr.h @@ -22,11 +22,6 @@ STATIC coord_t coordinate_dr = { .trans_mask = TM_UDFIX, .moves_mask_gendata = MM18_ALLMOVES, .moves_mask_solve = MM18_ALLMOVES, - .axistrans = { - [AXIS_UD] = TRANS_UFr, - [AXIS_RL] = TRANS_RFr, - [AXIS_FB] = TRANS_FDr, - }, .is_admissible = &solution_lastqt_cw, .is_solvable = &is_eoco_solvable, .is_solved = NULL, diff --git a/src/solvers/coord/dreo.h b/src/solvers/coord/dreo.h @@ -21,11 +21,6 @@ STATIC coord_t coordinate_dreo = { .trans_mask = TM_UDRLFIX, .moves_mask_gendata = MM18_EO, .moves_mask_solve = MM18_EO, - .axistrans = { - [AXIS_UD] = TRANS_UFr, - [AXIS_RL] = TRANS_RFr, - [AXIS_FB] = TRANS_FDr, - }, .is_admissible = &solution_lastqt_cw, .is_solvable = &is_dreo_solvable, .is_solved = NULL, diff --git a/src/solvers/coord/drfinnoe.h b/src/solvers/coord/drfinnoe.h @@ -31,11 +31,6 @@ STATIC coord_t coordinate_drfinnoe = { .trans_mask = TM_UDFIX, .moves_mask_gendata = MM18_DR, .moves_mask_solve = MM18_DR, - .axistrans = { - [AXIS_UD] = TRANS_UFr, - [AXIS_RL] = TRANS_RFr, - [AXIS_FB] = TRANS_FDr, - }, .is_admissible = &solution_always_valid, .is_solvable = &is_drfinnoe_solvable, .is_solved = NULL, diff --git a/src/solvers/coord/drslice.h b/src/solvers/coord/drslice.h @@ -23,11 +23,6 @@ STATIC coord_t coordinate_drslice = { .trans_mask = TM_UDFIX, .moves_mask_gendata = MM18_DR, .moves_mask_solve = MM18_DR_NOD, - .axistrans = { - [AXIS_UD] = TRANS_UFr, - [AXIS_RL] = TRANS_LFr, - [AXIS_FB] = TRANS_FUr, - }, .is_admissible = &solution_always_valid, .is_solvable = &is_drslice_solvable, .is_solved = &is_drslice_solved, diff --git a/src/solvers/coord/eo.h b/src/solvers/coord/eo.h @@ -14,11 +14,6 @@ STATIC coord_t coordinate_eo = { .trans_mask = TM_SINGLE(TRANS_UFr), .moves_mask_gendata = MM18_ALLMOVES, .moves_mask_solve = MM18_ALLMOVES, - .axistrans = { - [AXIS_UD] = TRANS_FDr, - [AXIS_RL] = TRANS_URr, - [AXIS_FB] = TRANS_UFr, - }, .is_admissible = &solution_lastqt_cw, .is_solvable = &is_eo_even, .is_solved = NULL, diff --git a/src/solvers/coord/gendata.h b/src/solvers/coord/gendata.h @@ -24,7 +24,7 @@ gendata_coord_dispatch( { coord_t *coord; - parse_coord_and_axis(coordstr, &coord, NULL); + parse_coord_and_trans(coordstr, &coord, NULL); if (coord == NULL) { LOG("Error: could not parse coordinate '%s'\n", coordstr); diff --git a/src/solvers/coord/solve.h b/src/solvers/coord/solve.h @@ -240,7 +240,7 @@ solve_coord_dfs(dfsarg_solve_coord_t arg[static 1]) STATIC long long solve_coord_dispatch( oriented_cube_t oc, - const char *coord_and_axis, + const char *coord_and_trans, unsigned nissflag, unsigned minmoves, unsigned maxmoves, @@ -257,22 +257,23 @@ solve_coord_dispatch( ) { coord_t *coord; - uint8_t axis; + uint8_t trans; - parse_coord_and_axis(coord_and_axis, &coord, &axis); + parse_coord_and_trans(coord_and_trans, &coord, &trans); if (coord == NULL) { LOG("Error: could not parse coordinate from '%s'\n", - coord_and_axis); + coord_and_trans); return NISSY_ERROR_INVALID_SOLVER; } - if (axis == UINT8_ERROR) { - LOG("Error: could not parse axis from '%s'\n", coord_and_axis); + if (trans == UINT8_ERROR) { + LOG("Error: could not parse transformation from '%s'\n", + coord_and_trans); return NISSY_ERROR_INVALID_SOLVER; } - return solve_coord(oc, coord, axis, nissflag, minmoves, maxmoves, + return solve_coord(oc, coord, trans, nissflag, minmoves, maxmoves, maxsolutions, optimal, threads, data_size, data, solutions_size, sols, poll_status, poll_status_data); } @@ -281,7 +282,7 @@ STATIC int64_t solve_coord( oriented_cube_t oc, coord_t coord [static 1], - uint8_t axis, + uint8_t trans, uint8_t nissflag, uint8_t minmoves, uint8_t maxmoves, @@ -297,7 +298,6 @@ solve_coord( ) { int8_t d; - uint8_t t; uint64_t i; int64_t err; cube_t c; @@ -309,8 +309,7 @@ solve_coord( solution_settings_t solution_settings; solution_list_t solution_list; - t = coord->axistrans[axis]; - c = transform(oc.cube, t); + c = transform(oc.cube, trans); if (!coord->is_solvable(c)) goto solve_coord_error_unsolvable; @@ -334,7 +333,7 @@ solve_coord( solution_moves_reset(&solution_moves); solution_settings = (solution_settings_t) { - .tmask = TM_SINGLE(inverse_trans(t)), + .tmask = TM_SINGLE(inverse_trans(trans)), .unniss = false, .maxmoves = maxmoves, .maxsolutions = maxsolutions, diff --git a/src/solvers/coord/types_macros.h b/src/solvers/coord/types_macros.h @@ -25,7 +25,6 @@ typedef struct { uint64_t moves_mask_gendata; uint64_t moves_mask_solve; uint64_t trans_mask; - uint8_t axistrans[3]; bool (*is_admissible)(const solution_moves_t[static 1]); bool (*is_solvable)(cube_t); bool (*is_solved)(uint64_t, const unsigned char *); diff --git a/src/solvers/coord/utils.h b/src/solvers/coord/utils.h @@ -1,6 +1,5 @@ STATIC coord_t *parse_coord(size_t, const char *); -STATIC uint8_t parse_axis(const char [static 2]); -STATIC void parse_coord_and_axis(const char *, coord_t **, uint8_t *); +STATIC void parse_coord_and_trans(const char *, coord_t **, uint8_t *); STATIC long long dataid_coord(const char *, char [static NISSY_SIZE_DATAID]); STATIC coord_t * @@ -8,6 +7,10 @@ parse_coord(size_t n, const char *coord) { int i; + /* + TODO Some coordinates are parsed incorrectly, e.g. DRFINNOE + TODO is matched by DRFIN. Check that strncmp is used correctly. + */ for (i = 0; all_coordinates[i] != NULL; i++) if (!strncmp(all_coordinates[i]->name, coord, n)) return all_coordinates[i]; @@ -15,25 +18,11 @@ parse_coord(size_t n, const char *coord) return NULL; } -STATIC uint8_t -parse_axis(const char axis[static 2]) -{ - if (!strcmp(axis, "UD") || !strcmp(axis, "DU")) { - return AXIS_UD; - } else if (!strcmp(axis, "RL") || !strcmp(axis, "LR")) { - return AXIS_RL; - } else if (!strcmp(axis, "FB") || !strcmp(axis, "BF")) { - return AXIS_FB; - } - - return UINT8_ERROR; -} - STATIC void -parse_coord_and_axis( +parse_coord_and_trans( const char *str, coord_t **coord, - uint8_t *axis + uint8_t *trans ) { size_t i; @@ -45,8 +34,9 @@ parse_coord_and_axis( if (coord != NULL) *coord = parse_coord(i-6, str+6); - if (axis != NULL) - *axis = i == strlen(str) ? UINT8_ERROR : parse_axis(str+i+1); + if (trans != NULL) + *trans = i == strlen(str) ? + UINT8_ERROR : readrotation(str+i+1); } STATIC long long @@ -54,7 +44,7 @@ dataid_coord(const char *ca, char dataid[static NISSY_SIZE_DATAID]) { coord_t *c; - parse_coord_and_axis(ca, &c, NULL); + parse_coord_and_trans(ca, &c, NULL); if (c == NULL) { LOG("Error: cannot parse coordinate from '%s'\n", ca);