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 _wait(agent, term, intention): # Handle optional arguments. args = [agentspeak.grounded(arg, intention.scope) for arg in term.args] if len(args) == 2: event, millis = args else: if agentspeak.is_number(args[0]): millis = args[0] event = None else: millis = None event = args[0] # Type checks. if not (millis is None or agentspeak.is_number(millis)): raise agentspeak.AslError("expected timeout for .wait to be numeric") if not (event is None or agentspeak.is_string(event)): raise agentspeak.AslError("expected event for .wait to be a string") # Event. if event is not None: # Parse event. if not event.endswith("."): event += "." log = agentspeak.Log(LOGGER, 1) tokens = agentspeak.lexer.TokenStream( agentspeak.StringSource("<.wait>", event), log) tok, ast_event = agentspeak.parser.parse_event(tokens.next(), tokens, log) if tok.lexeme != ".": raise log.error( "expected no further tokens after event for .wait, got: '%s'", tok.lexeme, loc=tok.loc) # Build term. event = ast_event.accept(agentspeak.runtime.BuildEventVisitor(log)) # Timeout. if millis is None: until = None else: until = agent.env.time() + millis / 1000 # Create waiter. intention.waiter = agentspeak.runtime.Waiter(event=event, until=until) yield
async def run(self): """ Coroutine run cyclic. """ if self.agent.bdi_enabled: msg = await self.receive(timeout=0) if msg: mdata = msg.metadata ilf_type = mdata["ilf_type"] if ilf_type == "tell": goal_type = asp.GoalType.belief trigger = asp.Trigger.addition elif ilf_type == "untell": goal_type = asp.GoalType.belief trigger = asp.Trigger.removal elif ilf_type == "achieve": goal_type = asp.GoalType.achievement trigger = asp.Trigger.addition else: raise asp.AslError( "unknown illocutionary force: {}".format(ilf_type)) intention = asp.runtime.Intention() functor, args = parse_literal(msg.body) message = asp.Literal(functor, args) message = asp.freeze(message, intention.scope, {}) tagged_message = message.with_annotation( asp.Literal("source", (asp.Literal(str(msg.sender)), ))) self.agent.bdi_intention_buffer.append( (trigger, goal_type, tagged_message, intention)) if self.agent.bdi_intention_buffer: temp_intentions = deque(self.agent.bdi_intention_buffer) for trigger, goal_type, term, intention in temp_intentions: self.agent.bdi_agent.call(trigger, goal_type, term, intention) '''self.agent.bdi_agent.step()''' self.agent.bdi_intention_buffer.popleft() self.agent.bdi_agent.step() else: await asyncio.sleep(0.1)
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