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 simple_substitution(set, phi): if phi == ds.TRUE(): return ds.TRUE() if phi == ds.FALSE(): return ds.FALSE() if isinstance(phi, ds.Literal): if phi in set: return ds.TRUE() phi_neg = phi.negate() if phi_neg in set: return ds.FALSE() else: # phi is not in the initial state if phi.negated: return ds.TRUE() else: return ds.FALSE() elif isinstance(phi, ds.Or): return ds.Or([ simple_substitution(set, component) for component in phi.components ]) else: # Conjunction return ds.And([ simple_substitution(set, component) for component in phi.components ])
def gamma(literal, action): disjunction = [] for cond, eff in get_effects(action): if literal == eff: if cond == ds.TRUE(): # in this case cond == TRUE(), so it is a simple effect return ds.TRUE() # cond is a list of literals disjunction.append(cond) if not disjunction: return ds.FALSE() return ds.Or(disjunction)
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 regression(phi, action): if isinstance(phi, ds.TRUE): return phi elif isinstance(phi, ds.FALSE): return phi elif isinstance(phi, ds.Literal): return gamma_substitution(phi, action) elif isinstance(phi, ds.Or): return ds.Or( [regression(component, action) for component in phi.components]) else: # And return ds.And( [regression(component, action) for component in phi.components])
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 gamma_substitution(literal, action): negated_literal = literal.negate() gamma1 = gamma(literal, action) gamma2 = gamma(negated_literal, action).negate() conjunction = ds.And([literal, gamma2]) return ds.Or([gamma1, conjunction])