예제 #1
0
        public void EquatorPermutationCoordTest() //Tests GetEquatorPermutationCoord, SetEquatorPermutationCoord
        {
            Random random      = new Random(7777777);
            int    length      = 50;
            int    repetitions = 50;

            //if solved permutation corresponds to the coordinate 0
            //SetEquatorPermutationCoord()
            CubieCube expected = CubieCube.CreateSolved();
            CubieCube result   = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));

            Coordinates.SetEquatorOrder(result, 0);
            CubingAssert.HaveEqualEquatorEdgePermutation(expected, result);

            expected = CubieCube.FromAlg(Alg.FromString("R2 L2"));
            result   = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
            Coordinates.SetEquatorOrder(result, Coordinates.NumEquatorOrders - 1);

            //GetEquatorPermutationCoord()
            result = CubieCube.CreateSolved();
            Assert.AreEqual(0, Coordinates.GetEquatorOrder(result));

            result.ApplyAlg(Alg.FromString("F' R' B' D' L2"));
            Assert.AreEqual(0, Coordinates.GetEquatorOrder(result));

            //apply B1
            int       expectedCoord = 17;
            CubieCube cube          = CubieCube.CreateSolved();

            cube.ApplyMove(Move.B1);
            int resultCoord = Coordinates.GetEquatorOrder(cube);

            Assert.AreEqual(expectedCoord, resultCoord);

            //apply B2
            expectedCoord = 6;
            cube          = CubieCube.CreateSolved();
            cube.ApplyMove(Move.B2);
            resultCoord = Coordinates.GetEquatorOrder(cube);
            Assert.AreEqual(expectedCoord, resultCoord);

            //if applying GetEquatorPermutationCoord() and SetEquatorPermutationCoord() results in the same array as at the beginning
            for (int repetition = 0; repetition < repetitions; repetition++)
            {
                expected = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
                result   = CubieCube.CreateSolved();

                int coord = Coordinates.GetEquatorOrder(expected);
                Coordinates.SetEquatorOrder(result, coord);

                CubingAssert.HaveEqualEquatorEdgePermutation(expected, result);
            }

            //exceptions
            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.GetEquatorOrder(null));

            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.SetEquatorOrder(null, 0));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetEquatorOrder(CubieCube.CreateSolved(), -1));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetEquatorOrder(CubieCube.CreateSolved(), Coordinates.NumEquatorOrders));
        }
예제 #2
0
        public void CpCoordTest() //Tests GetCpCoord, SetCpCoord
        {
            Random random = new Random(7777777);
            int    length = 50;

            //if applying GetCpCoord and SetCpCoord results in the same array as at the beginning
            CubieCube expected = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
            CubieCube result   = CubieCube.CreateSolved();

            int coord = Coordinates.GetCornerPermutation(expected);

            Coordinates.SetCornerPermutation(result, coord);

            CollectionAssert.AreEqual(expected.CornerPermutation, result.CornerPermutation);

            //apply R2 to a solved cube
            CubieCube cube = CubieCube.CreateSolved();

            cube.ApplyMove(Move.R2);

            int expectedCoord = 36177;
            int resultCoord   = Coordinates.GetCornerPermutation(cube);

            Assert.AreEqual(expectedCoord, resultCoord);

            expected = CubieCube.CreateSolved();
            expected.ApplyMove(Move.R2);

            result = CubieCube.CreateSolved();
            Coordinates.SetCornerPermutation(result, expectedCoord);

            CollectionAssert.AreEqual(expected.CornerPermutation, result.CornerPermutation);

            //if solved permutation corresponds to the coordinate 0
            expected = CubieCube.CreateSolved();
            result   = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
            Coordinates.SetCornerPermutation(result, 0);

            CollectionAssert.AreEqual(expected.CornerPermutation, result.CornerPermutation);

            result = CubieCube.CreateSolved();

            Assert.AreEqual(0, Coordinates.GetCornerPermutation(result));

            //example from http://kociemba.org/math/coordlevel
            Corner[] cp = new Corner[] { Corner.DFR, Corner.UFL, Corner.ULB, Corner.URF, Corner.DRB, Corner.DLF, Corner.DBL, Corner.UBR };
            cube          = CubieCube.Create(cp, CubieCube.SolvedCO, CubieCube.SolvedEP, CubieCube.SolvedEO, CubieCube.SolvedCenters);
            resultCoord   = Coordinates.GetCornerPermutation(cube);
            expectedCoord = 21021;
            Assert.AreEqual(expectedCoord, resultCoord);

            //exceptions
            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.GetCornerPermutation(null));

            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.SetCornerPermutation(null, 0));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetCornerPermutation(CubieCube.CreateSolved(), -1));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetCornerPermutation(CubieCube.CreateSolved(), Coordinates.NumCornerPermutations));
        }
