Esempio n. 1
0
 def solve(self, domain, problem):
     # Parser
     parser = PDDL_Parser()
     parser.parse_domain(domain)
     parser.parse_problem(problem)
     # Parsed data
     actions = parser.actions
     state = parser.state
     goal_pos = parser.positive_goals
     goal_not = parser.negative_goals
     # Do nothing
     if self.applicable(state, goal_pos, goal_not):
         return []
     # Search
     visited = [state]
     fringe = [state, None]
     while fringe:
         state = fringe.pop(0)
         plan = fringe.pop(0)
         for act in actions:
             if self.applicable(state, act.positive_preconditions,
                                act.negative_preconditions):
                 new_state = self.apply(state, act.add_effects,
                                        act.del_effects)
                 if new_state not in visited:
                     if self.applicable(new_state, goal_pos, goal_not):
                         full_plan = [act]
                         while plan:
                             act, plan = plan
                             full_plan.insert(0, act)
                         return full_plan
                     visited.append(new_state)
                     fringe.append(new_state)
                     fringe.append((act, plan))
     return None
Esempio n. 2
0
 def __init__(self, filename, domainName='reconstructed'):
     self.domainName = domainName
     self.parser = PDDL_Parser()
     self.tokens = self.parser.scan_tokens(filename)
     pprint.pprint(self.tokens)
     print('=== Objects ===')
     self.parseObjects(self.tokens[1])
     pprint.pprint(self.types2objs)
     print('=== States ===')
     self.parseStates(self.tokens)
     pprint.pprint(self.states)
     print('=== Predicates ===')
     pprint.pprint(self.predicates)
     print('=== Actions ===')
     self.parseActions(self.tokens)
     # print(self.tokens[3])
     # p, n = self.actions[0].assignPrecons(self.tokens[3][1][1:])
     # print('Grounded Positive preconditions')
     # print(p)
     # print('Grounded Negative preconditions')
     # print(n)
     # print('Before State')
     # print(self.states[0])
     # self.actions[0].prunePrecons(self.states[0], self.tokens[3][1][1:])
     # print(self.actions[0])
     self.refineActions(self.tokens)
     pprint.pprint(self.actions)
     self.genTypeclasses()
Esempio n. 3
0
def constraints(domain, problem):
    clause_list = []
    # Parser
    parser = PDDL_Parser()
    parser.parse_domain(domain)
    parser.parse_problem(problem)

    state = parser.state
    # Initial state clauses:
    initial_clauses = list(state)
    #print(initial_clauses)

    goal_pos = parser.positive_goals
    goal_not = parser.negative_goals
    goal_clauses = [goal_pos, goal_not]

    action_list = []
    # Grounding process
    ground_actions = []
    for action in parser.actions:
        for act in action.groundify(parser.objects):
            ground_actions.append(act)
    # Appending grounded actions:
    for act in ground_actions:
        action_list.append(act)
        #print(act)
    action_list.append(Action('noop', (), [], [], [], []))
    # Appending to one list:
    clause_list.append(initial_clauses)
    clause_list.append(goal_clauses)
    clause_list.extend(action_list)
    return clause_list
Esempio n. 4
0
 def test_scan_tokens_domain(self):
     parser = PDDL_Parser()
     self.assertEqual(parser.scan_tokens('examples/dinner/dinner.pddl'), [
         'define', ['domain', 'dinner'], [':requirements', ':strips'],
         [
             ':predicates', ['clean'], ['dinner'], ['quiet'], ['present'],
             ['garbage']
         ],
         [
             ':action', 'cook', ':precondition', ['clean'], ':effect',
             ['dinner']
         ],
         [
             ':action', 'wrap', ':precondition', ['quiet'], ':effect',
             ['present']
         ],
         [
             ':action', 'carry', ':precondition', ['garbage'], ':effect',
             ['and', ['not', ['garbage']], ['not', ['clean']]]
         ],
         [
             ':action', 'dolly', ':precondition', ['garbage'], ':effect',
             ['and', ['not', ['garbage']], ['not', ['quiet']]]
         ]
     ])
