Project

General

Profile

« Previous | Next » 

Revision 3feba94e

Added by Leszek Koltunski about 1 year ago

CU_323 solver: return to the old way of moving layers with a twist (we do not move the front layer, we move the middle and back layers to imitate this move and keep edge1 always in place)

View differences:

src/main/java/org/distorted/objectlib/tablebases/TBCuboid323.java
155 155
    return new boolean[][] { {true,false,true},{false,true},{true,true,false} };
156 156
    }
157 157

  
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159
// we map the move (axis=2, middle layer) to move (axis=2,both middle and back layers).
160
// this way we can imitate move of the front layer (which we do not want to move because
161
// the edge1 piece has to always stay in its place)
162

  
163
  @Override
164
  int computeBitLayer(int ax, int layer)
165
    {
166
    if( ax!=2 ) return (1<<layer);
167

  
168
    switch(layer)
169
      {
170
      case 0 : return 1;
171
      case 1 : return 3;
172
      default: return 4;
173
      }
174
    }
175

  
158 176
///////////////////////////////////////////////////////////////////////////////////////////////////
159 177
// specifically for the tablebase
160 178
///////////////////////////////////////////////////////////////////////////////////////////////////
......
183 201

  
184 202
  int[] getHighPruningLevels()
185 203
    {
186
    return new int[] {18};
204
    return new int[] {17,18};
187 205
    }
188 206

  
189 207
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/objectlib/tablebases/TablebasesAbstract.java
126 126
      }
127 127
    }
128 128

  
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

  
131
  int computeBitLayer(int ax, int layer)
132
    {
133
    return (1<<layer);
134
    }
135

  
129 136
///////////////////////////////////////////////////////////////////////////////////////////////////
130 137

  
131 138
  int computeRow(float[] pos, int quat, int axisIndex)
......
271 278
      for(int layer=0; layer<mNumLayers[ax]; layer++)
