def parse_effect(alist): tag = alist[0] if tag == "and": return [ ConjunctiveEffect(conjuncts) for conjuncts in cartesian_product( *[parse_effect(eff) for eff in alist[1:]]) ] elif tag == "forall": assert len(alist) == 3 parameters = pddl_types.parse_typed_list(alist[1]) effects = parse_effect(alist[2]) assert 1 == len( effects ), "Error: Cannot embed non-determinism inside of a forall (for now)." return [UniversalEffect(parameters, effect) for effect in effects] elif tag == "when": assert len(alist) == 3 condition = conditions.parse_condition(alist[1]) effects = parse_effect(alist[2]) return [ConditionalEffect(condition, effect) for effect in effects] elif tag == "increase": assert len(alist) == 3 assert alist[1] == ['total-cost'] assignment = f_expression.parse_assignment(alist) return [CostEffect(assignment)] elif tag == "oneof": options = [] for eff in alist[1:]: options.extend(parse_effect(eff)) return options else: return [SimpleEffect(conditions.parse_literal(alist))]
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_cond_effect(alist, durative=False): tag = alist[0] if tag == "and": return ConjunctiveEffect([parse_cond_effect(eff,durative) for eff in alist[1:]]) elif tag in ("scale-up", "scale-down", "increase", "decrease"): return ConjunctiveEffect([f_expression.parse_assignment(alist,durative)]) elif tag == "assign": symbol = alist[1] if isinstance(symbol,list): symbol = symbol[0] if tasks.Task.FUNCTION_SYMBOLS.get(symbol,"object")=="number": return ConjunctiveEffect([f_expression.parse_assignment(alist,durative)]) else: return ConjunctiveEffect([ObjectFunctionAssignment(conditions.parse_term(alist[1]),conditions.parse_term(alist[2]))]) else: return ConjunctiveEffect([conditions.parse_condition(alist)])
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] == "=": try: initial.append(f_expression.parse_assignment(fact)) except ValueError, e: raise SystemExit("Error in initial state specification\n" + "Reason: %s." % e) else: initial.append(conditions.Atom(fact[0], 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] == "=": try: initial.append(f_expression.parse_assignment(fact)) except ValueError, e: raise SystemExit("Error in initial state specification\n" + "Reason: %s." % e) else: initial.append(conditions.Atom(fact[0], fact[1:]))
def parse_cond_effect(alist, durative=False): tag = alist[0] if tag == "and": return ConjunctiveEffect([parse_cond_effect(eff, durative) for eff in alist[1:]]) elif tag in ("scale-up", "scale-down", "increase", "decrease"): return ConjunctiveEffect([f_expression.parse_assignment(alist, durative)]) elif tag == "assign": symbol = alist[1] if isinstance(symbol, list): symbol = symbol[0] if tasks.Task.FUNCTION_SYMBOLS.get(symbol, "object") == "number": return ConjunctiveEffect([f_expression.parse_assignment(alist, durative)]) else: return ConjunctiveEffect( [ObjectFunctionAssignment(conditions.parse_term(alist[1]), conditions.parse_term(alist[2]))]) else: return ConjunctiveEffect([conditions.parse_condition(alist)])
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_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] == "=": initial.append(f_expression.parse_assignment(fact)) else: initial.append(conditions.Atom(fact[0], fact[1:])) yield initial goal = iterator.next() assert goal[0] == ":goal" and len(goal) == 2 yield conditions.parse_condition(goal[1]) use_metric = False for entry in iterator: if entry[0] == ":metric": if entry[1]=="minimize" and entry[2][0] == "total-cost": use_metric = True else: assert False, "Unknown metric." yield use_metric for entry in iterator: assert False, entry
def parse_effect(alist): tag = alist[0] if tag == "and": return ConjunctiveEffect([parse_effect(eff) for eff in alist[1:]]) elif tag == "forall": assert len(alist) == 3 parameters = pddl_types.parse_typed_list(alist[1]) effect = parse_effect(alist[2]) return UniversalEffect(parameters, effect) elif tag == "when": assert len(alist) == 3 condition = conditions.parse_condition(alist[1]) effect = parse_effect(alist[2]) return ConditionalEffect(condition, effect) elif tag == "increase": assert len(alist) == 3 assert alist[1] == ['total-cost'] assignment = f_expression.parse_assignment(alist) return CostEffect(assignment) else: return SimpleEffect(conditions.parse_literal(alist))
def parse_effect(alist): tag = alist[0] if tag == "and": return ConjunctiveEffect([parse_effect(eff) for eff in alist[1:]]) elif tag == "forall": assert len(alist) == 3 parameters = pddl_types.parse_typed_list(alist[1]) effect = parse_effect(alist[2]) return UniversalEffect(parameters, effect) elif tag == "when": assert len(alist) == 3 condition = conditions.parse_condition(alist[1]) effect = parse_effect(alist[2]) return ConditionalEffect(condition, effect) elif tag == "increase": assert len(alist) == 3 assert alist[1] == ['total-cost'] assignment = f_expression.parse_assignment(alist) return CostEffect(assignment) else: return SimpleEffect(conditions.parse_literal(alist))
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)
def parse_task(task_pddl): iterator = iter(task_pddl) define_tag = next(iterator) assert define_tag == "define" problem_line = next(iterator) assert problem_line[0] == "problem" and len(problem_line) == 2 yield problem_line[1] domain_line = next(iterator) assert domain_line[0] == ":domain" and len(domain_line) == 2 yield domain_line[1] requirements_opt = next(iterator) if requirements_opt[0] == ":requirements": requirements = requirements_opt[1:] objects_opt = next(iterator) else: requirements = [] objects_opt = requirements_opt yield Requirements(requirements) if objects_opt[0] == ":objects": yield pddl_types.parse_typed_list(objects_opt[1:]) init = next(iterator) else: yield [] init = objects_opt assert init[0] == ":init" initial = [] initial_true = set() initial_false = set() initial_assignments = dict() for fact in init[1:]: if fact[0] == "=": try: assignment = f_expression.parse_assignment(fact) except ValueError as e: raise SystemExit("Error in initial state specification\n" + "Reason: %s." % e) if not isinstance(assignment.expression, f_expression.NumericConstant): raise SystemExit("Illegal assignment in initial state " + "specification:\n%s" % assignment) if assignment.fluent in initial_assignments: prev = initial_assignments[assignment.fluent] if assignment.expression == prev.expression: print("Warning: %s is specified twice" % assignment, "in initial state specification") else: raise SystemExit("Error in initial state specification\n" + "Reason: conflicting assignment for " + "%s." % assignment.fluent) else: initial_assignments[assignment.fluent] = assignment initial.append(assignment) elif fact[0] == "not": atom = conditions.Atom(fact[1][0], fact[1][1:]) check_atom_consistency(atom, initial_false, initial_true, False) initial_false.add(atom) else: atom = conditions.Atom(fact[0], fact[1:]) check_atom_consistency(atom, initial_true, initial_false) initial_true.add(atom) initial.extend(initial_true) yield initial goal = next(iterator) assert goal[0] == ":goal" and len(goal) == 2 yield conditions.parse_condition(goal[1]) use_metric = False for entry in iterator: if entry[0] == ":metric": if entry[1] == "minimize" and entry[2][0] == "total-cost": use_metric = True else: assert False, "Unknown metric." yield use_metric for entry in iterator: assert False, entry
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" oneofs = [] initial = [] ors = [] belief_state = [set()] skip_loop = False for fact in init[1:]: if fact[0] == "=": initial.append(f_expression.parse_assignment(fact)) elif fact[0] == "oneof": oneofs.append(conditions.parse_condition(fact)) elif fact[0] == "or": ors.append(conditions.parse_condition(fact)) else: initial.append(conditions.Atom(fact[0], fact[1:])) if ors != []: for oneof in oneofs: tmp_state = [] oneof.dump() for i in range(0,len(oneof.parts)): for j in range(0,len(belief_state)): state_set = belief_state[j] tmp_state_set = set() for x in state_set: tmp_state_set.add(x) tmp_state_set.add(oneof.parts[i]) tmp_state.append(tmp_state_set) for i in range(0,len(belief_state)): belief_state.pop() '''print "belief after cartesian product"''' for x in tmp_state: '''print "state" for atom in x: print atom''' belief_state.append(x) index_to_remove = [] for i in range(0,len(belief_state)): remove = False tmp_state_set = belief_state[i] '''print "checking state" for atom in tmp_state_set: print atom''' for orclause in ors: '''print "using or" orclause.dump()''' skip = False for k in range(0,len(orclause.parts)): if isinstance(orclause.parts[k], conditions.Atom): skip = True break if skip == True: continue else: remove = True for k in range(0,len(orclause.parts)): if orclause.parts[k].negate() not in tmp_state_set: remove = False break if remove == True: if tmp_state_set in belief_state: '''print "remove state" for atom in tmp_state_set: print atom print "because" orclause.dump()''' index_to_remove.insert(0,i) break if remove == False: for oneof in oneofs: skip = False for part in oneof.parts: if part in tmp_state_set: for other_part in oneof.parts: if other_part != part and other_part in tmp_state_set: skip = True if tmp_state_set in belief_state: index_to_remove.insert(0,i) break if skip == True: break if skip == True: break if skip == True: break for i in range(0, len(index_to_remove)): belief_state.pop(index_to_remove[i]) print "size of belief state" print len(belief_state) print "we are here" '''print "belief after removing invalid state" for x in belief_state: print "state" for atom in x: print atom''' index_to_remove = [] for i in range(0,len(belief_state)): tmp_state_set = belief_state[i] for orclause in ors: remove = False stop = False for k in range(0,len(orclause.parts)): if isinstance(orclause.parts[k], conditions.Atom): print orclause.parts[k] if orclause.parts[k] in tmp_state_set: stop = True break elif isinstance(orclause.parts[k], conditions.NegatedAtom): if orclause.parts[k].negate() not in tmp_state_set: stop = True break if stop == False: remove = True if remove == True: if tmp_state_set in belief_state: index_to_remove.insert(0,i) '''print "remove state" for atom in tmp_state_set: print atom print "because" orclause.dump()''' break for i in range(0, len(index_to_remove)): belief_state.pop(index_to_remove[i]) print "size of belief state" print len(belief_state) '''for tmp_state_set in belief_state: print "state" for atom in tmp_state_set: print atom''' if len(belief_state) > 0: state_set = belief_state[0] for atom in state_set: initial.append(atom) '''oneofsize = 1 for oneof in oneofs: oneofsize = oneofsize * len(oneof.parts) belief_state = {} exclude_list = [] for n in range(0,oneofsize): for i in range(0,len(oneofs)): bucketsize = 1 for j in range(i+1,len(oneofs)): bucketsize = bucketsize * len(oneofs[j].parts) index_i = (n / bucketsize) % len(oneofs[i].parts) oneof_valuename = oneofs[i].print_atom(index_i) oneof_valuename_str = str(oneof_valuename) skip_loop = false for var_no, var_key in enumerate(translation_key): for value, value_name in enumerate(var_key): if oneof_valuename_str.find(value_name) != -1: if var_no in belief_state: if belief_state[var_no] = value: print >> belief_file, "var%d \n" % var_no, print >> belief_file, "%d \n" % value, print >> belief_file, "END_BELIEF"''' else: for oneof in oneofs: atoms = set() atoms = oneof.get_atoms() for atom in atoms: atom.dump(), initial.append(atom) yield initial yield oneofs yield ors yield belief_state goal = iterator.next() assert goal[0] == ":goal" and len(goal) == 2 yield conditions.parse_condition(goal[1]) originalgoal = conditions.parse_condition(goal[1]) yield originalgoal use_metric = False for entry in iterator: if entry[0] == ":metric": if entry[1]=="minimize" and entry[2][0] == "total-cost": use_metric = True else: assert False, "Unknown metric." yield use_metric for entry in iterator: assert False, entry