Skip to content
Snippets Groups Projects
agent.py 2.00 KiB
import sys
from ast import literal_eval
from typing import Dict

from tool.schedulable import Schedulable


class Agent(Schedulable):

    def __init__(self, identifier: int) -> None:
        self.id = identifier

        Schedulable.__init__(self, client_id="Agent" + str(self.id))

        self.subscribe("scheduler/agent/wakeup", self.wake_up)

        self.neighbors = []
        self.next_neighbors = []
        self.subscribe("amas/agent/" + str(self.id) + "/neighbor", self.add_neighbor)

        self.on_initialization()

        self.publish("cycle_done", "")
        print("init done")

    def on_initialization(self):
        pass

    def add_neighbor(self, client, userdata, message):
        print(message.payload.decode("utf-8"))
        result = literal_eval(message.payload.decode("utf-8"))
        self.next_neighbors.append(result)

    def log(self, message: str) -> None:
        self.client.publish(
            "agent/" + str(self.id) + "/log",
            "[AGENT] " + str(self.id) + " : " + message
        )
        return

    def publish(self, topic: str, message) -> None:
        self.client.publish("agent/" + str(self.id) + "/" + topic, message)

    def on_cycle_begin(self):
        self.log("on_cycle_begin")

    def on_perceive(self):
        self.log("on_perceive")

    def on_decide(self):
        self.log("on_decide")

    def on_act(self):
        self.log("on_act")

    def on_cycle_end(self):
        self.log("on_cycle_end")

    def send_metric(self) -> Dict:
        return {"id": self.id}

    def run(self):
        while not self.exit_bool:

            self.wait()
            if self.exit_bool:
                return

            self.on_cycle_begin()

            self.on_perceive()

            self.on_decide()

            self.on_act()

            self.on_cycle_end()

            self.publish("metric", str(self.send_metric()))
            self.publish("cycle_done", "")


if __name__ == '__main__':
    print("id agent: ", int(sys.argv[1]))

    a = Agent(int(sys.argv[1]))
    a.run()