272 279
        {
273 280
        if( !mRotatable[ax][layer] ) continue;
274
        int bitLayer = (1<<layer);
281
        int bitLayer = computeBitLayer(ax,layer);
275 282
        int maxAngle = mAngles[ax][layer];
276 283

  
277 284
        for(int angle=1; angle<maxAngle; angle++ )
......
280 287
          int quat = quatBasis + angle;
281 288

  
282 289
          for(int cubit=0; cubit<mNumCubits; cubit++)
283
            if( mRotRow[cubit][ax]==bitLayer )
290
            if( (mRotRow[cubit][ax] & bitLayer) != 0 )
284 291
              {
285 292
              int currQuat = tmpQuats[cubit];
286 293
              int newQuat = getMultQuat(quat,currQuat);
......
393 400

  
394 401
///////////////////////////////////////////////////////////////////////////////////////////////////
395 402

  
396
  int[] newMove(int axis, int layer, int angle)
403
  int[] newMove(int ax, int layer, int angle)
397 404
    {
398
    int maxAngle = mAngles[axis][layer];
405
    int maxAngle = mAngles[ax][layer];
399 406
    angle = maxAngle-angle;
400 407
    if( angle> 0.5f*maxAngle ) angle -= maxAngle;
401 408

  
402
    return new int[] { axis, (1<<layer), angle };
409
    return new int[] { ax, computeBitLayer(ax,layer), angle };
403 410
    }
404 411

  
405 412
///////////////////////////////////////////////////////////////////////////////////////////////////
......
479 486

  
480 487
        if( mRotatable[ax][layer] )
481 488
          {
482
          int bitLayer = (1<<layer);
489
          int bitLayer = computeBitLayer(ax,layer);
483 490
          System.arraycopy(quats, 0, tmpQuats, 0, numQuats);
484 491

  
485 492
          for(int cubit=0; cubit<mNumCubits; cubit++)
486
            if( mRotRow[cubit][ax]==bitLayer )
493
            if( (mRotRow[cubit][ax] & bitLayer) != 0 )
487 494
              {
488 495
              int currQuat = tmpQuats[cubit];
489 496
              int newQuat = getMultQuat(quat,currQuat);
......
584 591

  
585 592
      if( mRotatable[ax][layer] )
586 593
        {
587
        int bitLayer = (1<<layer);
594
        int bitLayer = computeBitLayer(ax,layer);
588 595
        System.arraycopy(quats, 0, tmpQuats, 0, numQuats);
589 596

  
590 597
        for(int cubit=0; cubit<mNumCubits; cubit++)
591
          if( mRotRow[cubit][ax]==bitLayer )
598
          if( (mRotRow[cubit][ax] & bitLayer) != 0 )
592 599
            {
593 600
            int currQuat = tmpQuats[cubit];
594 601
            int newQuat = getMultQuat(quat,currQuat);
src/main/java/org/distorted/objectlib/tablebases/TablebasesPruning.java
14 14
import java.io.ByteArrayOutputStream;
15 15
import java.io.IOException;
16 16
import java.io.InputStream;
17
import java.util.ArrayList;
18 17

  
19 18
///////////////////////////////////////////////////////////////////////////////////////////////////
20 19

  
......
24 23

  
25 24
  private PruningTable[] mHighTables;
26 25
  private PruningTable[] mMidTables;
27
  private int mLowestHigh, mHighestMid, mLowestMid, mMaxDistance;
26
  private int mLowestHigh, mHighestMid, mLowestMid;
28 27

  
29 28
///////////////////////////////////////////////////////////////////////////////////////////////////
30 29

  
......
161 160
      if( i==0 || level<mLowestMid  ) mLowestMid =level;
162 161
      if( i==0 || level>mHighestMid ) mHighestMid=level;
163 162
      }
164

  
165
    int maxHigh = (mLowestHigh-mHighestMid)/2;
166
    int maxMid  = mLowestMid/2;
167

  
168
    mMaxDistance = Math.max(maxHigh,maxMid);
169 163
    }
170 164

  
171 165
///////////////////////////////////////////////////////////////////////////////////////////////////
......
192 186

  
193 187
      if( mRotatable[ax][layer] && moveCanProceed(lastA,lastR,move[0],move[1]) )
194 188
        {
195
        int bitLayer = (1<<layer);
189
        int bitLayer = computeBitLayer(ax,layer);
196 190
        System.arraycopy(quats, 0, tmpQuats, 0, numQuats);
197 191

  
198 192
        for(int cubit=0; cubit<mNumCubits; cubit++)
199
          if( mRotRow[cubit][ax]==bitLayer )
193
          if( (mRotRow[cubit][ax] & bitLayer) != 0 )
200 194
            {
201 195
            int currQuat = tmpQuats[cubit];
202 196
            int newQuat = getMultQuat(quat,currQuat);
......
304 298

  
305 299
      if( mRotatable[ax][layer] && moveCanProceed(lastA,lastR,ax,layer) )
306 300
        {
307
        int bitLayer = (1<<layer);
301
        int bitLayer = computeBitLayer(ax,layer);
308 302
        System.arraycopy(quats, 0, tmp, 0, numQuats);
309 303

  
310 304
        for(int cubit=0; cubit<mNumCubits; cubit++)
311
          if( rotRow[cubit][ax]==bitLayer )
305
          if( (rotRow[cubit][ax] & bitLayer) != 0 )
312 306
            {
313 307
            int currQuat = tmp[cubit];
314 308
            int newQuat = getMultQuat(quat,currQuat);
......
391 385

  
392 386
      if( mRotatable[ax][layer] && moveCanProceed(lastA,lastR,move[0],move[1]) )
393 387
        {
394
        int bitLayer = (1<<layer);
388
        int bitLayer = computeBitLayer(ax,layer);
395 389
        System.arraycopy(quats, 0, tmp, 0, numQuats);
396 390

  
397 391
        for(int cubit=0; cubit<mNumCubits; cubit++)
398
          if( rotRow[cubit][ax]==bitLayer )
392
          if( (rotRow[cubit][ax] & bitLayer) != 0 )
399 393
            {
400 394
            int currQuat = tmp[cubit];
401 395
            int newQuat = getMultQuat(quat,currQuat);
......
516 510
      }
517 511
    return concatenateMoves(highMoves,jump1Moves,midMoves,jump2Moves);
518 512
    }
519
/*
520
///////////////////////////////////////////////////////////////////////////////////////////////////
521

  
522
  private int getDistanceSingle(int[] quats)
523
    {
524
    int index = getIndex(quats);
525

  
526
    if( isSolved(index) ) return 0;
527

  
528
    int numMid = mMidTables.length;
529
    for(int i=0; i<numMid; i++)
530
      if( mMidTables[i].contains(index) ) return mLowestMid+i;
531

  
532
    if( mHighTables!=null )
533
      {
534
      int numHigh = mHighTables.length;
535
      for(int i=0; i<numHigh; i++)
536
        if( mHighTables[i].contains(index) )
537
          {
538
          //android.util.Log.e("D", "high tables contain "+index);
539
          return mLowestHigh+i;
540
          }
541

  
542
      //android.util.Log.e("D", "high tables do not contain "+index);
543
      }
544

  
545
    return -1;
546
    }
547

  
548
///////////////////////////////////////////////////////////////////////////////////////////////////
549

  
550
  private int getDistance(int[] quats, int depth)
551
    {
552
    if( depth==0 ) return getDistanceSingle(quats);
553

  
554
    final int MAX = 1000;
555
    int[] data = new int[4];
556
    int numQuats = quats.length;
557
    int[] tmpQuats = new int[numQuats];
558
    int[][] rotRow = new int[mNumCubits][mNumAxis];
559
    int ret = MAX;
560

  
561
    data[0]=0;
562
    data[1]=0;
563
    data[2]=1;
564
    data[3]=1;
565

  
566
    for(int ax=0; ax<mNumAxis; ax++)
567
      for(int cubit=0; cubit<mNumCubits; cubit++)
568
        rotRow[cubit][ax] = computeRow(mPosition[cubit],quats[cubit],ax);
569

  
570
    for(int s=0; s<mScalingFactor; s++)
571
      {
572
      int ax    = data[0];
573
      int layer = data[1];
574
      int quat  = data[3];
575

  
576
      if( mRotatable[ax][layer] )
577
        {
578
        int bitLayer = (1<<layer);
579
        System.arraycopy(quats, 0, tmpQuats, 0, numQuats);
580

  
581
        for(int cubit=0; cubit<mNumCubits; cubit++)
582
          if( rotRow[cubit][ax]==bitLayer )
583
            {
584
            int currQuat = tmpQuats[cubit];
585
            int newQuat = getMultQuat(quat,currQuat);
586
            tmpQuats[cubit] = newQuat;
587
            }
588

  
589
//android.util.Log.e("D", "getDistance: trying ax="+ax+" layer="+layer+" angle="+data[2]+" quat="+quat);
590
//TablebaseHelpers.displayTable(tmpQuats, "tmpQuats");
591

  
592
        int dist = getDistance(tmpQuats,depth-1);
593

  
594
//android.util.Log.e("D", "dist="+dist);
595

  
596
        if( dist>=0 && dist<ret ) ret=dist;
597
        }
598

  
599
      getNextAxisLayerAngleQuat(data);
600
      }
601

  
602
    return ret<MAX ? ret : -1;
603
    }
604

  
605
///////////////////////////////////////////////////////////////////////////////////////////////////
606

  
607
  private int getDepth(int[] quats, OperatingSystemInterface osi)
608
    {
609
    for(int d=0; d<=mMaxDistance; d++)
610
      {
611
//TablebaseHelpers.displayTable(quats, "quats, d="+d);
612

  
613
      int res = getDistance(quats,d);
614

  
615
//osi.reportError("getDistance res="+res+" d="+d);
616

  
617
      if( res>=0 )
618
        {
619
        if( res==0 ) return d;
620
        if( res==mLowestMid ) return mLowestMid-d;
621
        if( res>mLowestMid && res<mHighestMid )
622
          {
623
          if( d>0 )
624
            {
625
            osi.reportError("1 IMPOSSIBLE!!");
626
            return -1;
627
            }
628
          else return res;
629
          }
630
        if( res==mHighestMid ) return mHighestMid+d;
631
        if( res==mLowestHigh ) return mLowestHigh-d;
632
        if( res >mLowestHigh )
633
          {
634
          if( d>0 )
635
            {
636
            osi.reportError("2 IMPOSSIBLE!!");
637
            return -1;
638
            }
639
          else return res;
640
          }
641
        }
642
      }
643

  
644
    int index=getIndex(quats);
645
    osi.reportError("3 IMPOSSIBLE "+index);
646
    return -1;
647
    }
648

  
649
///////////////////////////////////////////////////////////////////////////////////////////////////
650

  
651
  public int[][] solutionNew(int index, int[] extra, OperatingSystemInterface osi)
652
    {
653
    int[] data = new int[4];
654
    ArrayList<int[]> moves = new ArrayList<>();
655
    int[] quats = getQuats(index);
656
    int depth = getDepth(quats,osi);
657
    int numQuats = quats.length;
658
    int[] tmpQuats = new int[numQuats];
659

  
660
    while( depth>0 )
661
      {
662
      boolean found = false;
663

  
664
      data[0]=0;
665
      data[1]=0;
666
      data[2]=1;
667
      data[3]=1;
668

  
669
      for(int ax=0; ax<mNumAxis; ax++)
670
        for(int cubit=0; cubit<mNumCubits; cubit++)
671
          mRotRow[cubit][ax] = computeRow(mPosition[cubit],quats[cubit],ax);
672

  
673
      for(int s=0; s<mScalingFactor && !found; s++)
674
        {
675
        int ax    = data[0];
676
        int layer = data[1];
677
        int angle = data[2];
678
        int quat  = data[3];
679

  
680
        if( mRotatable[ax][layer] )
681
          {
682
          int bitLayer = (1<<layer);
683
          System.arraycopy(quats, 0, tmpQuats, 0, numQuats);
684

  
685
          for(int cubit=0; cubit<mNumCubits; cubit++)
686
            if( mRotRow[cubit][ax]==bitLayer )
687
              {
688
              int currQuat = tmpQuats[cubit];
689
              int newQuat = getMultQuat(quat,currQuat);
690
              tmpQuats[cubit] = newQuat;
691
              }
692

  
693
          int newDepth = getDepth(tmpQuats,osi);
694

  
695
          if( newDepth==depth-1 )
696
            {
697
            int[] tmpMove = newMove(ax,layer,angle);
698
            moves.add(tmpMove);
699
            quats = new int[numQuats];
700
            System.arraycopy(tmpQuats, 0, quats, 0, numQuats);
701
            depth = newDepth;
702
            found = true;
703
            }
704
          }
705

  
706
        getNextAxisLayerAngleQuat(data);
707
        }
708
      }
709

  
710
    int[][] ret = convertMovesFromArray(moves);
711

  
712
    return extraInfo(ret,extra);
713
    }
714

  
715
 */
716 513
}

Also available in: Unified diff