예제 #3
0
        public void EpCoordTest() //Tests GetCpCoord, SetCpCoord
        {
            Random random = new Random(7777777);
            int    length = 50;

            //if applying GetEpCoord and SetEpCoord results in the same array as at the beginning
            CubieCube expected = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
            CubieCube result   = CubieCube.CreateSolved();

            int coord = Coordinates.GetEdgePermutation(expected);

            Coordinates.SetEdgePermutation(result, coord);

            CollectionAssert.AreEqual(expected.EdgePermutation, result.EdgePermutation);

            //apply R2 to a solved cube
            CubieCube cube = CubieCube.CreateSolved();

            cube.ApplyMove(Move.R2);

            int expectedCoord = 123763104;
            int resultCoord   = Coordinates.GetEdgePermutation(cube);

            Assert.AreEqual(expectedCoord, resultCoord);

            expected = CubieCube.CreateSolved();
            expected.ApplyMove(Move.R2);

            result = CubieCube.CreateSolved();
            Coordinates.SetEdgePermutation(result, expectedCoord);

            CollectionAssert.AreEqual(expected.EdgePermutation, result.EdgePermutation);

            //if solved permutation corresponds to the coordinate 0
            expected = CubieCube.CreateSolved();
            result   = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
            Coordinates.SetEdgePermutation(result, 0);

            CollectionAssert.AreEqual(expected.EdgePermutation, result.EdgePermutation);

            result = CubieCube.CreateSolved();

            Assert.AreEqual(0, Coordinates.GetEdgePermutation(result));

            //exceptions
            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.GetEdgePermutation(null));

            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.SetEdgePermutation(null, 0));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetEdgePermutation(CubieCube.CreateSolved(), -1));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetEdgePermutation(CubieCube.CreateSolved(), Coordinates.NumEdgePermutations));
        }
예제 #4
0
        public void StaticTest(string algString)
        {
            Alg       scramble = Alg.FromString(algString);
            CubieCube cube     = CubieCube.FromAlg(scramble);

            TimeSpan timeout       = TimeSpan.FromSeconds(1);
            float    returnValue   = 4000;
            float    requiredValue = 5000;

            float[] weights =
            {
                169.658122242946f,
                253.796705882179f,
                211.084512473536f,
                206.193406852305f,
                299.809258427086f,
                155.496912851115f,
                158.690899467791f,
                281.70422762001f,
                346.448146439892f,
                274.885031555195f,
                311.019164835258f,
                258.486161100002f,
                196.885474673572f,
                275.657440421246f,
                214.624405800259f,
                322.649818802591f,
                354.012863621357f,
                321.02200029978f
            };

            float[] weightedPhase2PruningTable = WeightedPruningTables.CreateWeightedPhase2CornerEquatorTable(weights);

            Alg solution = WeightedTwoPhaseSolver.FindSolution(cube, timeout, returnValue, requiredValue, weights, weightedPhase2PruningTable);

            Console.WriteLine("Scramble: " + scramble + "\nSolution: " + solution + "\nLength: " + solution.Length);

            Assert.IsTrue(solution.Select(move => weights[(int)move]).Sum() <= requiredValue);

            CubieCube expected = CubieCube.CreateSolved();
            CubieCube result   = CubieCube.CreateSolved();

            result.ApplyAlg(scramble);
            result.ApplyAlg(solution);

            Assert.AreEqual(expected, result);
        }
