commit bfac9e978fa82a7e8c553e8ec7f286aa7d385db1
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Apr 24 15:06:10 2023 +0200

    CU_323 solver: corrections.

diff --git a/src/main/java/org/distorted/solvers/SolverCuboid323.java b/src/main/java/org/distorted/solvers/SolverCuboid323.java
index c7bb3e0c..517ce6f3 100644
--- a/src/main/java/org/distorted/solvers/SolverCuboid323.java
+++ b/src/main/java/org/distorted/solvers/SolverCuboid323.java
@@ -11,8 +11,11 @@ package org.distorted.solvers;
 
 import android.content.res.Resources;
 
+import org.distorted.library.type.Static3D;
+import org.distorted.library.type.Static4D;
 import org.distorted.main.R;
 import org.distorted.objectlib.helpers.OperatingSystemInterface;
+import org.distorted.objectlib.helpers.QuatGroupGenerator;
 import org.distorted.objectlib.main.ObjectSignatures;
 import org.distorted.objectlib.main.TwistyObject;
 import org.distorted.objectlib.tablebases.ImplementedTablebasesList;
@@ -33,6 +36,56 @@ public class SolverCuboid323 extends SolverTablebase
   TablebasesAbstract mSolver;
   private final int[] mFaceColors;
   private int mErrorColor1, mErrorColor2, mErrorColor3;
+  private Static4D[] mQuats;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void initializeQuats()
+    {
+    int[] tmp2 = {2,2,2};
+    int[] tmp4 = {4,4};
+    int[][] angles = new int[][] { tmp2,tmp4,tmp2 };
+    Static3D[] axis = new Static3D[] { new Static3D(1,0,0), new Static3D(0,1,0), new Static3D(0,0,1) };
+    mQuats = QuatGroupGenerator.computeGroup(axis,angles);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private int mulQuat(int q1, int q2)
+    {
+    if( mQuats==null ) initializeQuats();
+    return TablebasesAbstract.mulQuat(q1,q2,mQuats);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void rotatePermutations(int[] corner, int[] edge8, int quat)
+    {
+    int[] quats = TBCuboid323.quatsFromPermutations(corner,edge8);
+    int num = quats.length;
+
+    for( int i=0; i<num; i++ ) quats[i] = mulQuat(quat,quats[i]);
+
+    TBCuboid323.cornerFromQuats(corner,quats);
+    TBCuboid323.edgeFromQuats(edge8,quats);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// when we input the position, edge1 can be anywhere. We need to rotate the permutations so that
+// edge1 is always in the front (i.e. so that edge[1] is 1 or 3)
+
+  private void normalizePermutations(int[] corner, int[] edge8)
+    {
+    switch(edge8[1])
+      {
+      case 0: case 2: rotatePermutations(corner,edge8,3);
+                      break;
+      case 4: case 5: rotatePermutations(corner,edge8,4);
+                      break;
+      case 6: case 7: rotatePermutations(corner,edge8,2);
+                      break;
+      }
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -287,19 +340,21 @@ public class SolverCuboid323 extends SolverTablebase
 //android.util.Log.e("D", "upper: "+mUpper);
 for(int i=0; i<6; i++) android.util.Log.e("D", "face color: "+mFaceColors[i]);
 
-    int[] edge_perm = new int[8];
-    int result2 = retEdgePermutation(edge_perm,edges);
+    int[] edge_perm8 = new int[8];
+    int result2 = retEdgePermutation(edge_perm8,edges);
     if( result2<0 ) return result2;
 
     TablebaseHelpers.displayTable(corner_perm, "CORNER PERM");
-    TablebaseHelpers.displayTable(edge_perm, "EDGE PERM8");
+    TablebaseHelpers.displayTable(edge_perm8, "EDGE PERM8");
+
+    normalizePermutations(corner_perm,edge_perm8);
 
-    int[] edge_perm2 = TBCuboid323.edgePermTo7(edge_perm);
+    int[] edge_perm7 = TBCuboid323.edgePermTo7(edge_perm8);
 
-TablebaseHelpers.displayTable(edge_perm2, "EDGE PERM7");
+TablebaseHelpers.displayTable(edge_perm7, "EDGE PERM7");
 
     int corner_perm_num = TablebaseHelpers.computePermutationNum(corner_perm);
-    int edge_perm_num = TablebaseHelpers.computePermutationNum(edge_perm2);
+    int edge_perm_num = TablebaseHelpers.computePermutationNum(edge_perm7);
     boolean inPlace = isFrontEdgeInItsPlace(edges);
 
 android.util.Log.e("D", "corner_perm_num: "+corner_perm_num+" edge_perm_num: "+edge_perm_num+" inPlace: "+inPlace);
