Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
import org.distorted.objectlib.helpers.OperatingSystemInterface;
14

    
15
///////////////////////////////////////////////////////////////////////////////////////////////////
16

    
17
public class TBCuboid323 extends TablebasesAbstract
18
{
19
  private static final int[][] CORNER_MAP = new int[][]
20
      {
21
          {0,4,7,1,2,3,5,6},
22
          {2,0,1,6,3,4,7,5},
23
          {7,1,0,4,5,6,2,3},
24
          {1,6,2,0,7,5,3,4},
25
          {4,3,5,7,0,2,6,1},
26
          {3,2,6,5,4,0,1,7},
27
          {5,7,4,3,6,1,0,2},
28
          {6,5,3,2,1,7,4,0}
29
      };
30
  private static final int[][] EDGE_MAP = new int[][]
31
      {
32
          {0,3,5,1,4,7,2,6},
33
          {3,0,1,5,2,6,4,7},
34
          {5,1,0,3,7,4,6,2},
35
          {1,5,3,0,6,2,7,4},
36
          {2,4,7,6,0,1,3,5},
37
          {7,6,2,4,1,0,5,3},
38
          {4,2,6,7,3,5,0,1},
39
          {6,7,4,2,5,3,1,0}
40
      };
41

    
42
  private static boolean mUpper;
43

    
44
///////////////////////////////////////////////////////////////////////////////////////////////////
45

    
46
  public static void setUpper(boolean upper)
47
    {
48
    mUpper = upper;
49
    }
50

    
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52
// if mUpper==true, then the edge3 is the 'half-fixed' front edge. Remove it from the permutation.
53
// Otherwise edge1 is the one; remove it.
54

    
55
  public static int[] edgePermTo7(int[] perm, boolean upper)
56
    {
57
    int val;
58
    int[] ret = new int[7];
59

    
60
    if( upper )
61
      {
62
      ret[0] = perm[0];
63
      ret[1] = perm[1];
64
      ret[2] = perm[2];
65
      ret[3] = perm[4];
66
      ret[4] = perm[5];
67
      ret[5] = perm[6];
68
      ret[6] = perm[7];
69

    
70
      val = perm[3];
71
      }
72
    else
73
      {
74
      ret[0] = perm[0];
75
      ret[1] = perm[2];
76
      ret[2] = perm[3];
77
      ret[3] = perm[4];
78
      ret[4] = perm[5];
79
      ret[5] = perm[6];
80
      ret[6] = perm[7];
81

    
82
      val = perm[1];
83
      }
84

    
85
    for(int i=0; i<7; i++)
86
      if( ret[i]>val ) ret[i]--;
87

    
88
    return ret;
89
    }
90

    
91
///////////////////////////////////////////////////////////////////////////////////////////////////
92

    
93
  private static int[] edgePermTo8(int[] perm, boolean inPlace)
94
    {
95
    int[] ret = new int[8];
96

    
97
    if( mUpper )
98
      {
99
      int val = inPlace ? 3:1;
100
      ret[0] = perm[0]; if( ret[0]>=val ) ret[0]++;
101
      ret[1] = perm[1]; if( ret[1]>=val ) ret[1]++;
102
      ret[2] = perm[2]; if( ret[2]>=val ) ret[2]++;
103
      ret[3] = val;
104
      ret[4] = perm[3]; if( ret[4]>=val ) ret[4]++;
105
      ret[5] = perm[4]; if( ret[5]>=val ) ret[5]++;
106
      ret[6] = perm[5]; if( ret[6]>=val ) ret[6]++;
107
      ret[7] = perm[6]; if( ret[7]>=val ) ret[7]++;
108
      }
109
    else
110
      {
111
      int val = inPlace ? 1:3;
112
      ret[0] = perm[0]; if( ret[0]>=val ) ret[0]++;
113
      ret[1] = val;
114
      ret[2] = perm[1]; if( ret[2]>=val ) ret[2]++;
115
      ret[3] = perm[2]; if( ret[3]>=val ) ret[3]++;
116
      ret[4] = perm[3]; if( ret[4]>=val ) ret[4]++;
117
      ret[5] = perm[4]; if( ret[5]>=val ) ret[5]++;
118
      ret[6] = perm[5]; if( ret[6]>=val ) ret[6]++;
119
      ret[7] = perm[6]; if( ret[7]>=val ) ret[7]++;
120
      }
121

    
122
    return ret;
123
    }
124

    
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126

    
127
  public TBCuboid323()
128
    {
129
    super();
130
    }
131

    
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133

    
134
  public TBCuboid323(OperatingSystemInterface os)
135
    {
136
    super(os,org.distorted.objectlib.R.raw.cu_232_tablebase);
137
    }
138

    
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140

    
141
  int[][] getBasicAngles()
142
    {
143
    int[] tmp2 = {2,2,2};
144
    int[] tmp4 = {4,4};
145
    return new int[][] { tmp2,tmp4,tmp2 };
146
    }
147

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  Static3D[] getRotationAxis()
151
    {
152
    return new Static3D[]
153
         {
154
           new Static3D(1,0,0),
155
           new Static3D(0,1,0),
156
           new Static3D(0,0,1)
157
         };
158
    }
159

    
160
///////////////////////////////////////////////////////////////////////////////////////////////////
161

    
162
  float[][] getPosition()
163
    {
164
    return new float[][]
165
      {
166
        { -1.0f, -0.5f, -1.0f },
167
        { -1.0f, -0.5f,  1.0f },
168
        { -1.0f,  0.5f, -1.0f },
169
        { -1.0f,  0.5f,  1.0f },
170
        {  1.0f, -0.5f, -1.0f },
171
        {  1.0f, -0.5f,  1.0f },
172
        {  1.0f,  0.5f, -1.0f },
173
        {  1.0f,  0.5f,  1.0f },
174

    
175
        {  0.0f, -0.5f, -1.0f },
176
        {  0.0f, -0.5f,  1.0f },
177
        {  0.0f,  0.5f, -1.0f },
178
        {  0.0f,  0.5f,  1.0f },
179
        { -1.0f, -0.5f,  0.0f },
180
        { -1.0f,  0.5f,  0.0f },
181
        {  1.0f, -0.5f,  0.0f },
182
        {  1.0f,  0.5f,  0.0f },
183

    
184
        {  0.0f,  0.5f,  0.0f },
185
        {  0.0f, -0.5f,  0.0f },
186
      };
187
    }
188

    
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190

    
191
  float[][] getCuts()
192
    {
193
    return new float[][] { {-0.5f,0.5f}, {0.0f}, {-0.5f,0.5f} };
194
    }
195

    
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197

    
198
  boolean[][] getRotatable()
199
    {
200
    return new boolean[][] { {true,false,true},{true,false},{true,false,true} };
201
    }
202

    
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204
// specifically for the tablebase
205
///////////////////////////////////////////////////////////////////////////////////////////////////
206
// 8!*8!/4 --> https://www.jaapsch.net/puzzles/domino.htm
207

    
208
  int getSize()
209
    {
210
    return 406425600;
211
    }
212

    
213
///////////////////////////////////////////////////////////////////////////////////////////////////
214

    
215
  int getMinScramble()
216
    {
217
    return 13;
218
    }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221

    
222
  private int findIndex(int[] table, int value)
223
    {
224
    for(int i=0; i<8; i++)
225
      if( table[i]==value ) return i;
226

    
227
    return -1;
228
    }
229

    
230
///////////////////////////////////////////////////////////////////////////////////////////////////
231

    
232
  private boolean isFrontEdgeInItsPlace(int[] perm)
233
    {
234
    return perm[mUpper ? 3 : 1]==0;
235
    }
236

    
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238

    
239
  public int[] getQuats(int index)
240
    {
241
    int cornerPermNum = index%20160;
242
    index /= 20160;
243
    boolean inPlace = ((index%2)==0);
244
    int edgePermNum = index/2;
245

    
246
    int[] corner_perm = new int[8];
247
    TablebaseHelpers.getPermutationFromNum(corner_perm,8,cornerPermNum);
248
    int[] edge_perm7 = new int[7];
249
    TablebaseHelpers.getPermutationFromNum(edge_perm7,7,edgePermNum);
250
    int[] edge_perm8 = edgePermTo8(edge_perm7,inPlace);
251

    
252
    int[] quats = new int[18];
253

    
254
    for(int i=0; i<8; i++)
255
      {
256
      int q = CORNER_MAP[i][corner_perm[i]];
257
      quats[i] = q;
258
      }
259
    for(int i=0; i<8; i++)
260
      {
261
      int q = EDGE_MAP[i][edge_perm8[i]];
262
      quats[i+8] = q;
263
      }
264

    
265
    return quats;
266
    }
267

    
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269

    
270
  public int getIndex(int[] quats)
271
    {
272
    int[] corner_perm = new int[8];
273
    int[] edge_perm8  = new int[8];
274

    
275
    for(int i=0; i<8; i++)
276
      {
277
      corner_perm[i] = findIndex( CORNER_MAP[i], quats[i  ]);
278
      edge_perm8[i]  = findIndex( EDGE_MAP[i]  , quats[i+8]);
279
      }
280

    
281
    int[] edge_perm7 = edgePermTo7(edge_perm8,mUpper);
282

    
283
    int corner_perm_num = TablebaseHelpers.computePermutationNum(corner_perm);
284
    int edge_perm_num = TablebaseHelpers.computePermutationNum(edge_perm7);
285
    boolean inPlace = isFrontEdgeInItsPlace(edge_perm8);
286

    
287
    return corner_perm_num + 20160*( (inPlace?0:1) + 2*edge_perm_num);
288
    }
289
}  
290

    
(5-5/19)