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