예제 #1
0
def test_breadth_first_tree_search():
    """
    Test breadth first tree search (i.e., with duplicates).
    """
    for goal in range(1, 10):
        p = AnnotatedProblem(EasyProblem(0, goal))
        sol = next(breadth_first_search(p, graph=False))
        assert sol.state_node.state == goal
        assert p.nodes_expanded == pow(2, goal + 1) - 2
        assert p.goal_tests == pow(2, goal)

        p = AnnotatedProblem(EasyProblem(0, goal))
        sol = next(
            breadth_first_search(p, graph=False, forward=False, backward=True))
        assert sol.state_node == sol.goal_node
        assert p.nodes_expanded == pow(2, goal + 1) - 2
        assert p.goal_tests == pow(2, goal)
예제 #2
0
def test_breadth_first_graph_search():
    """
    Test breadth first graph search (i.e., no duplicates). For this test
    problem it performs similar to breadth first.
    """
    for goal in range(1, 10):
        p = AnnotatedProblem(EasyProblem(0, goal))
        sol = next(breadth_first_search(p, graph=True))
        assert sol.state_node.state == goal
        assert p.nodes_expanded == goal * 2
        assert p.goal_tests == goal + 1

        p = AnnotatedProblem(EasyProblem(0, goal))
        sol = next(
            breadth_first_search(p, graph=True, forward=False, backward=True))
        assert sol.state_node == sol.goal_node
        assert p.nodes_expanded == goal * 2
        assert p.goal_tests == goal + 1
예제 #3
0
def test_bidirectional_tree_search():
    for goal in range(1, 14):
        p = AnnotatedProblem(EasyProblem(0, goal))
        sol = next(
            breadth_first_search(p, graph=False, forward=True, backward=True))
        assert sol.state_node == sol.goal_node
        if goal % 2 == 0:
            assert p.nodes_expanded == 2 * (pow(2, goal / 2 + 1) - 2)
            assert p.goal_tests == pow(2, goal)
        else:
            assert p.nodes_expanded == pow(2, goal // 2 + 2) - 2
예제 #4
0
def specialize(h,
               constraints,
               args,
               pset,
               neg,
               neg_mapping,
               gensym,
               depth_limit=10):
    """
    Returns the set of most general specializations of h that does NOT
    cover x.
    """
    problem = SpecializationProblem(h,
                                    extra=(args, constraints, pset, neg,
                                           neg_mapping, gensym))
    sol_set = set()
    for sol in breadth_first_search(problem, depth_limit=depth_limit):
        sol_set.add(sol.state)
        if len(sol_set) >= 25:
            break
    return sol_set
예제 #5
0
def test_solution_node():
    ep = EasyProblem(0, 8)
    sol1 = next(depth_first_search(ep))
    assert sol1.depth() == 8
    assert sol1.path() == tuple(['expand'] * 8)

    assert str(sol1) == ("StateNode={State: 8, Extra: None}, "
                         "GoalNode={State: 8, Extra: None}")
    assert repr(sol1) == "SolutionNode(Node(8), GoalNode(8))"
    assert hash(sol1) == hash((8, 8))

    sol2 = next(breadth_first_search(ep, forward=True, backward=True))
    assert sol2.depth() == 8
    print(sol2.path())
    assert sol2.path() == tuple(['expand'] * 8)
    assert sol2.goal_node.path() == tuple(['expand'] * 4)

    assert str(sol2) == ("StateNode={State: 4, Extra: None}, "
                         "GoalNode={State: 4, Extra: None}")
    assert repr(sol2) == "SolutionNode(Node(4), GoalNode(4))"
    assert hash(sol2) == hash((4, 4))

    assert sol1 == sol1
    assert sol1 != sol2
예제 #6
0
 def bidirectional(x):
     return breadth_first_search(x, forward=True, backward=True)
예제 #7
0
 def regression(x):
     return breadth_first_search(x, forward=False, backward=True)
예제 #8
0
 def breadth(self, x):
     return breadth_first_search(x, forward=True, backward=False)