예제 #1
0
def __ground_method(parameters, subtasks, ordering, task, problem, depth):
    task = signs[task]
    stasks = {}
    task_signifs = []
    for tasknum, subtask in subtasks.items():
        signifs = __ground_single_method(parameters, subtask, problem, depth)
        if signifs:
            stasks[tasknum] = signifs
        else:
            return None
    if len(stasks) == 1:
        signifs = stasks['task0']
        for signif in signifs:
            task_signif = task.add_significance()
            connector = task_signif.add_feature(signif)
            signif.sign.add_out_significance(connector)
            task_signifs.append(task_signif)
    else:
        variants = mix_pairs(stasks)
        for variant in variants:
            task_signif = task.add_significance()
            for order in ordering:
                signif = variant[order]
                connector = task_signif.add_feature(signif)
                signif.sign.add_out_significance(connector)
            task_signifs.append(task_signif)
    return task_signifs
예제 #2
0
def preactivate_action_nonspecial(act_signif, constraints, plagent):
    """
    This function activate nonspecial (common for all agents) actions
    """
    I_sign = signs['I']

    act_roles = {
        net[2].sign
        for net in act_signif.spread_down_activity('significance', 5)
    }

    for ag, constraint in constraints.items():
        predicates = set()
        signatures = []
        for predicate in constraint:
            predicates.add(predicate.name)
            signatures.append(predicate.signature)

        role_signifs = {}
        for signature in signatures:
            for signa in signature:
                roles = {
                    cm.sign
                    for cm in signs[signa].spread_up_activity_obj(
                        'significance', 2) if cm.sign in act_roles
                }
                for role in roles:
                    if signa == plagent:
                        signa = 'I'
                    role_signifs.setdefault(role, set()).add(signs[signa])

        variants = mix_pairs(role_signifs)

        for variant in variants:
            act_mean = act_signif.copy('significance', 'meaning')
            for role_sign, obj in variant.items():
                if obj not in obj_means:
                    obj_mean = obj_signifs[obj].copy('significance', 'meaning')
                else:
                    obj_mean = obj_means[obj]
                act_mean.replace('meaning', role_sign, obj_mean)
            if ag == plagent:
                connector = act_mean.add_feature(obj_means[I_sign])
                efconnector = act_mean.add_feature(obj_means[I_sign],
                                                   effect=True)
                I_sign.add_out_meaning(connector)
            else:
                ag_mean = obj_means[signs[ag]]
                connector = act_mean.add_feature(ag_mean)
                efconnector = act_mean.add_feature(ag_mean, effect=True)
                signs[ag].add_out_meaning(connector)
