Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TablebaseHelpers.java @ 68b59ec3

1 f9980f6a 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 74cc695a Leszek Koltunski
import java.util.Random;
13
14 f9980f6a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
15
16
public class TablebaseHelpers
17
{
18 74cc695a Leszek Koltunski
19 d6e2cf37 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
20
21 68b59ec3 Leszek Koltunski
  public static void displayTable(int[] table, String marker)
22 d6e2cf37 Leszek Koltunski
    {
23
    StringBuilder sb = new StringBuilder();
24
25
    for( int t : table )
26
      {
27
      sb.append(' ');
28
      sb.append(t);
29
      }
30
31
    android.util.Log.e("D", marker+" : "+sb);
32
    }
33
34 74cc695a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
35
36
  private static String print(int[][] move)
37
    {
38
    StringBuilder sb = new StringBuilder();
39
40
    if( move==null )
41
      {
42
      return ("move NULL!!");
43
      }
44
45
    for (int[] ints : move)
46
      {
47
      sb.append(' ');
48
      sb.append('(');
49
      sb.append(ints[0]);
50
      sb.append(' ');
51
      sb.append(ints[1]);
52
      sb.append(' ');
53
      sb.append(ints[2]);
54
      sb.append(')');
55
      }
56
57
    return sb.toString();
58
    }
59
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
62
  public static void test(TablebasesAbstract tb)
63
    {
64
    int size = tb.getSize();
65
66
    for(int i=0; i<size; i++)
67
      {
68
      boolean success = tb.test(i);
69
70
      if( (!success && i>0) || (success && i==0) )
71
        {
72
        android.util.Log.e("D", "--------> FAILED: "+i);
73
        break;
74
        }
75
76
      if( (i%1000)==0 )   android.util.Log.e("D", "trying "+i);
77
      }
78
    }
79
80
///////////////////////////////////////////////////////////////////////////////////////////////////
81
82
  public static void test2(TablebasesAbstract tb, int num)
83
    {
84
    Random rnd = new Random();
85
    int size = tb.getSize();
86
87
    for(int i=0; i<num; i++)
88
      {
89
      int next = rnd.nextInt(size-1);
90 00e83f23 Leszek Koltunski
      int[][] moves = tb.solution(next,null,null);
91 74cc695a Leszek Koltunski
      String moveSeq = print(moves);
92
      android.util.Log.e("D", (moves==null ? 0 : moves.length)+" Trying "+next+" : "+moveSeq);
93
      }
94
    }
95
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97
98 f9980f6a Leszek Koltunski
  private static int swaps(int val, int[] buffer, int len)
99
    {
100
    int ret = 0;
101
102
    for(int i=0; i<len; i++)
103
      {
104
           if( buffer[i] >val ) ret++;
105
      else if( buffer[i]==val ) return ret;
106
      }
107
108
    return -1;
109
    }
110
111
///////////////////////////////////////////////////////////////////////////////////////////////////
112
113
  public static boolean permutationIsEven(int[] buffer)
114
    {
115
    int len = buffer.length;
116
    int numOfSwaps = 0;
117 4d63b066 Leszek Koltunski
    for(int i=0; i<len-1; i++) numOfSwaps += swaps(i,buffer,len);
118 f9980f6a Leszek Koltunski
    return (numOfSwaps%2==0);
119
    }
120
121
///////////////////////////////////////////////////////////////////////////////////////////////////
122
123
  public static int computeEvenPermutationNum(int[] permutation)
124
    {
125
    int len = permutation.length-2;
126
    int ret = 0;
127
    int mul = 4;
128
129
    for(int i=0; i<len; i++)
130
      {
131 4d63b066 Leszek Koltunski
      ret += swaps(len-1-i,permutation,len+2);
132 f9980f6a Leszek Koltunski
133
      if( i<len-1 )
134
        {
135
        ret *= mul;
136
        mul++;
137
        }
138
      }
139
140
    return ret;
141
    }
142
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144
145 522d858e Leszek Koltunski
  public static void getEvenPermutationFromNum(int[] buffer, int permNum)
146 f9980f6a Leszek Koltunski
    {
147 522d858e Leszek Koltunski
    int permSize = buffer.length;
148 f9980f6a Leszek Koltunski
    int index = permSize;
149
    int len = permSize-2;
150
    int totalSwaps = 0;
151
152
    for(int i=0; i<permSize; i++) buffer[i]=-1;
153
154
    for(int i=0; i<len; i++)
155
      {
156
      int swaps = (permNum%index);
157
      permNum /= index;
158
      index--;
159
      totalSwaps += swaps;
160
161
      for(int j=0; j<permSize; j++)
162
        {
163
        if( buffer[j]==-1 )
164
          {
165
          if( swaps==0 )
166
            {
167
            buffer[j] = i;
168
            break;
169
            }
170
          swaps--;
171
          }
172
        }
173
      }
174
175
    int lower, upper;
176
177
    if( (totalSwaps%2)==0 )
178
      {
179
      lower = permSize-2;
180
      upper = permSize-1;
181
      }
182
    else
183
      {
184
      lower = permSize-1;
185
      upper = permSize-2;
186
      }
187
188
    boolean first=true;
189
190
    for(int i=0; i<permSize; i++)
191
      if( buffer[i]==-1 )
192
        {
193
        if( first )
194
          {
195
          buffer[i] = lower;
196
          first=false;
197
          }
198
        else
199
          {
200
          buffer[i] = upper;
201
          break;
202
          }
203
        }
204 4d63b066 Leszek Koltunski
    }
205
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207
208
  public static int computePermutationNum(int[] permutation)
209
    {
210
    int len = permutation.length-1;
211
    int ret = 0;
212
    int mul = 3;
213
214
    for(int i=0; i<len; i++)
215
      {
216
      ret += swaps(len-1-i,permutation,len+1);
217
218
      if( i<len-1 )
219
        {
220
        ret *= mul;
221
        mul++;
222
        }
223
      }
224
225
    return ret;
226
    }
227 f9980f6a Leszek Koltunski
228 4d63b066 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
229
230
  public static void getPermutationFromNum(int[] buffer,int permSize, int permNum)
231
    {
232
    int index = permSize;
233
    int len = permSize-1;
234
235
    for(int i=0; i<permSize; i++) buffer[i]=-1;
236
237
    for(int i=0; i<len; i++)
238
      {
239
      int swaps = (permNum%index);
240
      permNum /= index;
241
      index--;
242
243
      for(int j=0; j<permSize; j++)
244
        {
245
        if( buffer[j]==-1 )
246
          {
247
          if( swaps==0 )
248
            {
249
            buffer[j] = i;
250
            break;
251
            }
252
          swaps--;
253
          }
254
        }
255
      }
256
257
    for(int i=0; i<permSize; i++)
258
      if( buffer[i]==-1 )
259
        {
260
        buffer[i] = permSize-1;
261
        break;
262
        }
263 f9980f6a Leszek Koltunski
    }
264 8a489ebd Leszek Koltunski
265
///////////////////////////////////////////////////////////////////////////////////////////////////
266
267
  public static void invertPermutation(int[] perm, int[] output)
268
    {
269
    int len = perm.length;
270 43780264 Leszek Koltunski
    for(int i=0; i<len; i++) output[i] = -1;
271 8a489ebd Leszek Koltunski
    for(int i=0; i<len; i++) output[perm[i]] = i;
272
    }
273 f9980f6a Leszek Koltunski
}