diff options
| author | Sebastiano Tronto <sebastiano.tronto@gmail.com> | 2021-12-14 08:27:58 +0100 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano.tronto@gmail.com> | 2021-12-14 08:27:58 +0100 |
| commit | e3108647e28d336e3814821d338ec3a841a8343c (patch) | |
| tree | b5fb67359fc8490d84e94d1a48732d540a48be73 | |
| parent | 1215648b1ba3c592bd9d97b871349673d1702e44 (diff) | |
| download | nissy-e3108647e28d336e3814821d338ec3a841a8343c.tar.gz nissy-e3108647e28d336e3814821d338ec3a841a8343c.zip | |
random attempts
Diffstat (limited to '')
| -rw-r--r-- | TODO.md | 10 | ||||
| -rwxr-xr-x | nissy | bin | 188520 -> 188520 bytes | |||
| -rw-r--r-- | src/steps.c | 56 |
3 files changed, 34 insertions, 32 deletions
| @@ -28,6 +28,8 @@ It's more of a personal reminder than anything else. | |||
| 28 | * solve should try up to a small bound without loading the large pruning table | 28 | * solve should try up to a small bound without loading the large pruning table |
| 29 | * drfin for HTR scrambles should try all 3 axis and pick the best solutions; | 29 | * drfin for HTR scrambles should try all 3 axis and pick the best solutions; |
| 30 | in general every step that automatically detects orientation should do this | 30 | in general every step that automatically detects orientation should do this |
| 31 | * for solve -v, solving in different orientation does not give meaningful info, | ||
| 32 | because I need to transform the alg as I go. | ||
| 31 | * for solve -v, print certain info like average branching value | 33 | * for solve -v, print certain info like average branching value |
| 32 | 34 | ||
| 33 | ### New features | 35 | ### New features |
| @@ -43,11 +45,9 @@ It's more of a personal reminder than anything else. | |||
| 43 | 45 | ||
| 44 | ## Technical stuff | 46 | ## Technical stuff |
| 45 | 47 | ||
| 46 | ## Performance (optimal solver) | 48 | ## Performance |
| 47 | * Khuge optimal solver: change direction of search when doing so leads to | 49 | * solve (allow_next): filter out based on base_move; only check once for each |
| 48 | less branching (like nxopt). Need to add some info to EstimateData or to | 50 | triple of moves; how to deal with different movesets? |
| 49 | DfsData (like last moves on inverse/other scramble) and to change some of | ||
| 50 | the logic of niss (allow for switching multiple times). | ||
| 51 | * Light optimal solver: use drud table instead of khuge, with tricks as above | 51 | * Light optimal solver: use drud table instead of khuge, with tricks as above |
| 52 | and one more trick: if the last move is 180° avoid computing inverse cube | 52 | and one more trick: if the last move is 180° avoid computing inverse cube |
| 53 | and just use previous values for all 3 axes. | 53 | and just use previous values for all 3 axes. |
| Binary files differ | |||
diff --git a/src/steps.c b/src/steps.c index ccf33df..7d1823e 100644 --- a/src/steps.c +++ b/src/steps.c | |||
| @@ -1162,74 +1162,76 @@ static int | |||
| 1162 | estimate_optimal_HTM(DfsArg *arg) | 1162 | estimate_optimal_HTM(DfsArg *arg) |
| 1163 | { | 1163 | { |
| 1164 | int target, ret; | 1164 | int target, ret; |
| 1165 | Move lbase; | 1165 | Move bl1; |
| 1166 | Cube aux; | 1166 | Cube aux; |
| 1167 | 1167 | ||
| 1168 | target = arg->d - arg->current_alg->len; | 1168 | ret = -1; |
| 1169 | ret = -1; | 1169 | target = arg->d - arg->current_alg->len; |
| 1170 | arg->inverse = (Cube){0}; | 1170 | bl1 = base_move(arg->last1); |
| 1171 | arg->inverse = (Cube){0}; | ||
| 1171 | arg->badmovesinv = 0; | 1172 | arg->badmovesinv = 0; |
| 1172 | arg->badmoves = 0; | 1173 | arg->badmoves = 0; |
| 1173 | 1174 | ||
| 1175 | /* Corners */ | ||
| 1174 | arg->ed->corners = ptableval(&pd_corners_HTM, arg->cube); | 1176 | arg->ed->corners = ptableval(&pd_corners_HTM, arg->cube); |
| 1175 | UPDATECHECKSTOP(ret, arg->ed->corners, target); | 1177 | UPDATECHECKSTOP(ret, arg->ed->corners, target); |
| 1176 | 1178 | ||
| 1179 | /* Normal probing */ | ||
| 1177 | arg->ed->normal_ud = ptableval(&pd_khuge_HTM, arg->cube); | 1180 | arg->ed->normal_ud = ptableval(&pd_khuge_HTM, arg->cube); |
| 1178 | UPDATECHECKSTOP(ret, arg->ed->normal_ud, target); | 1181 | UPDATECHECKSTOP(ret, arg->ed->normal_ud, target); |
| 1179 | if (arg->ed->normal_ud == target) { | ||
| 1180 | arg->badmovesinv |= (1<<U) | (1<<U2) | (1<<U3) | | ||
| 1181 | (1<<D) | (1<<D2) | (1<<D3); | ||
| 1182 | } | ||
| 1183 | |||
| 1184 | aux = apply_trans(fd, arg->cube); | 1182 | aux = apply_trans(fd, arg->cube); |
| 1185 | arg->ed->normal_fb = ptableval(&pd_khuge_HTM, aux); | 1183 | arg->ed->normal_fb = ptableval(&pd_khuge_HTM, aux); |
| 1186 | UPDATECHECKSTOP(ret, arg->ed->normal_fb, target); | 1184 | UPDATECHECKSTOP(ret, arg->ed->normal_fb, target); |
| 1187 | if (arg->ed->normal_fb == target) { | ||
| 1188 | arg->badmovesinv |= (1<<F) | (1<<F2) | (1<<F3) | | ||
| 1189 | (1<<B) | (1<<B2) | (1<<B3); | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | aux = apply_trans(rf, arg->cube); | 1185 | aux = apply_trans(rf, arg->cube); |
| 1193 | arg->ed->normal_rl = ptableval(&pd_khuge_HTM, aux); | 1186 | arg->ed->normal_rl = ptableval(&pd_khuge_HTM, aux); |
| 1194 | UPDATECHECKSTOP(ret, arg->ed->normal_rl, target); | 1187 | UPDATECHECKSTOP(ret, arg->ed->normal_rl, target); |
| 1195 | if (arg->ed->normal_rl == target) { | ||
| 1196 | arg->badmovesinv |= (1<<R) | (1<<R2) | (1<<R3) | | ||
| 1197 | (1<<L) | (1<<L2) | (1<<L3); | ||
| 1198 | } | ||
| 1199 | 1188 | ||
| 1189 | /* If ret == 0, it's solved (corners + triple slice solved) */ | ||
| 1200 | if (ret == 0) | 1190 | if (ret == 0) |
| 1201 | return ret; | 1191 | return ret; |
| 1202 | 1192 | ||
| 1193 | /* Michel de Bondt's trick*/ | ||
| 1203 | if (arg->ed->normal_ud == arg->ed->normal_fb && | 1194 | if (arg->ed->normal_ud == arg->ed->normal_fb && |
| 1204 | arg->ed->normal_fb == arg->ed->normal_rl) | 1195 | arg->ed->normal_fb == arg->ed->normal_rl) |
| 1205 | UPDATECHECKSTOP(ret, arg->ed->normal_ud + 1, target); | 1196 | UPDATECHECKSTOP(ret, arg->ed->normal_ud + 1, target); |
| 1206 | 1197 | ||
| 1207 | /* TODO: avoid computation of inverse if unnecessary */ | 1198 | /* Inverse probing */ |
| 1208 | lbase = base_move(arg->last1); | ||
| 1209 | arg->inverse = inverse_cube(arg->cube); | 1199 | arg->inverse = inverse_cube(arg->cube); |
| 1210 | 1200 | if ((bl1 != U && bl1 != D) || (arg->ed->inverse_ud == -1)) { | |
| 1211 | if ((lbase != U && lbase != D) || (arg->ed->inverse_ud == -1)) { | ||
| 1212 | arg->ed->inverse_ud = ptableval(&pd_khuge_HTM, arg->inverse); | 1201 | arg->ed->inverse_ud = ptableval(&pd_khuge_HTM, arg->inverse); |
| 1213 | } | 1202 | } |
| 1214 | UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target); | 1203 | UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target); |
| 1215 | 1204 | if ((bl1 != F && bl1 != B) || (arg->ed->inverse_fb == -1)) { | |
| 1216 | if ((lbase != F && lbase != B) || (arg->ed->inverse_fb == -1)) { | ||
| 1217 | aux = apply_trans(fd, arg->inverse); | 1205 | aux = apply_trans(fd, arg->inverse); |
| 1218 | arg->ed->inverse_fb = ptableval(&pd_khuge_HTM, aux); | 1206 | arg->ed->inverse_fb = ptableval(&pd_khuge_HTM, aux); |
| 1219 | } | 1207 | } |
| 1220 | UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target); | 1208 | UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target); |
| 1221 | 1209 | if ((bl1 != R && bl1 != L) || (arg->ed->inverse_rl == -1)) { | |
| 1222 | if ((lbase != R && lbase != L) || (arg->ed->inverse_rl == -1)) { | ||
| 1223 | aux = apply_trans(rf, arg->inverse); | 1210 | aux = apply_trans(rf, arg->inverse); |
| 1224 | arg->ed->inverse_rl = ptableval(&pd_khuge_HTM, aux); | 1211 | arg->ed->inverse_rl = ptableval(&pd_khuge_HTM, aux); |
| 1225 | } | 1212 | } |
| 1226 | UPDATECHECKSTOP(ret, arg->ed->inverse_rl, target); | 1213 | UPDATECHECKSTOP(ret, arg->ed->inverse_rl, target); |
| 1227 | 1214 | ||
| 1215 | /* Michel de Bondt's trick*/ | ||
| 1228 | if (arg->ed->inverse_ud == arg->ed->inverse_fb && | 1216 | if (arg->ed->inverse_ud == arg->ed->inverse_fb && |
| 1229 | arg->ed->inverse_fb == arg->ed->inverse_rl) { | 1217 | arg->ed->inverse_fb == arg->ed->inverse_rl) { |
| 1230 | UPDATECHECKSTOP(ret, arg->ed->inverse_ud + 1, target); | 1218 | UPDATECHECKSTOP(ret, arg->ed->inverse_ud + 1, target); |
| 1231 | } | 1219 | } |
| 1232 | 1220 | ||
| 1221 | /* nxopt trick */ | ||
| 1222 | if (arg->ed->normal_ud == target) { | ||
| 1223 | arg->badmovesinv |= (1<<U) | (1<<U2) | (1<<U3) | | ||
| 1224 | (1<<D) | (1<<D2) | (1<<D3); | ||
| 1225 | } | ||
| 1226 | if (arg->ed->normal_fb == target) { | ||
| 1227 | arg->badmovesinv |= (1<<F) | (1<<F2) | (1<<F3) | | ||
| 1228 | (1<<B) | (1<<B2) | (1<<B3); | ||
| 1229 | } | ||
| 1230 | if (arg->ed->normal_rl == target) { | ||
| 1231 | arg->badmovesinv |= (1<<R) | (1<<R2) | (1<<R3) | | ||
| 1232 | (1<<L) | (1<<L2) | (1<<L3); | ||
| 1233 | } | ||
| 1234 | |||
| 1233 | if (arg->ed->inverse_ud == target) { | 1235 | if (arg->ed->inverse_ud == target) { |
| 1234 | arg->badmoves |= (1<<U) | (1<<U2) | (1<<U3) | | 1236 | arg->badmoves |= (1<<U) | (1<<U2) | (1<<U3) | |
| 1235 | (1<<D) | (1<<D2) | (1<<D3); | 1237 | (1<<D) | (1<<D2) | (1<<D3); |
