aboutsummaryrefslogtreecommitdiff
path: root/cube.c
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2023-11-13 21:49:30 +0100
committerSebastiano Tronto <sebastiano@tronto.net>2023-11-13 21:49:30 +0100
commit4444e53eaadf33aa309a40849730be332ca6d0de (patch)
tree0dca7c5d0a83b28f5010f12dae8e74caff7e05fe /cube.c
parentd0c592bdc3beb12074f085ab085dd90de9b8e643 (diff)
downloadnissy-core-4444e53eaadf33aa309a40849730be332ca6d0de.tar.gz
nissy-core-4444e53eaadf33aa309a40849730be332ca6d0de.zip
Tidy up; made things testable
Diffstat (limited to 'cube.c')
-rw-r--r--cube.c1081
1 files changed, 561 insertions, 520 deletions
diff --git a/cube.c b/cube.c
index 0d32627..47c4329 100644
--- a/cube.c
+++ b/cube.c
@@ -8,6 +8,8 @@
8 8
9#ifdef DEBUG 9#ifdef DEBUG
10#include <stdio.h> 10#include <stdio.h>
11#define _static
12#define _static_inline
11#define DBG_LOG(...) fprintf(stderr, __VA_ARGS__) 13#define DBG_LOG(...) fprintf(stderr, __VA_ARGS__)
12#define DBG_WARN(condition, ...) if (!(condition)) DBG_LOG(__VA_ARGS__); 14#define DBG_WARN(condition, ...) if (!(condition)) DBG_LOG(__VA_ARGS__);
13#define DBG_ASSERT(condition, retval, ...) \ 15#define DBG_ASSERT(condition, retval, ...) \
@@ -16,6 +18,8 @@
16 return retval; \ 18 return retval; \
17 } 19 }
18#else 20#else
21#define _static static
22#define _static_inline static inline
19#define DBG_LOG(...) 23#define DBG_LOG(...)
20#define DBG_WARN(condition, ...) 24#define DBG_WARN(condition, ...)
21#define DBG_ASSERT(condition, retval, ...) 25#define DBG_ASSERT(condition, retval, ...)
@@ -130,7 +134,7 @@ Section: constants, strings and other stuff
130#define _eflip 0x10U 134#define _eflip 0x10U
131#define _error 0xFFU 135#define _error 0xFFU
132 136
133static char *cornerstr[] = { 137_static char *cornerstr[] = {
134 [_c_ufr] = "UFR", 138 [_c_ufr] = "UFR",
135 [_c_ubl] = "UBL", 139 [_c_ubl] = "UBL",
136 [_c_dfl] = "DFL", 140 [_c_dfl] = "DFL",
@@ -141,7 +145,7 @@ static char *cornerstr[] = {
141 [_c_dbl] = "DBL" 145 [_c_dbl] = "DBL"
142}; 146};
143 147
144static char *cornerstralt[] = { 148_static char *cornerstralt[] = {
145 [_c_ufr] = "URF", 149 [_c_ufr] = "URF",
146 [_c_ubl] = "ULB", 150 [_c_ubl] = "ULB",
147 [_c_dfl] = "DLF", 151 [_c_dfl] = "DLF",
@@ -152,7 +156,7 @@ static char *cornerstralt[] = {
152 [_c_dbl] = "DLB" 156 [_c_dbl] = "DLB"
153}; 157};
154 158
155static char *edgestr[] = { 159_static char *edgestr[] = {
156 [_e_uf] = "UF", 160 [_e_uf] = "UF",
157 [_e_ub] = "UB", 161 [_e_ub] = "UB",
158 [_e_db] = "DB", 162 [_e_db] = "DB",
@@ -167,7 +171,7 @@ static char *edgestr[] = {
167 [_e_br] = "BR" 171 [_e_br] = "BR"
168}; 172};
169 173
170static char *movestr[] = { 174_static char *movestr[] = {
171 [U] = "U", 175 [U] = "U",
172 [U2] = "U2", 176 [U2] = "U2",
173 [U3] = "U'", 177 [U3] = "U'",
@@ -188,7 +192,7 @@ static char *movestr[] = {
188 [B3] = "B'", 192 [B3] = "B'",
189}; 193};
190 194
191static char *transstr[] = { 195_static char *transstr[] = {
192 [UFr] = "rotation UF", 196 [UFr] = "rotation UF",
193 [UFm] = "mirrored UF", 197 [UFm] = "mirrored UF",
194 [ULr] = "rotation UL", 198 [ULr] = "rotation UL",
@@ -252,7 +256,6 @@ Note: the #ifdef below is closed in the next section.
252 256
253typedef __m256i cube_fast_t; 257typedef __m256i cube_fast_t;
254 258
255#define _co_avx2 _mm256_set_epi64x(0, 0, 0, 0xF0F0F0F0F0F0F0F0)
256#define _co2_avx2 _mm256_set_epi64x(0, 0, 0, 0x6060606060606060) 259#define _co2_avx2 _mm256_set_epi64x(0, 0, 0, 0x6060606060606060)
257#define _cocw_avx2 _mm256_set_epi64x(0, 0, 0, 0x2020202020202020) 260#define _cocw_avx2 _mm256_set_epi64x(0, 0, 0, 0x2020202020202020)
258#define _eo_avx2 _mm256_set_epi64x(0x10101010, 0x1010101010101010, 0, 0) 261#define _eo_avx2 _mm256_set_epi64x(0x10101010, 0x1010101010101010, 0, 0)
@@ -262,14 +265,17 @@ typedef __m256i cube_fast_t;
262 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0 \ 265 0, 0, 0, 0, 0, 0, 0, 0, 7, 6, 5, 4, 3, 2, 1, 0 \
263) 266)
264 267
265static cube_fast_t cubetofast(cube_t); 268_static cube_fast_t cubetofast(cube_t);
266static cube_t fasttocube(cube_fast_t); 269_static cube_t fasttocube(cube_fast_t);
267static inline bool equal_fast(cube_fast_t, cube_fast_t); 270_static_inline bool equal_fast(cube_fast_t, cube_fast_t);
268static inline cube_fast_t invertco_fast(cube_fast_t); 271_static_inline bool issolved_fast(cube_fast_t);
269static inline cube_fast_t inverse_fast(cube_fast_t); 272_static_inline cube_fast_t invertco_fast(cube_fast_t);
270static inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t); 273_static_inline cube_fast_t cleanaftershuffle(cube_fast_t);
274_static_inline cube_fast_t inverse_fast(cube_fast_t);
275_static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t);
276_static_inline int64_t coord_fast_eo(cube_fast_t);
271 277
272static inline cube_fast_t 278_static_inline cube_fast_t
273_move_U(cube_fast_t c) 279_move_U(cube_fast_t c)
274{ 280{
275 cube_fast_t m = _mm256_set_epi8( 281 cube_fast_t m = _mm256_set_epi8(
@@ -280,7 +286,7 @@ _move_U(cube_fast_t c)
280 return compose_fast(c, m); 286 return compose_fast(c, m);
281} 287}
282 288
283static inline cube_fast_t 289_static_inline cube_fast_t
284_move_U2(cube_fast_t c) 290_move_U2(cube_fast_t c)
285{ 291{
286 cube_fast_t m = _mm256_set_epi8( 292 cube_fast_t m = _mm256_set_epi8(
@@ -291,7 +297,7 @@ _move_U2(cube_fast_t c)
291 return compose_fast(c, m); 297 return compose_fast(c, m);
292} 298}
293 299
294static inline cube_fast_t 300_static_inline cube_fast_t
295_move_U3(cube_fast_t c) 301_move_U3(cube_fast_t c)
296{ 302{
297 cube_fast_t m = _mm256_set_epi8( 303 cube_fast_t m = _mm256_set_epi8(
@@ -302,7 +308,7 @@ _move_U3(cube_fast_t c)
302 return compose_fast(c, m); 308 return compose_fast(c, m);
303} 309}
304 310
305static inline cube_fast_t 311_static_inline cube_fast_t
306_move_D(cube_fast_t c) 312_move_D(cube_fast_t c)
307{ 313{
308 cube_fast_t m = _mm256_set_epi8( 314 cube_fast_t m = _mm256_set_epi8(
@@ -313,7 +319,7 @@ _move_D(cube_fast_t c)
313 return compose_fast(c, m); 319 return compose_fast(c, m);
314} 320}
315 321
316static inline cube_fast_t 322_static_inline cube_fast_t
317_move_D2(cube_fast_t c) 323_move_D2(cube_fast_t c)
318{ 324{
319 cube_fast_t m = _mm256_set_epi8( 325 cube_fast_t m = _mm256_set_epi8(
@@ -324,7 +330,7 @@ _move_D2(cube_fast_t c)
324 return compose_fast(c, m); 330 return compose_fast(c, m);
325} 331}
326 332
327static inline cube_fast_t 333_static_inline cube_fast_t
328_move_D3(cube_fast_t c) 334_move_D3(cube_fast_t c)
329{ 335{
330 cube_fast_t m = _mm256_set_epi8( 336 cube_fast_t m = _mm256_set_epi8(
@@ -335,7 +341,7 @@ _move_D3(cube_fast_t c)
335 return compose_fast(c, m); 341 return compose_fast(c, m);
336} 342}
337 343
338static inline cube_fast_t 344_static_inline cube_fast_t
339_move_R(cube_fast_t c) 345_move_R(cube_fast_t c)
340{ 346{
341 cube_fast_t m = _mm256_set_epi8( 347 cube_fast_t m = _mm256_set_epi8(
@@ -346,7 +352,7 @@ _move_R(cube_fast_t c)
346 return compose_fast(c, m); 352 return compose_fast(c, m);
347} 353}
348 354
349static inline cube_fast_t 355_static_inline cube_fast_t
350_move_R2(cube_fast_t c) 356_move_R2(cube_fast_t c)
351{ 357{
352 cube_fast_t m = _mm256_set_epi8( 358 cube_fast_t m = _mm256_set_epi8(
@@ -357,7 +363,7 @@ _move_R2(cube_fast_t c)
357 return compose_fast(c, m); 363 return compose_fast(c, m);
358} 364}
359 365
360static inline cube_fast_t 366_static_inline cube_fast_t
361_move_R3(cube_fast_t c) 367_move_R3(cube_fast_t c)
362{ 368{
363 cube_fast_t m = _mm256_set_epi8( 369 cube_fast_t m = _mm256_set_epi8(
@@ -368,7 +374,7 @@ _move_R3(cube_fast_t c)
368 return compose_fast(c, m); 374 return compose_fast(c, m);
369} 375}
370 376
371static inline cube_fast_t 377_static_inline cube_fast_t
372_move_L(cube_fast_t c) 378_move_L(cube_fast_t c)
373{ 379{
374 cube_fast_t m = _mm256_set_epi8( 380 cube_fast_t m = _mm256_set_epi8(
@@ -379,7 +385,7 @@ _move_L(cube_fast_t c)
379 return compose_fast(c, m); 385 return compose_fast(c, m);
380} 386}
381 387
382static inline cube_fast_t 388_static_inline cube_fast_t
383_move_L2(cube_fast_t c) 389_move_L2(cube_fast_t c)
384{ 390{
385 cube_fast_t m = _mm256_set_epi8( 391 cube_fast_t m = _mm256_set_epi8(
@@ -390,7 +396,7 @@ _move_L2(cube_fast_t c)
390 return compose_fast(c, m); 396 return compose_fast(c, m);
391} 397}
392 398
393static inline cube_fast_t 399_static_inline cube_fast_t
394_move_L3(cube_fast_t c) 400_move_L3(cube_fast_t c)
395{ 401{
396 cube_fast_t m = _mm256_set_epi8( 402 cube_fast_t m = _mm256_set_epi8(
@@ -401,7 +407,7 @@ _move_L3(cube_fast_t c)
401 return compose_fast(c, m); 407 return compose_fast(c, m);
402} 408}
403 409
404static inline cube_fast_t 410_static_inline cube_fast_t
405_move_F(cube_fast_t c) 411_move_F(cube_fast_t c)
406{ 412{
407 cube_fast_t m = _mm256_set_epi8( 413 cube_fast_t m = _mm256_set_epi8(
@@ -412,7 +418,7 @@ _move_F(cube_fast_t c)
412 return compose_fast(c, m); 418 return compose_fast(c, m);
413} 419}
414 420
415static inline cube_fast_t 421_static_inline cube_fast_t
416_move_F2(cube_fast_t c) 422_move_F2(cube_fast_t c)
417{ 423{
418 cube_fast_t m = _mm256_set_epi8( 424 cube_fast_t m = _mm256_set_epi8(
@@ -423,7 +429,7 @@ _move_F2(cube_fast_t c)
423 return compose_fast(c, m); 429 return compose_fast(c, m);
424} 430}
425 431
426static inline cube_fast_t 432_static_inline cube_fast_t
427_move_F3(cube_fast_t c) 433_move_F3(cube_fast_t c)
428{ 434{
429 cube_fast_t m = _mm256_set_epi8( 435 cube_fast_t m = _mm256_set_epi8(
@@ -434,7 +440,7 @@ _move_F3(cube_fast_t c)
434 return compose_fast(c, m); 440 return compose_fast(c, m);
435} 441}
436 442
437static inline cube_fast_t 443_static_inline cube_fast_t
438_move_B(cube_fast_t c) 444_move_B(cube_fast_t c)
439{ 445{
440 cube_fast_t m = _mm256_set_epi8( 446 cube_fast_t m = _mm256_set_epi8(
@@ -445,7 +451,7 @@ _move_B(cube_fast_t c)
445 return compose_fast(c, m); 451 return compose_fast(c, m);
446} 452}
447 453
448static inline cube_fast_t 454_static_inline cube_fast_t
449_move_B2(cube_fast_t c) 455_move_B2(cube_fast_t c)
450{ 456{
451 cube_fast_t m = _mm256_set_epi8( 457 cube_fast_t m = _mm256_set_epi8(
@@ -456,7 +462,7 @@ _move_B2(cube_fast_t c)
456 return compose_fast(c, m); 462 return compose_fast(c, m);
457} 463}
458 464
459static inline cube_fast_t 465_static_inline cube_fast_t
460_move_B3(cube_fast_t c) 466_move_B3(cube_fast_t c)
461{ 467{
462 cube_fast_t m = _mm256_set_epi8( 468 cube_fast_t m = _mm256_set_epi8(
@@ -467,7 +473,7 @@ _move_B3(cube_fast_t c)
467 return compose_fast(c, m); 473 return compose_fast(c, m);
468} 474}
469 475
470static inline cube_fast_t 476_static_inline cube_fast_t
471_trans_UFr(cube_fast_t c) 477_trans_UFr(cube_fast_t c)
472{ 478{
473 cube_fast_t ret; 479 cube_fast_t ret;
@@ -487,7 +493,7 @@ _trans_UFr(cube_fast_t c)
487 return ret; 493 return ret;
488} 494}
489 495
490static inline cube_fast_t 496_static_inline cube_fast_t
491_trans_ULr(cube_fast_t c) 497_trans_ULr(cube_fast_t c)
492{ 498{
493 cube_fast_t ret; 499 cube_fast_t ret;
@@ -507,7 +513,7 @@ _trans_ULr(cube_fast_t c)
507 return ret; 513 return ret;
508} 514}
509 515
510static inline cube_fast_t 516_static_inline cube_fast_t
511_trans_UBr(cube_fast_t c) 517_trans_UBr(cube_fast_t c)
512{ 518{
513 cube_fast_t ret; 519 cube_fast_t ret;
@@ -527,7 +533,7 @@ _trans_UBr(cube_fast_t c)
527 return ret; 533 return ret;
528} 534}
529 535
530static inline cube_fast_t 536_static_inline cube_fast_t
531_trans_URr(cube_fast_t c) 537_trans_URr(cube_fast_t c)
532{ 538{
533 cube_fast_t ret; 539 cube_fast_t ret;
@@ -547,7 +553,7 @@ _trans_URr(cube_fast_t c)
547 return ret; 553 return ret;
548} 554}
549 555
550static inline cube_fast_t 556_static_inline cube_fast_t
551_trans_DFr(cube_fast_t c) 557_trans_DFr(cube_fast_t c)
552{ 558{
553 cube_fast_t ret; 559 cube_fast_t ret;
@@ -567,7 +573,7 @@ _trans_DFr(cube_fast_t c)
567 return ret; 573 return ret;
568} 574}
569 575
570static inline cube_fast_t 576_static_inline cube_fast_t
571_trans_DLr(cube_fast_t c) 577_trans_DLr(cube_fast_t c)
572{ 578{
573 cube_fast_t ret; 579 cube_fast_t ret;
@@ -587,7 +593,7 @@ _trans_DLr(cube_fast_t c)
587 return ret; 593 return ret;
588} 594}
589 595
590static inline cube_fast_t 596_static_inline cube_fast_t
591_trans_DBr(cube_fast_t c) 597_trans_DBr(cube_fast_t c)
592{ 598{
593 cube_fast_t ret; 599 cube_fast_t ret;
@@ -607,7 +613,7 @@ _trans_DBr(cube_fast_t c)
607 return ret; 613 return ret;
608} 614}
609 615
610static inline cube_fast_t 616_static_inline cube_fast_t
611_trans_DRr(cube_fast_t c) 617_trans_DRr(cube_fast_t c)
612{ 618{
613 cube_fast_t ret; 619 cube_fast_t ret;
@@ -627,7 +633,7 @@ _trans_DRr(cube_fast_t c)
627 return ret; 633 return ret;
628} 634}
629 635
630static inline cube_fast_t 636_static_inline cube_fast_t
631_trans_RUr(cube_fast_t c) 637_trans_RUr(cube_fast_t c)
632{ 638{
633 cube_fast_t ret; 639 cube_fast_t ret;
@@ -647,7 +653,7 @@ _trans_RUr(cube_fast_t c)
647 return ret; 653 return ret;
648} 654}
649 655
650static inline cube_fast_t 656_static_inline cube_fast_t
651_trans_RFr(cube_fast_t c) 657_trans_RFr(cube_fast_t c)
652{ 658{
653 cube_fast_t ret; 659 cube_fast_t ret;
@@ -667,7 +673,7 @@ _trans_RFr(cube_fast_t c)
667 return ret; 673 return ret;
668} 674}
669 675
670static inline cube_fast_t 676_static_inline cube_fast_t
671_trans_RDr(cube_fast_t c) 677_trans_RDr(cube_fast_t c)
672{ 678{
673 cube_fast_t ret; 679 cube_fast_t ret;
@@ -687,7 +693,7 @@ _trans_RDr(cube_fast_t c)
687 return ret; 693 return ret;
688} 694}
689 695
690static inline cube_fast_t 696_static_inline cube_fast_t
691_trans_RBr(cube_fast_t c) 697_trans_RBr(cube_fast_t c)
692{ 698{
693 cube_fast_t ret; 699 cube_fast_t ret;
@@ -707,7 +713,7 @@ _trans_RBr(cube_fast_t c)
707 return ret; 713 return ret;
708} 714}
709 715
710static inline cube_fast_t 716_static_inline cube_fast_t
711_trans_LUr(cube_fast_t c) 717_trans_LUr(cube_fast_t c)
712{ 718{
713 cube_fast_t ret; 719 cube_fast_t ret;
@@ -727,7 +733,7 @@ _trans_LUr(cube_fast_t c)
727 return ret; 733 return ret;
728} 734}
729 735
730static inline cube_fast_t 736_static_inline cube_fast_t
731_trans_LFr(cube_fast_t c) 737_trans_LFr(cube_fast_t c)
732{ 738{
733 cube_fast_t ret; 739 cube_fast_t ret;
@@ -747,7 +753,7 @@ _trans_LFr(cube_fast_t c)
747 return ret; 753 return ret;
748} 754}
749 755
750static inline cube_fast_t 756_static_inline cube_fast_t
751_trans_LDr(cube_fast_t c) 757_trans_LDr(cube_fast_t c)
752{ 758{
753 cube_fast_t ret; 759 cube_fast_t ret;
@@ -767,7 +773,7 @@ _trans_LDr(cube_fast_t c)
767 return ret; 773 return ret;
768} 774}
769 775
770static inline cube_fast_t 776_static_inline cube_fast_t
771_trans_LBr(cube_fast_t c) 777_trans_LBr(cube_fast_t c)
772{ 778{
773 cube_fast_t ret; 779 cube_fast_t ret;
@@ -787,7 +793,7 @@ _trans_LBr(cube_fast_t c)
787 return ret; 793 return ret;
788} 794}
789 795
790static inline cube_fast_t 796_static_inline cube_fast_t
791_trans_FUr(cube_fast_t c) 797_trans_FUr(cube_fast_t c)
792{ 798{
793 cube_fast_t ret; 799 cube_fast_t ret;
@@ -807,7 +813,7 @@ _trans_FUr(cube_fast_t c)
807 return ret; 813 return ret;
808} 814}
809 815
810static inline cube_fast_t 816_static_inline cube_fast_t
811_trans_FRr(cube_fast_t c) 817_trans_FRr(cube_fast_t c)
812{ 818{
813 cube_fast_t ret; 819 cube_fast_t ret;
@@ -827,7 +833,7 @@ _trans_FRr(cube_fast_t c)
827 return ret; 833 return ret;
828} 834}
829 835
830static inline cube_fast_t 836_static_inline cube_fast_t
831_trans_FDr(cube_fast_t c) 837_trans_FDr(cube_fast_t c)
832{ 838{
833 cube_fast_t ret; 839 cube_fast_t ret;
@@ -847,7 +853,7 @@ _trans_FDr(cube_fast_t c)
847 return ret; 853 return ret;
848} 854}
849 855
850static inline cube_fast_t 856_static_inline cube_fast_t
851_trans_FLr(cube_fast_t c) 857_trans_FLr(cube_fast_t c)
852{ 858{
853 cube_fast_t ret; 859 cube_fast_t ret;
@@ -867,7 +873,7 @@ _trans_FLr(cube_fast_t c)
867 return ret; 873 return ret;
868} 874}
869 875
870static inline cube_fast_t 876_static_inline cube_fast_t
871_trans_BUr(cube_fast_t c) 877_trans_BUr(cube_fast_t c)
872{ 878{
873 cube_fast_t ret; 879 cube_fast_t ret;
@@ -887,7 +893,7 @@ _trans_BUr(cube_fast_t c)
887 return ret; 893 return ret;
888} 894}
889 895
890static inline cube_fast_t 896_static_inline cube_fast_t
891_trans_BRr(cube_fast_t c) 897_trans_BRr(cube_fast_t c)
892{ 898{
893 cube_fast_t ret; 899 cube_fast_t ret;
@@ -907,7 +913,7 @@ _trans_BRr(cube_fast_t c)
907 return ret; 913 return ret;
908} 914}
909 915
910static inline cube_fast_t 916_static_inline cube_fast_t
911_trans_BDr(cube_fast_t c) 917_trans_BDr(cube_fast_t c)
912{ 918{
913 cube_fast_t ret; 919 cube_fast_t ret;
@@ -927,7 +933,7 @@ _trans_BDr(cube_fast_t c)
927 return ret; 933 return ret;
928} 934}
929 935
930static inline cube_fast_t 936_static_inline cube_fast_t
931_trans_BLr(cube_fast_t c) 937_trans_BLr(cube_fast_t c)
932{ 938{
933 cube_fast_t ret; 939 cube_fast_t ret;
@@ -947,7 +953,7 @@ _trans_BLr(cube_fast_t c)
947 return ret; 953 return ret;
948} 954}
949 955
950static inline cube_fast_t 956_static_inline cube_fast_t
951_trans_UFm(cube_fast_t c) 957_trans_UFm(cube_fast_t c)
952{ 958{
953 cube_fast_t ret; 959 cube_fast_t ret;
@@ -968,7 +974,7 @@ _trans_UFm(cube_fast_t c)
968 return ret; 974 return ret;
969} 975}
970 976
971static inline cube_fast_t 977_static_inline cube_fast_t
972_trans_ULm(cube_fast_t c) 978_trans_ULm(cube_fast_t c)
973{ 979{
974 cube_fast_t ret; 980 cube_fast_t ret;
@@ -989,7 +995,7 @@ _trans_ULm(cube_fast_t c)
989 return ret; 995 return ret;
990} 996}
991 997
992static inline cube_fast_t 998_static_inline cube_fast_t
993_trans_UBm(cube_fast_t c) 999_trans_UBm(cube_fast_t c)
994{ 1000{
995 cube_fast_t ret; 1001 cube_fast_t ret;
@@ -1010,7 +1016,7 @@ _trans_UBm(cube_fast_t c)
1010 return ret; 1016 return ret;
1011} 1017}
1012 1018
1013static inline cube_fast_t 1019_static_inline cube_fast_t
1014_trans_URm(cube_fast_t c) 1020_trans_URm(cube_fast_t c)
1015{ 1021{
1016 cube_fast_t ret; 1022 cube_fast_t ret;
@@ -1031,7 +1037,7 @@ _trans_URm(cube_fast_t c)
1031 return ret; 1037 return ret;
1032} 1038}
1033 1039
1034static inline cube_fast_t 1040_static_inline cube_fast_t
1035_trans_DFm(cube_fast_t c) 1041_trans_DFm(cube_fast_t c)
1036{ 1042{
1037 cube_fast_t ret; 1043 cube_fast_t ret;
@@ -1052,7 +1058,7 @@ _trans_DFm(cube_fast_t c)
1052 return ret; 1058 return ret;
1053} 1059}
1054 1060
1055static inline cube_fast_t 1061_static_inline cube_fast_t
1056_trans_DLm(cube_fast_t c) 1062_trans_DLm(cube_fast_t c)
1057{ 1063{
1058 cube_fast_t ret; 1064 cube_fast_t ret;
@@ -1073,7 +1079,7 @@ _trans_DLm(cube_fast_t c)
1073 return ret; 1079 return ret;
1074} 1080}
1075 1081
1076static inline cube_fast_t 1082_static_inline cube_fast_t
1077_trans_DBm(cube_fast_t c) 1083_trans_DBm(cube_fast_t c)
1078{ 1084{
1079 cube_fast_t ret; 1085 cube_fast_t ret;
@@ -1094,7 +1100,7 @@ _trans_DBm(cube_fast_t c)
1094 return ret; 1100 return ret;
1095} 1101}
1096 1102
1097static inline cube_fast_t 1103_static_inline cube_fast_t
1098_trans_DRm(cube_fast_t c) 1104_trans_DRm(cube_fast_t c)
1099{ 1105{
1100 cube_fast_t ret; 1106 cube_fast_t ret;
@@ -1115,7 +1121,7 @@ _trans_DRm(cube_fast_t c)
1115 return ret; 1121 return ret;
1116} 1122}
1117 1123
1118static inline cube_fast_t 1124_static_inline cube_fast_t
1119_trans_RUm(cube_fast_t c) 1125_trans_RUm(cube_fast_t c)
1120{ 1126{
1121 cube_fast_t ret; 1127 cube_fast_t ret;
@@ -1136,7 +1142,7 @@ _trans_RUm(cube_fast_t c)
1136 return ret; 1142 return ret;
1137} 1143}
1138 1144
1139static inline cube_fast_t 1145_static_inline cube_fast_t
1140_trans_RFm(cube_fast_t c) 1146_trans_RFm(cube_fast_t c)
1141{ 1147{
1142 cube_fast_t ret; 1148 cube_fast_t ret;
@@ -1157,7 +1163,7 @@ _trans_RFm(cube_fast_t c)
1157 return ret; 1163 return ret;
1158} 1164}
1159 1165
1160static inline cube_fast_t 1166_static_inline cube_fast_t
1161_trans_RDm(cube_fast_t c) 1167_trans_RDm(cube_fast_t c)
1162{ 1168{
1163 cube_fast_t ret; 1169 cube_fast_t ret;
@@ -1178,7 +1184,7 @@ _trans_RDm(cube_fast_t c)
1178 return ret; 1184 return ret;
1179} 1185}
1180 1186
1181static inline cube_fast_t 1187_static_inline cube_fast_t
1182_trans_RBm(cube_fast_t c) 1188_trans_RBm(cube_fast_t c)
1183{ 1189{
1184 cube_fast_t ret; 1190 cube_fast_t ret;
@@ -1199,7 +1205,7 @@ _trans_RBm(cube_fast_t c)
1199 return ret; 1205 return ret;
1200} 1206}
1201 1207
1202static inline cube_fast_t 1208_static_inline cube_fast_t
1203_trans_LUm(cube_fast_t c) 1209_trans_LUm(cube_fast_t c)
1204{ 1210{
1205 cube_fast_t ret; 1211 cube_fast_t ret;
@@ -1220,7 +1226,7 @@ _trans_LUm(cube_fast_t c)
1220 return ret; 1226 return ret;
1221} 1227}
1222 1228
1223static inline cube_fast_t 1229_static_inline cube_fast_t
1224_trans_LFm(cube_fast_t c) 1230_trans_LFm(cube_fast_t c)
1225{ 1231{
1226 cube_fast_t ret; 1232 cube_fast_t ret;
@@ -1241,7 +1247,7 @@ _trans_LFm(cube_fast_t c)
1241 return ret; 1247 return ret;
1242} 1248}
1243 1249
1244static inline cube_fast_t 1250_static_inline cube_fast_t
1245_trans_LDm(cube_fast_t c) 1251_trans_LDm(cube_fast_t c)
1246{ 1252{
1247 cube_fast_t ret; 1253 cube_fast_t ret;
@@ -1262,7 +1268,7 @@ _trans_LDm(cube_fast_t c)
1262 return ret; 1268 return ret;
1263} 1269}
1264 1270
1265static inline cube_fast_t 1271_static_inline cube_fast_t
1266_trans_LBm(cube_fast_t c) 1272_trans_LBm(cube_fast_t c)
1267{ 1273{
1268 cube_fast_t ret; 1274 cube_fast_t ret;
@@ -1283,7 +1289,7 @@ _trans_LBm(cube_fast_t c)
1283 return ret; 1289 return ret;
1284} 1290}
1285 1291
1286static inline cube_fast_t 1292_static_inline cube_fast_t
1287_trans_FUm(cube_fast_t c) 1293_trans_FUm(cube_fast_t c)
1288{ 1294{
1289 cube_fast_t ret; 1295 cube_fast_t ret;
@@ -1304,7 +1310,7 @@ _trans_FUm(cube_fast_t c)
1304 return ret; 1310 return ret;
1305} 1311}
1306 1312
1307static inline cube_fast_t 1313_static_inline cube_fast_t
1308_trans_FRm(cube_fast_t c) 1314_trans_FRm(cube_fast_t c)
1309{ 1315{
1310 cube_fast_t ret; 1316 cube_fast_t ret;
@@ -1325,7 +1331,7 @@ _trans_FRm(cube_fast_t c)
1325 return ret; 1331 return ret;
1326} 1332}
1327 1333
1328static inline cube_fast_t 1334_static_inline cube_fast_t
1329_trans_FDm(cube_fast_t c) 1335_trans_FDm(cube_fast_t c)
1330{ 1336{
1331 cube_fast_t ret; 1337 cube_fast_t ret;
@@ -1346,7 +1352,7 @@ _trans_FDm(cube_fast_t c)
1346 return ret; 1352 return ret;
1347} 1353}
1348 1354
1349static inline cube_fast_t 1355_static_inline cube_fast_t
1350_trans_FLm(cube_fast_t c) 1356_trans_FLm(cube_fast_t c)
1351{ 1357{
1352 cube_fast_t ret; 1358 cube_fast_t ret;
@@ -1367,7 +1373,7 @@ _trans_FLm(cube_fast_t c)
1367 return ret; 1373 return ret;
1368} 1374}
1369 1375
1370static inline cube_fast_t 1376_static_inline cube_fast_t
1371_trans_BUm(cube_fast_t c) 1377_trans_BUm(cube_fast_t c)
1372{ 1378{
1373 cube_fast_t ret; 1379 cube_fast_t ret;
@@ -1388,7 +1394,7 @@ _trans_BUm(cube_fast_t c)
1388 return ret; 1394 return ret;
1389} 1395}
1390 1396
1391static inline cube_fast_t 1397_static_inline cube_fast_t
1392_trans_BRm(cube_fast_t c) 1398_trans_BRm(cube_fast_t c)
1393{ 1399{
1394 cube_fast_t ret; 1400 cube_fast_t ret;
@@ -1409,7 +1415,7 @@ _trans_BRm(cube_fast_t c)
1409 return ret; 1415 return ret;
1410} 1416}
1411 1417
1412static inline cube_fast_t 1418_static_inline cube_fast_t
1413_trans_BDm(cube_fast_t c) 1419_trans_BDm(cube_fast_t c)
1414{ 1420{
1415 cube_fast_t ret; 1421 cube_fast_t ret;
@@ -1430,7 +1436,7 @@ _trans_BDm(cube_fast_t c)
1430 return ret; 1436 return ret;
1431} 1437}
1432 1438
1433static inline cube_fast_t 1439_static_inline cube_fast_t
1434_trans_BLm(cube_fast_t c) 1440_trans_BLm(cube_fast_t c)
1435{ 1441{
1436 cube_fast_t ret; 1442 cube_fast_t ret;
@@ -1451,7 +1457,7 @@ _trans_BLm(cube_fast_t c)
1451 return ret; 1457 return ret;
1452} 1458}
1453 1459
1454static cube_fast_t 1460_static cube_fast_t
1455cubetofast(cube_t a) 1461cubetofast(cube_t a)
1456{ 1462{
1457 uint8_t aux[32]; 1463 uint8_t aux[32];
@@ -1463,7 +1469,7 @@ cubetofast(cube_t a)
1463 return _mm256_loadu_si256((__m256i_u *)&aux); 1469 return _mm256_loadu_si256((__m256i_u *)&aux);
1464} 1470}
1465 1471
1466static cube_t 1472_static cube_t
1467fasttocube(cube_fast_t c) 1473fasttocube(cube_fast_t c)
1468{ 1474{
1469 cube_t a; 1475 cube_t a;
@@ -1476,7 +1482,7 @@ fasttocube(cube_fast_t c)
1476 return a; 1482 return a;
1477} 1483}
1478 1484
1479static inline bool 1485_static_inline bool
1480equal_fast(cube_fast_t c1, cube_fast_t c2) 1486equal_fast(cube_fast_t c1, cube_fast_t c2)
1481{ 1487{
1482 int32_t mask; 1488 int32_t mask;
@@ -1488,13 +1494,13 @@ equal_fast(cube_fast_t c1, cube_fast_t c2)
1488 return mask == ~0; 1494 return mask == ~0;
1489} 1495}
1490 1496
1491static inline bool 1497_static_inline bool
1492issolved_fast(cube_fast_t cube) 1498issolved_fast(cube_fast_t cube)
1493{ 1499{
1494 return equal_fast(cube, solved_fast); 1500 return equal_fast(cube, solved_fast);
1495} 1501}
1496 1502
1497static inline cube_fast_t 1503_static_inline cube_fast_t
1498invertco_fast(cube_fast_t c) 1504invertco_fast(cube_fast_t c)
1499{ 1505{
1500 cube_fast_t co, shleft, shright, summed, newco, cleanco, ret; 1506 cube_fast_t co, shleft, shright, summed, newco, cleanco, ret;
@@ -1510,7 +1516,7 @@ invertco_fast(cube_fast_t c)
1510 return ret; 1516 return ret;
1511} 1517}
1512 1518
1513static inline cube_fast_t 1519_static_inline cube_fast_t
1514cleanaftershuffle(cube_fast_t c) 1520cleanaftershuffle(cube_fast_t c)
1515{ 1521{
1516 __m256i b; 1522 __m256i b;
@@ -1523,7 +1529,7 @@ cleanaftershuffle(cube_fast_t c)
1523 return _mm256_andnot_si256(b, c); 1529 return _mm256_andnot_si256(b, c);
1524} 1530}
1525 1531
1526static inline cube_fast_t 1532_static_inline cube_fast_t
1527inverse_fast(cube_fast_t c) 1533inverse_fast(cube_fast_t c)
1528{ 1534{
1529 /* Method taken from Andrew Skalski's vcube[1]. The addition sequence 1535 /* Method taken from Andrew Skalski's vcube[1]. The addition sequence
@@ -1562,7 +1568,7 @@ inverse_fast(cube_fast_t c)
1562 return invertco_fast(ret); 1568 return invertco_fast(ret);
1563} 1569}
1564 1570
1565static inline cube_fast_t 1571_static_inline cube_fast_t
1566compose_fast(cube_fast_t c1, cube_fast_t c2) 1572compose_fast(cube_fast_t c1, cube_fast_t c2)
1567{ 1573{
1568 cube_fast_t ret; 1574 cube_fast_t ret;
@@ -1586,7 +1592,7 @@ compose_fast(cube_fast_t c1, cube_fast_t c2)
1586 return ret; 1592 return ret;
1587} 1593}
1588 1594
1589static inline int64_t 1595_static_inline int64_t
1590coord_fast_eo(cube_fast_t c) 1596coord_fast_eo(cube_fast_t c)
1591{ 1597{
1592 cube_fast_t eo, shifted; 1598 cube_fast_t eo, shifted;
@@ -1641,20 +1647,22 @@ typedef cube_t cube_fast_t;
1641 r[k] ^= _eobit; \ 1647 r[k] ^= _eobit; \
1642 r[l] ^= _eobit; 1648 r[l] ^= _eobit;
1643 1649
1644static cube_fast_t zero_fast = { .corner = {0}, .edge = {0} }; 1650_static cube_fast_t zero_fast = { .corner = {0}, .edge = {0} };
1645static cube_t solved_fast = { 1651_static cube_t solved_fast = {
1646 .corner = {0, 1, 2, 3, 4, 5, 6, 7}, 1652 .corner = {0, 1, 2, 3, 4, 5, 6, 7},
1647 .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} 1653 .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
1648}; 1654};
1649 1655
1650static cube_fast_t cubetofast(cube_t); 1656_static cube_fast_t cubetofast(cube_t);
1651static cube_t fasttocube(cube_fast_t); 1657_static cube_t fasttocube(cube_fast_t);
1652static inline bool equal_fast(cube_fast_t, cube_fast_t); 1658_static_inline bool equal_fast(cube_fast_t, cube_fast_t);
1653static inline cube_fast_t invertco_fast(cube_fast_t); 1659_static_inline bool issolved_fast(cube_fast_t);
1654static inline cube_fast_t inverse_fast(cube_fast_t); 1660_static_inline cube_fast_t invertco_fast(cube_fast_t);
1655static inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t); 1661_static_inline cube_fast_t inverse_fast(cube_fast_t);
1662_static_inline cube_fast_t compose_fast(cube_fast_t, cube_fast_t);
1663_static_inline int64_t coord_fast_eo(cube_fast_t);
1656 1664
1657static inline cube_fast_t 1665_static_inline cube_fast_t
1658_move_U(cube_fast_t c) 1666_move_U(cube_fast_t c)
1659{ 1667{
1660 uint8_t aux; 1668 uint8_t aux;
@@ -1666,7 +1674,7 @@ _move_U(cube_fast_t c)
1666 return ret; 1674 return ret;
1667} 1675}
1668 1676
1669static inline cube_fast_t 1677_static_inline cube_fast_t
1670_move_U2(cube_fast_t c) 1678_move_U2(cube_fast_t c)
1671{ 1679{
1672 uint8_t aux; 1680 uint8_t aux;
@@ -1678,7 +1686,7 @@ _move_U2(cube_fast_t c)
1678 return ret; 1686 return ret;
1679} 1687}
1680 1688
1681static inline cube_fast_t 1689_static_inline cube_fast_t
1682_move_U3(cube_fast_t c) 1690_move_U3(cube_fast_t c)
1683{ 1691{
1684 uint8_t aux; 1692 uint8_t aux;
@@ -1690,7 +1698,7 @@ _move_U3(cube_fast_t c)
1690 return ret; 1698 return ret;
1691} 1699}
1692 1700
1693static inline cube_fast_t 1701_static_inline cube_fast_t
1694_move_D(cube_fast_t c) 1702_move_D(cube_fast_t c)
1695{ 1703{
1696 uint8_t aux; 1704 uint8_t aux;
@@ -1702,7 +1710,7 @@ _move_D(cube_fast_t c)
1702 return ret; 1710 return ret;
1703} 1711}
1704 1712
1705static inline cube_fast_t 1713_static_inline cube_fast_t
1706_move_D2(cube_fast_t c) 1714_move_D2(cube_fast_t c)
1707{ 1715{
1708 uint8_t aux; 1716 uint8_t aux;
@@ -1714,7 +1722,7 @@ _move_D2(cube_fast_t c)
1714 return ret; 1722 return ret;
1715} 1723}
1716 1724
1717static inline cube_fast_t 1725_static_inline cube_fast_t
1718_move_D3(cube_fast_t c) 1726_move_D3(cube_fast_t c)
1719{ 1727{
1720 uint8_t aux; 1728 uint8_t aux;
@@ -1726,7 +1734,7 @@ _move_D3(cube_fast_t c)
1726 return ret; 1734 return ret;
1727} 1735}
1728 1736
1729static inline cube_fast_t 1737_static_inline cube_fast_t
1730_move_R(cube_fast_t c) 1738_move_R(cube_fast_t c)
1731{ 1739{
1732 uint8_t aux, auy, auz; 1740 uint8_t aux, auy, auz;
@@ -1740,7 +1748,7 @@ _move_R(cube_fast_t c)
1740 return ret; 1748 return ret;
1741} 1749}
1742 1750
1743static inline cube_fast_t 1751_static_inline cube_fast_t
1744_move_R2(cube_fast_t c) 1752_move_R2(cube_fast_t c)
1745{ 1753{
1746 uint8_t aux; 1754 uint8_t aux;
@@ -1752,7 +1760,7 @@ _move_R2(cube_fast_t c)
1752 return ret; 1760 return ret;
1753} 1761}
1754 1762
1755static inline cube_fast_t 1763_static_inline cube_fast_t
1756_move_R3(cube_fast_t c) 1764_move_R3(cube_fast_t c)
1757{ 1765{
1758 uint8_t aux, auy, auz; 1766 uint8_t aux, auy, auz;
@@ -1766,7 +1774,7 @@ _move_R3(cube_fast_t c)
1766 return ret; 1774 return ret;
1767} 1775}
1768 1776
1769static inline cube_fast_t 1777_static_inline cube_fast_t
1770_move_L(cube_fast_t c) 1778_move_L(cube_fast_t c)
1771{ 1779{
1772 uint8_t aux, auy, auz; 1780 uint8_t aux, auy, auz;
@@ -1780,7 +1788,7 @@ _move_L(cube_fast_t c)
1780 return ret; 1788 return ret;
1781} 1789}
1782 1790
1783static inline cube_fast_t 1791_static_inline cube_fast_t
1784_move_L2(cube_fast_t c) 1792_move_L2(cube_fast_t c)
1785{ 1793{
1786 uint8_t aux; 1794 uint8_t aux;
@@ -1792,7 +1800,7 @@ _move_L2(cube_fast_t c)
1792 return ret; 1800 return ret;
1793} 1801}
1794 1802
1795static inline cube_fast_t 1803_static_inline cube_fast_t
1796_move_L3(cube_fast_t c) 1804_move_L3(cube_fast_t c)
1797{ 1805{
1798 uint8_t aux, auy, auz; 1806 uint8_t aux, auy, auz;
@@ -1806,7 +1814,7 @@ _move_L3(cube_fast_t c)
1806 return ret; 1814 return ret;
1807} 1815}
1808 1816
1809static inline cube_fast_t 1817_static_inline cube_fast_t
1810_move_F(cube_fast_t c) 1818_move_F(cube_fast_t c)
1811{ 1819{
1812 uint8_t aux, auy, auz; 1820 uint8_t aux, auy, auz;
@@ -1821,7 +1829,7 @@ _move_F(cube_fast_t c)
1821 return ret; 1829 return ret;
1822} 1830}
1823 1831
1824static inline cube_fast_t 1832_static_inline cube_fast_t
1825_move_F2(cube_fast_t c) 1833_move_F2(cube_fast_t c)
1826{ 1834{
1827 uint8_t aux; 1835 uint8_t aux;
@@ -1833,7 +1841,7 @@ _move_F2(cube_fast_t c)
1833 return ret; 1841 return ret;
1834} 1842}
1835 1843
1836static inline cube_fast_t 1844_static_inline cube_fast_t
1837_move_F3(cube_fast_t c) 1845_move_F3(cube_fast_t c)
1838{ 1846{
1839 uint8_t aux, auy, auz; 1847 uint8_t aux, auy, auz;
@@ -1848,7 +1856,7 @@ _move_F3(cube_fast_t c)
1848 return ret; 1856 return ret;
1849} 1857}
1850 1858
1851static inline cube_fast_t 1859_static_inline cube_fast_t
1852_move_B(cube_fast_t c) 1860_move_B(cube_fast_t c)
1853{ 1861{
1854 uint8_t aux, auy, auz; 1862 uint8_t aux, auy, auz;
@@ -1863,7 +1871,7 @@ _move_B(cube_fast_t c)
1863 return ret; 1871 return ret;
1864} 1872}
1865 1873
1866static inline cube_fast_t 1874_static_inline cube_fast_t
1867_move_B2(cube_fast_t c) 1875_move_B2(cube_fast_t c)
1868{ 1876{
1869 uint8_t aux; 1877 uint8_t aux;
@@ -1875,7 +1883,7 @@ _move_B2(cube_fast_t c)
1875 return ret; 1883 return ret;
1876} 1884}
1877 1885
1878static inline cube_fast_t 1886_static_inline cube_fast_t
1879_move_B3(cube_fast_t c) 1887_move_B3(cube_fast_t c)
1880{ 1888{
1881 uint8_t aux, auy, auz; 1889 uint8_t aux, auy, auz;
@@ -1890,23 +1898,7 @@ _move_B3(cube_fast_t c)
1890 return ret; 1898 return ret;
1891} 1899}
1892 1900
1893static inline cube_fast_t 1901_static_inline cube_fast_t
1894invertco_fast(cube_fast_t c)
1895{
1896 uint8_t i, piece, orien;
1897 cube_fast_t ret;
1898
1899 ret = c;
1900 for (i = 0; i < 8; i++) {
1901 piece = c.corner[i];
1902 orien = ((piece << 1) | (piece >> 1)) & _cobits2;
1903 ret.corner[i] = (piece & _pbits) | orien;
1904 }
1905
1906 return ret;
1907}
1908
1909static inline cube_fast_t
1910_trans_UFr(cube_fast_t c) 1902_trans_UFr(cube_fast_t c)
1911{ 1903{
1912 cube_fast_t ret; 1904 cube_fast_t ret;
@@ -1925,7 +1917,7 @@ _trans_UFr(cube_fast_t c)
1925 return ret; 1917 return ret;
1926} 1918}
1927 1919
1928static inline cube_fast_t 1920_static_inline cube_fast_t
1929_trans_ULr(cube_fast_t c) 1921_trans_ULr(cube_fast_t c)
1930{ 1922{
1931 cube_fast_t ret; 1923 cube_fast_t ret;
@@ -1944,7 +1936,7 @@ _trans_ULr(cube_fast_t c)
1944 return ret; 1936 return ret;
1945} 1937}
1946 1938
1947static inline cube_fast_t 1939_static_inline cube_fast_t
1948_trans_UBr(cube_fast_t c) 1940_trans_UBr(cube_fast_t c)
1949{ 1941{
1950 cube_fast_t ret; 1942 cube_fast_t ret;
@@ -1963,7 +1955,7 @@ _trans_UBr(cube_fast_t c)
1963 return ret; 1955 return ret;
1964} 1956}
1965 1957
1966static inline cube_fast_t 1958_static_inline cube_fast_t
1967_trans_URr(cube_fast_t c) 1959_trans_URr(cube_fast_t c)
1968{ 1960{
1969 cube_fast_t ret; 1961 cube_fast_t ret;
@@ -1982,7 +1974,7 @@ _trans_URr(cube_fast_t c)
1982 return ret; 1974 return ret;
1983} 1975}
1984 1976
1985static inline cube_fast_t 1977_static_inline cube_fast_t
1986_trans_DFr(cube_fast_t c) 1978_trans_DFr(cube_fast_t c)
1987{ 1979{
1988 cube_fast_t ret; 1980 cube_fast_t ret;
@@ -2001,7 +1993,7 @@ _trans_DFr(cube_fast_t c)
2001 return ret; 1993 return ret;
2002} 1994}
2003 1995
2004static inline cube_fast_t 1996_static_inline cube_fast_t
2005_trans_DLr(cube_fast_t c) 1997_trans_DLr(cube_fast_t c)
2006{ 1998{
2007 cube_fast_t ret; 1999 cube_fast_t ret;
@@ -2020,7 +2012,7 @@ _trans_DLr(cube_fast_t c)
2020 return ret; 2012 return ret;
2021} 2013}
2022 2014
2023static inline cube_fast_t 2015_static_inline cube_fast_t
2024_trans_DBr(cube_fast_t c) 2016_trans_DBr(cube_fast_t c)
2025{ 2017{
2026 cube_fast_t ret; 2018 cube_fast_t ret;
@@ -2039,7 +2031,7 @@ _trans_DBr(cube_fast_t c)
2039 return ret; 2031 return ret;
2040} 2032}
2041 2033
2042static inline cube_fast_t 2034_static_inline cube_fast_t
2043_trans_DRr(cube_fast_t c) 2035_trans_DRr(cube_fast_t c)
2044{ 2036{
2045 cube_fast_t ret; 2037 cube_fast_t ret;
@@ -2058,7 +2050,7 @@ _trans_DRr(cube_fast_t c)
2058 return ret; 2050 return ret;
2059} 2051}
2060 2052
2061static inline cube_fast_t 2053_static_inline cube_fast_t
2062_trans_RUr(cube_fast_t c) 2054_trans_RUr(cube_fast_t c)
2063{ 2055{
2064 cube_fast_t ret; 2056 cube_fast_t ret;
@@ -2077,7 +2069,7 @@ _trans_RUr(cube_fast_t c)
2077 return ret; 2069 return ret;
2078} 2070}
2079 2071
2080static inline cube_fast_t 2072_static_inline cube_fast_t
2081_trans_RFr(cube_fast_t c) 2073_trans_RFr(cube_fast_t c)
2082{ 2074{
2083 cube_fast_t ret; 2075 cube_fast_t ret;
@@ -2096,7 +2088,7 @@ _trans_RFr(cube_fast_t c)
2096 return ret; 2088 return ret;
2097} 2089}
2098 2090
2099static inline cube_fast_t 2091_static_inline cube_fast_t
2100_trans_RDr(cube_fast_t c) 2092_trans_RDr(cube_fast_t c)
2101{ 2093{
2102 cube_fast_t ret; 2094 cube_fast_t ret;
@@ -2115,7 +2107,7 @@ _trans_RDr(cube_fast_t c)
2115 return ret; 2107 return ret;
2116} 2108}
2117 2109
2118static inline cube_fast_t 2110_static_inline cube_fast_t
2119_trans_RBr(cube_fast_t c) 2111_trans_RBr(cube_fast_t c)
2120{ 2112{
2121 cube_fast_t ret; 2113 cube_fast_t ret;
@@ -2134,7 +2126,7 @@ _trans_RBr(cube_fast_t c)
2134 return ret; 2126 return ret;
2135} 2127}
2136 2128
2137static inline cube_fast_t 2129_static_inline cube_fast_t
2138_trans_LUr(cube_fast_t c) 2130_trans_LUr(cube_fast_t c)
2139{ 2131{
2140 cube_fast_t ret; 2132 cube_fast_t ret;
@@ -2153,7 +2145,7 @@ _trans_LUr(cube_fast_t c)
2153 return ret; 2145 return ret;
2154} 2146}
2155 2147
2156static inline cube_fast_t 2148_static_inline cube_fast_t
2157_trans_LFr(cube_fast_t c) 2149_trans_LFr(cube_fast_t c)
2158{ 2150{
2159 cube_fast_t ret; 2151 cube_fast_t ret;
@@ -2172,7 +2164,7 @@ _trans_LFr(cube_fast_t c)
2172 return ret; 2164 return ret;
2173} 2165}
2174 2166
2175static inline cube_fast_t 2167_static_inline cube_fast_t
2176_trans_LDr(cube_fast_t c) 2168_trans_LDr(cube_fast_t c)
2177{ 2169{
2178 cube_fast_t ret; 2170 cube_fast_t ret;
@@ -2191,7 +2183,7 @@ _trans_LDr(cube_fast_t c)
2191 return ret; 2183 return ret;
2192} 2184}
2193 2185
2194static inline cube_fast_t 2186_static_inline cube_fast_t
2195_trans_LBr(cube_fast_t c) 2187_trans_LBr(cube_fast_t c)
2196{ 2188{
2197 cube_fast_t ret; 2189 cube_fast_t ret;
@@ -2210,7 +2202,7 @@ _trans_LBr(cube_fast_t c)
2210 return ret; 2202 return ret;
2211} 2203}
2212 2204
2213static inline cube_fast_t 2205_static_inline cube_fast_t
2214_trans_FUr(cube_fast_t c) 2206_trans_FUr(cube_fast_t c)
2215{ 2207{
2216 cube_fast_t ret; 2208 cube_fast_t ret;
@@ -2229,7 +2221,7 @@ _trans_FUr(cube_fast_t c)
2229 return ret; 2221 return ret;
2230} 2222}
2231 2223
2232static inline cube_fast_t 2224_static_inline cube_fast_t
2233_trans_FRr(cube_fast_t c) 2225_trans_FRr(cube_fast_t c)
2234{ 2226{
2235 cube_fast_t ret; 2227 cube_fast_t ret;
@@ -2248,7 +2240,7 @@ _trans_FRr(cube_fast_t c)
2248 return ret; 2240 return ret;
2249} 2241}
2250 2242
2251static inline cube_fast_t 2243_static_inline cube_fast_t
2252_trans_FDr(cube_fast_t c) 2244_trans_FDr(cube_fast_t c)
2253{ 2245{
2254 cube_fast_t ret; 2246 cube_fast_t ret;
@@ -2267,7 +2259,7 @@ _trans_FDr(cube_fast_t c)
2267 return ret; 2259 return ret;
2268} 2260}
2269 2261
2270static inline cube_fast_t 2262_static_inline cube_fast_t
2271_trans_FLr(cube_fast_t c) 2263_trans_FLr(cube_fast_t c)
2272{ 2264{
2273 cube_fast_t ret; 2265 cube_fast_t ret;
@@ -2286,7 +2278,7 @@ _trans_FLr(cube_fast_t c)
2286 return ret; 2278 return ret;
2287} 2279}
2288 2280
2289static inline cube_fast_t 2281_static_inline cube_fast_t
2290_trans_BUr(cube_fast_t c) 2282_trans_BUr(cube_fast_t c)
2291{ 2283{
2292 cube_fast_t ret; 2284 cube_fast_t ret;
@@ -2305,7 +2297,7 @@ _trans_BUr(cube_fast_t c)
2305 return ret; 2297 return ret;
2306} 2298}
2307 2299
2308static inline cube_fast_t 2300_static_inline cube_fast_t
2309_trans_BRr(cube_fast_t c) 2301_trans_BRr(cube_fast_t c)
2310{ 2302{
2311 cube_fast_t ret; 2303 cube_fast_t ret;
@@ -2324,7 +2316,7 @@ _trans_BRr(cube_fast_t c)
2324 return ret; 2316 return ret;
2325} 2317}
2326 2318
2327static inline cube_fast_t 2319_static_inline cube_fast_t
2328_trans_BDr(cube_fast_t c) 2320_trans_BDr(cube_fast_t c)
2329{ 2321{
2330 cube_fast_t ret; 2322 cube_fast_t ret;
@@ -2343,7 +2335,7 @@ _trans_BDr(cube_fast_t c)
2343 return ret; 2335 return ret;
2344} 2336}
2345 2337
2346static inline cube_fast_t 2338_static_inline cube_fast_t
2347_trans_BLr(cube_fast_t c) 2339_trans_BLr(cube_fast_t c)
2348{ 2340{
2349 cube_fast_t ret; 2341 cube_fast_t ret;
@@ -2362,7 +2354,7 @@ _trans_BLr(cube_fast_t c)
2362 return ret; 2354 return ret;
2363} 2355}
2364 2356
2365static inline cube_fast_t 2357_static_inline cube_fast_t
2366_trans_UFm(cube_fast_t c) 2358_trans_UFm(cube_fast_t c)
2367{ 2359{
2368 cube_fast_t ret; 2360 cube_fast_t ret;
@@ -2382,7 +2374,7 @@ _trans_UFm(cube_fast_t c)
2382 return ret; 2374 return ret;
2383} 2375}
2384 2376
2385static inline cube_fast_t 2377_static_inline cube_fast_t
2386_trans_ULm(cube_fast_t c) 2378_trans_ULm(cube_fast_t c)
2387{ 2379{
2388 cube_fast_t ret; 2380 cube_fast_t ret;
@@ -2402,7 +2394,7 @@ _trans_ULm(cube_fast_t c)
2402 return ret; 2394 return ret;
2403} 2395}
2404 2396
2405static inline cube_fast_t 2397_static_inline cube_fast_t
2406_trans_UBm(cube_fast_t c) 2398_trans_UBm(cube_fast_t c)
2407{ 2399{
2408 cube_fast_t ret; 2400 cube_fast_t ret;
@@ -2422,7 +2414,7 @@ _trans_UBm(cube_fast_t c)
2422 return ret; 2414 return ret;
2423} 2415}
2424 2416
2425static inline cube_fast_t 2417_static_inline cube_fast_t
2426_trans_URm(cube_fast_t c) 2418_trans_URm(cube_fast_t c)
2427{ 2419{
2428 cube_fast_t ret; 2420 cube_fast_t ret;
@@ -2442,7 +2434,7 @@ _trans_URm(cube_fast_t c)
2442 return ret; 2434 return ret;
2443} 2435}
2444 2436
2445static inline cube_fast_t 2437_static_inline cube_fast_t
2446_trans_DFm(cube_fast_t c) 2438_trans_DFm(cube_fast_t c)
2447{ 2439{
2448 cube_fast_t ret; 2440 cube_fast_t ret;
@@ -2462,7 +2454,7 @@ _trans_DFm(cube_fast_t c)
2462 return ret; 2454 return ret;
2463} 2455}
2464 2456
2465static inline cube_fast_t 2457_static_inline cube_fast_t
2466_trans_DLm(cube_fast_t c) 2458_trans_DLm(cube_fast_t c)
2467{ 2459{
2468 cube_fast_t ret; 2460 cube_fast_t ret;
@@ -2482,7 +2474,7 @@ _trans_DLm(cube_fast_t c)
2482 return ret; 2474 return ret;
2483} 2475}
2484 2476
2485static inline cube_fast_t 2477_static_inline cube_fast_t
2486_trans_DBm(cube_fast_t c) 2478_trans_DBm(cube_fast_t c)
2487{ 2479{
2488 cube_fast_t ret; 2480 cube_fast_t ret;
@@ -2502,7 +2494,7 @@ _trans_DBm(cube_fast_t c)
2502 return ret; 2494 return ret;
2503} 2495}
2504 2496
2505static inline cube_fast_t 2497_static_inline cube_fast_t
2506_trans_DRm(cube_fast_t c) 2498_trans_DRm(cube_fast_t c)
2507{ 2499{
2508 cube_fast_t ret; 2500 cube_fast_t ret;
@@ -2522,7 +2514,7 @@ _trans_DRm(cube_fast_t c)
2522 return ret; 2514 return ret;
2523} 2515}
2524 2516
2525static inline cube_fast_t 2517_static_inline cube_fast_t
2526_trans_RUm(cube_fast_t c) 2518_trans_RUm(cube_fast_t c)
2527{ 2519{
2528 cube_fast_t ret; 2520 cube_fast_t ret;
@@ -2542,7 +2534,7 @@ _trans_RUm(cube_fast_t c)
2542 return ret; 2534 return ret;
2543} 2535}
2544 2536
2545static inline cube_fast_t 2537_static_inline cube_fast_t
2546_trans_RFm(cube_fast_t c) 2538_trans_RFm(cube_fast_t c)
2547{ 2539{
2548 cube_fast_t ret; 2540 cube_fast_t ret;
@@ -2562,7 +2554,7 @@ _trans_RFm(cube_fast_t c)
2562 return ret; 2554 return ret;
2563} 2555}
2564 2556
2565static inline cube_fast_t 2557_static_inline cube_fast_t
2566_trans_RDm(cube_fast_t c) 2558_trans_RDm(cube_fast_t c)
2567{ 2559{
2568 cube_fast_t ret; 2560 cube_fast_t ret;
@@ -2582,7 +2574,7 @@ _trans_RDm(cube_fast_t c)
2582 return ret; 2574 return ret;
2583} 2575}
2584 2576
2585static inline cube_fast_t 2577_static_inline cube_fast_t
2586_trans_RBm(cube_fast_t c) 2578_trans_RBm(cube_fast_t c)
2587{ 2579{
2588 cube_fast_t ret; 2580 cube_fast_t ret;
@@ -2602,7 +2594,7 @@ _trans_RBm(cube_fast_t c)
2602 return ret; 2594 return ret;
2603} 2595}
2604 2596
2605static inline cube_fast_t 2597_static_inline cube_fast_t
2606_trans_LUm(cube_fast_t c) 2598_trans_LUm(cube_fast_t c)
2607{ 2599{
2608 cube_fast_t ret; 2600 cube_fast_t ret;
@@ -2622,7 +2614,7 @@ _trans_LUm(cube_fast_t c)
2622 return ret; 2614 return ret;
2623} 2615}
2624 2616
2625static inline cube_fast_t 2617_static_inline cube_fast_t
2626_trans_LFm(cube_fast_t c) 2618_trans_LFm(cube_fast_t c)
2627{ 2619{
2628 cube_fast_t ret; 2620 cube_fast_t ret;
@@ -2642,7 +2634,7 @@ _trans_LFm(cube_fast_t c)
2642 return ret; 2634 return ret;
2643} 2635}
2644 2636
2645static inline cube_fast_t 2637_static_inline cube_fast_t
2646_trans_LDm(cube_fast_t c) 2638_trans_LDm(cube_fast_t c)
2647{ 2639{
2648 cube_fast_t ret; 2640 cube_fast_t ret;
@@ -2662,7 +2654,7 @@ _trans_LDm(cube_fast_t c)
2662 return ret; 2654 return ret;
2663} 2655}
2664 2656
2665static inline cube_fast_t 2657_static_inline cube_fast_t
2666_trans_LBm(cube_fast_t c) 2658_trans_LBm(cube_fast_t c)
2667{ 2659{
2668 cube_fast_t ret; 2660 cube_fast_t ret;
@@ -2682,7 +2674,7 @@ _trans_LBm(cube_fast_t c)
2682 return ret; 2674 return ret;
2683} 2675}
2684 2676
2685static inline cube_fast_t 2677_static_inline cube_fast_t
2686_trans_FUm(cube_fast_t c) 2678_trans_FUm(cube_fast_t c)
2687{ 2679{
2688 cube_fast_t ret; 2680 cube_fast_t ret;
@@ -2702,7 +2694,7 @@ _trans_FUm(cube_fast_t c)
2702 return ret; 2694 return ret;
2703} 2695}
2704 2696
2705static inline cube_fast_t 2697_static_inline cube_fast_t
2706_trans_FRm(cube_fast_t c) 2698_trans_FRm(cube_fast_t c)
2707{ 2699{
2708 cube_fast_t ret; 2700 cube_fast_t ret;
@@ -2722,7 +2714,7 @@ _trans_FRm(cube_fast_t c)
2722 return ret; 2714 return ret;
2723} 2715}
2724 2716
2725static inline cube_fast_t 2717_static_inline cube_fast_t
2726_trans_FDm(cube_fast_t c) 2718_trans_FDm(cube_fast_t c)
2727{ 2719{
2728 cube_fast_t ret; 2720 cube_fast_t ret;
@@ -2742,7 +2734,7 @@ _trans_FDm(cube_fast_t c)
2742 return ret; 2734 return ret;
2743} 2735}
2744 2736
2745static inline cube_fast_t 2737_static_inline cube_fast_t
2746_trans_FLm(cube_fast_t c) 2738_trans_FLm(cube_fast_t c)
2747{ 2739{
2748 cube_fast_t ret; 2740 cube_fast_t ret;
@@ -2762,7 +2754,7 @@ _trans_FLm(cube_fast_t c)
2762 return ret; 2754 return ret;
2763} 2755}
2764 2756
2765static inline cube_fast_t 2757_static_inline cube_fast_t
2766_trans_BUm(cube_fast_t c) 2758_trans_BUm(cube_fast_t c)
2767{ 2759{
2768 cube_fast_t ret; 2760 cube_fast_t ret;
@@ -2782,7 +2774,7 @@ _trans_BUm(cube_fast_t c)
2782 return ret; 2774 return ret;
2783} 2775}
2784 2776
2785static inline cube_fast_t 2777_static_inline cube_fast_t
2786_trans_BRm(cube_fast_t c) 2778_trans_BRm(cube_fast_t c)
2787{ 2779{
2788 cube_fast_t ret; 2780 cube_fast_t ret;
@@ -2802,7 +2794,7 @@ _trans_BRm(cube_fast_t c)
2802 return ret; 2794 return ret;
2803} 2795}
2804 2796
2805static inline cube_fast_t 2797_static_inline cube_fast_t
2806_trans_BDm(cube_fast_t c) 2798_trans_BDm(cube_fast_t c)
2807{ 2799{
2808 cube_fast_t ret; 2800 cube_fast_t ret;
@@ -2822,7 +2814,7 @@ _trans_BDm(cube_fast_t c)
2822 return ret; 2814 return ret;
2823} 2815}
2824 2816
2825static inline cube_fast_t 2817_static_inline cube_fast_t
2826_trans_BLm(cube_fast_t c) 2818_trans_BLm(cube_fast_t c)
2827{ 2819{
2828 cube_fast_t ret; 2820 cube_fast_t ret;
@@ -2842,7 +2834,7 @@ _trans_BLm(cube_fast_t c)
2842 return ret; 2834 return ret;
2843} 2835}
2844 2836
2845static cube_fast_t 2837_static cube_fast_t
2846cubetofast(cube_t cube) 2838cubetofast(cube_t cube)
2847{ 2839{
2848 cube_fast_t fast; 2840 cube_fast_t fast;
@@ -2850,7 +2842,7 @@ cubetofast(cube_t cube)
2850 return fast; 2842 return fast;
2851} 2843}
2852 2844
2853static cube_t 2845_static cube_t
2854fasttocube(cube_fast_t fast) 2846fasttocube(cube_fast_t fast)
2855{ 2847{
2856 cube_t cube; 2848 cube_t cube;
@@ -2858,7 +2850,7 @@ fasttocube(cube_fast_t fast)
2858 return cube; 2850 return cube;
2859} 2851}
2860 2852
2861static inline bool 2853_static_inline bool
2862equal_fast(cube_fast_t c1, cube_fast_t c2) 2854equal_fast(cube_fast_t c1, cube_fast_t c2)
2863{ 2855{
2864 uint8_t i; 2856 uint8_t i;
@@ -2873,13 +2865,29 @@ equal_fast(cube_fast_t c1, cube_fast_t c2)
2873 return ret; 2865 return ret;
2874} 2866}
2875 2867
2876static inline bool 2868_static_inline bool
2877issolved_fast(cube_fast_t cube) 2869issolved_fast(cube_fast_t cube)
2878{ 2870{
2879 return equal_fast(cube, solved_fast); 2871 return equal_fast(cube, solved_fast);
2880} 2872}
2881 2873
2882static inline cube_fast_t 2874_static_inline cube_fast_t
2875invertco_fast(cube_fast_t c)
2876{
2877 uint8_t i, piece, orien;
2878 cube_fast_t ret;
2879
2880 ret = c;
2881 for (i = 0; i < 8; i++) {
2882 piece = c.corner[i];
2883 orien = ((piece << 1) | (piece >> 1)) & _cobits2;
2884 ret.corner[i] = (piece & _pbits) | orien;
2885 }
2886
2887 return ret;
2888}
2889
2890_static_inline cube_fast_t
2883inverse_fast(cube_fast_t cube) 2891inverse_fast(cube_fast_t cube)
2884{ 2892{
2885 cube_fast_t ret; 2893 cube_fast_t ret;
@@ -2902,7 +2910,7 @@ inverse_fast(cube_fast_t cube)
2902 return ret; 2910 return ret;
2903} 2911}
2904 2912
2905static inline cube_fast_t 2913_static_inline cube_fast_t
2906compose_fast(cube_fast_t c1, cube_fast_t c2) 2914compose_fast(cube_fast_t c1, cube_fast_t c2)
2907{ 2915{
2908 cube_fast_t ret; 2916 cube_fast_t ret;
@@ -2931,7 +2939,7 @@ compose_fast(cube_fast_t c1, cube_fast_t c2)
2931 return ret; 2939 return ret;
2932} 2940}
2933 2941
2934static inline int64_t 2942_static_inline int64_t
2935coord_fast_eo(cube_fast_t cube) 2943coord_fast_eo(cube_fast_t cube)
2936{ 2944{
2937 int i, p; 2945 int i, p;
@@ -2954,32 +2962,43 @@ Some of these routines depend on the efficient functions implemented in the
2954previous sections, while some other operate directly on the cube. 2962previous sections, while some other operate directly on the cube.
2955******************************************************************************/ 2963******************************************************************************/
2956 2964
2957static inline uint8_t movebase(uint8_t); 2965_static cube_t zero = { .corner = {0}, .edge = {0} };
2958static inline uint8_t moveaxis(uint8_t); 2966_static cube_t solved = {
2959static uint8_t readco(char *);
2960static uint8_t readcp(char *);
2961static uint8_t readeo(char *);
2962static uint8_t readep(char *);
2963static int permsign(uint8_t *, int);
2964static cube_t readcube_H48(char *);
2965static void writecube_AVX(cube_t, char *);
2966static void writecube_H48(cube_t, char *);
2967static int writepiece_SRC(uint8_t, char *);
2968static void writecube_SRC(cube_t, char *);
2969static uint8_t readmove(char);
2970static uint8_t readmodifier(char);
2971static uint8_t readtrans(char *);
2972static int writemoves(uint8_t *, int, char *);
2973static void writetrans(uint8_t, char *);
2974static cube_fast_t transform(cube_fast_t, uint8_t);
2975static cube_fast_t move(cube_fast_t, uint8_t);
2976
2977static cube_t zero = { .corner = {0}, .edge = {0} };
2978static cube_t solved = {
2979 .corner = {0, 1, 2, 3, 4, 5, 6, 7}, 2967 .corner = {0, 1, 2, 3, 4, 5, 6, 7},
2980 .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} 2968 .edge = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
2981}; 2969};
2982 2970
2971cube_t solvedcube(void);
2972bool isconsistent(cube_t);
2973bool issolvable(cube_t);
2974bool issolved(cube_t cube);
2975bool equal(cube_t, cube_t);
2976bool iserror(cube_t);
2977cube_t compose(cube_t, cube_t);
2978cube_t inverse(cube_t);
2979cube_t applymoves(cube_t, char *);
2980cube_t applytrans(cube_t, char *);
2981cube_t readcube(char *, char *);
2982void writecube(char *, cube_t, char *);
2983
2984_static int permsign(uint8_t *, int);
2985_static uint8_t readco(char *);
2986_static uint8_t readcp(char *);
2987_static uint8_t readeo(char *);
2988_static uint8_t readep(char *);
2989_static cube_t readcube_H48(char *);
2990_static int writepiece_SRC(uint8_t, char *);
2991_static void writecube_AVX(cube_t, char *);
2992_static void writecube_H48(cube_t, char *);
2993_static void writecube_SRC(cube_t, char *);
2994_static uint8_t readmove(char);
2995_static uint8_t readmodifier(char);
2996_static uint8_t readtrans(char *);
2997_static int writemoves(uint8_t *, int, char *);
2998_static void writetrans(uint8_t, char *);
2999_static cube_fast_t move(cube_fast_t, uint8_t);
3000_static cube_fast_t transform(cube_fast_t, uint8_t);
3001
2983cube_t 3002cube_t
2984solvedcube(void) 3003solvedcube(void)
2985{ 3004{
@@ -2987,6 +3006,111 @@ solvedcube(void)
2987} 3006}
2988 3007
2989bool 3008bool
3009isconsistent(cube_t cube)
3010{
3011 uint8_t i, p, e, piece;
3012 bool found[12];
3013
3014 for (i = 0; i < 12; i++)
3015 found[i] = false;
3016 for (i = 0; i < 12; i++) {
3017 piece = cube.edge[i];
3018 p = piece & _pbits;
3019 e = piece & _eobit;
3020 if (p >= 12)
3021 goto inconsistent_ep;
3022 if (e != 0 && e != _eobit)
3023 goto inconsistent_eo;
3024 found[p] = true;
3025 }
3026 for (i = 0; i < 12; i++)
3027 if (!found[i])
3028 goto inconsistent_ep;
3029
3030 for (i = 0; i < 8; i++)
3031 found[i] = false;
3032 for (i = 0; i < 8; i++) {
3033 piece = cube.corner[i];
3034 p = piece & _pbits;
3035 e = piece & _cobits;
3036 if (p >= 8)
3037 goto inconsistent_cp;
3038 if (e != 0 && e != _ctwist_cw && e != _ctwist_ccw)
3039 goto inconsistent_co;
3040 found[p] = true;
3041 }
3042 for (i = 0; i < 8; i++)
3043 if (!found[i])
3044 goto inconsistent_co;
3045
3046 return true;
3047
3048inconsistent_ep:
3049 DBG_LOG("Inconsistent EP\n");
3050 return false;
3051inconsistent_cp:
3052 DBG_LOG("Inconsistent CP\n");
3053 return false;
3054inconsistent_eo:
3055 DBG_LOG("Inconsistent EO\n");
3056 return false;
3057inconsistent_co:
3058 DBG_LOG("Inconsistent CO\n");
3059 return false;
3060}
3061
3062bool
3063issolvable(cube_t cube)
3064{
3065 uint8_t i, eo, co, piece, edges[12], corners[8];
3066
3067 DBG_ASSERT(isconsistent(cube), false,
3068 "issolvable: cube is inconsistent\n");
3069
3070 for (i = 0; i < 12; i++)
3071 edges[i] = cube.edge[i] & _pbits;
3072 for (i = 0; i < 8; i++)
3073 corners[i] = cube.corner[i] & _pbits;
3074
3075 if (permsign(edges, 12) != permsign(corners, 8))
3076 goto issolvable_parity;
3077
3078 eo = 0;
3079 for (i = 0; i < 12; i++) {
3080 piece = cube.edge[i];
3081 eo += (piece & _eobit) >> _eoshift;
3082 }
3083 if (eo % 2 != 0)
3084 goto issolvable_eo;
3085
3086 co = 0;
3087 for (i = 0; i < 8; i++) {
3088 piece = cube.corner[i];
3089 co += (piece & _cobits) >> _coshift;
3090 }
3091 if (co % 3 != 0)
3092 goto issolvable_co;
3093
3094 return true;
3095
3096issolvable_parity:
3097 DBG_LOG("EP and CP parities are different\n");
3098 return false;
3099issolvable_eo:
3100 DBG_LOG("Odd number of flipped edges\n");
3101 return false;
3102issolvable_co:
3103 DBG_LOG("Sum of corner orientation is not multiple of 3\n");
3104 return false;
3105}
3106
3107bool
3108issolved(cube_t cube)
3109{
3110 return equal(cube, solved);
3111}
3112
3113bool
2990equal(cube_t c1, cube_t c2) 3114equal(cube_t c1, cube_t c2)
2991{ 3115{
2992 int i; 3116 int i;
@@ -3007,19 +3131,133 @@ iserror(cube_t cube)
3007 return equal(cube, zero); 3131 return equal(cube, zero);
3008} 3132}
3009 3133
3010static inline uint8_t 3134cube_t
3011movebase(uint8_t move) 3135compose(cube_t c1, cube_t c2)
3012{ 3136{
3013 return move / 3; 3137 DBG_ASSERT(isconsistent(c1) && isconsistent(c2),
3138 zero, "compose error: inconsistent cube\n")
3139
3140 return fasttocube(compose_fast(cubetofast(c1), cubetofast(c2)));
3014} 3141}
3015 3142
3016static inline uint8_t 3143cube_t
3017moveaxis(uint8_t move) 3144inverse(cube_t cube)
3018{ 3145{
3019 return move / 6; 3146 DBG_ASSERT(isconsistent(cube), zero,
3147 "inverse error: inconsistent cube\n");
3148
3149 return fasttocube(inverse_fast(cubetofast(cube)));
3020} 3150}
3021 3151
3022static uint8_t 3152cube_t
3153applymoves(cube_t cube, char *buf)
3154{
3155 cube_fast_t fast;
3156 uint8_t r, m;
3157 char *b;
3158
3159 DBG_ASSERT(isconsistent(cube), zero,
3160 "move error: inconsistent cube\n");
3161
3162 fast = cubetofast(cube);
3163
3164 for (b = buf; *b != '\0'; b++) {
3165 while (*b == ' ' || *b == '\t' || *b == '\n')
3166 b++;
3167 if (*b == '\0')
3168 goto readmoves_finish;
3169 if ((r = readmove(*b)) == _error)
3170 goto readmoves_error;
3171 if ((m = readmodifier(*(b+1))) != 0)
3172 b++;
3173 fast = move(fast, r + m);
3174 }
3175
3176readmoves_finish:
3177 return fasttocube(fast);
3178
3179readmoves_error:
3180 DBG_LOG("readmoves error\n");
3181 return zero;
3182}
3183
3184cube_t
3185applytrans(cube_t cube, char *buf)
3186{
3187 cube_fast_t fast;
3188 uint8_t t;
3189
3190 DBG_ASSERT(isconsistent(cube), zero,
3191 "transformation error: inconsistent cube\n");
3192
3193 t = readtrans(buf);
3194 fast = cubetofast(cube);
3195 fast = transform(fast, t);
3196
3197 return fasttocube(fast);
3198}
3199
3200cube_t
3201readcube(char *format, char *buf)
3202{
3203 cube_t cube;
3204
3205 if (!strcmp(format, "H48")) {
3206 cube = readcube_H48(buf);
3207 } else {
3208 DBG_LOG("Cannot read cube in the given format\n");
3209 cube = zero;
3210 }
3211
3212 return cube;
3213}
3214
3215void
3216writecube(char *format, cube_t cube, char *buf)
3217{
3218 char *errormsg;
3219 size_t len;
3220
3221 if (!isconsistent(cube)) {
3222 errormsg = "ERROR: cannot write inconsistent cube";
3223 goto writecube_error;
3224 }
3225
3226 if (!strcmp(format, "H48")) {
3227 writecube_H48(cube, buf);
3228 } else if (!strcmp(format, "SRC")) {
3229 writecube_SRC(cube, buf);
3230 } else if (!strcmp(format, "AVX")) {
3231 writecube_AVX(cube, buf);
3232 } else {
3233 errormsg = "ERROR: cannot write cube in the given format";
3234 goto writecube_error;
3235 }
3236
3237 return;
3238
3239writecube_error:
3240 DBG_LOG("writecube error, see stdout for details\n");
3241 len = strlen(errormsg);
3242 memcpy(buf, errormsg, len);
3243 buf[len] = '\n';
3244 buf[len+1] = '\0';
3245}
3246
3247_static int
3248permsign(uint8_t *a, int n)
3249{
3250 int i, j;
3251 uint8_t ret = 0;
3252
3253 for (i = 0; i < n; i++)
3254 for (j = i+1; j < n; j++)
3255 ret += a[i] > a[j] ? 1 : 0;
3256
3257 return ret % 2;
3258}
3259
3260_static uint8_t
3023readco(char *str) 3261readco(char *str)
3024{ 3262{
3025 if (*str == '0') 3263 if (*str == '0')
@@ -3033,7 +3271,7 @@ readco(char *str)
3033 return _error; 3271 return _error;
3034} 3272}
3035 3273
3036static uint8_t 3274_static uint8_t
3037readcp(char *str) 3275readcp(char *str)
3038{ 3276{
3039 uint8_t c; 3277 uint8_t c;
@@ -3047,7 +3285,7 @@ readcp(char *str)
3047 return _error; 3285 return _error;
3048} 3286}
3049 3287
3050static uint8_t 3288_static uint8_t
3051readeo(char *str) 3289readeo(char *str)
3052{ 3290{
3053 if (*str == '0') 3291 if (*str == '0')
@@ -3059,7 +3297,7 @@ readeo(char *str)
3059 return _error; 3297 return _error;
3060} 3298}
3061 3299
3062static uint8_t 3300_static uint8_t
3063readep(char *str) 3301readep(char *str)
3064{ 3302{
3065 uint8_t e; 3303 uint8_t e;
@@ -3072,7 +3310,7 @@ readep(char *str)
3072 return _error; 3310 return _error;
3073} 3311}
3074 3312
3075static cube_t 3313_static cube_t
3076readcube_H48(char *buf) 3314readcube_H48(char *buf)
3077{ 3315{
3078 int i; 3316 int i;
@@ -3108,23 +3346,7 @@ readcube_H48(char *buf)
3108 return ret; 3346 return ret;
3109} 3347}
3110 3348
3111cube_t 3349_static int
3112readcube(char *format, char *buf)
3113{
3114 cube_t cube;
3115
3116 if (!strcmp(format, "H48")) {
3117 cube = readcube_H48(buf);
3118 } else {
3119 DBG_LOG("Cannot read cube in the given format\n");
3120 cube = zero;
3121 }
3122
3123 return cube;
3124}
3125
3126
3127static int
3128writepiece_SRC(uint8_t piece, char *buf) 3350writepiece_SRC(uint8_t piece, char *buf)
3129{ 3351{
3130 char digits[3]; 3352 char digits[3];
@@ -3147,7 +3369,7 @@ writepiece_SRC(uint8_t piece, char *buf)
3147 return len+2; 3369 return len+2;
3148} 3370}
3149 3371
3150static void 3372_static void
3151writecube_AVX(cube_t cube, char *buf) 3373writecube_AVX(cube_t cube, char *buf)
3152{ 3374{
3153 int i, ptr; 3375 int i, ptr;
@@ -3172,7 +3394,7 @@ writecube_AVX(cube_t cube, char *buf)
3172 memcpy(buf+ptr-2, "\n)\0", 3); 3394 memcpy(buf+ptr-2, "\n)\0", 3);
3173} 3395}
3174 3396
3175static void 3397_static void
3176writecube_H48(cube_t cube, char *buf) 3398writecube_H48(cube_t cube, char *buf)
3177{ 3399{
3178 uint8_t piece, perm, orient; 3400 uint8_t piece, perm, orient;
@@ -3201,7 +3423,7 @@ writecube_H48(cube_t cube, char *buf)
3201 buf[48+39] = '\0'; 3423 buf[48+39] = '\0';
3202} 3424}
3203 3425
3204static void 3426_static void
3205writecube_SRC(cube_t cube, char *buf) 3427writecube_SRC(cube_t cube, char *buf)
3206{ 3428{
3207 int i, ptr; 3429 int i, ptr;
@@ -3226,39 +3448,7 @@ writecube_SRC(cube_t cube, char *buf)
3226 memcpy(buf+ptr-2, "}\n}\0", 4); 3448 memcpy(buf+ptr-2, "}\n}\0", 4);
3227} 3449}
3228 3450
3229void 3451_static uint8_t
3230writecube(char *format, cube_t cube, char *buf)
3231{
3232 char *errormsg;
3233 size_t len;
3234
3235 if (!isconsistent(cube)) {
3236 errormsg = "ERROR: cannot write inconsistent cube";
3237 goto writecube_error;
3238 }
3239
3240 if (!strcmp(format, "H48")) {
3241 writecube_H48(cube, buf);
3242 } else if (!strcmp(format, "SRC")) {
3243 writecube_SRC(cube, buf);
3244 } else if (!strcmp(format, "AVX")) {
3245 writecube_AVX(cube, buf);
3246 } else {
3247 errormsg = "ERROR: cannot write cube in the given format";
3248 goto writecube_error;
3249 }
3250
3251 return;
3252
3253writecube_error:
3254 DBG_LOG("writecube error, see stdout for details\n");
3255 len = strlen(errormsg);
3256 memcpy(buf, errormsg, len);
3257 buf[len] = '\n';
3258 buf[len+1] = '\0';
3259}
3260
3261static uint8_t
3262readmove(char c) 3452readmove(char c)
3263{ 3453{
3264 switch (c) { 3454 switch (c) {
@@ -3279,7 +3469,7 @@ readmove(char c)
3279 } 3469 }
3280} 3470}
3281 3471
3282static uint8_t 3472_static uint8_t
3283readmodifier(char c) 3473readmodifier(char c)
3284{ 3474{
3285 switch (c) { 3475 switch (c) {
@@ -3294,7 +3484,7 @@ readmodifier(char c)
3294 } 3484 }
3295} 3485}
3296 3486
3297static uint8_t 3487_static uint8_t
3298readtrans(char *buf) 3488readtrans(char *buf)
3299{ 3489{
3300 uint8_t t; 3490 uint8_t t;
@@ -3307,7 +3497,7 @@ readtrans(char *buf)
3307 return _error; 3497 return _error;
3308} 3498}
3309 3499
3310static int 3500_static int
3311writemoves(uint8_t *m, int n, char *buf) 3501writemoves(uint8_t *m, int n, char *buf)
3312{ 3502{
3313 int i; 3503 int i;
@@ -3329,7 +3519,7 @@ writemoves(uint8_t *m, int n, char *buf)
3329 return b - buf; 3519 return b - buf;
3330} 3520}
3331 3521
3332static void 3522_static void
3333writetrans(uint8_t t, char *buf) 3523writetrans(uint8_t t, char *buf)
3334{ 3524{
3335 if (t >= 48) 3525 if (t >= 48)
@@ -3339,143 +3529,7 @@ writetrans(uint8_t t, char *buf)
3339 buf[11] = '\0'; 3529 buf[11] = '\0';
3340} 3530}
3341 3531
3342static int 3532_static cube_fast_t
3343permsign(uint8_t *a, int n)
3344{
3345 int i, j;
3346 uint8_t ret = 0;
3347
3348 for (i = 0; i < n; i++)
3349 for (j = i+1; j < n; j++)
3350 ret += a[i] > a[j] ? 1 : 0;
3351
3352 return ret % 2;
3353}
3354
3355bool
3356isconsistent(cube_t cube)
3357{
3358 uint8_t i, p, e, piece;
3359 bool found[12];
3360
3361 for (i = 0; i < 12; i++)
3362 found[i] = false;
3363 for (i = 0; i < 12; i++) {
3364 piece = cube.edge[i];
3365 p = piece & _pbits;
3366 e = piece & _eobit;
3367 if (p >= 12)
3368 goto inconsistent_ep;
3369 if (e != 0 && e != _eobit)
3370 goto inconsistent_eo;
3371 found[p] = true;
3372 }
3373 for (i = 0; i < 12; i++)
3374 if (!found[i])
3375 goto inconsistent_ep;
3376
3377 for (i = 0; i < 8; i++)
3378 found[i] = false;
3379 for (i = 0; i < 8; i++) {
3380 piece = cube.corner[i];
3381 p = piece & _pbits;
3382 e = piece & _cobits;
3383 if (p >= 8)
3384 goto inconsistent_cp;
3385 if (e != 0 && e != _ctwist_cw && e != _ctwist_ccw)
3386 goto inconsistent_co;
3387 found[p] = true;
3388 }
3389 for (i = 0; i < 8; i++)
3390 if (!found[i])
3391 goto inconsistent_co;
3392
3393 return true;
3394
3395inconsistent_ep:
3396 DBG_LOG("Inconsistent EP\n");
3397 return false;
3398inconsistent_cp:
3399 DBG_LOG("Inconsistent CP\n");
3400 return false;
3401inconsistent_eo:
3402 DBG_LOG("Inconsistent EO\n");
3403 return false;
3404inconsistent_co:
3405 DBG_LOG("Inconsistent CO\n");
3406 return false;
3407}
3408
3409bool
3410issolvable(cube_t cube)
3411{
3412 uint8_t i, eo, co, piece, edges[12], corners[8];
3413
3414 DBG_ASSERT(isconsistent(cube), false,
3415 "issolvable: cube is inconsistent\n");
3416
3417 for (i = 0; i < 12; i++)
3418 edges[i] = cube.edge[i] & _pbits;
3419 for (i = 0; i < 8; i++)
3420 corners[i] = cube.corner[i] & _pbits;
3421
3422 if (permsign(edges, 12) != permsign(corners, 8))
3423 goto issolvable_parity;
3424
3425 eo = 0;
3426 for (i = 0; i < 12; i++) {
3427 piece = cube.edge[i];
3428 eo += (piece & _eobit) >> _eoshift;
3429 }
3430 if (eo % 2 != 0)
3431 goto issolvable_eo;
3432
3433 co = 0;
3434 for (i = 0; i < 8; i++) {
3435 piece = cube.corner[i];
3436 co += (piece & _cobits) >> _coshift;
3437 }
3438 if (co % 3 != 0)
3439 goto issolvable_co;
3440
3441 return true;
3442
3443issolvable_parity:
3444 DBG_LOG("EP and CP parities are different\n");
3445 return false;
3446issolvable_eo:
3447 DBG_LOG("Odd number of flipped edges\n");
3448 return false;
3449issolvable_co:
3450 DBG_LOG("Sum of corner orientation is not multiple of 3\n");
3451 return false;
3452}
3453
3454bool
3455issolved(cube_t cube)
3456{
3457 return equal(cube, solved);
3458}
3459
3460cube_t
3461inverse(cube_t cube)
3462{
3463 DBG_ASSERT(isconsistent(cube), zero,
3464 "inverse error: inconsistent cube\n");
3465
3466 return fasttocube(inverse_fast(cubetofast(cube)));
3467}
3468
3469cube_t
3470compose(cube_t c1, cube_t c2)
3471{
3472 DBG_ASSERT(isconsistent(c1) && isconsistent(c2),
3473 zero, "compose error: inconsistent cube\n")
3474
3475 return fasttocube(compose_fast(cubetofast(c1), cubetofast(c2)));
3476}
3477
3478static cube_fast_t
3479move(cube_fast_t c, uint8_t m) 3533move(cube_fast_t c, uint8_t m)
3480{ 3534{
3481 switch (m) { 3535 switch (m) {
@@ -3521,7 +3575,7 @@ move(cube_fast_t c, uint8_t m)
3521 } 3575 }
3522} 3576}
3523 3577
3524static cube_fast_t 3578_static cube_fast_t
3525transform(cube_fast_t c, uint8_t t) 3579transform(cube_fast_t c, uint8_t t)
3526{ 3580{
3527 switch (t) { 3581 switch (t) {
@@ -3627,52 +3681,26 @@ transform(cube_fast_t c, uint8_t t)
3627 } 3681 }
3628} 3682}
3629 3683
3630cube_t 3684/******************************************************************************
3631applymoves(cube_t cube, char *buf) 3685Section: moves and move sequences
3632{
3633 cube_fast_t fast;
3634 uint8_t r, m;
3635 char *b;
3636
3637 DBG_ASSERT(isconsistent(cube), zero,
3638 "move error: inconsistent cube\n");
3639
3640 fast = cubetofast(cube);
3641 3686
3642 for (b = buf; *b != '\0'; b++) { 3687This section contains methods to work with moves and arrays of moves. They
3643 while (*b == ' ' || *b == '\t' || *b == '\n') 3688do not rely on the cube structure.
3644 b++; 3689******************************************************************************/
3645 if (*b == '\0')
3646 goto readmoves_finish;
3647 if ((r = readmove(*b)) == _error)
3648 goto readmoves_error;
3649 if ((m = readmodifier(*(b+1))) != 0)
3650 b++;
3651 fast = move(fast, r + m);
3652 }
3653 3690
3654readmoves_finish: 3691_static_inline uint8_t movebase(uint8_t);
3655 return fasttocube(fast); 3692_static_inline uint8_t moveaxis(uint8_t);
3656 3693
3657readmoves_error: 3694_static_inline uint8_t
3658 DBG_LOG("readmoves error\n"); 3695movebase(uint8_t move)
3659 return zero; 3696{
3697 return move / 3;
3660} 3698}
3661 3699
3662cube_t 3700_static_inline uint8_t
3663applytrans(cube_t cube, char *buf) 3701moveaxis(uint8_t move)
3664{ 3702{
3665 cube_fast_t fast; 3703 return move / 6;
3666 uint8_t t;
3667
3668 DBG_ASSERT(isconsistent(cube), zero,
3669 "transformation error: inconsistent cube\n");
3670
3671 t = readtrans(buf);
3672 fast = cubetofast(cube);
3673 fast = transform(fast, t);
3674
3675 return fasttocube(fast);
3676} 3704}
3677 3705
3678/****************************************************************************** 3706/******************************************************************************
@@ -3692,7 +3720,82 @@ typedef struct {
3692 uint8_t (*estimate)(cube_fast_t); 3720 uint8_t (*estimate)(cube_fast_t);
3693} dfsarg_generic_t; 3721} dfsarg_generic_t;
3694 3722
3695static bool 3723int64_t solve(cube_t, char *, char *, char *, int8_t, int8_t, int64_t, int8_t,
3724 void *, char *);
3725void multisolve(int, cube_t *, char *, void *, char *);
3726int64_t gendata(char *, void *);
3727
3728_static bool allowednextmove(dfsarg_generic_t, uint8_t);
3729_static void solve_generic_appendsolution(dfsarg_generic_t);
3730_static int solve_generic_dfs(dfsarg_generic_t);
3731_static int64_t solve_generic(cube_t, char *, int8_t, int8_t, int64_t, int8_t,
3732 char *, uint8_t (*)(cube_fast_t));
3733_static uint8_t estimate_simple(cube_fast_t);
3734_static int64_t solve_simple(cube_t, int8_t, int8_t, int64_t, int8_t, char *);
3735
3736int64_t
3737solve(
3738 cube_t cube,
3739 char *solver,
3740 char *options,
3741 char *nisstype,
3742 int8_t minmoves,
3743 int8_t maxmoves,
3744 int64_t maxsols,
3745 int8_t optimal,
3746 void *data,
3747 char *solutions
3748)
3749{
3750 DBG_WARN(!strcmp(options, ""),
3751 "solve: 'options' not implemented yet, ignoring\n");
3752
3753 DBG_WARN(!strcmp(nisstype, ""),
3754 "solve: NISS not implemented yet, ignoring 'nisstype'\n");
3755
3756 DBG_WARN(data == NULL,
3757 "solve: 'data' not implemented yet, ignoring\n");
3758
3759 if (!strcmp(solver, "optimal") || !strcmp(solver, "simple")) {
3760 return solve_simple(
3761 cube,
3762 minmoves,
3763 maxmoves,
3764 maxsols,
3765 optimal,
3766 solutions
3767 );
3768 } else {
3769 DBG_LOG("solve: unknown solver '%s'\n", solver);
3770 return -1;
3771 }
3772
3773 DBG_LOG("solve: error\n");
3774 return -1;
3775}
3776
3777void
3778multisolve(int n, cube_t *cube, char *solver, void *data, char *sols)
3779{
3780 char *s;
3781 int i;
3782
3783 s = sols;
3784 for (i = 0; i < n; i++) {
3785 solve(cube[i], solver, "", "normal", 0, -1, 1, 0, NULL, s);
3786 while (s++);
3787 }
3788}
3789
3790int64_t
3791gendata(char *solver, void *data)
3792{
3793 DBG_LOG("gendata: not implemented yet\n");
3794
3795 return -1;
3796}
3797
3798_static bool
3696allowednextmove(dfsarg_generic_t arg, uint8_t m) 3799allowednextmove(dfsarg_generic_t arg, uint8_t m)
3697{ 3800{
3698 int n; 3801 int n;
@@ -3720,7 +3823,7 @@ allowednextmove(dfsarg_generic_t arg, uint8_t m)
3720 return l1axis != l2axis || mbase != l2base; 3823 return l1axis != l2axis || mbase != l2base;
3721} 3824}
3722 3825
3723static void 3826_static void
3724solve_generic_appendsolution(dfsarg_generic_t arg) 3827solve_generic_appendsolution(dfsarg_generic_t arg)
3725{ 3828{
3726 int strl; 3829 int strl;
@@ -3733,7 +3836,7 @@ solve_generic_appendsolution(dfsarg_generic_t arg)
3733 (*arg.nsols)++; 3836 (*arg.nsols)++;
3734} 3837}
3735 3838
3736static int 3839_static int
3737solve_generic_dfs(dfsarg_generic_t arg) 3840solve_generic_dfs(dfsarg_generic_t arg)
3738{ 3841{
3739 dfsarg_generic_t nextarg; 3842 dfsarg_generic_t nextarg;
@@ -3765,7 +3868,7 @@ solve_generic_dfs(dfsarg_generic_t arg)
3765 return ret; 3868 return ret;
3766} 3869}
3767 3870
3768static int64_t 3871_static int64_t
3769solve_generic( 3872solve_generic(
3770 cube_t cube, 3873 cube_t cube,
3771 char *nisstype, 3874 char *nisstype,
@@ -3862,13 +3965,13 @@ solve_generic(
3862 return ret; 3965 return ret;
3863} 3966}
3864 3967
3865static uint8_t 3968_static uint8_t
3866estimate_simple(cube_fast_t cube) 3969estimate_simple(cube_fast_t cube)
3867{ 3970{
3868 return issolved_fast(cube) ? 0 : 1; 3971 return issolved_fast(cube) ? 0 : 1;
3869} 3972}
3870 3973
3871static int64_t 3974_static int64_t
3872solve_simple( 3975solve_simple(
3873 cube_t cube, 3976 cube_t cube,
3874 int8_t minmoves, 3977 int8_t minmoves,
@@ -3889,65 +3992,3 @@ solve_simple(
3889 &estimate_simple 3992 &estimate_simple
3890 ); 3993 );
3891} 3994}
3892
3893int64_t
3894solve(
3895 cube_t cube,
3896 char *solver,
3897 char *options,
3898 char *nisstype,
3899 int8_t minmoves,
3900 int8_t maxmoves,
3901 int64_t maxsols,
3902 int8_t optimal,
3903 void *data,
3904 char *solutions
3905)
3906{
3907 DBG_WARN(!strcmp(options, ""),
3908 "solve: 'options' not implemented yet, ignoring\n");
3909
3910 DBG_WARN(!strcmp(nisstype, ""),
3911 "solve: NISS not implemented yet, ignoring 'nisstype'\n");
3912
3913 DBG_WARN(data == NULL,
3914 "solve: 'data' not implemented yet, ignoring\n");
3915
3916 if (!strcmp(solver, "optimal") || !strcmp(solver, "simple")) {
3917 return solve_simple(
3918 cube,
3919 minmoves,
3920 maxmoves,
3921 maxsols,
3922 optimal,
3923 solutions
3924 );
3925 } else {
3926 DBG_LOG("solve: unknown solver '%s'\n", solver);
3927 return -1;
3928 }
3929
3930 DBG_LOG("solve: error\n");
3931 return -1;
3932}
3933
3934void
3935multisolve(int n, cube_t *cube, char *solver, void *data, char *sols)
3936{
3937 char *s;
3938 int i;
3939
3940 s = sols;
3941 for (i = 0; i < n; i++) {
3942 solve(cube[i], solver, "", "normal", 0, -1, 1, 0, NULL, s);
3943 while (s++);
3944 }
3945}
3946
3947int64_t
3948gendata(char *solver, void *data)
3949{
3950 DBG_LOG("gendata: not implemented yet\n");
3951
3952 return -1;
3953}

Generated with cgit - Back to sebastiano.tronto.net