Skip to content
Snippets Groups Projects
Commit cd0ecd2d authored by shinedday's avatar shinedday
Browse files

Upgrade add agent, Simplified amas, fix typo

parent 16fe7a33
Branches
Tags
No related merge requests found
...@@ -20,30 +20,43 @@ class Amas(Schedulable, SSHClient): ...@@ -20,30 +20,43 @@ class Amas(Schedulable, SSHClient):
self.next_id = 0 self.next_id = 0
self.agents_metric = [None for _ in range(self.next_id)] self.agents_cmd = []
self.on_initialization() self.on_initialization()
self.on_initial_agents_creation() self.on_initial_agents_creation()
self.agents_metric = [None for _ in range(self.next_id)]
self.client.publish("amas/action_done", "") self.client.publish("amas/action_done", "")
def on_initial_agents_creation(self): def on_initial_agents_creation(self):
pass 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 = [] self.agents_cmd.append(Cmd(command))
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.client.publish("amas/agent/new", self.next_id) self.subscribe("agent/" + str(self.next_id) + "/metric", self.agent_metric)
self.next_id += 1 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): def agent_log(self, client, userdata, message):
print("[Log] " + str(message.payload.decode("utf-8")) + " on topic " + message.topic) print("[Log] " + str(message.payload.decode("utf-8")) + " on topic " + message.topic)
...@@ -74,6 +87,8 @@ class Amas(Schedulable, SSHClient): ...@@ -74,6 +87,8 @@ class Amas(Schedulable, SSHClient):
def run(self) -> None: def run(self) -> None:
self.push_agent()
while not self.exit_bool: while not self.exit_bool:
self.wait() self.wait()
......
...@@ -36,22 +36,22 @@ class PhiAgent(Agent): ...@@ -36,22 +36,22 @@ class PhiAgent(Agent):
res = literal_eval(message.payload.decode("utf-8")) res = literal_eval(message.payload.decode("utf-8"))
if res.get("response") == "True": if res.get("response") == "True":
if res.get("side") == "right": 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") self.right_fork.state = res.get("state")
else: else:
self.left_fork.tanken_by = self.id self.left_fork.taken_by = self.id
self.left_fork.state = res.get("state") self.left_fork.state = res.get("state")
self.fork_wait = False self.fork_wait = False
def left_fork_update(self, client, userdata, message): def left_fork_update(self, client, userdata, message):
res = literal_eval(message.payload.decode("utf-8")) res = literal_eval(message.payload.decode("utf-8"))
self.left_fork.state = res.get("state") 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): def right_fork_update(self, client, userdata, message):
res = literal_eval(message.payload.decode("utf-8")) res = literal_eval(message.payload.decode("utf-8"))
self.right_fork.state = res.get("state") 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): def ask_spoon(self, left):
if left : if left :
...@@ -65,16 +65,16 @@ class PhiAgent(Agent): ...@@ -65,16 +65,16 @@ class PhiAgent(Agent):
def on_decide(self): def on_decide(self):
super().on_decide() super().on_decide()
if self.right_fork.tanken_by == -1: if self.right_fork.taken_by == -1:
self.ask_spoon(False) self.ask_spoon(False)
if self.left_fork.tanken_by == -1: if self.left_fork.taken_by == -1:
self.ask_spoon(True) self.ask_spoon(True)
if self.state == 1: if self.state == 1:
if self.right_fork.tanken_by != self.id: if self.right_fork.taken_by != self.id:
self.ask_spoon(False) self.ask_spoon(False)
if self.left_fork.tanken_by != self.id: if self.left_fork.taken_by != self.id:
self.ask_spoon(True) self.ask_spoon(True)
def on_act(self): def on_act(self):
...@@ -87,7 +87,7 @@ class PhiAgent(Agent): ...@@ -87,7 +87,7 @@ class PhiAgent(Agent):
self.state = 1 self.state = 1
elif self.state == 1: elif self.state == 1:
self.log("Is Hungry") 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 self.state = 2
elif self.state == 2: elif self.state == 2:
self.log("Is Eating") self.log("Is Eating")
...@@ -96,7 +96,5 @@ class PhiAgent(Agent): ...@@ -96,7 +96,5 @@ class PhiAgent(Agent):
if __name__ == '__main__': if __name__ == '__main__':
print("id agent: ", int(sys.argv[1]))
a = PhiAgent(int(sys.argv[1]), int(sys.argv[2])) a = PhiAgent(int(sys.argv[1]), int(sys.argv[2]))
a.run() a.run()
...@@ -4,7 +4,7 @@ import pathlib ...@@ -4,7 +4,7 @@ import pathlib
sys.path.insert(0, str(pathlib.Path(__file__).parent.parent)) sys.path.insert(0, str(pathlib.Path(__file__).parent.parent))
from amas import Amas from amas import Amas
from tool.ssh_client import Cmd
class PhiAmas(Amas): class PhiAmas(Amas):
...@@ -13,26 +13,10 @@ class PhiAmas(Amas): ...@@ -13,26 +13,10 @@ class PhiAmas(Amas):
super().__init__() super().__init__()
def on_initial_agents_creation(self): 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__': if __name__ == '__main__':
s = PhiAmas(3) s = PhiAmas(3)
s.run() s.run()
\ No newline at end of file
...@@ -34,20 +34,20 @@ class PhiEnv(Environment): ...@@ -34,20 +34,20 @@ class PhiEnv(Environment):
message = { message = {
"response": "False" "response": "False"
} }
elif self.forks[fork_id].tanken_by == -1: elif self.forks[fork_id].taken_by == -1:
message = { message = {
"response": "True", "response": "True",
"side": res, "side": res,
"state": 0 "state": 0
} }
self.forks[fork_id].tanken_by = agent_id self.forks[fork_id].taken_by = agent_id
else: else:
message = { message = {
"response": "True", "response": "True",
"side": res, "side": res,
"state": 1 "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.forks[fork_id].state = 1
self.client.publish("env/agent/" + str(agent_id) + "/ask_spoon", str(message)) self.client.publish("env/agent/" + str(agent_id) + "/ask_spoon", str(message))
...@@ -61,7 +61,7 @@ class PhiEnv(Environment): ...@@ -61,7 +61,7 @@ class PhiEnv(Environment):
def on_cycle_begin(self) -> None: def on_cycle_begin(self) -> None:
for fork in self.forks: for fork in self.forks:
self.client.publish("env/fork/" + str(fork.identifier), str(fork.to_msg())) 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__': if __name__ == '__main__':
......
...@@ -7,10 +7,10 @@ class Fork: ...@@ -7,10 +7,10 @@ class Fork:
# 0: dirty, 1: clean # 0: dirty, 1: clean
self.state = 0 self.state = 0
self.tanken_by = -1 self.taken_by = -1
def to_msg(self): def to_msg(self):
return { return {
"state": self.state, "state": self.state,
"taken_by": self.tanken_by "taken_by": self.taken_by
} }
\ No newline at end of file
...@@ -14,7 +14,6 @@ class VersionManager: ...@@ -14,7 +14,6 @@ class VersionManager:
self.clients = read_ssh(str(pathlib.Path(__file__).parent.resolve())+"/config.json") self.clients = read_ssh(str(pathlib.Path(__file__).parent.resolve())+"/config.json")
def update(self): def update(self):
# TODO: rm previous files
for client in self.clients: for client in self.clients:
transport = paramiko.Transport((client.hostname, 22)) transport = paramiko.Transport((client.hostname, 22))
transport.connect(username=client.user, password=client.password) transport.connect(username=client.user, password=client.password)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment