Beispiel #1
0
    def __init__(
        self,
        dialogue_label: BaseDialogueLabel,
        self_address: Address,
        role: BaseDialogue.Role,
        message_class: Type[FipaMessage] = FipaMessage,
    ) -> None:
        """
        Initialize a dialogue.

        :param dialogue_label: the identifier of the dialogue
        :param self_address: the address of the entity for whom this dialogue is maintained
        :param role: the role of the agent this dialogue is maintained for

        :return: None
        """
        BaseFipaDialogue.__init__(
            self,
            dialogue_label=dialogue_label,
            self_address=self_address,
            role=role,
            message_class=message_class,
        )
        self.data_for_sale = None  # type: Optional[Dict[str, str]]
        self._terms = None  # type: Optional[Terms]
Beispiel #2
0
    def __init__(
        self,
        dialogue_label: DialogueLabel,
        self_address: Address,
        role: Dialogue.Role,
        message_class: Type[FipaMessage] = FipaMessage,
    ) -> None:
        """
        Initialize a dialogue.

        :param dialogue_label: the identifier of the dialogue
        :param self_address: the address of the entity for whom this dialogue is maintained
        :param role: the role of the agent this dialogue is maintained for

        :return: None
        """
        BaseFipaDialogue.__init__(
            self,
            dialogue_label=dialogue_label,
            self_address=self_address,
            role=role,
            message_class=message_class,
        )
        self._proposal = None  # type: Optional[Description]
        self._terms = None  # type: Optional[Terms]
        self._counterparty_signature = None  # type: Optional[str]
Beispiel #3
0
    def _on_propose(self, propose: FipaMessage, dialogue: Dialogue) -> None:
        """
        Handle a Propose.

        :param propose: the message containing the Propose
        :param dialogue: the dialogue
        :return: None
        """
        new_msg_id = propose.message_id + 1
        strategy = cast(Strategy, self.context.strategy)
        proposal_description = propose.proposal
        self.context.logger.debug("[{}]: on Propose as {}.".format(
            self.context.agent_name, dialogue.role))
        transactions = cast(Transactions, self.context.transactions)
        transaction_msg = transactions.generate_transaction_message(
            TransactionMessage.Performative.PROPOSE_FOR_SIGNING,
            proposal_description,
            dialogue.dialogue_label,
            dialogue.is_seller,
            self.context.agent_address,
        )

        if strategy.is_profitable_transaction(transaction_msg,
                                              is_seller=dialogue.is_seller):
            self.context.logger.info("[{}]: Accepting propose (as {}).".format(
                self.context.agent_name, dialogue.role))
            transactions.add_locked_tx(transaction_msg,
                                       as_seller=dialogue.is_seller)
            transactions.add_pending_initial_acceptance(
                dialogue.dialogue_label, new_msg_id, transaction_msg)
            fipa_msg = FipaMessage(
                performative=FipaMessage.Performative.ACCEPT,
                message_id=new_msg_id,
                dialogue_reference=dialogue.dialogue_label.dialogue_reference,
                target=propose.message_id,
            )
        else:
            self.context.logger.info("[{}]: Declining propose (as {})".format(
                self.context.agent_name, dialogue.role))
            fipa_msg = FipaMessage(
                performative=FipaMessage.Performative.DECLINE,
                message_id=new_msg_id,
                dialogue_reference=dialogue.dialogue_label.dialogue_reference,
                target=propose.message_id,
            )
            dialogues = cast(Dialogues, self.context.dialogues)
            dialogues.dialogue_stats.add_dialogue_endstate(
                Dialogue.EndState.DECLINED_PROPOSE, dialogue.is_self_initiated)
        dialogue.outgoing_extend(fipa_msg)
        self.context.outbox.put_message(
            to=dialogue.dialogue_label.dialogue_opponent_addr,
            sender=self.context.agent_address,
            protocol_id=FipaMessage.protocol_id,
            message=FipaSerializer().encode(fipa_msg),
        )
Beispiel #4
0
    def __init__(self, dialogue_label: DialogueLabel, is_seller: bool) -> None:
        """
        Initialize a dialogue label.

        :param dialogue_label: the identifier of the dialogue
        :param is_seller: indicates whether the agent associated with the dialogue is a seller or buyer

        :return: None
        """
        FipaDialogue.__init__(self, dialogue_label=dialogue_label, is_seller=is_seller)
        self.temp_data = None  # type: Optional[Dict[str, str]]
        self.proposal = None  # type: Optional[Description]