예제 #5
0
        public void UEdgeCoordTest()
        {
            Random random      = new Random(7777777);
            int    length      = 50;
            int    repetitions = 50;

            CubieCube expected;
            CubieCube result;
            int       expectedCoord;
            int       resultCoord;

            double[] phase2probabilities =
            {
                0d, 1d, 0d, 1d, 1d, 1d, 0d, 1d, 0d,
                0d, 1d, 0d, 1d, 1d, 1d, 0d, 1d, 0d
            };

            //solved tests
            Assert.AreEqual(0, Coordinates.GetUEdgeDistribution(CubieCube.CreateSolved()));

            //scrambled tests
            for (int i = 0; i < repetitions; i++)
            {
                result        = CubieCube.CreateSolved();
                expected      = CubieCube.FromAlg(Alg.FromRandomMoves(length, random));
                expectedCoord = Coordinates.GetUEdgePermutation(expected);
                Coordinates.SetUEdgePermutation(result, expectedCoord);
                resultCoord = Coordinates.GetUEdgePermutation(result);

                int expectedDistribution = expectedCoord / Coordinates.NumUEdgePermutations;
                int expectedPermutation  = expectedCoord % Coordinates.NumUEdgePermutations;
                int resultDistribution   = resultCoord / Coordinates.NumUEdgePermutations;
                int resultPermutation    = resultCoord % Coordinates.NumUEdgePermutations;

                Assert.AreEqual(expectedDistribution, resultDistribution);
                Assert.AreEqual(expectedPermutation, resultPermutation);
            }

            //exceptions
            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.GetUEdgePermutation(null));

            Assert.ThrowsException <ArgumentNullException>(() => Coordinates.SetUEdgePermutation(null, 0));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetUEdgePermutation(CubieCube.CreateSolved(), -1));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => Coordinates.SetUEdgePermutation(CubieCube.CreateSolved(), Coordinates.NumUEdgePermutations));
        }
예제 #6
0
        public void CostTooHighTest() //There used to be an error when solving this scramble
        {
            string    algString = "B2 D B F' D L U B U' F' R' F2 B' L' F' R B2 R' U R' L2 D R2 F2 L B2";
            Alg       scramble  = Alg.FromString(algString);
            CubieCube cube      = CubieCube.FromAlg(scramble);

            TimeSpan timeout       = TimeSpan.FromSeconds(0);
            float    requiredValue = 4700f;

            float[] weights =
            {
                169.658122242946f, // R
                253.796705882179f, // R2
                211.084512473536f, // R'
                206.193406852305f, // U
                299.809258427086f, // U2
                155.496912851115f, // U'
                158.690899467791f, // F
                281.70422762001f,  // F2
                346.448146439892f, // F'
                274.885031555195f, // L
                311.019164835258f, // L2
                258.486161100002f, // L'
                196.885474673572f, // D
                275.657440421246f, // D2
                214.624405800259f, // D'
                322.649818802591f, // B
                354.012863621357f, // B2
                321.02200029978f   // B'
            };

            float[] weightedPhase2PruningTable = WeightedPruningTables.CreateWeightedPhase2CornerEquatorTable(weights);

            Alg solution = WeightedTwoPhaseSolver.FindSolution(cube, timeout, requiredValue, requiredValue, weights, weightedPhase2PruningTable);

            float cost = solution.Select(move => weights[(int)move])
                         .Sum();

            Assert.IsTrue(cost <= requiredValue);

            Console.WriteLine("\nScramble: " + scramble + "\nSolution: " + solution + "\nCost: " + cost + " Length: " + solution.Length);
        }