From 4e4c710131b143cfb6651d23945746f02bf2593e Mon Sep 17 00:00:00 2001 From: Sebastiano Tronto Date: Thu, 31 Jul 2025 15:59:03 +0200 Subject: Fixed bug and added tests --- src/solvers/coord/solve.h | 57 +++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 32 deletions(-) (limited to 'src/solvers') diff --git a/src/solvers/coord/solve.h b/src/solvers/coord/solve.h index 2d040de..b372257 100644 --- a/src/solvers/coord/solve.h +++ b/src/solvers/coord/solve.h @@ -20,7 +20,6 @@ STATIC long long solve_coord_dispatch(oriented_cube_t, const char *, unsigned, const unsigned char *, unsigned, char *, long long [static NISSY_SIZE_SOLVE_STATS], int (*)(void *), void *); STATIC bool coord_solution_admissible(const dfsarg_solve_coord_t [static 1]); -STATIC bool solve_coord_dfs_stop(const dfsarg_solve_coord_t [static 1]); STATIC bool coord_continue_onnormal(const dfsarg_solve_coord_t [static 1]); STATIC bool coord_continue_oninverse(const dfsarg_solve_coord_t [static 1]); STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t [static 1]); @@ -38,35 +37,11 @@ coord_solution_admissible(const dfsarg_solve_coord_t arg[static 1]) arg->coord->is_admissible(arg->solution_moves); } -STATIC bool -solve_coord_dfs_stop(const dfsarg_solve_coord_t arg[static 1]) -{ - bool hasnissed; - uint8_t n, pval; - uint64_t coord; - const cube_t *c; - - n = arg->solution_moves->nmoves + arg->solution_moves->npremoves; - if (n >= arg->target_depth) - return true; - - hasnissed = arg->solution_moves->nmoves > 0 && - arg->solution_moves->npremoves > 0; - if (!hasnissed && (arg->nissflag & NISSY_NISSFLAG_MIXED)) - return false; - - c = arg->lastisnormal ? &arg->cube : &arg->inverse; - - coord = arg->coord->coord(*c, arg->coord_data); - pval = get_coord_pval(arg->coord, arg->ptable, coord); - - return n + pval > arg->target_depth; -} - STATIC bool coord_continue_onnormal(const dfsarg_solve_coord_t arg[static 1]) { - uint8_t flag, nn, ni, swbound_n, swbound_i; + uint8_t flag, nn, ni, swbound_n, swbound_i, pval; + uint64_t coord; flag = arg->nissflag; nn = arg->solution_moves->nmoves; @@ -82,6 +57,14 @@ coord_continue_onnormal(const dfsarg_solve_coord_t arg[static 1]) if (nn + ni == 0) return true; + /* Pruning table check */ + if (!(flag & NISSY_NISSFLAG_MIXED) || ni != 0) { + coord = arg->coord->coord(arg->cube, arg->coord_data); + pval = get_coord_pval(arg->coord, arg->ptable, coord); + if (nn + ni + pval > arg->target_depth) + return false; + } + if (arg->lastisnormal) { /* Can continue if we have already switched */ if (ni > 0) @@ -111,7 +94,8 @@ coord_continue_onnormal(const dfsarg_solve_coord_t arg[static 1]) STATIC bool coord_continue_oninverse(const dfsarg_solve_coord_t arg[static 1]) { - uint8_t flag, nn, ni, swbound_n, swbound_i; + uint8_t flag, nn, ni, swbound_n, swbound_i, pval; + uint64_t coord; flag = arg->nissflag; nn = arg->solution_moves->nmoves; @@ -127,6 +111,14 @@ coord_continue_oninverse(const dfsarg_solve_coord_t arg[static 1]) if (nn + ni == 0) return true; + /* Pruning table check */ + if (!(flag & NISSY_NISSFLAG_MIXED) || nn != 0) { + coord = arg->coord->coord(arg->inverse, arg->coord_data); + pval = get_coord_pval(arg->coord, arg->ptable, coord); + if (nn + ni + pval > arg->target_depth) + return false; + } + if (!arg->lastisnormal) { /* Can continue if we have already switched */ if (nn > 0) @@ -157,7 +149,7 @@ STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t arg[static 1]) { bool lastbackup; - uint8_t m, l, nnbackup, nibackup; + uint8_t m, l, nnbackup, nibackup, nmoves; uint32_t mm; uint64_t coord; int64_t n, ret; @@ -171,14 +163,15 @@ solve_coord_dfs(dfsarg_solve_coord_t arg[static 1]) arg->solution_settings, arg->solution_list); } - if (solve_coord_dfs_stop(arg)) - return 0; - backup_cube = arg->cube; backup_inverse = arg->inverse; lastbackup = arg->lastisnormal; nnbackup = arg->solution_moves->nmoves; nibackup = arg->solution_moves->npremoves; + nmoves = nnbackup + nibackup; + + if (nmoves >= arg->target_depth) + return 0; ret = 0; if (coord_continue_onnormal(arg)) { -- cgit v1.3