{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "-cy4CItVIKRK" }, "source": [ "# Custom observer tutorial\n", "\n", "The goal of this tutorial is to setup a custom observer that will be able to monitor certain events of the simulation.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "bQX5hbAmIKRO", "outputId": "10242ef7-4936-4970-9711-0379033b9d30" }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "from pydistsim import NetworkGenerator, Simulation\n", "from pydistsim.logging import set_log_level, LogLevels, enable_logger\n", "\n", "set_log_level(LogLevels.INFO)\n", "enable_logger()" ] }, { "cell_type": "markdown", "metadata": { "id": "sEYOElVXIKRS" }, "source": [ "### Algorithm\n", "\n", "To demonstrate this, we will re-use the `Echo` algorithm from the \"Hello World\" example. The algorithm is a simple\n", "flooding algorithm that sends a message to all neighbors and waits for the response from all of them.\n", "Once every neighbor responds, the algorithms terminates.\n", "\n", "The observer will be able to monitor the following events:\n", "\n", "- 'echo_response_received': This event is triggered when a response is received from a neighbor.\n", "- 'echo_terminated': This event is triggered when the algorithm terminates.\n", "\n", "Implementation of `Echo` algorithm is given below. Notice the `self.notify_observers()` method that is called whenever\n", "an event occurs.\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "wwaAh2VeIKRS" }, "outputs": [], "source": [ "from enum import StrEnum\n", "from pydistsim.algorithm.node_algorithm import NodeAlgorithm, StatusValues\n", "from pydistsim.algorithm.node_wrapper import NodeAccess\n", "from pydistsim.message import Message\n", "from pydistsim.restrictions.communication import BidirectionalLinks\n", "from pydistsim.restrictions.reliability import TotalReliability\n", "from pydistsim.restrictions.topological import Connectivity, UniqueInitiator\n", "\n", "\n", "class EchoEvents(StrEnum):\n", " echo_response_received = \"echo_response_received\"\n", " echo_terminated = \"echo_terminated\"\n", "\n", "\n", "class Echo(NodeAlgorithm):\n", " default_params = {\n", " \"echo_message\": \"Hello world!\",\n", " }\n", "\n", " class Status(StatusValues):\n", " INITIATOR = \"INITIATOR\"\n", " AWAITING_ECHO = \"AWAITING_ECHO\"\n", " AWAITING_ECHO_RESPONSE = \"AWAITING_ECHO_RESPONSE\"\n", " DONE = \"DONE\"\n", "\n", " S_init = (Status.INITIATOR, Status.AWAITING_ECHO)\n", " S_term = (Status.DONE,)\n", "\n", " # Here we define under which restrictions the algorithm is designed to work\n", " algorithm_restrictions = (\n", " BidirectionalLinks, # The algorithm requires bidirectional links, so that the response can be sent back\n", " TotalReliability, # The algorithm requires that all messages are delivered without loss\n", " Connectivity, # The algorithm requires that the network is connected\n", " UniqueInitiator, # The algorithm requires that only one node is the initiator\n", " )\n", "\n", " def initializer(self):\n", " # Set all nodes to AWAITING_ECHO\n", " for node in self.network.nodes():\n", " node.status = self.Status.AWAITING_ECHO\n", "\n", " # Choose the initiator\n", " ini_node = self.network.nodes_sorted()[0]\n", "\n", " # Send the initial message to the initiator\n", " ini_node.push_to_inbox(Message(meta_header=NodeAlgorithm.INI, destination=ini_node))\n", "\n", " # Set the initiator status to INITIATOR and store the initial information\n", " ini_node.status = self.Status.INITIATOR\n", " ini_node.memory[\"message\"] = self.echo_message\n", "\n", " @Status.INITIATOR\n", " def spontaneously(self, node: NodeAccess, message: Message):\n", " self.send(\n", " node,\n", " data=node.memory[\"message\"],\n", " destination=list(node.neighbors()), # send to all neighbors\n", " header=\"Echo\",\n", " )\n", " node.memory[\"responseCount\"] = 0\n", " node.status = self.Status.AWAITING_ECHO_RESPONSE\n", "\n", " @Status.AWAITING_ECHO_RESPONSE\n", " def receiving(self, node: NodeAccess, message: Message):\n", " if message.header == \"Echo response\":\n", " self.notify_observers(EchoEvents.echo_response_received, node=node, message=message)\n", "\n", " # Count the number of responses received, only if the response is the same as the original message\n", " node.memory[\"responseCount\"] += 1 if message.data == node.memory[\"message\"] else 0\n", "\n", " # If all responses have been received, set the node status to DONE\n", " if node.memory[\"responseCount\"] == len(list(node.neighbors())):\n", " self.notify_observers(EchoEvents.echo_terminated, node=node)\n", " node.status = self.Status.DONE\n", "\n", " @Status.AWAITING_ECHO\n", " def receiving(self, node: NodeAccess, message: Message):\n", " if message.header == \"Echo\":\n", " node.memory[\"message\"] = message.data\n", "\n", " self.send(\n", " node,\n", " data=message.data,\n", " destination=message.source,\n", " header=\"Echo response\",\n", " )\n", " node.status = self.Status.DONE\n", "\n", " @Status.DONE\n", " def default(self, *args, **kwargs):\n", " \"Do nothing, for all inputs.\"\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Observer\n", "\n", "The observer will be implemented as a class that inherits from both `AlgorithmObserver` and `SimulationObserver` classes.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from pydistsim.observers import AlgorithmObserver, SimulationObserver\n", "from pydistsim.network import Node\n", "\n", "\n", "class EchoObserver(AlgorithmObserver, SimulationObserver):\n", " events = [\n", " EchoEvents.echo_response_received,\n", " EchoEvents.echo_terminated,\n", " ]\n", "\n", " def __init__(self):\n", " self.list_of_events = []\n", "\n", " def on_echo_response_received(self, node: NodeAccess, message: Message):\n", " actual_node: Node = node.unbox()\n", " actual_source: Node = message.source.unbox()\n", " print(f\"Node {actual_node} received echo response from {actual_source}.\")\n", " self.list_of_events.append(\"received\")\n", "\n", " def on_echo_terminated(self, node: NodeAccess):\n", " actual_node: Node = node.unbox()\n", " print(f\"Node {actual_node} terminated.\")\n", " self.list_of_events.append(\"terminated\")" ] }, { "cell_type": "markdown", "metadata": { "id": "wl8UmzwUIKRT" }, "source": [ "### Assigning algorithm and observer to simulation\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m2024-10-22 23:39:48.901\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpydistsim.simulation\u001b[0m:\u001b[36m__init__\u001b[0m:\u001b[36m59\u001b[0m - \u001b[1mSimulation 0x7f58b45e3190 created successfully.\u001b[0m\n" ] } ], "source": [ "MESSAGE = \"Hello distributed and observable world\"\n", "\n", "net = NetworkGenerator.generate_star_network(16)\n", "observer = EchoObserver()\n", "sim = Simulation(net)\n", "\n", "sim.algorithms = ((Echo, {\"echo_message\": MESSAGE}),)\n", "sim.add_observers(observer)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/mnt/d/Proyectos/pymote/docs/notebooks/../../pydistsim/network/network.py:560: UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown\n", " fig.show()\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Running\n" ] }, { "cell_type": "markdown", "metadata": { "id": "CBbV5L7UIKRT" }, "source": [ "Finally, run simulation:\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node received echo response from .\n", "Node terminated.\n", "\u001b[32m2024-10-22 23:39:52.911\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mpydistsim.simulation\u001b[0m:\u001b[36m_run_algorithm\u001b[0m:\u001b[36m148\u001b[0m - \u001b[1m[Echo] Algorithm finished\u001b[0m\n" ] } ], "source": [ "sim.run()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, the observer has executed the 'print' message me defied in the different trigger methods.\n", "\n", "Now, we check if the observer has kept track of the events.\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'received',\n", " 'terminated']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "observer.list_of_events" ] } ], "metadata": { "colab": { "provenance": [] }, "kernelspec": { "display_name": "venv_pydistim_dev", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0rc1" } }, "nbformat": 4, "nbformat_minor": 0 }