diff options
Diffstat (limited to 'src/solver_step.c')
| -rw-r--r-- | src/solver_step.c | 26 |
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 | ||
| 9 | static void apply_alg_cubedata(void *, void *, Alg *); | 9 | static void apply_move_cubedata(void *, void *, Move); |
| 10 | static void init_indexes(Step *, CubeData *); | 10 | static void init_indexes(Step *, CubeData *); |
| 11 | static void * prepare_cube(void *, Cube *); | 11 | static void * prepare_cube(void *, Cube *); |
| 12 | static bool move_check_stop_eager(void *, DfsArg *, Threader *); | 12 | static bool move_check_stop_eager(void *, DfsArg *, Threader *); |
| @@ -22,13 +22,17 @@ static bool niss_makes_sense(void *, void *, Alg *); | |||
| 22 | static Solver * new_stepsolver_nocheckstop(Step *step); | 22 | static Solver * new_stepsolver_nocheckstop(Step *step); |
| 23 | 23 | ||
| 24 | static void | 24 | static void |
| 25 | apply_alg_cubedata(void *param, void *cubedata, Alg *alg) | 25 | apply_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 | ||
| 34 | static void | 38 | static 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 */ | ||
| 104 | static bool | 110 | static bool |
| 105 | move_check_stop_nonsol(void *param, DfsArg *arg, Threader *threader) | 111 | move_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; |
