Project

General

Profile

« Previous | Next » 

Revision 693cc52e

Added by Leszek Koltunski 12 months ago

speedup

View differences:

src/main/java/org/distorted/objectlib/tablebases/TBCuboid323.java
197 197
    return new boolean[][] { {true,false,true},{false,true},{true,true,false} };
198 198
    }
199 199

  
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201
// purely for speedup
202

  
203
  @Override
204
  void computeRow(float[] pos, int quat, int[] output)
205
    {
206
    float[] q = mQuats[quat];
207
    float qx = q[0];
208
    float qy = q[1];
209
    float qz = q[2];
210
    float qw = q[3];
211
    float rx = pos[0];
212
    float ry = pos[1];
213
    float rz = pos[2];
214

  
215
    mTmp[0] = qx - rz*qy + ry*qz + rx*qw;
216
    mTmp[1] = qy + rz*qx + ry*qw - rx*qz;
217
    mTmp[2] = qz + rz*qw - ry*qx + rx*qy;
218
    mTmp[3] = qw - rz*qz - ry*qy - rx*qx;
219

  
220
    float x = qw*mTmp[0] + qz*mTmp[1] - qy*mTmp[2] - qx*mTmp[3];
221
    float y = qw*mTmp[1] - qz*mTmp[0] - qy*mTmp[3] + qx*mTmp[2];
222
    float z = qw*mTmp[2] - qz*mTmp[3] + qy*mTmp[0] - qx*mTmp[1];
223

  
224
    output[0] = (x<-0.5f ? 1 : (x<0.5f ? 2:4));
225
    output[1] = (y<0 ? 1:2);
226
    output[2] = (z<-0.5f ? 1 : (z<0.5f ? 2:4));
227
    }
228

  
229 200
///////////////////////////////////////////////////////////////////////////////////////////////////
230 201
// we map the move (axis=2, middle layer) to move (axis=2,both middle and back layers).
231 202
// this way we can imitate move of the front layer (which we do not want to move because
src/main/java/org/distorted/objectlib/tablebases/TablebasesAbstract.java
32 32
  private final int mNumQuats;
33 33
  private final float[][] mCuts;
34 34
  private final int[] mNumCuts;
35
  private final int[][] mCubitRows;
36
  private final int[][] mCubitQuatMap;
37
  private final float[][] mQuats;
38
  private final float[][] mPosition;
35 39

  
36 40
  private int[][] mQuatMult;
37 41
  private int[] mInvertedQuat;
......
39 43
  Tablebase mTablebase;
40 44
  boolean mInitialized;
41 45

  
42
  final float[][] mQuats;
43 46
  final int mScalingFactor;
44 47
  final int mNumAxis;
45
  final float[][] mPosition;
46 48
  final int[][] mRotRow;
47 49
  final int mNumCubits;
48 50
  final boolean[][] mRotatable;
49 51

  
50
  static final float[] mTmp = new float[4];
52
  private static final float[] mTmp = new float[4];
51 53

  
52 54
///////////////////////////////////////////////////////////////////////////////////////////////////
53 55

  
......
102 104

  
103 105
    mScalingFactor = scaling;
104 106
    mRotRow = new int[mNumCubits][mNumAxis];
107

  
108
    mCubitRows = new int[mNumCubits][mNumAxis];
109
    mCubitQuatMap = new int[mNumCubits][mNumQuats];
110

  
111
    for(int i=0; i<mNumCubits; i++)
112
      {
113
      computeInitRow(i,mCubitRows[i]);
114
      for(int j=0; j<mNumQuats; j++) mCubitQuatMap[i][j] = computeMap(i,j);
115
      }
116

  
105 117
    mInitialized = false;
106 118
    }
107 119

  
......
135 147
      }
136 148
    }
137 149

  
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151

  
152
  private int computeMap(int cubit, int quat)
153
    {
154
    float[] pos = mPosition[cubit];
155
    float[] q = mQuats[quat];
156

  
157
    QuatHelper.rotateVectorByQuat(mTmp,pos[0],pos[1],pos[2],1.0f,q);
158
    float dist = Float.MAX_VALUE;
159
    int min = 0;
160

  
161
    for(int i=0; i<mNumCubits; i++)
162
      {
163
      float[] p = mPosition[i];
164
      float dx = p[0]-mTmp[0];
165
      float dy = p[1]-mTmp[1];
166
      float dz = p[2]-mTmp[2];
167

  
168
      float d = dx*dx + dy*dy + dz*dz;
169

  
170
      if( d<dist )
171
        {
172
        dist = d;
173
        min = i;
174
        }
175
      }
176

  
177
    return min;
178
    }