Beispiel #5
0
    def _on_accept(self, accept: FipaMessage, dialogue: Dialogue) -> None:
        """
        Handle an Accept.

        :param accept: the Accept message
        :param dialogue: the dialogue
        :return: None
        """
        self.context.logger.debug(
            "[{}]: on_accept: msg_id={}, dialogue_reference={}, origin={}, target={}"
            .format(
                self.context.agent_name,
                accept.message_id,
                accept.dialogue_reference,
                dialogue.dialogue_label.dialogue_opponent_addr,
                accept.target,
            ))
        new_msg_id = accept.message_id + 1
        transactions = cast(Transactions, self.context.transactions)
        transaction_msg = transactions.pop_pending_proposal(
            dialogue.dialogue_label, accept.target)
        strategy = cast(Strategy, self.context.strategy)

        if strategy.is_profitable_transaction(transaction_msg,
                                              is_seller=dialogue.is_seller):
            self.context.logger.info(
                "[{}]: locking the current state (as {}).".format(
                    self.context.agent_name, dialogue.role))
            transactions.add_locked_tx(transaction_msg,
                                       as_seller=dialogue.is_seller)
            self.context.decision_maker_message_queue.put(transaction_msg)
        else:
            self.context.logger.debug(
                "[{}]: decline the Accept (as {}).".format(
                    self.context.agent_name, dialogue.role))
            fipa_msg = FipaMessage(
                performative=FipaMessage.Performative.DECLINE,
                message_id=new_msg_id,
                dialogue_reference=dialogue.dialogue_label.dialogue_reference,
                target=accept.message_id,
            )
            dialogue.outgoing_extend(fipa_msg)
            dialogues = cast(Dialogues, self.context.dialogues)
            dialogues.dialogue_stats.add_dialogue_endstate(
                Dialogue.EndState.DECLINED_ACCEPT, dialogue.is_self_initiated)
            self.context.outbox.put_message(
                to=dialogue.dialogue_label.dialogue_opponent_addr,
                sender=self.context.agent_address,
                protocol_id=FipaMessage.protocol_id,
                message=FipaSerializer().encode(fipa_msg),
            )
Beispiel #6
0
    def test_non_initial_incoming_message_dialogue_reference(self):
        """Test the _non_initial_incoming_message_dialogue_reference method."""
        dialogue_incomplete_ref = FipaDialogue(
            DialogueLabel(("2", ""), "opponent", "self_address"),
            "self_address",
            FipaDialogue.Role.BUYER,
        )
        reference_incomplete = self._non_initial_incoming_message_dialogue_reference(
            dialogue_incomplete_ref)
        assert reference_incomplete[1] != ""

        dialogue_complete_ref = FipaDialogue(
            DialogueLabel(("2", "7"), "opponent", "self_address"),
            "self_address",
            FipaDialogue.Role.BUYER,
        )
        reference_complete = self._non_initial_incoming_message_dialogue_reference(
            dialogue_complete_ref)
        assert reference_complete[1] == "7"
Beispiel #7
0
    def __init__(
        self,
        dialogue_label: BaseDialogueLabel,
        agent_address: Address,
        role: BaseDialogue.Role,
    ) -> None:
        """
        Initialize a dialogue.

        :param dialogue_label: the identifier of the dialogue
        :param agent_address: the address of the agent for whom this dialogue is maintained
        :param role: the role of the agent this dialogue is maintained for

        :return: None
        """
        BaseFipaDialogue.__init__(
            self, dialogue_label=dialogue_label, agent_address=agent_address, role=role
        )
        self._proposal = None  # type: Optional[Description]
Beispiel #8
0
    def __init__(
        self,
        dialogue_label: DialogueLabel,
        agent_address: Address,
        role: BaseDialogue.Role,
    ) -> None:
        """
        Initialize a dialogue.

        :param dialogue_label: the identifier of the dialogue
        :param agent_address: the address of the agent for whom this dialogue is maintained
        :param role: the role of the agent this dialogue is maintained for

        :return: None
        """
        FipaDialogue.__init__(self,
                              dialogue_label=dialogue_label,
                              agent_address=agent_address,
                              role=role)
