Revision b4f45fdc
Added by Leszek Koltunski over 2 years ago
| src/main/java/org/distorted/solvers/SolverSkewb.java | ||
|---|---|---|
| 9 | 9 |
|
| 10 | 10 |
package org.distorted.solvers; |
| 11 | 11 |
|
| 12 |
import static org.distorted.objectlib.tablebases.TBSkewb.FREE; |
|
| 13 |
|
|
| 12 | 14 |
import android.content.res.Resources; |
| 13 | 15 |
|
| 14 | 16 |
import org.distorted.main.R; |
| ... | ... | |
| 68 | 70 |
|
| 69 | 71 |
private void getCenters(TwistyObject object, int[] centers) |
| 70 | 72 |
{
|
| 71 |
int[] map = {12,13,10,11,8,9};
|
|
| 73 |
final int[] face_colors = {4,5,2,3,0,1};
|
|
| 74 |
int[] tmp = new int[6]; |
|
| 72 | 75 |
|
| 73 | 76 |
for(int i=0; i<6; i++) |
| 74 |
centers[i] = object.getCubitFaceStickerIndex(map[i],0) - 6; |
|
| 77 |
{
|
|
| 78 |
int color = object.getCubitFaceStickerIndex(i+8,0) - 6; |
|
| 79 |
tmp[i] = face_colors[color]; |
|
| 80 |
} |
|
| 81 |
|
|
| 82 |
TablebaseHelpers.invertPermutation(tmp,centers); |
|
| 75 | 83 |
} |
| 76 | 84 |
|
| 77 | 85 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 166 | 174 |
} |
| 167 | 175 |
|
| 168 | 176 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 169 |
// free corners: 1,2,4,7 |
|
| 170 | 177 |
|
| 171 | 178 |
private int retFreeCornerPermutation(int[] perm, int[][] corners) |
| 172 | 179 |
{
|
| 173 |
int[] map = {1,2,4,7};
|
|
| 174 |
|
|
| 175 | 180 |
perm[0] = -1; |
| 176 | 181 |
perm[1] = -1; |
| 177 | 182 |
perm[2] = -1; |
| ... | ... | |
| 179 | 184 |
|
| 180 | 185 |
for(int i=0; i<4; i++) |
| 181 | 186 |
{
|
| 182 |
int[] cor = corners[map[i]];
|
|
| 187 |
int[] cor = corners[FREE[i]];
|
|
| 183 | 188 |
|
| 184 | 189 |
if( cornerIs(cor,2,5,0) ) perm[0] = i; |
| 185 | 190 |
if( cornerIs(cor,3,4,0) ) perm[1] = i; |
| ... | ... | |
| 199 | 204 |
|
| 200 | 205 |
private int retCornerPerm(int index, int[] perm) |
| 201 | 206 |
{
|
| 202 |
int[] free = {1,2,4,7};
|
|
| 203 |
|
|
| 204 | 207 |
switch(index) |
| 205 | 208 |
{
|
| 206 | 209 |
case 0: return 0; |
| 207 |
case 1: return free[perm[0]];
|
|
| 208 |
case 2: return free[perm[1]];
|
|
| 210 |
case 1: return FREE[perm[0]];
|
|
| 211 |
case 2: return FREE[perm[1]];
|
|
| 209 | 212 |
case 3: return 3; |
| 210 |
case 4: return free[perm[2]];
|
|
| 213 |
case 4: return FREE[perm[2]];
|
|
| 211 | 214 |
case 5: return 5; |
| 212 | 215 |
case 6: return 6; |
| 213 |
case 7: return free[perm[3]];
|
|
| 216 |
case 7: return FREE[perm[3]];
|
|
| 214 | 217 |
} |
| 215 | 218 |
|
| 216 | 219 |
return -1; |
| ... | ... | |
| 221 | 224 |
private void computeCornerQuats(int[] quats, int[][] corners, int[] perm) |
| 222 | 225 |
{
|
| 223 | 226 |
final int[] map = { 4,2,3,5,1,5,4,1 };
|
| 224 |
int[] twists = new int[8];
|
|
| 227 |
int[] twist = new int[8]; |
|
| 225 | 228 |
|
| 226 | 229 |
for(int i=0; i<8; i++) |
| 227 | 230 |
{
|
| 228 | 231 |
int color = mFaceColors[map[i]]; |
| 229 | 232 |
int[] c = corners[retCornerPerm(i,perm)]; |
| 230 | 233 |
|
| 231 |
if( c[0]==color ) twists[i] = 0;
|
|
| 232 |
else if( c[1]==color ) twists[i] = 1;
|
|
| 233 |
else twists[i] = 2;
|
|
| 234 |
if( c[0]==color ) twist[i] = 0; |
|
| 235 |
else if( c[1]==color ) twist[i] = 1; |
|
| 236 |
else twist[i] = 2; |
|
| 234 | 237 |
} |
| 235 | 238 |
|
| 236 |
TBSkewb.fillInQuats(quats,perm,twists);
|
|
| 239 |
TBSkewb.fillInQuats(quats,perm,twist); |
|
| 237 | 240 |
} |
| 238 | 241 |
|
| 239 | 242 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 257 | 260 |
getCenters(object,centers); |
| 258 | 261 |
int result3 = checkAllCentersPresent(centers); |
| 259 | 262 |
if( result3<0 ) return result3; |
| 260 |
/* |
|
| 261 |
for(int i=0; i<8; i++) |
|
| 262 |
for(int j=0; j<3; j++) android.util.Log.e("D", "corner "+i+" face "+j+" : "+corners[i][j]);
|
|
| 263 | 263 |
|
| 264 |
for(int i=0; i<6; i++) android.util.Log.e("D", "center "+i+" : "+centers[i]);
|
|
| 265 |
for(int i=0; i<6; i++) android.util.Log.e("D", "face "+i+" : "+mFaceColors[i]);
|
|
| 266 |
*/ |
|
| 267 | 264 |
if( !TablebaseHelpers.permutationIsEven(centers) ) return ERROR_TWO_CENTERS; |
| 268 | 265 |
int center_perm_num = TablebaseHelpers.computeEvenPermutationNum(centers); |
| 269 | 266 |
|
| ... | ... | |
| 272 | 269 |
|
| 273 | 270 |
computeCornerQuats(quats,corners,freePerm); |
| 274 | 271 |
TBSkewb.computeCornerTwists(twist,quats); |
| 275 |
/* |
|
| 276 |
for(int i=0; i<4; i++) android.util.Log.e("D", "perm "+i+" : "+freePerm[i]);
|
|
| 277 |
for(int i=0; i<8; i++) android.util.Log.e("D", "quat "+i+" : "+quats[i]);
|
|
| 278 |
for(int i=0; i<8; i++) android.util.Log.e("D", "twist "+i+" : "+twist[i]);
|
|
| 279 |
*/ |
|
| 280 |
int total = twist[1]+twist[2]+twist[4]+twist[7]; |
|
| 272 |
|
|
| 273 |
int total = 0; |
|
| 274 |
for(int i=0; i<4; i++) total += twist[FREE[i]]; |
|
| 281 | 275 |
if( (total%3)!=0 ) return ERROR_CORNER_TWISTED; |
| 282 | 276 |
int totalTwist = twist[0]+ 3*(twist[1]+ 3*(twist[2]+ 3*(twist[3]+ 3*(twist[4]+ 3*(twist[5]+ 3*twist[6]))))); |
| 283 | 277 |
|
| ... | ... | |
| 399 | 393 |
if( mSolver==null ) |
| 400 | 394 |
{
|
| 401 | 395 |
mSolver = ImplementedTablebasesList.createPacked(res,ObjectSignatures.SKEW_2); |
| 402 |
/* |
|
| 403 |
if( mSolver!=null ) |
|
| 404 |
{
|
|
| 405 |
mSolver.createTablebase(-1); |
|
| 406 |
mSolver.pack(); |
|
| 407 |
//mSolver.test(); |
|
| 408 |
} |
|
| 409 |
|
|
| 410 |
*/ |
|
| 411 | 396 |
} |
| 412 | 397 |
|
| 413 | 398 |
return mSolver!=null ? mSolver.solution(index,null) : null; |
Also available in: Unified diff
Skewb solver: full TB version works now.