Esempio n. 1
0
    def test_priority_queue(self):
        queue = solver_lib._PriorityQueue()
        first_cube = cube_lib.get_scrambled_cube(3)

        first_state = solver_lib._AStarState(first_cube,
                                             cost_to_come=2,
                                             est_cost_to_go=5,
                                             previous_state=None,
                                             previous_rotation=None)
        queue.add_or_update_state(first_state)

        second_cube = first_cube.copy()
        second_cube.rotate_face(
            cube_lib.Rotation(cube_lib.Face.LEFT, is_clockwise=True))
        second_state = solver_lib._AStarState(second_cube,
                                              cost_to_come=1,
                                              est_cost_to_go=7,
                                              previous_state=None,
                                              previous_rotation=None)
        queue.add_or_update_state(second_state)

        third_cube = second_cube.copy()
        third_cube.rotate_face(
            cube_lib.Rotation(cube_lib.Face.LEFT, is_clockwise=True))
        third_state = solver_lib._AStarState(third_cube,
                                             cost_to_come=1,
                                             est_cost_to_go=5,
                                             previous_state=None,
                                             previous_rotation=None)
        queue.add_or_update_state(third_state)

        self.assertTrue(queue)
        self.assertEqual(queue.pop_min_state(), third_state)

        second_state = copy.copy(second_state)
        second_state.est_cost_to_go = 3
        queue.add_or_update_state(second_state)

        self.assertTrue(queue)
        self.assertEqual(queue.pop_min_state(), second_state)

        first_state = copy.copy(first_state)
        first_state.est_cost_to_go = 3
        queue.add_or_update_state(first_state)

        self.assertTrue(queue)
        self.assertEqual(queue.pop_min_state(), first_state)

        self.assertFalse(queue)
Esempio n. 2
0
    def test_priority_queue_same_value(self):
        '''Verifies that we can insert two states with the same value.'''
        queue = solver_lib._PriorityQueue()
        first_cube = cube_lib.get_scrambled_cube(num_rotations=3)

        first_state = solver_lib._AStarState(first_cube,
                                             cost_to_come=2,
                                             est_cost_to_go=5,
                                             previous_state=None,
                                             previous_rotation=None)
        queue.add_or_update_state(first_state)

        second_cube = first_cube.copy()
        second_cube.rotate_face(
            cube_lib.Rotation(cube_lib.Face.LEFT, is_clockwise=True))
        second_state = solver_lib._AStarState(second_cube,
                                              cost_to_come=2,
                                              est_cost_to_go=5,
                                              previous_state=None,
                                              previous_rotation=None)
        queue.add_or_update_state(second_state)

        self.assertTrue(queue)

        costs_to_come = set()
        costs_to_come.add(queue.pop_min_state().cube)
        self.assertTrue(queue)
        costs_to_come.add(queue.pop_min_state().cube)
        self.assertFalse(queue)

        self.assertEqual(costs_to_come, set((first_cube, second_cube)))
Esempio n. 3
0
    def test_one_rotation_greedy_depth_two(self):
        cube = cube_lib.Cube()
        rotation = cube_lib.Rotation(cube_lib.Face.LEFT, is_clockwise=True)
        cube.rotate_face(rotation)

        model = mock.Mock()
        model.predict.return_value = [1.0]
        solver = solver_lib.GreedySolver(cube, model, depth=2)
        self.assertEqual(solver.apply_next_rotation(), rotation.invert())
Esempio n. 4
0
    def test_one_rotation_a_star(self):
        cube = cube_lib.Cube()
        rotation = cube_lib.Rotation(cube_lib.Face.LEFT, is_clockwise=True)
        cube.rotate_face(rotation)

        # This is a valid heuristic, as it is an under-prediction. In that case,
        # AStar is equivalent to DFS.
        model = FakeModel(0)

        solver = solver_lib.AStarSolver(cube, model)
        self.assertEqual(solver.apply_next_rotation(), rotation.invert())

        self.assertTrue(solver.cube.is_solved())
Esempio n. 5
0
    def test_two_rotations_greedy_depth_two(self):
        cube = cube_lib.Cube()
        cube.rotate_face(
            cube_lib.Rotation(cube_lib.Face.LEFT, is_clockwise=True))
        cube.rotate_face(
            cube_lib.Rotation(cube_lib.Face.UP, is_clockwise=False))

        model = mock.Mock()
        model.predict.return_value = [1.0]

        # We follow the solver for two steps, and verify that the cube is
        # solved.
        self.assertFalse(cube.is_solved())

        solver = solver_lib.GreedySolver(cube, model, depth=2)

        self.assertEqual(
            solver.apply_next_rotation(),
            cube_lib.Rotation(cube_lib.Face.UP, is_clockwise=True))
        self.assertFalse(solver.cube.is_solved())
        self.assertEqual(
            solver.apply_next_rotation(),
            cube_lib.Rotation(cube_lib.Face.LEFT, is_clockwise=False))
        self.assertTrue(solver.cube.is_solved())