Beispiel #9
0
    def __init__(
        self,
        dialogue_label: BaseDialogueLabel,
        agent_address: Address,
        role: BaseDialogue.Role,
    ) -> None:
        """
        Initialize a dialogue.

        :param dialogue_label: the identifier of the dialogue
        :param agent_address: the address of the agent for whom this dialogue is maintained
        :param role: the role of the agent this dialogue is maintained for

        :return: None
        """
        BaseFipaDialogue.__init__(self,
                                  dialogue_label=dialogue_label,
                                  agent_address=agent_address,
                                  role=role)
        self._terms = None  # type: Optional[Terms]
        self._associated_ledger_api_dialogue = None  # type: Optional[LedgerApiDialogue]
Beispiel #10
0
    def __init__(
        self,
        dialogue_label: DialogueLabel,
        self_address: Address,
        role: BaseDialogue.Role,
        message_class: Type[FipaMessage],
    ) -> None:
        """
        Initialize a dialogue.

        :param dialogue_label: the identifier of the dialogue
        :param self_address: the address of the entity for whom this dialogue is maintained
        :param role: the role of the agent this dialogue is maintained for

        :return: None
        """
        FipaDialogue.__init__(
            self,
            dialogue_label=dialogue_label,
            self_address=self_address,
            role=role,
            message_class=message_class,
        )
Beispiel #11
0
    def _on_cfp(self, cfp: FipaMessage, dialogue: Dialogue) -> None:
        """
        Handle a CFP.

        :param cfp: the fipa message containing the CFP
        :param dialogue: the dialogue

        :return: None
        """
        new_msg_id = cfp.message_id + 1
        query = cast(Query, cfp.query)
        strategy = cast(Strategy, self.context.strategy)
        proposal_description = strategy.get_proposal_for_query(
            query, dialogue.is_seller)

        if proposal_description is None:
            self.context.logger.debug("[{}]: sending to {} a Decline{}".format(
                self.context.agent_name,
                dialogue.dialogue_label.dialogue_opponent_addr[-5:],
                pprint.pformat({
                    "msg_id":
                    new_msg_id,
                    "dialogue_reference":
                    cfp.dialogue_reference,
                    "origin":
                    dialogue.dialogue_label.dialogue_opponent_addr[-5:],
                    "target":
                    cfp.target,
                }),
            ))
            fipa_msg = FipaMessage(
                performative=FipaMessage.Performative.DECLINE,
                message_id=new_msg_id,
                dialogue_reference=dialogue.dialogue_label.dialogue_reference,
                target=cfp.message_id,
            )
            dialogues = cast(Dialogues, self.context.dialogues)
            dialogues.dialogue_stats.add_dialogue_endstate(
                Dialogue.EndState.DECLINED_CFP, dialogue.is_self_initiated)
        else:
            transactions = cast(Transactions, self.context.transactions)
            transaction_msg = transactions.generate_transaction_message(
                TransactionMessage.Performative.PROPOSE_FOR_SIGNING,
                proposal_description,
                dialogue.dialogue_label,
                dialogue.is_seller,
                self.context.agent_address,
            )
            transactions.add_pending_proposal(dialogue.dialogue_label,
                                              new_msg_id, transaction_msg)
            self.context.logger.info("[{}]: sending to {} a Propose{}".format(
                self.context.agent_name,
                dialogue.dialogue_label.dialogue_opponent_addr[-5:],
                pprint.pformat({
                    "msg_id":
                    new_msg_id,
                    "dialogue_reference":
                    cfp.dialogue_reference,
                    "origin":
                    dialogue.dialogue_label.dialogue_opponent_addr[-5:],
                    "target":
                    cfp.message_id,
                    "propose":
                    proposal_description.values,
                }),
            ))
            fipa_msg = FipaMessage(
                performative=FipaMessage.Performative.PROPOSE,
                message_id=new_msg_id,
                dialogue_reference=dialogue.dialogue_label.dialogue_reference,
                target=cfp.message_id,
                proposal=[proposal_description],
            )
        dialogue.outgoing_extend(fipa_msg)
        self.context.outbox.put_message(
            to=dialogue.dialogue_label.dialogue_opponent_addr,
            sender=self.context.agent_address,
            protocol_id=FipaMessage.protocol_id,
            message=FipaSerializer().encode(fipa_msg),
        )