Revision 693cc52e
Added by Leszek Koltunski 12 months ago
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
speedup