/** * initializing from cached tables(move table, pruning table, etc.) * * @param in * Where to read tables. * * @see cs.min2phase.Tools#saveTo(java.io.DataOutput) */ public static void initFrom(System.IO.BinaryReader input) { if (Search.inited) { return; } CubieCube.initMove(); CubieCube.initSym(); read(CubieCube.FlipS2R, input); read(CubieCube.TwistS2R, input); read(CubieCube.EPermS2R, input); read(CubieCube.MtoEPerm, input); read(CubieCube.Perm2Comb, input); read(CoordCube.TwistMove, input); read(CoordCube.FlipMove, input); read(CoordCube.UDSliceMove, input); read(CoordCube.UDSliceConj, input); read(CoordCube.CPermMove, input); read(CoordCube.EPermMove, input); read(CoordCube.MPermMove, input); read(CoordCube.MPermConj, input); read(CoordCube.CCombMove, input); read(CoordCube.CCombConj, input); read(CoordCube.MCPermPrun, input); read(CoordCube.MEPermPrun, input); read(CoordCube.EPermCCombPrun, input); if (Search.EXTRA_PRUN_LEVEL > 0) { read(CubieCube.UDSliceFlipS2R, input); read(CubieCube.TwistS2RF, input); read(CoordCubeHuge.TwistMoveF, input); read(CoordCubeHuge.TwistConj, input); read(CoordCubeHuge.UDSliceFlipMove, input); read(CubieCube.FlipSlice2UDSliceFlip, input); CoordCubeHuge.initUDSliceFlipTwistPrun(); } else { read(CoordCube.UDSliceTwistPrun, input); read(CoordCube.UDSliceFlipPrun, input); if (Search.USE_TWIST_FLIP_PRUN) { read(CubieCube.FlipS2RF, input); read(CoordCube.TwistFlipPrun, input); } } Search.inited = true; }
public static void init() { if (inited) { return; } CubieCube.initMove(); CubieCube.initSym(); if (EXTRA_PRUN_LEVEL > 0) { CoordCubeHuge.init(); } else { CoordCube.init(); } inited = true; }
internal override void calcPruning(bool isPhase1) { int prunm3 = 0; if (Search.EXTRA_PRUN_LEVEL > 1 && !isPhase1) { prunm3 = getPruningP(HugePrunP, flip * ((long)N_TWIST) * N_COMB + TwistConj[twist, fsym] * N_COMB + CCombConj[tsym, fsym], N_HUGE_5 * 4L); } else { prunm3 = getPruningP(UDSliceFlipTwistPrunP, flip * N_TWIST + TwistConj[twist, fsym], N_UDSLICEFLIP_SYM * N_TWIST / 5 * 4); } prun = 0; CoordCubeHuge tmp1 = new CoordCubeHuge(); CoordCubeHuge tmp2 = new CoordCubeHuge(); tmp1.set(this); tmp1.prun = prunm3; while (tmp1.twist != 0 || tmp1.flip != 0 || tmp1.tsym != 0 && !isPhase1) { ++prun; if (tmp1.prun == 0) { tmp1.prun = 3; } for (int m = 0; m < 18; m++) { int gap = tmp2.doMovePrun(tmp1, m, isPhase1); if (gap < tmp1.prun) { tmp1.set(tmp2); break; } } } }