diff options
| -rw-r--r-- | src/solvers/h48/solve.h | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/src/solvers/h48/solve.h b/src/solvers/h48/solve.h index 10b22b9..0162852 100644 --- a/src/solvers/h48/solve.h +++ b/src/solvers/h48/solve.h | |||
| @@ -217,23 +217,28 @@ solve_h48_prune(solve_h48_prune_arg_t arg) | |||
| 217 | solve_h48_prune_return_t ret = {0}; | 217 | solve_h48_prune_return_t ret = {0}; |
| 218 | uint64_t c; | 218 | uint64_t c; |
| 219 | uint32_t dn, di; | 219 | uint32_t dn, di; |
| 220 | uint8_t pmin, pe; | 220 | uint8_t pmin, pcn, pci, pe; |
| 221 | |||
| 222 | ret.pi = arg.lb_inverse; | ||
| 223 | 221 | ||
| 224 | /* We'll never get a bound higher than base + 3 */ | 222 | /* We'll never get a bound higher than base + 3 */ |
| 225 | if (arg.h48base + 3 <= arg.target) | 223 | if (arg.h48base + 3 <= arg.target) |
| 226 | goto solve_h48_prune_return_false; | 224 | goto solve_h48_prune_return_false; |
| 227 | 225 | ||
| 228 | /* Preliminary probing using last computed bound, if possible */ | 226 | /* Use prevously computed bound */ |
| 229 | if (arg.lb_inverse > arg.target) | 227 | ret.pi = arg.lb_inverse; |
| 228 | if (ret.pi > arg.target) | ||
| 230 | goto solve_h48_prune_return_true; | 229 | goto solve_h48_prune_return_true; |
| 231 | 230 | ||
| 232 | /* Get cdata and do preliminary corner probing */ | 231 | /* Get corner data and do preliminary corner probing */ |
| 233 | if (get_h48_cdata(arg.inverse, arg.cocsepdata, &di) > arg.target || | 232 | pci = get_h48_cdata(arg.inverse, arg.cocsepdata, &di); |
| 234 | get_h48_cdata(arg.cube, arg.cocsepdata, &dn) > arg.target) | 233 | if (pci > arg.target) { |
| 234 | ret.pi = pci; | ||
| 235 | goto solve_h48_prune_return_true; | ||
| 236 | } | ||
| 237 | pcn = get_h48_cdata(arg.cube, arg.cocsepdata, &dn); | ||
| 238 | if (pcn > arg.target) | ||
| 235 | goto solve_h48_prune_return_true; | 239 | goto solve_h48_prune_return_true; |
| 236 | 240 | ||
| 241 | /* Inverse probing is done only if previous value can't be used */ | ||
| 237 | if (arg.lb_inverse == 0) { | 242 | if (arg.lb_inverse == 0) { |
| 238 | ret.lookups++; | 243 | ret.lookups++; |
| 239 | c = coord_h48_edges( | 244 | c = coord_h48_edges( |
| @@ -243,7 +248,7 @@ solve_h48_prune(solve_h48_prune_arg_t arg) | |||
| 243 | if (ret.pi == 0) { | 248 | if (ret.pi == 0) { |
| 244 | ret.fallbacks++; | 249 | ret.fallbacks++; |
| 245 | pe = get_eoesep_pval_cube(arg.eoesepdata, arg.inverse); | 250 | pe = get_eoesep_pval_cube(arg.eoesepdata, arg.inverse); |
| 246 | ret.pi = MAX(pmin, pe); | 251 | ret.pi = MAX(pmin, MAX(pci, pe)); |
| 247 | } else { | 252 | } else { |
| 248 | ret.pi += arg.h48base; | 253 | ret.pi += arg.h48base; |
| 249 | } | 254 | } |
| @@ -254,6 +259,7 @@ solve_h48_prune(solve_h48_prune_arg_t arg) | |||
| 254 | 259 | ||
| 255 | ret.nohalf_normal = ret.pi == arg.target; | 260 | ret.nohalf_normal = ret.pi == arg.target; |
| 256 | 261 | ||
| 262 | /* Normal probing */ | ||
| 257 | ret.lookups++; | 263 | ret.lookups++; |
| 258 | c = coord_h48_edges(arg.cube, COCLASS(dn), TTREP(dn), arg.h48h); | 264 | c = coord_h48_edges(arg.cube, COCLASS(dn), TTREP(dn), arg.h48h); |
| 259 | ret.pn = get_h48_pval_and_min(arg.h48data, c, &pmin); | 265 | ret.pn = get_h48_pval_and_min(arg.h48data, c, &pmin); |
| @@ -261,7 +267,7 @@ solve_h48_prune(solve_h48_prune_arg_t arg) | |||
| 261 | if (ret.pn == 0) { | 267 | if (ret.pn == 0) { |
| 262 | ret.fallbacks++; | 268 | ret.fallbacks++; |
| 263 | pe = get_eoesep_pval_cube(arg.eoesepdata, arg.cube); | 269 | pe = get_eoesep_pval_cube(arg.eoesepdata, arg.cube); |
| 264 | ret.pn = MAX(pmin, pe); | 270 | ret.pn = MAX(pmin, MAX(pcn, pe)); |
| 265 | } else { | 271 | } else { |
| 266 | ret.pn += arg.h48base; | 272 | ret.pn += arg.h48base; |
| 267 | } | 273 | } |
| @@ -321,7 +327,7 @@ solve_h48_dfs(dfsarg_solve_h48_t arg[static 1]) | |||
| 321 | prune_arg = (solve_h48_prune_arg_t){ | 327 | prune_arg = (solve_h48_prune_arg_t){ |
| 322 | .cocsepdata = arg->cocsepdata, | 328 | .cocsepdata = arg->cocsepdata, |
| 323 | .h48data = arg->h48data, | 329 | .h48data = arg->h48data, |
| 324 | .eoesepdata = arg->h48data_fallback_eoesep, /* TODO rmove? */ | 330 | .eoesepdata = arg->h48data_fallback_eoesep, |
| 325 | .target = arg->target_depth - (nm + 1), | 331 | .target = arg->target_depth - (nm + 1), |
| 326 | .h48base = arg->base, | 332 | .h48base = arg->base, |
| 327 | .h48h = arg->h, | 333 | .h48h = arg->h, |
