h48

A prototype for an optimal Rubik's cube solver, work in progress.
git clone https://git.tronto.net/h48
Download | Log | Files | Refs | README | LICENSE

commit 869d852bd7bf0531af4605773615c0bf0c911d48
parent 1809d7b212128fcdcb481002a17db5dc97a15e03
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Fri, 17 May 2024 19:45:11 +0200

Prepare for next step

Diffstat:
MTODO.txt | 2+-
Msrc/cube_avx2.h | 8++++++++
Msrc/cube_portable.h | 8++++++++
Msrc/solve_h48.h | 13+++----------
Atest/078_invcoord_esep/00_solved.in | 1+
Atest/078_invcoord_esep/00_solved.out | 1+
Atest/078_invcoord_esep/01_U.in | 1+
Atest/078_invcoord_esep/01_U.out | 1+
Atest/078_invcoord_esep/02_U2.in | 1+
Atest/078_invcoord_esep/02_U2.out | 1+
Atest/078_invcoord_esep/20_scrambled.in | 3+++
Atest/078_invcoord_esep/20_scrambled.out | 1+
Atest/078_invcoord_esep/21_swapaxis_FB.in | 1+
Atest/078_invcoord_esep/21_swapaxis_FB.out | 1+
Atest/078_invcoord_esep/22_swapaxis_RL.in | 1+
Atest/078_invcoord_esep/22_swapaxis_RL.out | 1+
Atest/078_invcoord_esep/23_swapaxis_UD.in | 1+
Atest/078_invcoord_esep/23_swapaxis_UD.out | 1+
Atest/078_invcoord_esep/invcoord_esep_tests.c | 24++++++++++++++++++++++++
19 files changed, 60 insertions(+), 11 deletions(-)

