def manage_sb_compilation(phi, psi, m_atom, a, E): if OPTIMIZED: monitoring_atom = ds.Literal(m_atom, False) added_precond = (None, False) if can_make_true(a, phi): R_phi = regression_aux(phi, a) rho = ds.Or([R_phi.negate(), monitoring_atom]).simplified() added_precond = (rho, True) if can_make_true(a, psi): R_psi = regression_aux(psi, a) if R_psi != psi: add_cond_eff(E, create_cond_eff(R_psi, monitoring_atom)) return added_precond else: monitoring_atom = ds.Literal(m_atom, False) R_phi = regression_aux(phi, a) if R_phi == phi: added_precond = (None, False) else: rho = ds.Or([R_phi.negate(), monitoring_atom]).simplified() added_precond = (rho, True) R_psi = regression_aux(psi, a) if R_psi != psi: add_cond_eff(E, create_cond_eff(R_psi, monitoring_atom)) return added_precond
def manage_sometime_compilation(phi, m_atom, a, E): if OPTIMIZED: if can_make_true(a, phi): monitoring_atom = ds.Literal(m_atom, False) R = regression_aux(phi, a) add_cond_eff(E, create_cond_eff(R, monitoring_atom)) else: monitoring_atom = ds.Literal(m_atom, False) R = regression_aux(phi, a) if R != phi: add_cond_eff(E, create_cond_eff(R, monitoring_atom))
def convert_formula(formula): if isinstance(formula, pddl.Atom): return ds.Literal(atom_str(formula), False) elif isinstance(formula, pddl.NegatedAtom): return ds.Literal(atom_str(formula), True) elif isinstance(formula, pddl.Disjunction): return ds.Or([convert_formula(part) for part in formula.parts]) elif isinstance(formula, pddl.Conjunction): return ds.And([convert_formula(part) for part in formula.parts]) elif isinstance(formula, pddl.Truth): return ds.TRUE() elif isinstance(formula, pddl.Falsity): return ds.FALSE()
def manage_sa_compilation(phi, psi, m_atom, a, E): if OPTIMIZED: R1 = regression_aux(phi, a) R2 = regression_aux(psi, a) monitoring_atom = ds.Literal(m_atom, False) if can_make_true(a, phi) or can_falsify(a, psi): cond = ds.And([R1, R2.negate()]).simplified() cond_eff = create_cond_eff(cond, monitoring_atom.negate()) add_cond_eff(E, cond_eff) if can_make_true(a, psi): add_cond_eff(E, create_cond_eff(R2, monitoring_atom)) else: R1 = regression_aux(phi, a) R2 = regression_aux(psi, a) monitoring_atom = ds.Literal(m_atom, False) if phi != R1 or psi != R2: cond = ds.And([R1, R2.negate()]).simplified() cond_eff = create_cond_eff(cond, monitoring_atom.negate()) add_cond_eff(E, cond_eff) if psi != R2: add_cond_eff(E, create_cond_eff(R2, monitoring_atom))
def manage_amo_compilation(phi, m_atom, a, E): if OPTIMIZED: if not can_make_true(a, phi): return None, False monitoring_atom = ds.Literal(m_atom, False) R = regression_aux(phi, a) if R == phi: return None, False else: rho = ds.Or([R.negate(), monitoring_atom.negate(), phi]).simplified() add_cond_eff(E, create_cond_eff(R, monitoring_atom)) return rho, True else: monitoring_atom = ds.Literal(m_atom, False) R = regression_aux(phi, a) if R == phi: return None, False else: rho = ds.Or([R.negate(), monitoring_atom.negate(), phi]).simplified() add_cond_eff(E, create_cond_eff(R, monitoring_atom)) return rho, True
def tcore(F, A, I, G, C): relevancy_dict = build_relevancy_dict(C) A_prime = [] G_prime = [] I_prime, F_prime = get_monitoring_atoms(C, I) compiled_action = 0 for c in LTC(C): monitoring_atom = ds.Literal(c.monitoring_atom, False) G_prime.append(monitoring_atom) G_prime = ds.And(G_prime) for a in A: E = [] relevant_constraints = get_relevant_constraints(a, relevancy_dict) if len(relevant_constraints) > 0: compiled_action += 1 for c in relevant_constraints: if c.kind == ds.ALWAYS: precondition, to_add = manage_always_compilation(c.gd1, a) elif c.kind == ds.ATMOSTONCE: precondition, to_add = manage_amo_compilation( c.gd1, c.monitoring_atom, a, E) elif c.kind == ds.SOMETIMEBEFORE: precondition, to_add = manage_sb_compilation( c.gd1, c.gd2, c.monitoring_atom, a, E) if c.kind == ds.ALWAYS or c.kind == ds.ATMOSTONCE or c.kind == ds.SOMETIMEBEFORE: if to_add: a.precondition.append(precondition) if c.kind == ds.SOMETIME: manage_sometime_compilation(c.gd1, c.monitoring_atom, a, E) elif c.kind == ds.SOMETIMEAFTER: manage_sa_compilation(c.gd1, c.gd2, c.monitoring_atom, a, E) for eff in E: a.effects.append(eff) if ds.FALSE() not in a.precondition: A_prime.append(a) G_new = ds.And([G, G_prime]).simplified() #print("Compiled actions: {}".format(compiled_action)) return F + F_prime, A_prime, I + I_prime, G_new
def get_fresh_monitoring_atom(name, number): return ds.Literal('{}{}{}'.format(name, SEPARATOR, number), False)