def _broadcast(agent, term, intention): # Illocutionary force. ilf = agentspeak.grounded(term.args[0], intention.scope) if not agentspeak.is_atom(ilf): return if ilf.functor == "tell": goal_type = agentspeak.GoalType.belief trigger = agentspeak.Trigger.addition elif ilf.functor == "untell": goal_type = agentspeak.GoalType.belief trigger = agentspeak.Trigger.removal elif ilf.functor == "achieve": goal_type = agentspeak.GoalType.achievement trigger = agentspeak.Trigger.addition else: raise agentspeak.AslError("unknown illocutionary force: %s" % ilf) # Prepare message. message = agentspeak.freeze(term.args[1], intention.scope, {}) tagged_message = message.with_annotation( agentspeak.Literal("source", (agentspeak.Literal(agent.name), ))) # Broadcast. for receiver in agent.env.agents.values(): if receiver == agent: continue receiver.call(trigger, goal_type, tagged_message, agentspeak.runtime.Intention()) yield
def _send(agent, term, intention): # Find the receivers: By a string, atom or list of strings or atoms. receivers = agentspeak.grounded(term.args[0], intention.scope) if not agentspeak.is_list(receivers): receivers = [receivers] receiving_agents = [] for receiver in receivers: if agentspeak.is_atom(receiver): receiving_agents.append(agent.env.agents[receiver.functor]) else: receiving_agents.append(agent.env.agents[receiver]) # Illocutionary force. ilf = agentspeak.grounded(term.args[1], intention.scope) if not agentspeak.is_atom(ilf): return if ilf.functor == "tell": goal_type = agentspeak.GoalType.belief trigger = agentspeak.Trigger.addition elif ilf.functor == "untell": goal_type = agentspeak.GoalType.belief trigger = agentspeak.Trigger.removal elif ilf.functor == "achieve": goal_type = agentspeak.GoalType.achievement trigger = agentspeak.Trigger.addition else: raise agentspeak.AslError("unknown illocutionary force: %s" % ilf) # TODO: unachieve, askOne, askAll, tellHow, untellHow, askHow # Prepare message. message = agentspeak.freeze(term.args[2], intention.scope, {}) tagged_message = message.with_annotation( agentspeak.Literal("source", (agentspeak.Literal(agent.name), ))) # Broadcast. for receiver in receiving_agents: receiver.call(trigger, goal_type, tagged_message, agentspeak.runtime.Intention()) yield
def _send(agent, term, intention): receivers = asp.grounded(term.args[0], intention.scope) if isinstance(receivers, str) or isinstance(receivers, asp.Literal): receivers = (receivers,) ilf = asp.grounded(term.args[1], intention.scope) if not asp.is_atom(ilf): return ilf_type = ilf.functor mdata = {"performative": "BDI", "ilf_type": ilf_type, } for receiver in receivers: body = asp.asl_str(asp.freeze(term.args[2], intention.scope, {})) msg = Message(to=str(receiver), body=body, metadata=mdata) self.agent.submit(self.send(msg)) yield