def parse_domain_structure(entry, the_functions, the_axioms, the_actions, the_durative_actions, the_types, the_predicates): if entry[0] == ":derived": axiom = axioms.Axiom.parse(entry) the_axioms.append(axiom) elif entry[0] == ":durative-action": action = actions.DurativeAction.parse(entry) the_durative_actions.append(action) elif entry[0] == ":functions": the_functions.extend( pddl_types.parse_typed_list( entry[1:], constructor=functions.Function.parse_typed, functions=True, types=the_types)) for function in the_functions: Task.FUNCTION_SYMBOLS[function.name] = function.type if function.type != "number": the_predicates.append( predicates.Predicate( conditions.function_predicate_name(function.name), function.arguments + [pddl_types.TypedObject("?val", function.type)])) elif entry[0] == ":action": action = actions.Action.parse(entry) the_actions.append(action) else: assert False, "unknown entity"
def __init__(self, time, init_fact): self.time = time self.fact = init_fact # nested list if self.fact[0] == 'not': self.type = 'NEGATED_BOOLEAN' self.value = False self.predicate = tuple(self.fact[1]) self.atom = conditions.Atom(self.fact[1][0], [conditions.parse_term(term) for term in self.fact[1][1:]]) elif self.fact[0] == '=': if f_expression.isFloat(self.fact[2]): self.type = 'NUMERICAL_FUNCTION' self.value = float(self.fact[2]) self.predicate = tuple(self.fact[1]) self.atom = f_expression.parse_assignment(fact) else: self.type = 'OBJECT_FUNCTION' self.value = self.fact[2] self.predicate = tuple(self.fact[1]) function = conditions.parse_term(self.fact[1]) terms = function.args terms.append(conditions.parse_term(self.fact[2])) atomname = conditions.function_predicate_name(function.name) self.atom = conditions.Atom(atomname, terms) else: self.type = 'BOOLEAN' self.value = True self.atom = conditions.Atom(self.fact[0], [conditions.parse_term(term) for term in self.fact[1:]]) self.predicate = tuple(self.fact)
def parse_task(task_pddl): iterator = iter(task_pddl) assert iterator.next() == "define" problem_line = iterator.next() assert problem_line[0] == "problem" and len(problem_line) == 2 yield problem_line[1] domain_line = iterator.next() assert domain_line[0] == ":domain" and len(domain_line) == 2 yield domain_line[1] objects_opt = iterator.next() if objects_opt[0] == ":objects": yield pddl_types.parse_typed_list(objects_opt[1:]) init = iterator.next() else: yield [] init = objects_opt assert init[0] == ":init" initial = [] for fact in init[1:]: if fact[0] == "=": if conditions.is_function_comparison(fact): # numeric function initial.append(f_expression.parse_assignment(fact)) else: # object function function = conditions.parse_term(fact[1]) terms = function.args terms.append(conditions.parse_term(fact[2])) atomname = conditions.function_predicate_name(function.name) initial.append(conditions.Atom(atomname, terms)) else: initial.append( conditions.Atom( fact[0], [conditions.parse_term(term) for term in fact[1:]])) yield initial goal = iterator.next() assert goal[0] == ":goal" and len(goal) == 2 yield conditions.parse_condition(goal[1]) metric_defined = False for entry in iterator: if entry[0] == ":metric": metric_defined = True # if entry[2][0] in ["total-time", "total-cost"] : metric = (entry[1], entry[2]) yield metric if not metric_defined: metric = () yield metric
def parse_init_fact(fact): if fact[0] == "=": if conditions.is_function_comparison(fact): # numeric function return f_expression.parse_assignment(fact) else: # object function function = conditions.parse_term(fact[1]) terms = function.args terms.append(conditions.parse_term(fact[2])) atomname = conditions.function_predicate_name(function.name) return conditions.Atom(atomname, terms) else: return conditions.Atom(fact[0], [conditions.parse_term(term) for term in fact[1:]])
def parse_task(task_pddl): iterator = iter(task_pddl) assert iterator.next() == "define" problem_line = iterator.next() assert problem_line[0] == "problem" and len(problem_line) == 2 yield problem_line[1] domain_line = iterator.next() assert domain_line[0] == ":domain" and len(domain_line) == 2 yield domain_line[1] objects_opt = iterator.next() if objects_opt[0] == ":objects": yield pddl_types.parse_typed_list(objects_opt[1:]) init = iterator.next() else: yield [] init = objects_opt assert init[0] == ":init" initial = [] for fact in init[1:]: if fact[0] == "=": if conditions.is_function_comparison(fact): # numeric function initial.append(f_expression.parse_assignment(fact)) else: # object function function = conditions.parse_term(fact[1]) terms = function.args terms.append(conditions.parse_term(fact[2])) atomname = conditions.function_predicate_name(function.name) initial.append(conditions.Atom(atomname, terms)) else: initial.append(conditions.Atom(fact[0], [conditions.parse_term(term) for term in fact[1:]])) yield initial goal = iterator.next() assert goal[0] == ":goal" and len(goal) == 2 yield conditions.parse_condition(goal[1]) for entry in iterator: if entry[0] == ":metric" and entry[1]=="minimize": if entry[2][0] in ["total-time", "total-cost"] : continue assert False, entry
def parse_domain_structure(entry,the_functions,the_axioms,the_actions,the_durative_actions, the_types, the_predicates): if entry[0] == ":derived": axiom = axioms.Axiom.parse(entry) the_axioms.append(axiom) elif entry[0] == ":durative-action": action = actions.DurativeAction.parse(entry) the_durative_actions.append(action) elif entry[0] == ":functions": the_functions = pddl_types.parse_typed_list(entry[1:], constructor=functions.Function.parse_typed, functions=True, types=the_types) for function in the_functions: Task.FUNCTION_SYMBOLS[function.name] = function.type if function.type != "number": the_predicates.append( predicates.Predicate(conditions.function_predicate_name(function.name), function.arguments + [pddl_types.TypedObject("?val", function.type)])) else: action = actions.Action.parse(entry) the_actions.append(action)
def parse_task(task_pddl): iterator = iter(task_pddl) assert iterator.next() == "define" problem_line = iterator.next() assert problem_line[0] == "problem" and len(problem_line) == 2 yield problem_line[1] domain_line = iterator.next() assert domain_line[0] == ":domain" and len(domain_line) == 2 yield domain_line[1] module_opt = iterator.next() if module_opt[0] == ":moduleoptions": yield [modules.ModuleInit.parse(mi) for mi in module_opt[1:]] module_exit_opt = iterator.next() else: yield [] module_exit_opt = module_opt if module_exit_opt[0] == ":moduleexitoptions": yield [modules.ModuleExit.parse(mi) for mi in module_exit_opt[1:]] objects_opt = iterator.next() else: yield [] objects_opt = module_exit_opt if objects_opt[0] == ":objects": yield pddl_types.parse_typed_list(objects_opt[1:]) init = iterator.next() else: yield [] init = objects_opt assert init[0] == ":init" initial = [] for fact in init[1:]: if fact[0] == "=": if conditions.is_function_comparison(fact): # numeric function initial.append(f_expression.parse_assignment(fact)) else: # object function function = conditions.parse_term(fact[1]) terms = function.args terms.append(conditions.parse_term(fact[2])) atomname = conditions.function_predicate_name(function.name) initial.append(conditions.Atom(atomname, terms)) else: initial.append( conditions.Atom( fact[0], [conditions.parse_term(term) for term in fact[1:]])) yield initial goal = iterator.next() assert goal[0] == ":goal" and len(goal) == 2 yield conditions.parse_condition(goal[1]) for entry in iterator: if entry[0] == ":metric" and entry[1] == "minimize": if entry[2][0] in ["total-time", "total-cost"]: continue assert False, "Can only minimize total-time or total-cost, got: " + str( entry)