From cd0ecd2d92bfff88045694527ebc26f6620c9515 Mon Sep 17 00:00:00 2001 From: shinedday <shinedday@gmail.com> Date: Mon, 9 May 2022 14:11:07 +0200 Subject: [PATCH] Upgrade add agent, Simplified amas, fix typo --- amas.py | 39 +++++++++++++++++++++++++++------------ philosophers/agent.py | 20 +++++++++----------- philosophers/amas.py | 24 ++++-------------------- philosophers/env.py | 8 ++++---- philosophers/fork.py | 4 ++-- tool/update.py | 1 - 6 files changed, 46 insertions(+), 50 deletions(-) diff --git a/amas.py b/amas.py index 1ff3e9d..632ec34 100644 --- a/amas.py +++ b/amas.py @@ -20,30 +20,43 @@ class Amas(Schedulable, SSHClient): self.next_id = 0 - self.agents_metric = [None for _ in range(self.next_id)] + self.agents_cmd = [] self.on_initialization() self.on_initial_agents_creation() + self.agents_metric = [None for _ in range(self.next_id)] self.client.publish("amas/action_done", "") def on_initial_agents_creation(self): pass - def add_agent(self, agent_to_create): + def add_agent(self, experience_name, args): + + command = "nohup python " + command += "\"Desktop/mqtt_goyon/iotamak-core/" + experience_name + "/agent.py\" " + command += str(self.next_id) + " " + for arg in args: + command += str(arg) + " " + command += "&" - agents = [] - for _ in range(agent_to_create): - agents.append(Cmd( - cmd='nohup python \"Desktop/mqtt_goyon/iotamak-core/agent.py\" ' + str(self.next_id) + " &" - )) - self.subscribe("agent/" + str(self.next_id) + "/metric", self.agent_metric) - self.subscribe("agent/" + str(self.next_id) + "/log", self.agent_log) + self.agents_cmd.append(Cmd(command)) - self.client.publish("amas/agent/new", self.next_id) - self.next_id += 1 + self.subscribe("agent/" + str(self.next_id) + "/metric", self.agent_metric) + self.subscribe("agent/" + str(self.next_id) + "/log", self.agent_log) - self.run_cmd(0, agents) + self.client.publish("amas/agent/new", self.next_id) + self.next_id += 1 + + def push_agent(self): + + total_pi = len(self.clients) + for client in range(total_pi): + self.run_cmd(client, list(self.agents_cmd[ + client * len(self.agents_cmd) // total_pi:(client + 1) * len( + self.agents_cmd) // total_pi + ]) + ) def agent_log(self, client, userdata, message): print("[Log] " + str(message.payload.decode("utf-8")) + " on topic " + message.topic) @@ -74,6 +87,8 @@ class Amas(Schedulable, SSHClient): def run(self) -> None: + self.push_agent() + while not self.exit_bool: self.wait() diff --git a/philosophers/agent.py b/philosophers/agent.py index a939a3a..6de0ab2 100644 --- a/philosophers/agent.py +++ b/philosophers/agent.py @@ -36,22 +36,22 @@ class PhiAgent(Agent): res = literal_eval(message.payload.decode("utf-8")) if res.get("response") == "True": if res.get("side") == "right": - self.right_fork.tanken_by = self.id + self.right_fork.taken_by = self.id self.right_fork.state = res.get("state") else: - self.left_fork.tanken_by = self.id + self.left_fork.taken_by = self.id self.left_fork.state = res.get("state") self.fork_wait = False def left_fork_update(self, client, userdata, message): res = literal_eval(message.payload.decode("utf-8")) self.left_fork.state = res.get("state") - self.left_fork.tanken_by = res.get("tanken_by") + self.left_fork.taken_by = res.get("tanken_by") def right_fork_update(self, client, userdata, message): res = literal_eval(message.payload.decode("utf-8")) self.right_fork.state = res.get("state") - self.right_fork.tanken_by = res.get("tanken_by") + self.right_fork.taken_by = res.get("tanken_by") def ask_spoon(self, left): if left : @@ -65,16 +65,16 @@ class PhiAgent(Agent): def on_decide(self): super().on_decide() - if self.right_fork.tanken_by == -1: + if self.right_fork.taken_by == -1: self.ask_spoon(False) - if self.left_fork.tanken_by == -1: + if self.left_fork.taken_by == -1: self.ask_spoon(True) if self.state == 1: - if self.right_fork.tanken_by != self.id: + if self.right_fork.taken_by != self.id: self.ask_spoon(False) - if self.left_fork.tanken_by != self.id: + if self.left_fork.taken_by != self.id: self.ask_spoon(True) def on_act(self): @@ -87,7 +87,7 @@ class PhiAgent(Agent): self.state = 1 elif self.state == 1: self.log("Is Hungry") - if self.left_fork.tanken_by == self.right_fork.tanken_by == self.id: + if self.left_fork.taken_by == self.right_fork.taken_by == self.id: self.state = 2 elif self.state == 2: self.log("Is Eating") @@ -96,7 +96,5 @@ class PhiAgent(Agent): if __name__ == '__main__': - print("id agent: ", int(sys.argv[1])) - a = PhiAgent(int(sys.argv[1]), int(sys.argv[2])) a.run() diff --git a/philosophers/amas.py b/philosophers/amas.py index 060ace3..886fd89 100644 --- a/philosophers/amas.py +++ b/philosophers/amas.py @@ -4,7 +4,7 @@ import pathlib sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) from amas import Amas -from tool.ssh_client import Cmd + class PhiAmas(Amas): @@ -13,26 +13,10 @@ class PhiAmas(Amas): super().__init__() def on_initial_agents_creation(self): + for _ in range(self.agent_to_create): + self.add_agent("philosophers", [str(self.agent_to_create)]) - self.add_agent(self.agent_to_create) - - def add_agent(self, agent_to_create): - - agents = [] - for _ in range(agent_to_create): - agents.append(Cmd( - cmd='nohup python \"Desktop/mqtt_goyon/iotamak-core/philosophers/agent.py\" ' + str(self.next_id) - + " " + str(self.agent_to_create) + " &" - )) - self.subscribe("agent/" + str(self.next_id) + "/log", self.agent_log) - - self.client.publish("amas/agent/new", self.next_id) - self.next_id += 1 - - self.run_cmd(0, [agents[0]]) - self.run_cmd(1, [agents[1]]) - self.run_cmd(2, [agents[2]]) if __name__ == '__main__': s = PhiAmas(3) - s.run() \ No newline at end of file + s.run() diff --git a/philosophers/env.py b/philosophers/env.py index 179ba88..34e7c8f 100644 --- a/philosophers/env.py +++ b/philosophers/env.py @@ -34,20 +34,20 @@ class PhiEnv(Environment): message = { "response": "False" } - elif self.forks[fork_id].tanken_by == -1: + elif self.forks[fork_id].taken_by == -1: message = { "response": "True", "side": res, "state": 0 } - self.forks[fork_id].tanken_by = agent_id + self.forks[fork_id].taken_by = agent_id else: message = { "response": "True", "side": res, "state": 1 } - self.forks[fork_id].tanken_by = agent_id + self.forks[fork_id].taken_by = agent_id self.forks[fork_id].state = 1 self.client.publish("env/agent/" + str(agent_id) + "/ask_spoon", str(message)) @@ -61,7 +61,7 @@ class PhiEnv(Environment): def on_cycle_begin(self) -> None: for fork in self.forks: self.client.publish("env/fork/" + str(fork.identifier), str(fork.to_msg())) - print("Fork : ",fork.identifier," taken by ",fork.tanken_by," and is :",fork.state) + print("Fork : ", fork.identifier," taken by ", fork.taken_by, " and is :", fork.state) if __name__ == '__main__': diff --git a/philosophers/fork.py b/philosophers/fork.py index c9a4b3e..8e59e66 100644 --- a/philosophers/fork.py +++ b/philosophers/fork.py @@ -7,10 +7,10 @@ class Fork: # 0: dirty, 1: clean self.state = 0 - self.tanken_by = -1 + self.taken_by = -1 def to_msg(self): return { "state": self.state, - "taken_by": self.tanken_by + "taken_by": self.taken_by } \ No newline at end of file diff --git a/tool/update.py b/tool/update.py index e78bdf9..03b7fde 100644 --- a/tool/update.py +++ b/tool/update.py @@ -14,7 +14,6 @@ class VersionManager: self.clients = read_ssh(str(pathlib.Path(__file__).parent.resolve())+"/config.json") def update(self): - # TODO: rm previous files for client in self.clients: transport = paramiko.Transport((client.hostname, 22)) transport.connect(username=client.user, password=client.password) -- GitLab