示例#1
0
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
示例#2
0
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))
示例#3
0
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()
示例#4
0
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))
示例#5
0
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
示例#6
0
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
示例#7
0
def get_fresh_monitoring_atom(name, number):
    return ds.Literal('{}{}{}'.format(name, SEPARATOR, number), False)