aboutsummaryrefslogtreecommitdiff
path: root/src/steps.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/steps.c')
-rw-r--r--src/steps.c126
1 files changed, 119 insertions, 7 deletions
diff --git a/src/steps.c b/src/steps.c
index a56b47a..7478ce6 100644
--- a/src/steps.c
+++ b/src/steps.c
@@ -36,6 +36,7 @@ static int estimate_drudfin_drud(DfsArg *arg);
36static int estimate_htr_drud(DfsArg *arg); 36static int estimate_htr_drud(DfsArg *arg);
37static int estimate_htrfin_htr(DfsArg *arg); 37static int estimate_htrfin_htr(DfsArg *arg);
38static int estimate_optimal_HTM(DfsArg *arg); 38static int estimate_optimal_HTM(DfsArg *arg);
39static int estimate_light_HTM(DfsArg *arg);
39 40
40static bool always_valid(Alg *alg); 41static bool always_valid(Alg *alg);
41static bool validate_singlecw_ending(Alg *alg); 42static bool validate_singlecw_ending(Alg *alg);
@@ -55,6 +56,7 @@ static char check_drany_msg[100] = "DR must be solved on at least one axis";
55 56
56/* Steps *********************************************************************/ 57/* Steps *********************************************************************/
57 58
59/* Optimal solvers *******************/
58Step 60Step
59optimal_HTM = { 61optimal_HTM = {
60 .shortname = "optimal", 62 .shortname = "optimal",
@@ -74,6 +76,25 @@ optimal_HTM = {
74 .ntables = 2, 76 .ntables = 2,
75}; 77};
76 78
79Step
80optimal_light_HTM = {
81 .shortname = "light",
82 .name = "Optimal solve (in HTM), small table (500Mb RAM total)",
83
84 .final = true,
85 .is_done = is_solved,
86 .estimate = estimate_light_HTM,
87 .ready = check_centers,
88 .ready_msg = check_centers_msg,
89 .is_valid = always_valid,
90 .moveset = moveset_HTM,
91
92 .pre_trans = uf,
93
94 .tables = {&pd_drud_sym16_HTM, &pd_corners_HTM},
95 .ntables = 2,
96};
97
77/* EO steps **************************/ 98/* EO steps **************************/
78Step 99Step
79eoany_HTM = { 100eoany_HTM = {
@@ -813,6 +834,7 @@ htrfin_htr = {
813 834
814Step *steps[NSTEPS] = { 835Step *steps[NSTEPS] = {
815 &optimal_HTM, /* first is default */ 836 &optimal_HTM, /* first is default */
837 &optimal_light_HTM,
816 838
817 &eoany_HTM, 839 &eoany_HTM,
818 &eofb_HTM, 840 &eofb_HTM,
@@ -1162,7 +1184,6 @@ static int
1162estimate_optimal_HTM(DfsArg *arg) 1184estimate_optimal_HTM(DfsArg *arg)
1163{ 1185{
1164 int target, ret; 1186 int target, ret;
1165 Move bl1;
1166 Cube aux; 1187 Cube aux;
1167 1188
1168 static const uint64_t udmask = (1<<U) | (1<<U2) | (1<<U3) | 1189 static const uint64_t udmask = (1<<U) | (1<<U2) | (1<<U3) |
@@ -1174,7 +1195,6 @@ estimate_optimal_HTM(DfsArg *arg)
1174 1195
1175 ret = -1; 1196 ret = -1;
1176 target = arg->d - arg->current_alg->len; 1197 target = arg->d - arg->current_alg->len;
1177 bl1 = base_move(arg->last1);
1178 arg->inverse = (Cube){0}; 1198 arg->inverse = (Cube){0};
1179 arg->badmovesinv = 0; 1199 arg->badmovesinv = 0;
1180 arg->badmoves = 0; 1200 arg->badmoves = 0;
@@ -1204,17 +1224,17 @@ estimate_optimal_HTM(DfsArg *arg)
1204 } 1224 }
1205 1225
1206 /* Inverse probing */ 1226 /* Inverse probing */
1207 arg->inverse = inverse_cube(arg->cube); 1227 aux = arg->inverse = inverse_cube(arg->cube);
1208 if ((bl1 != U && bl1 != D) || (arg->ed->inverse_ud == -1)) { 1228 if (!((1<<arg->last1) & udmask) || (arg->ed->inverse_ud == -1)) {
1209 arg->ed->inverse_ud = ptableval(&pd_khuge_HTM, arg->inverse); 1229 arg->ed->inverse_ud = ptableval(&pd_khuge_HTM, aux);
1210 } 1230 }
1211 UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target); 1231 UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target);
1212 if ((bl1 != F && bl1 != B) || (arg->ed->inverse_fb == -1)) { 1232 if (!((1<<arg->last1) & fbmask) || (arg->ed->inverse_fb == -1)) {
1213 aux = apply_trans(fd, arg->inverse); 1233 aux = apply_trans(fd, arg->inverse);
1214 arg->ed->inverse_fb = ptableval(&pd_khuge_HTM, aux); 1234 arg->ed->inverse_fb = ptableval(&pd_khuge_HTM, aux);
1215 } 1235 }
1216 UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target); 1236 UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target);
1217 if ((bl1 != R && bl1 != L) || (arg->ed->inverse_rl == -1)) { 1237 if (!((1<<arg->last1) & rlmask) || (arg->ed->inverse_rl == -1)) {
1218 aux = apply_trans(rf, arg->inverse); 1238 aux = apply_trans(rf, arg->inverse);
1219 arg->ed->inverse_rl = ptableval(&pd_khuge_HTM, aux); 1239 arg->ed->inverse_rl = ptableval(&pd_khuge_HTM, aux);
1220 } 1240 }
@@ -1244,6 +1264,98 @@ estimate_optimal_HTM(DfsArg *arg)
1244 return arg->ed->oldret = ret; 1264 return arg->ed->oldret = ret;
1245} 1265}
1246 1266
1267static int
1268estimate_light_HTM(DfsArg *arg)
1269{
1270 int target, ret;
1271 Cube aux;
1272
1273 static const uint64_t udmask = (1<<U) | (1<<U2) | (1<<U3) |
1274 (1<<D) | (1<<D2) | (1<<D3);
1275 static const uint64_t rlmask = (1<<R) | (1<<R2) | (1<<R3) |
1276 (1<<L) | (1<<L2) | (1<<L3);
1277 static const uint64_t fbmask = (1<<F) | (1<<F2) | (1<<F3) |
1278 (1<<B) | (1<<B2) | (1<<B3);
1279 static const uint64_t htmask = (1<<U2) | (1<<D2) |
1280 (1<<R2) | (1<<L2) |
1281 (1<<F2) | (1<<B2);
1282
1283 ret = -1;
1284 target = arg->d - arg->current_alg->len;
1285 arg->inverse = (Cube){0};
1286 arg->badmovesinv = 0;
1287 arg->badmoves = 0;
1288
1289 /* Corners */
1290 arg->ed->corners = ptableval(&pd_corners_HTM, arg->cube);
1291 UPDATECHECKSTOP(ret, arg->ed->corners, target);
1292
1293 /* Normal probing */
1294 arg->ed->normal_ud = ptableval(&pd_drud_sym16_HTM, arg->cube);
1295 UPDATECHECKSTOP(ret, arg->ed->normal_ud, target);
1296 aux = apply_trans(fd, arg->cube);
1297 arg->ed->normal_fb = ptableval(&pd_drud_sym16_HTM, aux);
1298 UPDATECHECKSTOP(ret, arg->ed->normal_fb, target);
1299 aux = apply_trans(rf, arg->cube);
1300 arg->ed->normal_rl = ptableval(&pd_drud_sym16_HTM, aux);
1301 UPDATECHECKSTOP(ret, arg->ed->normal_rl, target);
1302
1303 /* If ret == 0, it's solved (corners + triple slice solved) */
1304 if (ret == 0)
1305 return 0;
1306
1307 /* Michel de Bondt's trick*/
1308 if (arg->ed->normal_ud == arg->ed->normal_fb &&
1309 arg->ed->normal_fb == arg->ed->normal_rl) {
1310 UPDATECHECKSTOP(ret, arg->ed->normal_ud + 1, target);
1311 }
1312
1313 /* Inverse probing */
1314 if (!((1<<arg->last1) & htmask)) {
1315 aux = arg->inverse = inverse_cube(arg->cube);
1316 if (!((1<<arg->last1) & udmask) || (arg->ed->inverse_ud==-1)) {
1317 arg->ed->inverse_ud =
1318 ptableval(&pd_drud_sym16_HTM, aux);
1319 }
1320 UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target);
1321 if (!((1<<arg->last1) & fbmask) || (arg->ed->inverse_fb==-1)) {
1322 aux = apply_trans(fd, arg->inverse);
1323 arg->ed->inverse_fb =
1324 ptableval(&pd_drud_sym16_HTM, aux);
1325 }
1326 UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target);
1327 if (!((1<<arg->last1) & rlmask) || (arg->ed->inverse_rl==-1)) {
1328 aux = apply_trans(rf, arg->inverse);
1329 arg->ed->inverse_rl =
1330 ptableval(&pd_drud_sym16_HTM, aux);
1331 }
1332 UPDATECHECKSTOP(ret, arg->ed->inverse_rl, target);
1333 }
1334
1335 /* Michel de Bondt's trick*/
1336 if (arg->ed->inverse_ud == arg->ed->inverse_fb &&
1337 arg->ed->inverse_fb == arg->ed->inverse_rl) {
1338 UPDATECHECKSTOP(ret, arg->ed->inverse_ud + 1, target);
1339 }
1340
1341 /* nxopt trick + half turn trick */
1342 if (arg->ed->normal_ud == target)
1343 arg->badmovesinv |= udmask | htmask;
1344 if (arg->ed->normal_fb == target)
1345 arg->badmovesinv |= fbmask | htmask;
1346 if (arg->ed->normal_rl == target)
1347 arg->badmovesinv |= rlmask | htmask;
1348
1349 if (arg->ed->inverse_ud == target)
1350 arg->badmoves |= udmask | htmask;
1351 if (arg->ed->inverse_fb == target)
1352 arg->badmoves |= fbmask | htmask;
1353 if (arg->ed->inverse_rl == target)
1354 arg->badmoves |= rlmask | htmask;
1355
1356 return arg->ed->oldret = ret;
1357}
1358
1247static bool 1359static bool
1248always_valid(Alg *alg) 1360always_valid(Alg *alg)
1249{ 1361{

Generated with cgit - Back to sebastiano.tronto.net