Project

General

Profile

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

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

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 java.util.Random;
13

    
14
///////////////////////////////////////////////////////////////////////////////////////////////////
15

    
16
public class TablebaseHelpers
17
{
18

    
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

    
21
  public static void displayTable(int[] table, String marker)
22
    {
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
///////////////////////////////////////////////////////////////////////////////////////////////////
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
      int[][] moves = tb.solution(next,null,null);
91
      String moveSeq = print(moves);
92
      android.util.Log.e("D", (moves==null ? 0 : moves.length)+" Trying "+next+" : "+moveSeq);
93
      }
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  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
    for(int i=0; i<len-1; i++) numOfSwaps += swaps(i,buffer,len);
118
    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
      ret += swaps(len-1-i,permutation,len+2);
132

    
133
      if( i<len-1 )
134
        {
135
        ret *= mul;
136
        mul++;
137
        }
138
      }
139

    
140
    return ret;
141
    }
142

    
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144

    
145
  public static void getEvenPermutationFromNum(int[] buffer, int permNum)
146
    {
147
    int permSize = buffer.length;
148
    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
    }
205

    
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207

    
208
  public static int computePermutationNum(int[] permutation)
209
    {
210
    int len = permutation.length;
211
    int ret = 0;
212
    int mul = 3;
213

    
214
    for(int i=0; i<len-2; i++)
215
      {
216
      ret += swaps(len-2-i,permutation,len);
217
      ret *= mul;
218
      mul++;
219
      }
220

    
221
    ret += swaps(0,permutation,len);
222

    
223
    return ret;
224
    }
225

    
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227

    
228
  public static void getPermutationFromNum(int[] buffer,int permSize, int permNum)
229
    {
230
    int index = permSize;
231
    int len = permSize-1;
232

    
233
    for(int i=0; i<permSize; i++) buffer[i]=-1;
234

    
235
    for(int i=0; i<len; i++)
236
      {
237
      int swaps = (permNum%index);
238
      permNum /= index;
239
      index--;
240

    
241
      for(int j=0; j<permSize; j++)
242
        {
243
        if( buffer[j]==-1 )
244
          {
245
          if( swaps==0 )
246
            {
247
            buffer[j] = i;
248
            break;
249
            }
250
          swaps--;
251
          }
252
        }
253
      }
254

    
255
    for(int i=0; i<permSize; i++)
256
      if( buffer[i]==-1 )
257
        {
258
        buffer[i] = permSize-1;
259
        break;
260
        }
261
    }
262

    
263
///////////////////////////////////////////////////////////////////////////////////////////////////
264

    
265
  public static void invertPermutation(int[] perm, int[] output)
266
    {
267
    int len = perm.length;
268
    for(int i=0; i<len; i++) output[i] = -1;
269
    for(int i=0; i<len; i++) output[perm[i]] = i;
270
    }
271
}
(17-17/19)