aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/h48
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2025-04-17 10:50:57 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2025-04-17 14:36:27 +0200
commit0ece4b72db22139db51e8f5f37c25f24c84f3e43 (patch)
treefa9d0f5ec4124b2e51194ec6dc888e037b9da7e2 /src/solvers/h48
parent785f2859e336db49095a8443be8d204ba0989925 (diff)
downloadnissy-core-0ece4b72db22139db51e8f5f37c25f24c84f3e43.tar.gz
nissy-core-0ece4b72db22139db51e8f5f37c25f24c84f3e43.zip
Small rework of optimal vs maxsols
I wanted to make the "optimal" and "maxsolutions" options mutually exclusive, but in the end I decided there is value in keeping both (e.g. for specifying a limit to the number of solutions when asking for "all" optimal"). Now optimal cannot be negative anymore, for the same reason of maxsolutions. The interface user (shell, UI) will have to take care of handling this in a way that makes sense for the user. Usually this means setting the maximum number of solutions to UINT_MAX (or a similar very high number) when the user wants "all optimal".
Diffstat (limited to 'src/solvers/h48')
-rw-r--r--src/solvers/h48/solve.h22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/solvers/h48/solve.h b/src/solvers/h48/solve.h
index f076f11..78b4c97 100644
--- a/src/solvers/h48/solve.h
+++ b/src/solvers/h48/solve.h
@@ -52,7 +52,7 @@ STATIC int64_t solve_h48_maketasks(
52 solve_h48_task_t [static STARTING_CUBES], int [static 1]); 52 solve_h48_task_t [static STARTING_CUBES], int [static 1]);
53STATIC void *solve_h48_runthread(void *); 53STATIC void *solve_h48_runthread(void *);
54STATIC int64_t solve_h48_dfs(dfsarg_solve_h48_t [static 1]); 54STATIC int64_t solve_h48_dfs(dfsarg_solve_h48_t [static 1]);
55STATIC int64_t solve_h48(cube_t, int8_t, int8_t, uint64_t, int8_t, int8_t, 55STATIC int64_t solve_h48(cube_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t,
56 uint64_t, const void *, size_t n, char [n], 56 uint64_t, const void *, size_t n, char [n],
57 long long [static NISSY_SIZE_SOLVE_STATS]); 57 long long [static NISSY_SIZE_SOLVE_STATS]);
58 58
@@ -67,7 +67,9 @@ solve_h48_stop(dfsarg_solve_h48_t arg[static 1])
67 n = arg->solution_moves->nmoves + arg->solution_moves->npremoves; 67 n = arg->solution_moves->nmoves + arg->solution_moves->npremoves;
68 target = arg->target_depth - n; 68 target = arg->target_depth - n;
69 if (target <= 0 || 69 if (target <= 0 ||
70 arg->solution_list->nsols == arg->solution_settings->maxsolutions) 70 arg->solution_list->nsols >= arg->solution_settings->maxsolutions ||
71 n > arg->solution_list->shortest_sol +
72 arg->solution_settings->optimal)
71 return true; 73 return true;
72 74
73 arg->movemask_normal = arg->movemask_inverse = MM_ALLMOVES; 75 arg->movemask_normal = arg->movemask_inverse = MM_ALLMOVES;
@@ -283,8 +285,8 @@ solve_h48_maketasks(
283 if (issolved(maketasks_arg->cube)) { 285 if (issolved(maketasks_arg->cube)) {
284 if (maketasks_arg->nmoves > maketasks_arg->maxmoves || 286 if (maketasks_arg->nmoves > maketasks_arg->maxmoves ||
285 maketasks_arg->nmoves < maketasks_arg->minmoves || 287 maketasks_arg->nmoves < maketasks_arg->minmoves ||
286 solve_arg->solution_list->nsols >= 288 solutions_done(solve_arg->solution_list,
287 solve_arg->solution_settings->maxsolutions) 289 solve_arg->solution_settings, maketasks_arg->nmoves))
288 return NISSY_OK; 290 return NISSY_OK;
289 291
290 solution_moves_reset(&moves); 292 solution_moves_reset(&moves);
@@ -341,11 +343,11 @@ solve_h48_maketasks(
341STATIC int64_t 343STATIC int64_t
342solve_h48( 344solve_h48(
343 cube_t cube, 345 cube_t cube,
344 int8_t minmoves, 346 uint8_t minmoves,
345 int8_t maxmoves, 347 uint8_t maxmoves,
346 uint64_t maxsolutions, 348 uint8_t maxsolutions,
347 int8_t optimal, 349 uint8_t optimal,
348 int8_t threads, 350 uint8_t threads,
349 uint64_t data_size, 351 uint64_t data_size,
350 const void *data, 352 const void *data,
351 size_t solutions_size, 353 size_t solutions_size,
@@ -448,7 +450,7 @@ solve_h48(
448 solve_h48_maketasks(&arg[0], &maketasks_arg, tasks, &ntasks); 450 solve_h48_maketasks(&arg[0], &maketasks_arg, tasks, &ntasks);
449 if (ntasks < 0) 451 if (ntasks < 0)
450 goto solve_h48_error_solutions_buffer; 452 goto solve_h48_error_solutions_buffer;
451 if (sollist.nsols >= maxsolutions) 453 if (solutions_done(&sollist, &settings, MAX(minmoves, STARTING_MOVES)))
452 goto solve_h48_done; 454 goto solve_h48_done;
453 455
454 for (i = 0; i < threads; i++) { 456 for (i = 0; i < threads; i++) {

Generated with cgit - Back to sebastiano.tronto.net