diff options
30 files changed, 94 insertions, 6 deletions
| @@ -1,5 +1,7 @@ | |||
| 1 | ## (find better name) H48 solver, ideas | 1 | ## (find better name) H48 solver, ideas |
| 2 | 2 | ||
| 3 | TODO next: implement cosep coordinate | ||
| 4 | |||
| 3 | First compute co + csep. Use csep as a binary number (2^8 instead of 70, | 5 | First compute co + csep. Use csep as a binary number (2^8 instead of 70, |
| 4 | loose a factor of 3.66 but still fits in a few megabytes or less). Use | 6 | loose a factor of 3.66 but still fits in a few megabytes or less). Use |
| 5 | co + csep as an index in a table whose entries have: 6 bits for ttrep, | 7 | co + csep as an index in a table whose entries have: 6 bits for ttrep, |
| @@ -509,6 +509,8 @@ _static_inline bool equal_fast(cube_fast_t, cube_fast_t); | |||
| 509 | _static_inline bool issolved_fast(cube_fast_t); | 509 | _static_inline bool issolved_fast(cube_fast_t); |
| 510 | _static_inline cube_fast_t invertco_fast(cube_fast_t); | 510 | _static_inline cube_fast_t invertco_fast(cube_fast_t); |
| 511 | _static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t); | 511 | _static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t); |
| 512 | |||
| 513 | _static_inline int64_t coord_fast_co(cube_fast_t); | ||
| 512 | _static_inline int64_t coord_fast_eo(cube_fast_t); | 514 | _static_inline int64_t coord_fast_eo(cube_fast_t); |
| 513 | 515 | ||
| 514 | _static_inline cube_fast_t | 516 | _static_inline cube_fast_t |
| @@ -637,6 +639,22 @@ compose_fast(cube_fast_t c1, cube_fast_t c2) | |||
| 637 | } | 639 | } |
| 638 | 640 | ||
| 639 | _static_inline int64_t | 641 | _static_inline int64_t |
| 642 | coord_fast_co(cube_fast_t c) | ||
| 643 | { | ||
| 644 | cube_fast_t co, shifted; | ||
| 645 | int64_t mem[4], ret, i, p; | ||
| 646 | |||
| 647 | co = _mm256_and_si256(c, _co2_avx2); | ||
| 648 | _mm256_storeu_si256((__m256i *)mem, co); | ||
| 649 | |||
| 650 | mem[0] >>= 5L; | ||
| 651 | for (i = 0, ret = 0, p = 1; i < 7; i++, mem[0] >>= 8L, p *= 3) | ||
| 652 | ret += (mem[0] & 3L) * p; | ||
| 653 | |||
| 654 | return ret; | ||
| 655 | } | ||
| 656 | |||
| 657 | _static_inline int64_t | ||
| 640 | coord_fast_eo(cube_fast_t c) | 658 | coord_fast_eo(cube_fast_t c) |
| 641 | { | 659 | { |
| 642 | cube_fast_t eo, shifted; | 660 | cube_fast_t eo, shifted; |
| @@ -689,6 +707,8 @@ _static_inline bool equal_fast(cube_fast_t, cube_fast_t); | |||
| 689 | _static_inline bool issolved_fast(cube_fast_t); | 707 | _static_inline bool issolved_fast(cube_fast_t); |
| 690 | _static_inline cube_fast_t invertco_fast(cube_fast_t); | 708 | _static_inline cube_fast_t invertco_fast(cube_fast_t); |
| 691 | _static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t); | 709 | _static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t); |
| 710 | |||
| 711 | _static_inline int64_t coord_fast_co(cube_fast_t); | ||
| 692 | _static_inline int64_t coord_fast_eo(cube_fast_t); | 712 | _static_inline int64_t coord_fast_eo(cube_fast_t); |
| 693 | 713 | ||
| 694 | _static_inline cube_fast_t | 714 | _static_inline cube_fast_t |
| @@ -812,14 +832,25 @@ compose_fast(cube_fast_t c1, cube_fast_t c2) | |||
| 812 | } | 832 | } |
| 813 | 833 | ||
| 814 | _static_inline int64_t | 834 | _static_inline int64_t |
| 815 | coord_fast_eo(cube_fast_t cube) | 835 | coord_fast_co(cube_fast_t c) |
| 816 | { | 836 | { |
| 817 | int i, p; | 837 | int i, p; |
| 818 | int64_t ret; | 838 | int64_t ret; |
| 819 | 839 | ||
| 820 | ret = 0; | 840 | for (ret = 0, i = 0, p = 1; i < 7; i++, p *= 3) |
| 821 | for (i = 1, p = 1; i < 12; i++, p *= 2) | 841 | ret += p * (c.corner[i] >> _coshift); |
| 822 | ret += p * (cube.edge[i] >> 4); | 842 | |
| 843 | return ret; | ||
| 844 | } | ||
| 845 | |||
| 846 | _static_inline int64_t | ||
| 847 | coord_fast_eo(cube_fast_t c) | ||
| 848 | { | ||
| 849 | int i, p; | ||
| 850 | int64_t ret; | ||
| 851 | |||
| 852 | for (ret = 0, i = 1, p = 1; i < 12; i++, p *= 2) | ||
| 853 | ret += p * (c.edge[i] >> _eoshift); | ||
| 823 | 854 | ||
| 824 | return ret; | 855 | return ret; |
| 825 | } | 856 | } |
| @@ -1600,6 +1631,12 @@ moveaxis(uint8_t move) | |||
| 1600 | } | 1631 | } |
| 1601 | 1632 | ||
| 1602 | /****************************************************************************** | 1633 | /****************************************************************************** |
| 1634 | Section: auxiliary procedures for H48 optimal solver (temporary) | ||
| 1635 | ******************************************************************************/ | ||
| 1636 | |||
| 1637 | |||
| 1638 | |||
| 1639 | /****************************************************************************** | ||
| 1603 | Section: solvers | 1640 | Section: solvers |
| 1604 | 1641 | ||
| 1605 | Here you can find the implementation of all the solving algorithms. | 1642 | Here you can find the implementation of all the solving algorithms. |
diff --git a/test/071_coord_eo/coord_eo_tests.c b/test/071_coord_eo/coord_eo_tests.c index 6c18a73..85128e0 100644 --- a/test/071_coord_eo/coord_eo_tests.c +++ b/test/071_coord_eo/coord_eo_tests.c | |||
| @@ -7,7 +7,7 @@ int main(void) { | |||
| 7 | char str[STRLENMAX]; | 7 | char str[STRLENMAX]; |
| 8 | cube_t cube; | 8 | cube_t cube; |
| 9 | cube_fast_t fast; | 9 | cube_fast_t fast; |
| 10 | int16_t result; | 10 | int64_t result; |
| 11 | 11 | ||
| 12 | fgets(str, STRLENMAX, stdin); | 12 | fgets(str, STRLENMAX, stdin); |
| 13 | cube = readcube("H48", str); | 13 | cube = readcube("H48", str); |
| @@ -15,7 +15,7 @@ int main(void) { | |||
| 15 | 15 | ||
| 16 | result = coord_fast_eo(fast); | 16 | result = coord_fast_eo(fast); |
| 17 | 17 | ||
| 18 | printf("%" PRId16 "\n", result); | 18 | printf("%" PRId64 "\n", result); |
| 19 | 19 | ||
| 20 | return 0; | 20 | return 0; |
| 21 | } | 21 | } |
diff --git a/test/072_coord_co/00_solved.in b/test/072_coord_co/00_solved.in new file mode 100644 index 0000000..dff224d --- /dev/null +++ b/test/072_coord_co/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/072_coord_co/00_solved.out b/test/072_coord_co/00_solved.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/00_solved.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/01_U.in b/test/072_coord_co/01_U.in new file mode 100644 index 0000000..b5b36ad --- /dev/null +++ b/test/072_coord_co/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/072_coord_co/01_U.out b/test/072_coord_co/01_U.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/01_U.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/02_U2.in b/test/072_coord_co/02_U2.in new file mode 100644 index 0000000..316ad57 --- /dev/null +++ b/test/072_coord_co/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/072_coord_co/02_U2.out b/test/072_coord_co/02_U2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/02_U2.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/03_U3.in b/test/072_coord_co/03_U3.in new file mode 100644 index 0000000..7721ab5 --- /dev/null +++ b/test/072_coord_co/03_U3.in | |||
| @@ -0,0 +1 @@ | |||
| UL0 UR0 DB0 DF0 UF0 UB0 DL0 DR0 FR0 FL0 BL0 BR0 UFL0 UBR0 DFL0 DBR0 UBL0 UFR0 DFR0 DBL0 | |||
diff --git a/test/072_coord_co/03_U3.out b/test/072_coord_co/03_U3.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/03_U3.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/04_D.in b/test/072_coord_co/04_D.in new file mode 100644 index 0000000..cf4f816 --- /dev/null +++ b/test/072_coord_co/04_D.in | |||
| @@ -0,0 +1 @@ | |||
| UF0 UB0 DR0 DL0 UR0 UL0 DB0 DF0 FR0 FL0 BL0 BR0 UFR0 UBL0 DBL0 DFR0 UFL0 UBR0 DFL0 DBR0 | |||
diff --git a/test/072_coord_co/04_D.out b/test/072_coord_co/04_D.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/04_D.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/07_R.in b/test/072_coord_co/07_R.in new file mode 100644 index 0000000..8c8fcb3 --- /dev/null +++ b/test/072_coord_co/07_R.in | |||
| @@ -0,0 +1 @@ | |||
| UF0 UB0 DB0 DF0 FR0 UL0 DL0 BR0 DR0 FL0 BL0 UR0 DFR2 UBL0 DFL0 UBR2 UFL0 UFR1 DBR1 DBL0 | |||
diff --git a/test/072_coord_co/07_R.out b/test/072_coord_co/07_R.out new file mode 100644 index 0000000..1f3d8a7 --- /dev/null +++ b/test/072_coord_co/07_R.out | |||
| @@ -0,0 +1 @@ | |||
| 1028 | |||
diff --git a/test/072_coord_co/08_R2.in b/test/072_coord_co/08_R2.in new file mode 100644 index 0000000..90765e2 --- /dev/null +++ b/test/072_coord_co/08_R2.in | |||
| @@ -0,0 +1 @@ | |||
| UF0 UB0 DB0 DF0 DR0 UL0 DL0 UR0 BR0 FL0 BL0 FR0 DBR0 UBL0 DFL0 UFR0 UFL0 DFR0 UBR0 DBL0 | |||
diff --git a/test/072_coord_co/08_R2.out b/test/072_coord_co/08_R2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/08_R2.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/10_L.in b/test/072_coord_co/10_L.in new file mode 100644 index 0000000..0b0565c --- /dev/null +++ b/test/072_coord_co/10_L.in | |||
| @@ -0,0 +1 @@ | |||
| UF0 UB0 DB0 DF0 UR0 BL0 FL0 DR0 FR0 UL0 DL0 BR0 UFR0 DBL2 UFL2 DBR0 UBL1 UBR0 DFR0 DFL1 | |||
diff --git a/test/072_coord_co/10_L.out b/test/072_coord_co/10_L.out new file mode 100644 index 0000000..f96ac06 --- /dev/null +++ b/test/072_coord_co/10_L.out | |||
| @@ -0,0 +1 @@ | |||
| 105 | |||
diff --git a/test/072_coord_co/13_F.in b/test/072_coord_co/13_F.in new file mode 100644 index 0000000..e805af8 --- /dev/null +++ b/test/072_coord_co/13_F.in | |||
| @@ -0,0 +1 @@ | |||
| FL1 UB0 DB0 FR1 UR0 UL0 DL0 DR0 UF1 DF1 BL0 BR0 UFL1 UBL0 DFR1 DBR0 DFL2 UBR0 UFR2 DBL0 | |||
diff --git a/test/072_coord_co/13_F.out b/test/072_coord_co/13_F.out new file mode 100644 index 0000000..86868c5 --- /dev/null +++ b/test/072_coord_co/13_F.out | |||
| @@ -0,0 +1 @@ | |||
| 1630 | |||
diff --git a/test/072_coord_co/14_F2.in b/test/072_coord_co/14_F2.in new file mode 100644 index 0000000..8aa701f --- /dev/null +++ b/test/072_coord_co/14_F2.in | |||
| @@ -0,0 +1 @@ | |||
| DF0 UB0 DB0 UF0 UR0 UL0 DL0 DR0 FL0 FR0 BL0 BR0 DFL0 UBL0 UFR0 DBR0 DFR0 UBR0 UFL0 DBL0 | |||
diff --git a/test/072_coord_co/14_F2.out b/test/072_coord_co/14_F2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/14_F2.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/16_B.in b/test/072_coord_co/16_B.in new file mode 100644 index 0000000..f7fb13c --- /dev/null +++ b/test/072_coord_co/16_B.in | |||
| @@ -0,0 +1 @@ | |||
| UF0 BR1 BL1 DF0 UR0 UL0 DL0 DR0 FR0 FL0 UB1 DB1 UFR0 UBR1 DFL0 DBL1 UFL0 DBR2 DFR0 UBL2 | |||
diff --git a/test/072_coord_co/16_B.out b/test/072_coord_co/16_B.out new file mode 100644 index 0000000..1c599d4 --- /dev/null +++ b/test/072_coord_co/16_B.out | |||
| @@ -0,0 +1 @@ | |||
| 516 | |||
diff --git a/test/072_coord_co/17_B2.in b/test/072_coord_co/17_B2.in new file mode 100644 index 0000000..9b33e35 --- /dev/null +++ b/test/072_coord_co/17_B2.in | |||
| @@ -0,0 +1 @@ | |||
| UF0 DB0 UB0 DF0 UR0 UL0 DL0 DR0 FR0 FL0 BR0 BL0 UFR0 DBR0 DFL0 UBL0 UFL0 DBL0 DFR0 UBR0 | |||
diff --git a/test/072_coord_co/17_B2.out b/test/072_coord_co/17_B2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/072_coord_co/17_B2.out | |||
| @@ -0,0 +1 @@ | |||
| 0 | |||
diff --git a/test/072_coord_co/20_scrambled.in b/test/072_coord_co/20_scrambled.in new file mode 100644 index 0000000..274d30b --- /dev/null +++ b/test/072_coord_co/20_scrambled.in | |||
| @@ -0,0 +1,3 @@ | |||
| 1 | UL0 BL0 BR1 DL0 FR0 DF0 DB1 DR1 UB0 FL0 UF0 UR1 DFL0 UFR1 DBR1 UBR2 DBL2 DFR0 UFL1 UBL2 | ||
| 2 | |||
| 3 | // 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/072_coord_co/20_scrambled.out b/test/072_coord_co/20_scrambled.out new file mode 100644 index 0000000..6943e4d --- /dev/null +++ b/test/072_coord_co/20_scrambled.out | |||
| @@ -0,0 +1 @@ | |||
| 957 | |||
diff --git a/test/072_coord_co/coord_co_tests.c b/test/072_coord_co/coord_co_tests.c new file mode 100644 index 0000000..bb061e5 --- /dev/null +++ b/test/072_coord_co/coord_co_tests.c | |||
| @@ -0,0 +1,21 @@ | |||
| 1 | #include "../test.h" | ||
| 2 | |||
| 3 | int64_t coord_fast_co(cube_fast_t); | ||
| 4 | cube_fast_t cubetofast(cube_t); | ||
| 5 | |||
| 6 | int main(void) { | ||
| 7 | char str[STRLENMAX]; | ||
| 8 | cube_t cube; | ||
| 9 | cube_fast_t fast; | ||
| 10 | int64_t result; | ||
| 11 | |||
| 12 | fgets(str, STRLENMAX, stdin); | ||
| 13 | cube = readcube("H48", str); | ||
| 14 | fast = cubetofast(cube); | ||
| 15 | |||
| 16 | result = coord_fast_co(fast); | ||
| 17 | |||
| 18 | printf("%" PRId64 "\n", result); | ||
| 19 | |||
| 20 | return 0; | ||
| 21 | } | ||