179

  
138 180
///////////////////////////////////////////////////////////////////////////////////////////////////
139 181

  
140 182
  int computeBitLayer(int ax, int layer)
......
144 186

  
145 187
///////////////////////////////////////////////////////////////////////////////////////////////////
146 188

  
147
  void computeRow(float[] pos, int quat, int[] output)
189
  void computeInitRow(int cubit, int[] output)
148 190
    {
149
    int len = pos.length/3;
150
    float[] q = mQuats[quat];
191
    float[] pos = mPosition[cubit];
151 192
    int num = output.length;
152 193

  
153
    for(int i=0; i<len; i++)
194
    for(int i=0; i<num; i++)
154 195
      {
155
      QuatHelper.rotateVectorByQuat(mTmp,pos[3*i],pos[3*i+1],pos[3*i+2],1.0f,q);
156

  
157
      for(int j=0; j<num; j++)
158
        {
159
        output[j] = 0;
160
        Static3D axis = mAxis[j];
161
        float axisX = axis.get0();
162
        float axisY = axis.get1();
163
        float axisZ = axis.get2();
164
        float casted = mTmp[0]*axisX + mTmp[1]*axisY + mTmp[2]*axisZ;
165
        output[j] |= computeSingleRow(j,casted);
166
        }
196
      Static3D axis = mAxis[i];
197
      float axisX = axis.get0();
198
      float axisY = axis.get1();
199
      float axisZ = axis.get2();
200
      float casted = pos[0]*axisX + pos[1]*axisY + pos[2]*axisZ;
201
      output[i] = computeSingleRow(i,casted);
167 202
      }
168 203
    }
169 204

  
......
181 216
    return (1<<num);
182 217
    }
183 218

  
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

  
221
  int[] computeRow(int cubit, int quat)
222
    {
223
    int newPos = mCubitQuatMap[cubit][quat];
224
    return mCubitRows[newPos];
225
    }
226

  
184 227
///////////////////////////////////////////////////////////////////////////////////////////////////
185 228
// remember about the double cover or unit quaternions!
186 229

  
......
281 324
    byte newLevel = (byte)(level+1);
282 325
    int quatBasis = 0;
283 326

  
284
    for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
327
    for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
285 328

  
286 329
    for(int ax=0; ax<mNumAxis; ax++)
287 330
      {
......
482 525
      data[2]=1;
483 526
      data[3]=1;
484 527

  
485
      for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
528
      for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
486 529

  
487 530
      for(int s=0; s<mScalingFactor && !found; s++)
488 531
        {
......
586 629
    data[2]=1;
587 630
    data[3]=1;
588 631

  
589
    for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
632
    for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
590 633

  
591 634
    for(int s=0; s<mScalingFactor; s++)
592 635
      {
src/main/java/org/distorted/objectlib/tablebases/TablebasesPruning.java
174 174
    move[2]=1;
175 175
    move[3]=1;
176 176

  
177
    for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],mRotRow[cubit]);
177
    for(int cubit=0; cubit<mNumCubits; cubit++) mRotRow[cubit] = computeRow(cubit,quats[cubit]);
178 178

  
179 179
    for(int s=0; s<mScalingFactor; s++)
180 180
      {
......
285 285
    move[2]=1;
286 286
    move[3]=1;
287 287

  
288
    for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],rotRow[cubit]);
288
    for(int cubit=0; cubit<mNumCubits; cubit++) rotRow[cubit] = computeRow(cubit,quats[cubit]);
289 289

  
290 290
    for(int s=0; s<mScalingFactor; s++)
291 291
      {
......
300 300

  
301 301
        for(int cubit=0; cubit<mNumCubits; cubit++)
302 302
          if( (rotRow[cubit][ax] & bitLayer) != 0 )
303
            {
304
            int currQuat = tmp[cubit];
305
            int newQuat = getMultQuat(quat,currQuat);
306
            tmp[cubit] = newQuat;
307
            }
303
            tmp[cubit] = getMultQuat(quat,tmp[cubit]);
308 304

  
309 305
        int childIndex = getIndex(tmp);
310 306

  
......
373 369
    move[2]=1;
374 370
    move[3]=1;
375 371

  
376
    for(int cubit=0; cubit<mNumCubits; cubit++) computeRow(mPosition[cubit],quats[cubit],rotRow[cubit]);
372
    for(int cubit=0; cubit<mNumCubits; cubit++) rotRow[cubit] = computeRow(cubit,quats[cubit]);
377 373

  
378 374
    for(int s=0; s<mScalingFactor; s++)
379 375
      {

Also available in: Unified diff