diff --git a/TODO.txt b/TODO.txt @@ -1,8 +1,8 @@ In progress: go back to nissy-style BFS for eosep data computation - (done) compute selfsim and cocsep representatives - (done) implement set_eo_fast for invcoord_h48 + - for invcoord_h48 remove erep, implement inverse esep coord - add unit tests for invcoord_h48 (compute tables, if needed) - - in gendata_esep, compute representatives for esep inverse coordinate - change to BFS TODO pruning tables: diff --git a/src/cube_avx2.h b/src/cube_avx2.h @@ -28,6 +28,7 @@ _static_inline int64_t coord_fast_esep(cube_fast_t); _static_inline void copy_corners_fast(cube_fast_t *, cube_fast_t); _static_inline void copy_edges_fast(cube_fast_t *, cube_fast_t); _static_inline void set_eo_fast(cube_fast_t *, int64_t); +_static_inline cube_fast_t invcoord_fast_esep(int64_t); _static_inline cube_fast_t fastcube( @@ -268,3 +269,10 @@ set_eo_fast(cube_fast_t *cube, int64_t eo) *cube = _mm256_andnot_si256(_eo_avx2, *cube); *cube = _mm256_or_si256(*cube, veo); } + +_static_inline cube_fast_t +invcoord_fast_esep(int64_t esep) +{ + /* TODO */ + return cubetofast(zero); +} diff --git a/src/cube_portable.h b/src/cube_portable.h @@ -22,6 +22,7 @@ _static_inline int64_t coord_fast_esep(cube_fast_t); _static_inline void copy_corners_fast(cube_fast_t *, cube_fast_t); _static_inline void copy_edges_fast(cube_fast_t *, cube_fast_t); _static_inline void set_eo_fast(cube_fast_t *, int64_t); +_static_inline cube_fast_t invcoord_fast_esep(int64_t); _static_inline cube_fast_t fastcube( @@ -251,3 +252,10 @@ set_eo_fast(cube_fast_t *cube, int64_t eo) } cube->edge[0] = (cube->edge[0] & ~_eobit) | (_eobit * (sum%2)); } + +_static_inline cube_fast_t +invcoord_fast_esep(int64_t esep) +{ + /* TODO */ + return cubetofast(zero); +} diff --git a/src/solve_h48.h b/src/solve_h48.h @@ -39,8 +39,7 @@ typedef struct { } dfsarg_esep_t; _static_inline int64_t coord_h48(cube_fast_t, const uint32_t *, uint8_t); -_static_inline cube_fast_t invcoord_h48(int64_t, const uint32_t *, - const cube_fast_t *, const cube_fast_t *, uint8_t); +_static_inline cube_fast_t invcoord_h48(int64_t, const cube_fast_t *, uint8_t); _static size_t gendata_cocsep(void *, uint64_t *, cube_fast_t *); _static uint32_t gendata_cocsep_dfs(dfsarg_cocsep_t *); @@ -77,13 +76,7 @@ coord_h48(cube_fast_t c, const uint32_t *cocsepdata, uint8_t h) } _static_inline cube_fast_t -invcoord_h48( - int64_t i, - const uint32_t *cocsepdata, - const cube_fast_t *crep, - const cube_fast_t *erep, - uint8_t h -) +invcoord_h48(int64_t i, const cube_fast_t *crep, uint8_t h) { cube_fast_t ret; int64_t coclass, ee, esep, eo; @@ -96,8 +89,8 @@ invcoord_h48( esep = ee >> h; eo = (ee & ((1<<h)-1)) << (11-h); + ret = invcoord_fast_esep(esep); copy_corners_fast(&ret, crep[coclass]); - copy_edges_fast(&ret, erep[esep]); set_eo_fast(&ret, eo); return ret; diff --git a/test/078_invcoord_esep/00_solved.in b/test/078_invcoord_esep/00_solved.in @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 diff --git a/test/078_invcoord_esep/00_solved.out b/test/078_invcoord_esep/00_solved.out @@ -0,0 +1 @@ +0 diff --git a/test/078_invcoord_esep/01_U.in b/test/078_invcoord_esep/01_U.in @@ -0,0 +1 @@ +UR0 UL0 DB0 DF0 UB0 UF0 DL0 DR0 FR0 FL0 BL0 BR0 UBR0 UFL0 DFL0 DBR0 UFR0 UBL0 DFR0 DBL0 diff --git a/test/078_invcoord_esep/01_U.out b/test/078_invcoord_esep/01_U.out @@ -0,0 +1 @@ +55 diff --git a/test/078_invcoord_esep/02_U2.in b/test/078_invcoord_esep/02_U2.in @@ -0,0 +1 @@ +UB0 UF0 DB0 DF0 UL0 UR0 DL0 DR0 FR0 FL0 BL0 BR0 UBL0 UFR0 DFL0 DBR0 UBR0 UFL0 DFR0 DBL0 diff --git a/test/078_invcoord_esep/02_U2.out b/test/078_invcoord_esep/02_U2.out @@ -0,0 +1 @@ +0 diff --git a/test/078_invcoord_esep/20_scrambled.in b/test/078_invcoord_esep/20_scrambled.in @@ -0,0 +1,3 @@ +UL0 BL0 BR1 DL0 FR0 DF0 DB1 DR1 UB0 FL0 UF0 UR1 DFL0 UFR1 DBR1 UBR2 DBL2 DFR0 UFL1 UBL2 + +// Scramble: U R D' L D' F L2 D L F B D2 B' L2 F U2 L2 D2 R2 L2 B' diff --git a/test/078_invcoord_esep/20_scrambled.out b/test/078_invcoord_esep/20_scrambled.out @@ -0,0 +1 @@ +22248 diff --git a/test/078_invcoord_esep/21_swapaxis_FB.in b/test/078_invcoord_esep/21_swapaxis_FB.in @@ -0,0 +1 @@ +FR0 BR0 BL0 FL0 UR0 UL0 DL0 DR0 DF0 UF0 UB0 DB0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 diff --git a/test/078_invcoord_esep/21_swapaxis_FB.out b/test/078_invcoord_esep/21_swapaxis_FB.out @@ -0,0 +1 @@ +34649 diff --git a/test/078_invcoord_esep/22_swapaxis_RL.in b/test/078_invcoord_esep/22_swapaxis_RL.in @@ -0,0 +1 @@ +UF0 UB0 DB0 DF0 FR0 FL0 BL0 BR0 DR0 DL0 UL0 UR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 diff --git a/test/078_invcoord_esep/22_swapaxis_RL.out b/test/078_invcoord_esep/22_swapaxis_RL.out @@ -0,0 +1 @@ +4830 diff --git a/test/078_invcoord_esep/23_swapaxis_UD.in b/test/078_invcoord_esep/23_swapaxis_UD.in @@ -0,0 +1 @@ +UR0 UL0 DL0 DR0 UB0 UF0 DF0 DB0 FR0 FL0 BL0 BR0 UFR0 UBL0 DFL0 DBR0 UFL0 UBR0 DFR0 DBL0 diff --git a/test/078_invcoord_esep/23_swapaxis_UD.out b/test/078_invcoord_esep/23_swapaxis_UD.out @@ -0,0 +1 @@ +69 diff --git a/test/078_invcoord_esep/invcoord_esep_tests.c b/test/078_invcoord_esep/invcoord_esep_tests.c @@ -0,0 +1,24 @@ +#include "../test.h" + +int64_t coord_fast_esep(cube_fast_t); +cube_fast_t invcoord_fast_esep(int64_t); +cube_fast_t cubetofast(cube_t); + +int main(void) { + char str[STRLENMAX]; + cube_t cube; + cube_fast_t fast; + int64_t i; + + fgets(str, STRLENMAX, stdin); + cube = readcube("H48", str); + fast = cubetofast(cube); + + i = coord_fast_esep(fast); + fast = invcoord_fast_esep(i); + i = coord_fast_esep(fast); + + printf("%" PRId64 "\n", i); + + return 0; +}