Revision 5b9f1cec
Added by Leszek Koltunski about 1 year ago
src/main/java/org/distorted/objectlib/tablebases/TablebasesAbstract.java | ||
---|---|---|
303 | 303 |
public void createTablebase(int maxLevel) |
304 | 304 |
{ |
305 | 305 |
mTablebase = new Tablebase(mSize); |
306 |
mTablebase.insertUnpacked(0,(byte)0); |
|
306 |
int[] solved = getSolvedIndices(); |
|
307 |
int numSolved = solved.length; |
|
308 |
for(int s : solved ) mTablebase.insertUnpacked(s,(byte)0); |
|
307 | 309 |
|
308 |
int numInserted, totalInserted=1;
|
|
310 |
int numInserted, totalInserted=numSolved;
|
|
309 | 311 |
byte insertingLevel = 0; |
310 | 312 |
|
311 | 313 |
android.util.Log.e("D", "creating tablebase of size "+mSize); |
... | ... | |
329 | 331 |
android.util.Log.e("D", "total Inserted: "+totalInserted); |
330 | 332 |
} |
331 | 333 |
|
334 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
335 |
|
|
336 |
int[] getSolvedIndices() |
|
337 |
{ |
|
338 |
return new int[] {0}; |
|
339 |
} |
|
340 |
|
|
341 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
342 |
|
|
343 |
boolean isSolved(int index) |
|
344 |
{ |
|
345 |
return index==0; |
|
346 |
} |
|
347 |
|
|
332 | 348 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
333 | 349 |
|
334 | 350 |
public void pack() |
... | ... | |
359 | 375 |
{ |
360 | 376 |
for(int[] move : moves ) |
361 | 377 |
{ |
362 |
int axis = move[0]; |
|
363 |
int layer= move[1]; |
|
364 |
int angle= move[2]; |
|
365 |
|
|
366 |
int maxAngle = mAngles[axis][layer]; |
|
367 |
angle = maxAngle-angle; |
|
368 |
if( angle> 0.5f*maxAngle ) angle -= maxAngle; |
|
378 |
int[] newMove = newMove(move[0],move[1],move[2]); |
|
369 | 379 |
|
370 |
move[1] = (1<<layer); |
|
371 |
move[2] = angle; |
|
380 |
move[0] = newMove[0]; |
|
381 |
move[1] = newMove[1]; |
|
382 |
move[2] = newMove[2]; |
|
372 | 383 |
} |
373 | 384 |
} |
374 | 385 |
|
375 | 386 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
376 | 387 |
|
377 |
private void addMove(ArrayList<int[]> moves, int axis, int layer, int angle)
|
|
388 |
int[] newMove(int axis, int layer, int angle)
|
|
378 | 389 |
{ |
379 | 390 |
int maxAngle = mAngles[axis][layer]; |
380 | 391 |
angle = maxAngle-angle; |
381 | 392 |
if( angle> 0.5f*maxAngle ) angle -= maxAngle; |
382 | 393 |
|
383 |
int[] move = new int[] { axis, (1<<layer), angle }; |
|
384 |
moves.add(move); |
|
394 |
return new int[] { axis, (1<<layer), angle }; |
|
385 | 395 |
} |
386 | 396 |
|
387 | 397 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
439 | 449 |
int numQuats = quats.length; |
440 | 450 |
int[] tmpQuats = new int[numQuats]; |
441 | 451 |
|
442 |
while(index!=0)
|
|
452 |
while( !isSolved(index) )
|
|
443 | 453 |
{ |
444 | 454 |
boolean found = false; |
445 | 455 |
|
... | ... | |
477 | 487 |
|
478 | 488 |
if( ((newLevel-level+1)%3) == 0 ) |
479 | 489 |
{ |
480 |
addMove(moves,ax,layer,angle); |
|
490 |
int[] tmpMove = newMove(ax,layer,angle); |
|
491 |
moves.add(tmpMove); |
|
481 | 492 |
index = childIndex; |
482 | 493 |
level = (level==0 ? 2 : (byte)(level-1)); |
483 | 494 |
found = true; |
... | ... | |
534 | 545 |
} |
535 | 546 |
} |
536 | 547 |
|
548 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
549 |
// TESTING |
|
537 | 550 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
538 | 551 |
|
539 | 552 |
public boolean test(int index) |
... | ... | |
588 | 601 |
|
589 | 602 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
590 | 603 |
|
591 |
public void testPruning(int level) |
|
604 |
public void testPruning(int level) |
|
605 |
{ |
|
606 |
for( int supp : PruningTable.SUPPORTED ) |
|
592 | 607 |
{ |
593 |
for( int supp : PruningTable.SUPPORTED ) |
|
594 |
{ |
|
595 |
PruningTable table = new PruningTable(mTablebase, level, supp); |
|
596 |
int size = mTablebase.getSize(); |
|
608 |
PruningTable table = new PruningTable(mTablebase, level, supp); |
|
609 |
int size = mTablebase.getSize(); |
|
597 | 610 |
|
598 |
StringBuilder sb = new StringBuilder();
|
|
599 |
int num = 0;
|
|
611 |
StringBuilder sb = new StringBuilder(); |
|
612 |
int num = 0; |
|
600 | 613 |
|
601 |
for(int i=0; i<size; i++) |
|
614 |
for(int i=0; i<size; i++) |
|
615 |
{ |
|
616 |
if (table.contains(i)) |
|
602 | 617 |
{ |
603 |
if (table.contains(i)) |
|
604 |
{ |
|
605 |
if ((num % 10) == 0) sb.append("\n"); |
|
606 |
num++; |
|
607 |
sb.append(i); |
|
608 |
sb.append(' '); |
|
609 |
} |
|
618 |
if ((num % 10) == 0) sb.append("\n"); |
|
619 |
num++; |
|
620 |
sb.append(i); |
|
621 |
sb.append(' '); |
|
610 | 622 |
} |
611 |
|
|
612 |
android.util.Log.e("D", "numbers: " + sb); |
|
613 | 623 |
} |
624 |
|
|
625 |
android.util.Log.e("D", "numbers: " + sb); |
|
626 |
} |
|
627 |
} |
|
628 |
|
|
629 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
630 |
|
|
631 |
private void printQuats(int[] quats) |
|
632 |
{ |
|
633 |
StringBuilder sb = new StringBuilder(); |
|
634 |
for(int q : quats ) |
|
635 |
{ |
|
636 |
sb.append(' '); |
|
637 |
sb.append(q); |
|
614 | 638 |
} |
639 |
android.util.Log.e("D", "quats: "+sb); |
|
640 |
} |
|
641 |
|
|
642 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
643 |
|
|
644 |
public void test() |
|
645 |
{ |
|
646 |
int[] p0 = {0,5,6,10, 2,3,11,9, 1,4,7,8}; |
|
647 |
int[] q0 = TBDino6.getQuatsFromPerm(p0); |
|
648 |
int index0 = getIndex(q0); |
|
649 |
android.util.Log.e("D", "index0: "+index0); |
|
650 |
|
|
651 |
int[] p1 = {0,3,11,6, 7,8,10,2, 1,4,9,5}; |
|
652 |
int[] q1 = TBDino6.getQuatsFromPerm(p1); |
|
653 |
int index1 = getIndex(q1); |
|
654 |
android.util.Log.e("D", "index1: "+index1); |
|
655 |
|
|
656 |
int[] p2 = {0,3,2,1, 7,6,5,4, 8,11,10,9}; |
|
657 |
int[] q2 = TBDino6.getQuatsFromPerm(p2); |
|
658 |
int index2 = getIndex(q2); |
|
659 |
android.util.Log.e("D", "index2: "+index2); |
|
660 |
} |
|
615 | 661 |
|
616 | 662 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
617 | 663 |
|
618 |
private void printQuats(int[] quats) |
|
664 |
private void printPerm(int index) |
|
665 |
{ |
|
666 |
int[] perm11 = new int[11]; |
|
667 |
TablebaseHelpers.getEvenPermutationFromNum(perm11,index); |
|
668 |
int[] perm = new int[12]; |
|
669 |
for(int i=1; i<12; i++) perm[i] = perm11[i-1]+1; |
|
670 |
|
|
671 |
StringBuilder sb = new StringBuilder(); |
|
672 |
sb.append(index); |
|
673 |
sb.append(" : "); |
|
674 |
|
|
675 |
for(int i=0; i<12; i++) |
|
619 | 676 |
{ |
620 |
StringBuilder sb = new StringBuilder(); |
|
621 |
for(int q : quats ) |
|
622 |
{ |
|
623 |
sb.append(' '); |
|
624 |
sb.append(q); |
|
625 |
} |
|
626 |
android.util.Log.e("D", "quats: "+sb); |
|
677 |
sb.append(' '); |
|
678 |
sb.append(perm[i]); |
|
627 | 679 |
} |
680 |
android.util.Log.e("D", "PERM: "+sb); |
|
681 |
} |
|
628 | 682 |
|
629 | 683 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
630 | 684 |
|
631 |
public void test() |
|
685 |
private void printQuat(int index) |
|
686 |
{ |
|
687 |
int[] perm11 = new int[11]; |
|
688 |
TablebaseHelpers.getEvenPermutationFromNum(perm11,index); |
|
689 |
int[] perm = new int[12]; |
|
690 |
for(int i=1; i<12; i++) perm[i] = perm11[i-1]+1; |
|
691 |
int[] quats = TBDino6.getQuatsFromPerm(perm); |
|
692 |
|
|
693 |
StringBuilder sb = new StringBuilder(); |
|
694 |
sb.append(index); |
|
695 |
sb.append(" : "); |
|
696 |
|
|
697 |
for(int i=0; i<12; i++) |
|
632 | 698 |
{ |
633 |
int[] q1 = {1,1,1,0,1,0,0,0, 1,0,1,0,1,0 }; |
|
634 |
int index1 = getIndex(q1); |
|
635 |
android.util.Log.e("D", "index1: "+index1); |
|
636 |
|
|
637 |
int[] q2 = getQuats(index1); |
|
638 |
printQuats(q2); |
|
639 |
/* |
|
640 |
int[] q2 = {0,0,3,0,4,0,0,0, 0,0,0,0,0,0 }; |
|
641 |
int index2 = getIndex(q2); |
|
642 |
android.util.Log.e("D", "index2: "+index2); |
|
643 |
|
|
644 |
*/ |
|
699 |
sb.append(' '); |
|
700 |
sb.append(quats[i]); |
|
645 | 701 |
} |
702 |
android.util.Log.e("D", "QUATS: "+sb); |
|
703 |
} |
|
646 | 704 |
} |
Also available in: Unified diff
Dino6 solver: pruning version done.