Esempio n. 5
0
 def test_parse_predicates(self):
     parser = PDDL_Parser()
     parser.predicates = {}
     parser.parse_predicates(
         [['untyped_pred', '?v1', '?v2', '?v3'],
          [
              'typed_pred', '?v1', '-', 'type1', '?v2', '-', 'type1', '?v3',
              '-', 'object'
          ], ['shared_type_pred', '?v1', '?v2', '-', 'type1', '?v3']])
     self.assertEqual(
         parser.predicates, {
             'untyped_pred': {
                 '?v1': 'object',
                 '?v2': 'object',
                 '?v3': 'object'
             },
             'typed_pred': {
                 '?v1': 'type1',
                 '?v2': 'type1',
                 '?v3': 'object'
             },
             'shared_type_pred': {
                 '?v1': 'type1',
                 '?v2': 'type1',
                 '?v3': 'object'
             }
         })
Esempio n. 6
0
 def test_scan_tokens_problem(self):
     parser = PDDL_Parser()
     self.assertEqual(parser.scan_tokens('examples/dinner/pb1.pddl'), [
         'define', ['problem', 'pb1'], [':domain', 'dinner'],
         [':init', ['garbage'], ['clean'], ['quiet']],
         [':goal', ['and', ['dinner'], ['present'], ['not', ['garbage']]]]
     ])
Esempio n. 7
0
 def test_parse_undefined_types(self):
     parser = PDDL_Parser()
     parser.types = {}
     parser.parse_types(['location', 'pile', 'robot', 'crane', 'container'])
     self.assertEqual(
         parser.types,
         {'object': ['location', 'pile', 'robot', 'crane', 'container']})
Esempio n. 8
0
 def test_parse_problem(self):
     parser = PDDL_Parser()
     parser.parse_domain('examples/dinner/dinner.pddl')
     parser.parse_problem('examples/dinner/pb1.pddl')
     self.assertEqual(parser.problem_name, 'pb1')
     self.assertEqual(parser.objects, {})
     self.assertEqual(parser.state, [['garbage'],['clean'],['quiet']])
     self.assertEqual(parser.positive_goals, [['dinner'], ['present']])
     self.assertEqual(parser.negative_goals, [['garbage']])
Esempio n. 9
0
 def __init__(self, domainfile, problemfile):
     self.parser_help = PDDL_Parser()
     self.parser_help.parse_domain(domainfile)
     self.parser_help.parse_problem(problemfile)
     self.domprob = DomainProblem(domainfile, problemfile)
     self.current_state = None  # State object
     self.pos_goal = None  # tuple of literals that need to be true at goal
     self.neg_goal = None  # tuple of literals that need to be false at goal
     self.action_dic = None  # list of actions
     self.objects = None  # list of world objects
     self.reversed_objects = None  # for type of object, list of instances
     self.parser()
Esempio n. 10
0
 def test_parse_defined_types(self):
     parser = PDDL_Parser()
     parser.types = {}
     parser.parse_types([
         'place', 'locatable', 'level', '-', 'object', 'depot', 'market',
         '-', 'place', 'truck', 'goods', '-', 'locatable'
     ])
     self.assertEqual(
         parser.types, {
             'object': ['place', 'locatable', 'level'],
             'place': ['depot', 'market'],
             'locatable': ['truck', 'goods']
         })
Esempio n. 11
0
 def test_parse_domain(self):
     parser = PDDL_Parser()
     parser.parse_domain('dinner/dinner.pddl')
     self.assertEqual(parser.domain_name, 'dinner')
     self.assertEqual(parser.requirements, [':strips'])
     self.assertEqual(parser.types, [])
     self.assertEqual(parser.actions, [
         Action('cook', [], [['clean']], [], [['dinner']], []),
         Action('wrap', [], [['quiet']], [], [['present']], []),
         Action('carry', [], [['garbage']], [], [],
                [['garbage'], ['clean']]),
         Action('dolly', [], [['garbage']], [], [],
                [['garbage'], ['quiet']])
     ])
Esempio n. 12
0
    def test_parse_problem(self):
        def frozenset_of_tuples(data):
            return frozenset([tuple(t) for t in data])

        parser = PDDL_Parser()
        parser.parse_domain('examples/dinner/dinner.pddl')
        parser.parse_problem('examples/dinner/pb1.pddl')
        self.assertEqual(parser.problem_name, 'pb1')
        self.assertEqual(parser.objects, {})
        self.assertEqual(
            parser.state,
            frozenset_of_tuples([['garbage'], ['clean'], ['quiet']]))
        self.assertEqual(parser.positive_goals,
                         frozenset_of_tuples([['dinner'], ['present']]))
        self.assertEqual(parser.negative_goals,
                         frozenset_of_tuples([['garbage']]))