예제 #3
0
def specialized(action, signs, obj_means, obj_signifs, act_signif, agent,
                constraints):
    agent_signs = []
    agents_with_constraints = []
    for ag in action.agents:
        for cm in signs[ag].significances.values():
            agent_signs.extend(list(
                cm.get_signs()))  #add current agents's signs
    for ag in constraints.keys():
        agents_with_constraints.append(signs[ag])
    agent_roles = {}
    # receiving all agent's roles.
    for ag in agent_signs:
        for a in ag.get_role():
            if a.name != "object":
                agent_roles.setdefault(ag, set()).update(a.get_role())
    for ag in agent_roles.keys():
        act_mean = act_signif.copy('significance', 'meaning')
        role_signs = [
            sign for sign in act_mean.get_signs() if sign in agent_roles[ag]
        ]
        for role_sign in role_signs:  # changing agent's roles to agents cms
            if role_sign in act_mean.get_signs():
                ag_mean = obj_means[ag]
                act_mean.replace('meaning', role_sign, ag_mean)
        if ag in agents_with_constraints:
            predicates = []
            for _, preds in constraints[ag.name].items():
                predicates.extend(preds)
            role_signifs = {}

            non_agent_preds = []
            agent_preds = []
            for pred in predicates:
                for signa in pred.signature:
                    if signa[0] == ag.name:
                        agent_preds.append(
                            pred)  # predicates with agent signature
                        break
                    else:
                        continue
                else:
                    non_agent_preds.append(
                        pred)  # predicates without agent signature

            agent_signs = []
            for predicate in agent_preds:
                agent_signs.extend([
                    signa[0] for signa in predicate.signature
                    if signa[0] != ag.name
                ])
            for pred in non_agent_preds.copy():
                signatures = []
                for signa in pred.signature:
                    signatures.append(signa[0])
                if not any(signa in agent_signs for signa in signatures):
                    non_agent_preds.remove(pred)
            non_agent_preds_signs = {
                signs[pred.name]
                for pred in non_agent_preds
            }
            for event in itertools.chain(act_mean.cause, act_mean.effect):
                event_signs = event.get_signs()
                if ag in event_signs:
                    pred_signs = [
                        pred for pred in predicates
                        if signs[pred.name] in event_signs
                    ]
                    if pred_signs:
                        event_signs.remove(ag)
                        for pred in pred_signs:
                            role_signature = {
                                sign
                                for sign in event_signs
                                if sign != signs[pred.name]
                            }
                            for role in role_signature:
                                pred_roles = [
                                    signif.get_signs() for _, signif in
                                    role.significances.items()
                                ]
                                pred_role = set()
                                while len(pred_roles):
                                    for role1 in pred_roles.copy():
                                        role2 = list(role1)[0]
                                        if not role2 in pred_role:
                                            pred_role.add(role2)
                                            pred_roles.remove(role1)
                                        else:
                                            pred_roles.remove(role1)
                                # matrixe role to predicate's type
                                role_signifs.setdefault(
                                    role, set()).update(pred_role)
                            # change type sign to object sign
                            for key, pred_signats in role_signifs.items():
                                for pred_signat in pred_signats.copy():
                                    for signa in pred.signature:
                                        if signa[1][
                                                0].name == pred_signat.name:
                                            pred_signats.remove(pred_signat)
                                            pred_signats.add(signs[signa[0]])
                elif event_signs & non_agent_preds_signs:
                    for predicate in non_agent_preds:
                        pred_signats = {
                            signs[signa[0]]
                            for signa in predicate.signature
                        }
                        if role_signifs:
                            used_signs = reduce(lambda x, y: x | y,
                                                role_signifs.values())
                        else:
                            used_signs = set()
                        new_signs = pred_signats - used_signs
                        for pred_sign in new_signs:
                            attributes = pred_sign.find_attribute()
                            key_at = None
                            depth = 2
                            while depth > 0:
                                for attribute in attributes:
                                    if not attribute in event_signs:
                                        attribute = attribute.find_attribute()
                                        for at in attribute.copy():
                                            if at in event_signs:
                                                key_at = at
                                                break
                                        else:
                                            depth -= 1
                                            break
                                break
                            if key_at:
                                role_signifs.setdefault(key_at,
                                                        set()).add(pred_sign)

            if 'truck' not in action.name and 'airplane' not in action.name:
                obj_signs = signs['block?x'], signs['block?y']
                for obj_sign in obj_signs:
                    if obj_sign in role_signifs.keys():
                        role_signifs.pop(obj_sign)

            pairs = mix_pairs(role_signifs)
            if pairs:
                for pair in pairs:
                    act_mean_constr = act_mean.copy('meaning', 'meaning')
                    for role_sign, obj in pair.items():
                        if obj not in obj_means:
                            obj_mean = obj_signifs[obj].copy(
                                'significance', 'meaning')
                        else:
                            obj_mean = obj_means[obj]
                        act_mean_constr.replace('meaning', role_sign, obj_mean)
                    if ag.name == agent:
                        I_sign = signs["I"]
                        connector = act_mean_constr.add_feature(
                            obj_means[I_sign])
                        efconnector = act_mean_constr.add_feature(
                            obj_means[I_sign], effect=True)
                        I_sign.add_out_meaning(connector)
                    else:
                        ag_mean = obj_means[ag]
                        connector = act_mean_constr.add_feature(ag_mean)
                        efconnector = act_mean_constr.add_feature(ag_mean,
                                                                  effect=True)
                        ag.add_out_meaning(connector)

        else:
            if ag.name == agent:
                I_sign = signs["I"]
                connector = act_mean.add_feature(obj_means[I_sign])
                efconnector = act_mean.add_feature(obj_means[I_sign],
                                                   effect=True)
                I_sign.add_out_meaning(connector)
            else:
                ag_mean = obj_means[ag]
                connector = act_mean.add_feature(ag_mean)
                efconnector = act_mean.add_feature(ag_mean, effect=True)
                ag.add_out_meaning(connector)
