aboutsummaryrefslogtreecommitdiff
path: root/src/solver_step.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/solver_step.c')
-rw-r--r--src/solver_step.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/solver_step.c b/src/solver_step.c
index 5c9d149..52fa347 100644
--- a/src/solver_step.c
+++ b/src/solver_step.c
@@ -6,7 +6,7 @@ typedef struct {
6 Trans * t; 6 Trans * t;
7} CubeData; 7} CubeData;
8 8
9static void apply_alg_cubedata(void *, void *, Alg *); 9static void apply_move_cubedata(void *, void *, Move);
10static void init_indexes(Step *, CubeData *); 10static void init_indexes(Step *, CubeData *);
11static void * prepare_cube(void *, Cube *); 11static void * prepare_cube(void *, Cube *);
12static bool move_check_stop_eager(void *, DfsArg *, Threader *); 12static bool move_check_stop_eager(void *, DfsArg *, Threader *);
@@ -22,13 +22,17 @@ static bool niss_makes_sense(void *, void *, Alg *);
22static Solver * new_stepsolver_nocheckstop(Step *step); 22static Solver * new_stepsolver_nocheckstop(Step *step);
23 23
24static void 24static void
25apply_alg_cubedata(void *param, void *cubedata, Alg *alg) 25apply_move_cubedata(void *param, void *cubedata, Move m)
26{ 26{
27 Step *s = (Step *)param; 27 Step *s = (Step *)param;
28 CubeData *data = (CubeData *)cubedata; 28 CubeData *data = (CubeData *)cubedata;
29 29
30 apply_alg(alg, data->cube); 30 Trans tt;
31 init_indexes(s, data); 31 for (int i = 0; i < s->n_coord; i++) {
32 Move mm = transform_move(data->t[i], m);
33 data->val[i] = move_coord(s->coord[i], mm, data->val[i], &tt);
34 data->t[i] = transform_trans(tt, data->t[i]);
35 }
32} 36}
33 37
34static void 38static void
@@ -101,6 +105,8 @@ move_check_stop_lazy(void *param, DfsArg *arg, Threader *threader)
101 return move_check_stop_nonsol(param, arg, threader); 105 return move_check_stop_nonsol(param, arg, threader);
102} 106}
103 107
108/* TODO: split in 2 (nissable / non-nissable) and only move cube
109 when nissable */
104static bool 110static bool
105move_check_stop_nonsol(void *param, DfsArg *arg, Threader *threader) 111move_check_stop_nonsol(void *param, DfsArg *arg, Threader *threader)
106{ 112{
@@ -113,6 +119,7 @@ move_check_stop_nonsol(void *param, DfsArg *arg, Threader *threader)
113 s = (Step *)param; 119 s = (Step *)param;
114 data = (CubeData *)arg->cubedata; 120 data = (CubeData *)arg->cubedata;
115 121
122
116 bound = 0; 123 bound = 0;
117 goal = arg->d - arg->current_alg->len; 124 goal = arg->d - arg->current_alg->len;
118/* TODO: check if len is 0 */ 125/* TODO: check if len is 0 */
@@ -130,6 +137,8 @@ move_check_stop_nonsol(void *param, DfsArg *arg, Threader *threader)
130 return true; 137 return true;
131 } 138 }
132 } 139 }
140 if (arg->opts->can_niss && !arg->niss)
141 apply_move(lastmove, data->cube);
133 142
134 return false; 143 return false;
135} 144}
@@ -184,8 +193,9 @@ copy_cubedata(void *param, void *src, void *dst)
184 olddata = (CubeData *)src; 193 olddata = (CubeData *)src;
185 newdata = (CubeData *)dst; 194 newdata = (CubeData *)dst;
186 195
187 /* Copy reference: we never move the cube */ 196/* TODO: do not copy if not nissable */
188 newdata->cube = olddata->cube; 197 newdata->cube = malloc(sizeof(Cube));
198 copy_cube(olddata->cube, newdata->cube);
189 for (i = 0; i < s->n_coord; i++) { 199 for (i = 0; i < s->n_coord; i++) {
190 newdata->val[i] = olddata->val[i]; 200 newdata->val[i] = olddata->val[i];
191 newdata->t[i] = olddata->t[i]; 201 newdata->t[i] = olddata->t[i];
@@ -201,7 +211,7 @@ free_cubedata(void *param, void *cubedata)
201 211
202 free(data->t); 212 free(data->t);
203 free(data->val); 213 free(data->val);
204 /* We do not free the cube */ 214 free(data->cube);
205 free(data); 215 free(data);
206} 216}
207 217
@@ -254,7 +264,7 @@ new_stepsolver_nocheckstop(Step *step)
254 solver->moveset = step->moveset; 264 solver->moveset = step->moveset;
255 solver->param = step; 265 solver->param = step;
256 266
257 solver->apply_alg = apply_alg_cubedata; 267 solver->apply_move = apply_move_cubedata;
258 solver->prepare_cube = prepare_cube; 268 solver->prepare_cube = prepare_cube;
259 solver->is_solved = is_solved_step; 269 solver->is_solved = is_solved_step;
260 solver->validate_solution = validate_solution; 270 solver->validate_solution = validate_solution;

Generated with cgit - Back to sebastiano.tronto.net