aboutsummaryrefslogtreecommitdiff
path: root/src/solve.c
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano.tronto@gmail.com>2021-11-15 08:29:37 +0100
committerSebastiano Tronto <sebastiano.tronto@gmail.com>2021-11-15 08:29:37 +0100
commit20ac0e60d7174114965d4419af0bb3028db8e447 (patch)
treeb94184b39965aa3cd74f4e5e2cec988603f224f4 /src/solve.c
parent44beaa88e54d60d5c576380534cf5ebb8dd44709 (diff)
downloadnissy-20ac0e60d7174114965d4419af0bb3028db8e447.tar.gz
nissy-20ac0e60d7174114965d4419af0bb3028db8e447.zip
Load all necessary pruning tables for a step before the actual solving process
starts. This is in preparation for multi-threaded solving (but don't get hyped, it will take time).
Diffstat (limited to 'src/solve.c')
-rw-r--r--src/solve.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/src/solve.c b/src/solve.c
index 1f4a155..29f614b 100644
--- a/src/solve.c
+++ b/src/solve.c
@@ -127,47 +127,36 @@ AlgList *
127solve(Cube cube, Step *step, SolveOptions *opts) 127solve(Cube cube, Step *step, SolveOptions *opts)
128{ 128{
129 AlgListNode *node; 129 AlgListNode *node;
130 AlgList *sols = new_alglist(); 130 DfsData dd;
131 Cube c; 131 Cube c;
132 132
133 prepare_step(step, &dd);
134
133 if (step->detect != NULL) 135 if (step->detect != NULL)
134 step->pre_trans = step->detect(cube); 136 step->pre_trans = step->detect(cube);
135 c = apply_trans(step->pre_trans, cube); 137 c = apply_trans(step->pre_trans, cube);
136 138
137 DfsData dd = {
138 .m = 0,
139 .niss = false,
140 .lb = -1,
141 .last1 = NULLMOVE,
142 .last2 = NULLMOVE,
143 .sols = sols,
144 .current_alg = new_alg("")
145 };
146
147 if (step->ready != NULL && !step->ready(c)) { 139 if (step->ready != NULL && !step->ready(c)) {
148 fprintf(stderr, "Cube not ready for solving step: "); 140 fprintf(stderr, "Cube not ready for solving step: ");
149 fprintf(stderr, "%s\n", step->ready_msg); 141 fprintf(stderr, "%s\n", step->ready_msg);
150 return sols; 142 return dd.sols;
151 } 143 }
152 144
153 moveset_to_list(step->moveset, dd.sorted_moves);
154 movelist_to_position(dd.sorted_moves, dd.move_position);
155
156 for (dd.d = opts->min_moves; 145 for (dd.d = opts->min_moves;
157 dd.d <= opts->max_moves && 146 dd.d <= opts->max_moves &&
158 !(sols->len && opts->optimal_only) && 147 !(dd.sols->len && opts->optimal_only) &&
159 sols->len < opts->max_solutions; 148 dd.sols->len < opts->max_solutions;
160 dd.d++) { 149 dd.d++) {
161 if (opts->verbose) 150 if (opts->verbose)
162 fprintf(stderr, 151 fprintf(stderr,
163 "Found %d solutions, searching depth %d...\n", 152 "Found %d solutions, searching depth %d...\n",
164 sols->len, dd.d); 153 dd.sols->len, dd.d);
165 dfs(c, step, opts, &dd); 154 dfs(c, step, opts, &dd);
166 } 155 }
167 156
168 for (node = sols->first; node != NULL; node = node->next) 157 for (node = dd.sols->first; node != NULL; node = node->next)
169 transform_alg(inverse_trans(step->pre_trans), node->alg); 158 transform_alg(inverse_trans(step->pre_trans), node->alg);
170 159
171 free_alg(dd.current_alg); 160 free_alg(dd.current_alg);
172 return sols; 161 return dd.sols;
173} 162}

Generated with cgit - Back to sebastiano.tronto.net