예제 #4
0
    def _generate_meanings(self, chains, sm=None):
        def __get_role_index(chain):
            index = 0
            rev_chain = reversed(chain)
            for el in rev_chain:
                if len(el.cause) == 0:
                    continue
                elif len(el.cause) == 1:
                    if len(el.cause[0].coincidences) ==1:
                        index = chain.index(el)
                    else:
                        return index
                else:
                    return index
            return None

        def __generator(combinations, pms, pm_signs, pm, agent):
            for combination in combinations:
                cm = pm.copy('meaning', 'meaning')
                for role_sign, obj_pm in combination.items():
                    if role_sign in pm_signs:
                        if obj_pm.sign in pm_signs:
                            continue
                        obj_cm = obj_pm.copy('significance', 'meaning')
                        cm.replace('meaning', role_sign, obj_cm)
                if not pms:
                    pms.append((agent, cm))
                else:
                    for _, pmd in copy(pms):
                        if pmd.resonate('meaning', cm):
                            break
                    else:
                        pms.append((agent, cm))
            return pms

        replace_map = {}
        main_pm = None
        for chain in chains:
            role_index = __get_role_index(chain)
            if role_index:
                if not chain[role_index].sign in replace_map:
                    replace_map[chain[role_index].sign] = [chain[-1]]
                else:
                    if not chain[-1] in replace_map[chain[role_index].sign]:
                        replace_map[chain[role_index].sign].append(chain[-1])
                main_pm = chain[0]

        connectors = [agent.out_meanings for agent in self.agents]

        main_pm_len = len(main_pm.cause) + len(main_pm.effect) + 2

        mapped_actions = {}
        for agent_con in connectors:
            for con in agent_con:
                if con.in_sign == main_pm.sign:
                    mapped_actions.setdefault(con.out_sign, set()).add(con.in_sign.meanings[con.in_index])

        new_map = {}
        rkeys = {el for el in replace_map.keys()}
        pms = []

        for agent, lpm in mapped_actions.items():
            for pm in lpm.copy():
                if len(pm.cause) + len(pm.effect) != main_pm_len:
                    lpm.remove(pm)
                    continue
                pm_signs = set()
                pm_mean = pm.spread_down_activity('meaning', 3)
                for pm_list in pm_mean:
                    pm_signs |= set([c.sign for c in pm_list])
                role_signs = rkeys & pm_signs
                if not role_signs:
                    lpm.remove(pm)
                    if not pms:
                        pms.append((agent, pm))
                    else:
                        for _, pmd in copy(pms):
                            if pmd.resonate('meaning', pm):
                                break
                        else:
                            pms.append((agent, pm))
        if not sm:
            for agent, lpm in mapped_actions.items():
                for pm in lpm:
                    if len(pm.cause) + len(pm.effect) != main_pm_len:
                        continue
                    pm_signs = set()
                    pm_mean = pm.spread_down_activity('meaning', 3)
                    for pm_list in pm_mean:
                        pm_signs |= set([c.sign for c in pm_list])
                    role_signs = rkeys & pm_signs
                    for role_sign in role_signs:
                        new_map[role_sign] = replace_map[role_sign]
                    combinations = mix_pairs(new_map)
                    pms = __generator(combinations, pms, pm_signs, pm, agent)
        else:
            sm_chains = sm.spread_down_activity('meaning', A_C)
            sm_signs = set()
            for chain in sm_chains:
                sm_signs |= set([c.sign for c in chain])
            changed_signs = set()
            for role, rms in replace_map.items():
                changed_signs |= {cm.sign for cm in rms if cm.sign in sm_signs}
            for agent, actions in mapped_actions.items():
                for action in actions:
                    act_chains = action.spread_down_activity('meaning', A_C)
                    act_signs = set()
                    for chain in act_chains:
                        act_signs |= set([c.sign for c in chain])
                    combinations = mix_pairs(replace_map)
                    pms = __generator(combinations, pms, act_signs, action, agent)
            for pair in pms.copy():
                pm_chains = pair[1].spread_down_activity('meaning', A_C)
                pm_signs = set()
                for chain in pm_chains:
                    pm_signs |= set([c.sign for c in chain])
                if not pm_signs.issuperset(changed_signs):
                    pms.remove(pair)
        return pms