Project

General

Profile

Download (9.65 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TBCuboid323.java @ e1e92738

1 68b59ec3 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objectlib.tablebases;
11
12
import org.distorted.library.type.Static3D;
13 feceac2f Leszek Koltunski
import org.distorted.objectlib.R;
14 68b59ec3 Leszek Koltunski
import org.distorted.objectlib.helpers.OperatingSystemInterface;
15
16
///////////////////////////////////////////////////////////////////////////////////////////////////
17
18 45dc5cd7 Leszek Koltunski
public class TBCuboid323 extends TablebasesPruning
19 68b59ec3 Leszek Koltunski
{
20 6ab0bce9 Leszek Koltunski
  private static final int[][] CORNER_MAP = new int[][]
21
      {
22
          {0,4,7,1,2,3,5,6},
23
          {2,0,1,6,3,4,7,5},
24
          {7,1,0,4,5,6,2,3},
25
          {1,6,2,0,7,5,3,4},
26
          {4,3,5,7,0,2,6,1},
27
          {3,2,6,5,4,0,1,7},
28
          {5,7,4,3,6,1,0,2},
29
          {6,5,3,2,1,7,4,0}
30
      };
31
  private static final int[][] EDGE_MAP = new int[][]
32
      {
33
          {0,3,5,1,4,7,2,6},
34
          {3,0,1,5,2,6,4,7},
35
          {5,1,0,3,7,4,6,2},
36
          {1,5,3,0,6,2,7,4},
37
          {2,4,7,6,0,1,3,5},
38
          {7,6,2,4,1,0,5,3},
39
          {4,2,6,7,3,5,0,1},
40
          {6,7,4,2,5,3,1,0}
41
      };
42
43
///////////////////////////////////////////////////////////////////////////////////////////////////
44 5b9e0ba4 Leszek Koltunski
// remove perm[1] which is always equal to 1.
45 6ab0bce9 Leszek Koltunski
46 08451d7f Leszek Koltunski
  public static int[] edgePermTo7(int[] perm)
47 6ab0bce9 Leszek Koltunski
    {
48
    int[] ret = new int[7];
49
50 5b9e0ba4 Leszek Koltunski
    ret[0] = perm[0]; if( ret[0]>1 ) ret[0]--;
51
    ret[1] = perm[2]; if( ret[1]>1 ) ret[1]--;
52
    ret[2] = perm[3]; if( ret[2]>1 ) ret[2]--;
53
    ret[3] = perm[4]; if( ret[3]>1 ) ret[3]--;
54
    ret[4] = perm[5]; if( ret[4]>1 ) ret[4]--;
55
    ret[5] = perm[6]; if( ret[5]>1 ) ret[5]--;
56
    ret[6] = perm[7]; if( ret[6]>1 ) ret[6]--;
57 6ab0bce9 Leszek Koltunski
58
    return ret;
59
    }
60
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62 c64217f7 Leszek Koltunski
// reverse the above
63 6ab0bce9 Leszek Koltunski
64 5b9e0ba4 Leszek Koltunski
  private static int[] edgePermTo8(int[] perm)
65 6ab0bce9 Leszek Koltunski
    {
66
    int[] ret = new int[8];
67
68 5b9e0ba4 Leszek Koltunski
    ret[0] = perm[0]; if( ret[0]>=1 ) ret[0]++;
69
    ret[1] = 1;
70
    ret[2] = perm[1]; if( ret[2]>=1 ) ret[2]++;
71
    ret[3] = perm[2]; if( ret[3]>=1 ) ret[3]++;
72
    ret[4] = perm[3]; if( ret[4]>=1 ) ret[4]++;
73
    ret[5] = perm[4]; if( ret[5]>=1 ) ret[5]++;
74
    ret[6] = perm[5]; if( ret[6]>=1 ) ret[6]++;
75
    ret[7] = perm[6]; if( ret[7]>=1 ) ret[7]++;
76 6ab0bce9 Leszek Koltunski
77
    return ret;
78
    }
79
80
///////////////////////////////////////////////////////////////////////////////////////////////////
81
82 68b59ec3 Leszek Koltunski
  public TBCuboid323()
83
    {
84
    super();
85
    }
86
87
///////////////////////////////////////////////////////////////////////////////////////////////////
88
89
  public TBCuboid323(OperatingSystemInterface os)
90
    {
91 e1e92738 Leszek Koltunski
    super(os,new int[] {R.raw.cu_323_pruning7 ,R.raw.cu_323_pruning8 },
92
             new int[] {R.raw.cu_323_pruning17,R.raw.cu_323_pruning18} );
93 68b59ec3 Leszek Koltunski
    }
94
95
///////////////////////////////////////////////////////////////////////////////////////////////////
96
97
  int[][] getBasicAngles()
98
    {
99 5b9e0ba4 Leszek Koltunski
    int[] tmp2 = {2,2,2};
100
    int[] tmp4 = {4,4};
101
    return new int[][] { tmp2,tmp4,tmp2 };
102 68b59ec3 Leszek Koltunski
    }
103
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105
106
  Static3D[] getRotationAxis()
107
    {
108
    return new Static3D[]
109
         {
110
           new Static3D(1,0,0),
111
           new Static3D(0,1,0),
112
           new Static3D(0,0,1)
113
         };
114
    }
115
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117
118
  float[][] getPosition()
119
    {
120
    return new float[][]
121
      {
122
        { -1.0f, -0.5f, -1.0f },
123
        { -1.0f, -0.5f,  1.0f },
124
        { -1.0f,  0.5f, -1.0f },
125
        { -1.0f,  0.5f,  1.0f },
126
        {  1.0f, -0.5f, -1.0f },
127
        {  1.0f, -0.5f,  1.0f },
128
        {  1.0f,  0.5f, -1.0f },
129
        {  1.0f,  0.5f,  1.0f },
130
131
        {  0.0f, -0.5f, -1.0f },
132
        {  0.0f, -0.5f,  1.0f },
133
        {  0.0f,  0.5f, -1.0f },
134
        {  0.0f,  0.5f,  1.0f },
135
        { -1.0f, -0.5f,  0.0f },
136
        { -1.0f,  0.5f,  0.0f },
137
        {  1.0f, -0.5f,  0.0f },
138
        {  1.0f,  0.5f,  0.0f },
139
140
        {  0.0f,  0.5f,  0.0f },
141
        {  0.0f, -0.5f,  0.0f },
142
      };
143
    }
144
145
///////////////////////////////////////////////////////////////////////////////////////////////////
146
147
  float[][] getCuts()
148
    {
149
    return new float[][] { {-0.5f,0.5f}, {0.0f}, {-0.5f,0.5f} };
150
    }
151
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153
154
  boolean[][] getRotatable()
155
    {
156 5b9e0ba4 Leszek Koltunski
    return new boolean[][] { {true,false,true},{false,true},{true,true,false} };
157 68b59ec3 Leszek Koltunski
    }
158
159 3feba94e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
160
// we map the move (axis=2, middle layer) to move (axis=2,both middle and back layers).
161
// this way we can imitate move of the front layer (which we do not want to move because
162
// the edge1 piece has to always stay in its place)
163
164
  @Override
165
  int computeBitLayer(int ax, int layer)
166
    {
167
    if( ax!=2 ) return (1<<layer);
168
169
    switch(layer)
170
      {
171
      case 0 : return 1;
172
      case 1 : return 3;
173
      default: return 4;
174
      }
175
    }
176
177 68b59ec3 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
178
// specifically for the tablebase
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180
// 8!*8!/4 --> https://www.jaapsch.net/puzzles/domino.htm
181
182
  int getSize()
183
    {
184
    return 406425600;
185
    }
186
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188
189
  int getMinScramble()
190
    {
191
    return 13;
192
    }
193
194 45dc5cd7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
195
196
  int[] getMidPruningLevels()
197
    {
198 5b9e0ba4 Leszek Koltunski
    return new int[] {7,8};
199 45dc5cd7 Leszek Koltunski
    }
200
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202
203
  int[] getHighPruningLevels()
204
    {
205 3feba94e Leszek Koltunski
    return new int[] {17,18};
206 45dc5cd7 Leszek Koltunski
    }
207
208
///////////////////////////////////////////////////////////////////////////////////////////////////
209
210
  int getGodsNumber()
211
    {
212
    return 18;
213
    }
214
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216
217
  boolean moveCanProceed(int lastA, int lastR, int currA, int currR)
218
    {
219
    return (lastA!=currA) || (lastR!=currR);
220
    }
221
222 6ab0bce9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
223
224 398f2870 Leszek Koltunski
  private static int findIndex(int[] table, int value)
225 6ab0bce9 Leszek Koltunski
    {
226
    for(int i=0; i<8; i++)
227
      if( table[i]==value ) return i;
228
229
    return -1;
230
    }
231
232
///////////////////////////////////////////////////////////////////////////////////////////////////
233
234 5b9e0ba4 Leszek Koltunski
  private int centersInverted(int[] quats)
235 6ab0bce9 Leszek Koltunski
    {
236 5b9e0ba4 Leszek Koltunski
    int q = quats[16];
237
    return (q==0 || q==2 || q==3 || q==4) ? 0 : 1;
238 6ab0bce9 Leszek Koltunski
    }
239
240 398f2870 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
241
242 5b9e0ba4 Leszek Koltunski
  public static int[] quatsFromPermutations(int[] corner, int[] edge8, int centers)
243 398f2870 Leszek Koltunski
    {
244
    int[] quats = new int[18];
245
246
    for(int i=0; i<8; i++)
247
      {
248
      int q = CORNER_MAP[i][corner[i]];
249
      quats[i] = q;
250
      }
251
    for(int i=0; i<8; i++)
252
      {
253
      int q = EDGE_MAP[i][edge8[i]];
254
      quats[i+8] = q;
255
      }
256
257 5b9e0ba4 Leszek Koltunski
    if( centers==0 )
258
      {
259
      quats[16]=0;
260
      quats[17]=0;
261
      }
262
    else
263
      {
264
      quats[16]=5;
265
      quats[17]=5;
266
      }
267
268 398f2870 Leszek Koltunski
    return quats;
269
    }
270
271
///////////////////////////////////////////////////////////////////////////////////////////////////
272
273
  public static void cornerFromQuats(int[] corner_perm, int[] quats)
274
    {
275
    for(int i=0; i<8; i++) corner_perm[i] = findIndex( CORNER_MAP[i], quats[i]);
276
    }
277
278
///////////////////////////////////////////////////////////////////////////////////////////////////
279
280
  public static void edgeFromQuats(int[] edge_perm, int[] quats)
281
    {
282
    for(int i=0; i<8; i++) edge_perm[i] = findIndex( EDGE_MAP[i], quats[i+8]);
283
    }
284
285 68b59ec3 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
286
287
  public int[] getQuats(int index)
288
    {
289 5b9e0ba4 Leszek Koltunski
    int cornerPermNum = (index%40320);
290 45dc5cd7 Leszek Koltunski
    index /= 40320;
291 5b9e0ba4 Leszek Koltunski
    int centers = (index%2);
292 6ab0bce9 Leszek Koltunski
    int edgePermNum = index/2;
293
294
    int[] corner_perm = new int[8];
295
    TablebaseHelpers.getPermutationFromNum(corner_perm,8,cornerPermNum);
296
    int[] edge_perm7 = new int[7];
297
    TablebaseHelpers.getPermutationFromNum(edge_perm7,7,edgePermNum);
298 5b9e0ba4 Leszek Koltunski
    int[] edge_perm8 = edgePermTo8(edge_perm7);
299 c64217f7 Leszek Koltunski
/*
300
TablebaseHelpers.displayTable(corner_perm, "CORNER");
301
TablebaseHelpers.displayTable(edge_perm8, "EDGE8");
302
TablebaseHelpers.displayTable(edge_perm7, "EDGE7");
303
android.util.Log.e("D", "inPlace="+inPlace);
304
*/
305 6ab0bce9 Leszek Koltunski
306 5b9e0ba4 Leszek Koltunski
    return quatsFromPermutations(corner_perm,edge_perm8,centers);
307 68b59ec3 Leszek Koltunski
    }
308
309
///////////////////////////////////////////////////////////////////////////////////////////////////
310
311
  public int getIndex(int[] quats)
312
    {
313 6ab0bce9 Leszek Koltunski
    int[] corner_perm = new int[8];
314 398f2870 Leszek Koltunski
    cornerFromQuats(corner_perm,quats);
315 6ab0bce9 Leszek Koltunski
    int[] edge_perm8  = new int[8];
316 398f2870 Leszek Koltunski
    edgeFromQuats(edge_perm8,quats);
317
    int[] edge_perm7  = edgePermTo7(edge_perm8);
318 6ab0bce9 Leszek Koltunski
319
    int corner_perm_num = TablebaseHelpers.computePermutationNum(corner_perm);
320
    int edge_perm_num = TablebaseHelpers.computePermutationNum(edge_perm7);
321 5b9e0ba4 Leszek Koltunski
    int centers = centersInverted(quats);
322 6ab0bce9 Leszek Koltunski
323 5b9e0ba4 Leszek Koltunski
    return corner_perm_num + 40320*( centers + 2*edge_perm_num);
324 68b59ec3 Leszek Koltunski
    }
325
}