Esempio n. 13
0
    def __init__(self, domain, problem, logfile='/dev/null'):
        # Parser
        self.parser = PDDL_Parser()
        self.parser.parse_domain(domain)
        self.parser.parse_problem(problem)
        # Parsed data
        self.state = self.parser.state
        self.goal_pos = self.parser.positive_goals
        self.goal_not = self.parser.negative_goals

        self.history = []
        self.movelog = []

        self.logfile = logfile

        self.planner = Planner()
        # Do nothing
        if self.planner.applicable(self.state, self.goal_pos, self.goal_not):
            print('Puzzle is already solved! Double-check your problem file!')
Esempio n. 14
0
def constraints(domain, problem):
    gate_list = []
    # Parser
    parser = PDDL_Parser()
    parser.parse_domain(domain)
    parser.parse_problem(problem)

    state = parser.state
    # Initial state gate:
    initial_gate = list(state)
    #initial_gate = refine_gate(initial_gate)
    #print(initial_gate)

    goal_pos = parser.positive_goals
    goal_not = parser.negative_goals
    goal_gate = [goal_pos, goal_not]
    #goal_gate = [refine_gate(goal_pos), refine_gate(goal_not)]
    #print(goal_gate)

    #for act in parser.actions:
    #  #print(act)
    #  act.positive_preconditions = refine_gate(act.positive_preconditions)
    #  act.negative_preconditions = refine_gate(act.negative_preconditions)
    #  act.add_effects = refine_gate(act.add_effects)
    #  act.del_effects = refine_gate(act.del_effects)
    #  #print(act)

    action_list = []
    # Grounding process
    ground_actions = []
    for action in parser.actions:
        for act in action.groundify(parser.objects):
            ground_actions.append(act)
    # Appending grounded actions:
    for act in ground_actions:
        action_list.append(act)
        #print(act)

    # Appending to one list:
    gate_list.append(initial_gate)
    gate_list.append(goal_gate)
    gate_list.extend(action_list)
    return gate_list
Esempio n. 15
0
 def test_parse_objects(self):
     parser = PDDL_Parser()
     parser.types = {}
     parser.objects = {}
     parser.parse_types(
         ['airplane', 'segment', 'direction', 'airplanetype', 'a'])
     parser.parse_objects([
         'b', '-', 'a', 'a', '-', 'a', 'north', 'south', '-', 'direction',
         'light', 'medium', 'heavy', '-', 'airplanetype', 'element1', '-',
         'object', 'seg_pp_0_60', 'seg_ppdoor_0_40', '-', 'segment',
         'airplane_CFBEG', '-', 'airplane', 'element2'
     ], 'test')
     self.assertEqual(
         parser.objects, {
             'a': ['b', 'a'],
             'object': ['element1', 'element2'],
             'direction': ['north', 'south'],
             'airplanetype': ['light', 'medium', 'heavy'],
             'segment': ['seg_pp_0_60', 'seg_ppdoor_0_40'],
             'airplane': ['airplane_CFBEG']
         })
Esempio n. 16
0
 def construct(self, domain, problem):
     # Parser
     parser = PDDL_Parser()
     parser.parse_domain(domain)
     parser.parse_problem(problem)
     # Parsed data
     state = parser.state
     initial_state = convert(state)
     goal_pos = parser.positive_goals
     goal_not = parser.negative_goals
     # Do nothing
     if self.applicable(state, goal_pos, goal_not):
         return []
     # Grounding process
     ground_actions = []
     for action in parser.actions:
         for act in action.groundify(parser.objects):
             ground_actions.append(act)
     # Search
     visited = [state]
     need_visit = [state]
     transitions = dict()
     while need_visit:
         state = need_visit.pop(0)
         transitions[convert(state)] = dict()
         for act in ground_actions:
             if self.applicable(state, act.positive_preconditions,
                                act.negative_preconditions):
                 new_state = self.apply(state, act.add_effects,
                                        act.del_effects)
                 if new_state not in visited:
                     visited.append(new_state)
                     need_visit.append(new_state)
                     transitions[convert(state)][act.name] = convert(
                         new_state)
     return [transitions, initial_state]