commit 86bdcff582f0cfe12a4e2bb0898a74d348a2abb4
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Apr 3 01:41:03 2023 +0200

    Skeleton of a Pyraminx Diamond solver.

diff --git a/src/main/java/org/distorted/objectlib/tablebases/ImplementedTablebasesList.java b/src/main/java/org/distorted/objectlib/tablebases/ImplementedTablebasesList.java
index ef03751c..7264b228 100644
--- a/src/main/java/org/distorted/objectlib/tablebases/ImplementedTablebasesList.java
+++ b/src/main/java/org/distorted/objectlib/tablebases/ImplementedTablebasesList.java
@@ -31,6 +31,7 @@ public enum ImplementedTablebasesList
   SKEW2    (ObjectSignatures.SKEW_2, TBSkewb.class),
   DINO6    (ObjectSignatures.DINO_3, TBDino6.class),
   DINO4    (ObjectSignatures.DIN4_3, TBDino4.class),
+  PDIAM    (ObjectSignatures.PDIA_3, TBPyraminxDiamond.class),
   ;
 
   public static final int NUM_OBJECTS = values().length;
diff --git a/src/main/java/org/distorted/objectlib/tablebases/TBPyraminxDiamond.java b/src/main/java/org/distorted/objectlib/tablebases/TBPyraminxDiamond.java
new file mode 100644
index 00000000..32dcfdab
--- /dev/null
+++ b/src/main/java/org/distorted/objectlib/tablebases/TBPyraminxDiamond.java
@@ -0,0 +1,133 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2023 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.objectlib.tablebases;
+
+import static org.distorted.objectlib.main.TwistyObject.SQ2;
+
+import android.content.res.Resources;
+
+import org.distorted.library.type.Static3D;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class TBPyraminxDiamond extends TablebasesAbstract
+{
+  public TBPyraminxDiamond()
+    {
+    super();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public TBPyraminxDiamond(Resources res)
+    {
+    super(res, 0);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int[][] getBasicAngles()
+    {
+    int[] tmp = {4,4,4};
+    return new int[][] { tmp,tmp,tmp };
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  Static3D[] getRotationAxis()
+    {
+    return new Static3D[]
+         {
+         new Static3D(SQ2/2, 0, SQ2/2),
+         new Static3D(    0, 1,     0),
+         new Static3D(SQ2/2, 0,-SQ2/2)
+         };
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float[][] getPosition()
+    {
+    float B0 = 1.5f*SQ2;
+    float C0 = 1.5f;
+    float A  = 1.03f;
+    float B1 = 0.5f*SQ2*A;
+    float C1 = A;
+
+    return new float[][]
+         {
+             {  0, B0,  0 },
+             {  0,-B0,  0 },
+             { C0,  0, C0 },
+             { C0,  0,-C0 },
+             {-C0,  0, C0 },
+             {-C0,  0,-C0 },
+
+             {  0, B1, C1 },
+             {  0, B1,-C1 },
+             {  0,-B1, C1 },
+             {  0,-B1,-C1 },
+             { C1, B1,  0 },
+             { C1,-B1,  0 },
+             {-C1, B1,  0 },
+             {-C1,-B1,  0 },
+         };
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  float[][] getCuts()
+    {
+    float C = 0.5f*SQ2;
+    float[] cut = { -C,C};
+    return new float[][] { cut,cut,cut };
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  boolean[][] getRotatable()
+    {
+    boolean[] tmp = {true,false,true};
+    return new boolean[][] { tmp,tmp,tmp };
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// specifically for the tablebase
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// 4^6 - corner twists; 8! - center permutation; divide by 2 because parity of permutation must
+// agree with parity of total twists = (4^6)*8! / 2 = 82.575.360
+
+  int getSize()
+    {
+    return 82575360;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getMinScramble()
+    {
+    return 8;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int[] getQuats(int index)
+    {
+    return null;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getIndex(int[] quats)
+    {
+    return 0;
+    }
+}  
+
