def parse_goal_state(pddl_domain_name, pddl_file_name): t = parsePDDL(task_filename=pddl_file_name, domain_filename=pddl_domain_name) # Only lift the goal if it is a conjunction of atoms if Conjunction != t.goal.__class__: print ("Error: Goal condition must be a conjunction of atoms -- " + str(t.goal.__class__)) return set([]) # Lift the goal state goals = set([]) for g in t.goal.parts: if Atom != g.__class__: print ("Error: Goal condition not an Atom -- " + str(init.__class__)) return set([]) fluent = str(g.predicate) for arg in g.args: fluent += ' ' + str(arg) # We don't want to keep around the trivial equality constraints if fluent[0] != '=': goals.add(Fluent(fluent)) return goals
def parse_problem(pddl_domain_name, pddl_file_name): # Get the init and goal conditions I = parse_init_state(pddl_domain_name, pddl_file_name) G = parse_goal_state(pddl_domain_name, pddl_file_name) # Parse our task t = parsePDDL(task_filename=pddl_file_name, domain_filename=pddl_domain_name) _, atoms, actions, _, _ = explore(t) F = set([]) FMAP = {} for atom in atoms: fname = ' '.join([atom.predicate] + list(atom.args)) f = Fluent(fname) F.add(f) FMAP[fname] = f A = {} for a in actions: PRE = set([]) ADD = set([]) DEL = set([]) for p in a.precondition: assert not p.negated, "Error: Cannot handle negative preconditions" PRE.add(FMAP[' '.join([p.predicate] + list(p.args))]) for cond, fact in a.add_effects: ADD.add(FMAP[' '.join([fact.predicate] + list(fact.args))]) for cond, fact in a.del_effects: DEL.add(FMAP[' '.join([fact.predicate] + list(fact.args))]) A[a.name[1:-1].lower().strip()] = Action(PRE, ADD, DEL, a.name[1:-1].lower().strip()) return (F, A, I, G)
def parse_init_state(pddl_domain_name, pddl_file_name): t = parsePDDL(task_filename=pddl_file_name, domain_filename=pddl_domain_name) # Lift the initial state inits = set([]) for init in t.init: # We don't want to keep around the trivial equality constraints if Assign == init.__class__: continue if Atom != init.__class__: print ("Error: Init condition not an Atom -- " + str(init.__class__)) return set([]) fluent = str(init.predicate) for arg in init.args: fluent += ' ' + str(arg) inits.add(Fluent(fluent)) return inits