aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/solvers/h48/solve.h28
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,

Generated with cgit - Back to sebastiano.tronto.net