commit e3108647e28d336e3814821d338ec3a841a8343c
parent 1215648b1ba3c592bd9d97b871349673d1702e44
Author: Sebastiano Tronto <sebastiano.tronto@gmail.com>
Date: Tue, 14 Dec 2021 08:27:58 +0100
random attempts
Diffstat:
3 files changed, 34 insertions(+), 32 deletions(-)
diff --git a/TODO.md b/TODO.md
@@ -28,6 +28,8 @@ It's more of a personal reminder than anything else.
* solve should try up to a small bound without loading the large pruning table
* drfin for HTR scrambles should try all 3 axis and pick the best solutions;
in general every step that automatically detects orientation should do this
+* for solve -v, solving in different orientation does not give meaningful info,
+ because I need to transform the alg as I go.
* for solve -v, print certain info like average branching value
### New features
@@ -43,11 +45,9 @@ It's more of a personal reminder than anything else.
## Technical stuff
-## Performance (optimal solver)
-* Khuge optimal solver: change direction of search when doing so leads to
-less branching (like nxopt). Need to add some info to EstimateData or to
-DfsData (like last moves on inverse/other scramble) and to change some of
-the logic of niss (allow for switching multiple times).
+## Performance
+* solve (allow_next): filter out based on base_move; only check once for each
+ triple of moves; how to deal with different movesets?
* Light optimal solver: use drud table instead of khuge, with tricks as above
and one more trick: if the last move is 180° avoid computing inverse cube
and just use previous values for all 3 axes.
diff --git a/nissy b/nissy
Binary files differ.
diff --git a/src/steps.c b/src/steps.c
@@ -1162,74 +1162,76 @@ static int
estimate_optimal_HTM(DfsArg *arg)
{
int target, ret;
- Move lbase;
+ Move bl1;
Cube aux;
- target = arg->d - arg->current_alg->len;
- ret = -1;
- arg->inverse = (Cube){0};
+ ret = -1;
+ target = arg->d - arg->current_alg->len;
+ bl1 = base_move(arg->last1);
+ arg->inverse = (Cube){0};
arg->badmovesinv = 0;
- arg->badmoves = 0;
+ arg->badmoves = 0;
+ /* Corners */
arg->ed->corners = ptableval(&pd_corners_HTM, arg->cube);
UPDATECHECKSTOP(ret, arg->ed->corners, target);
+ /* Normal probing */
arg->ed->normal_ud = ptableval(&pd_khuge_HTM, arg->cube);
UPDATECHECKSTOP(ret, arg->ed->normal_ud, target);
- if (arg->ed->normal_ud == target) {
- arg->badmovesinv |= (1<<U) | (1<<U2) | (1<<U3) |
- (1<<D) | (1<<D2) | (1<<D3);
- }
-
aux = apply_trans(fd, arg->cube);
arg->ed->normal_fb = ptableval(&pd_khuge_HTM, aux);
UPDATECHECKSTOP(ret, arg->ed->normal_fb, target);
- if (arg->ed->normal_fb == target) {
- arg->badmovesinv |= (1<<F) | (1<<F2) | (1<<F3) |
- (1<<B) | (1<<B2) | (1<<B3);
- }
-
aux = apply_trans(rf, arg->cube);
arg->ed->normal_rl = ptableval(&pd_khuge_HTM, aux);
UPDATECHECKSTOP(ret, arg->ed->normal_rl, target);
- if (arg->ed->normal_rl == target) {
- arg->badmovesinv |= (1<<R) | (1<<R2) | (1<<R3) |
- (1<<L) | (1<<L2) | (1<<L3);
- }
+ /* If ret == 0, it's solved (corners + triple slice solved) */
if (ret == 0)
return ret;
+ /* Michel de Bondt's trick*/
if (arg->ed->normal_ud == arg->ed->normal_fb &&
arg->ed->normal_fb == arg->ed->normal_rl)
UPDATECHECKSTOP(ret, arg->ed->normal_ud + 1, target);
- /* TODO: avoid computation of inverse if unnecessary */
- lbase = base_move(arg->last1);
+ /* Inverse probing */
arg->inverse = inverse_cube(arg->cube);
-
- if ((lbase != U && lbase != D) || (arg->ed->inverse_ud == -1)) {
+ if ((bl1 != U && bl1 != D) || (arg->ed->inverse_ud == -1)) {
arg->ed->inverse_ud = ptableval(&pd_khuge_HTM, arg->inverse);
}
UPDATECHECKSTOP(ret, arg->ed->inverse_ud, target);
-
- if ((lbase != F && lbase != B) || (arg->ed->inverse_fb == -1)) {
+ if ((bl1 != F && bl1 != B) || (arg->ed->inverse_fb == -1)) {
aux = apply_trans(fd, arg->inverse);
arg->ed->inverse_fb = ptableval(&pd_khuge_HTM, aux);
}
UPDATECHECKSTOP(ret, arg->ed->inverse_fb, target);
-
- if ((lbase != R && lbase != L) || (arg->ed->inverse_rl == -1)) {
+ if ((bl1 != R && bl1 != L) || (arg->ed->inverse_rl == -1)) {
aux = apply_trans(rf, arg->inverse);
arg->ed->inverse_rl = ptableval(&pd_khuge_HTM, aux);
}
UPDATECHECKSTOP(ret, arg->ed->inverse_rl, target);
+ /* Michel de Bondt's trick*/
if (arg->ed->inverse_ud == arg->ed->inverse_fb &&
arg->ed->inverse_fb == arg->ed->inverse_rl) {
UPDATECHECKSTOP(ret, arg->ed->inverse_ud + 1, target);
}
+ /* nxopt trick */
+ if (arg->ed->normal_ud == target) {
+ arg->badmovesinv |= (1<<U) | (1<<U2) | (1<<U3) |
+ (1<<D) | (1<<D2) | (1<<D3);
+ }
+ if (arg->ed->normal_fb == target) {
+ arg->badmovesinv |= (1<<F) | (1<<F2) | (1<<F3) |
+ (1<<B) | (1<<B2) | (1<<B3);
+ }
+ if (arg->ed->normal_rl == target) {
+ arg->badmovesinv |= (1<<R) | (1<<R2) | (1<<R3) |
+ (1<<L) | (1<<L2) | (1<<L3);
+ }
+
if (arg->ed->inverse_ud == target) {
arg->badmoves |= (1<<U) | (1<<U2) | (1<<U3) |
(1<<D) | (1<<D2) | (1<<D3);