diff --git a/pyAmakCore/classes/amas.py b/pyAmakCore/classes/amas.py index 39868c5dfa21c94d3d9f10fb1d29120d8931d323..d24b11510190a8bbb38eae15c38fba0080166e53 100644 --- a/pyAmakCore/classes/amas.py +++ b/pyAmakCore/classes/amas.py @@ -30,6 +30,9 @@ class Amas(Schedulable, Loggable): Loggable.__init__(self) self.__environment: Environment = environment self.__agents: List[Agent] = [] + self.__agent_to_add: List[Agent] = [] + self.__agent_to_remove: List[Agent] = [] + self.__nbrcycle: int = 0 self.__scheduler: Scheduler = Scheduler() @@ -40,6 +43,11 @@ class Amas(Schedulable, Loggable): self.on_initial_agents_creation() + for agent in self.__agent_to_add: + if agent not in self.__agents: + self.__agents.append(agent) + self.__agent_to_add = [] + for agent in self.__agents: agent.compute_criticality() @@ -52,9 +60,9 @@ class Amas(Schedulable, Loggable): """ add agent in the amas agents list without duplicate """ - if agent in self.__agents: + if agent in self.__agents or agent in self.__agent_to_add: return - self.__agents.append(agent) + self.__agent_to_add.append(agent) def add_agents(self, agents: List[Agent]) -> None: """ @@ -67,9 +75,7 @@ class Amas(Schedulable, Loggable): """ remove agent from amas """ - if agent not in self.__agents: - return - self.__agents.remove(agent) + self.__agent_to_remove.append(agent) def get_environment(self) -> Environment: """ @@ -120,6 +126,11 @@ class Amas(Schedulable, Loggable): """ print("Cycle : ", self.__nbrcycle) + for agent in self.__agent_to_add: + if agent not in self.__agents: + self.__agents.append(agent) + self.__agent_to_add = [] + self.on_cycle_begin() self.synchronization() @@ -146,6 +157,12 @@ class Amas(Schedulable, Loggable): self.synchronization() self.on_cycle_end() + + for agent in self.__agent_to_remove: + if agent in self.__agents: + self.__agents.remove(agent) + self.__agent_to_remove = [] + self.to_csv(self.get_cycle(), self.get_agents()) self.__nbrcycle += 1 diff --git a/pyAmakCore/classes/tools/loggable.py b/pyAmakCore/classes/tools/loggable.py index a74ba82837f2ee142aa621989c80e10dad95c939..094e4f0ab9ce6789398d85a181a4872de0e8b58b 100644 --- a/pyAmakCore/classes/tools/loggable.py +++ b/pyAmakCore/classes/tools/loggable.py @@ -14,6 +14,7 @@ class Loggable: def __init__(self): self.__do_log = False self.__file_path = None + self.__ignore_attribute = ["_Agent__amas", "_Agent__environment"] def to_csv(self, cycle: int, var_list: List['Agent']) -> None: """ @@ -22,8 +23,7 @@ class Loggable: if not self.__do_log: return - ignore_attribute = ["_Agent__amas", "_Agent__environment"] - table = [{**{e: x[e] for e in x if e not in ignore_attribute}, + table = [{**{e: x[e] for e in x if e not in self.__ignore_attribute}, **{'nombre_cycle': cycle}} for x in map(vars, var_list)] dataframe = DataFrame(table) @@ -46,3 +46,17 @@ class Loggable: specify path to csv """ self.__file_path = path_to_file + + def add_ignore_attribute(self, attribute: str) -> None: + """ + add attribute in ignored attribute + """ + self.__ignore_attribute.append(attribute) + + def remove_ignore_attribute(self, attribute: str) -> None: + """ + remove attribute in ignored attribute + """ + if attribute not in self.__ignore_attribute: + return + self.__ignore_attribute.remove(attribute) diff --git a/pyAmakCore/tests/test_amas/test_agent.py b/pyAmakCore/tests/test_amas/test_agent.py index c5b623ab8c92bb2d62e2af4e93ac6ee2cef01d1d..e43150f67f56a23074c9a934c3f706401a997a83 100644 --- a/pyAmakCore/tests/test_amas/test_agent.py +++ b/pyAmakCore/tests/test_amas/test_agent.py @@ -8,6 +8,11 @@ from pyAmakCore.classes.amas import Amas from pyAmakCore.classes.environment import Environment from pyAmakCore.classes.agent import Agent +class SimplerAmas(Amas): + + def synchronization(self): + self._Amas__scheduler.give_amas_token() + super().synchronization() class TestAmasAgents(TestCase): """ @@ -33,27 +38,31 @@ class TestAmasAgents(TestCase): """ environment = Environment() - amas = Amas(environment) + amas = SimplerAmas(environment) agent1 = Agent(amas) agent2 = Agent(amas) agent3 = Agent(amas) # add 1 agent amas.add_agent(agent1) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1]) # don't remove previous agent amas.add_agent(agent2) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent2]) # add agent in good order amas.add_agent(agent3) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent2, agent3]) # don't add duplicate amas.add_agent(agent1) amas.add_agent(agent2) amas.add_agent(agent3) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent2, agent3]) def test_add_agents(self) -> None: @@ -62,7 +71,7 @@ class TestAmasAgents(TestCase): """ environment = Environment() - amas = Amas(environment) + amas = SimplerAmas(environment) agent1 = Agent(amas) agent2 = Agent(amas) @@ -71,36 +80,43 @@ class TestAmasAgents(TestCase): agent5 = Agent(amas) amas.add_agents([agent1, agent2, agent3, agent4, agent5]) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent2, agent3, agent4, agent5]) - amas = Amas(environment) + amas = SimplerAmas(environment) amas.add_agents([agent1, agent2]) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent2]) amas.add_agents([agent1, agent2, agent4, agent2, agent3]) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent2, agent4, agent3]) def test_remove_agent(self) -> None: environment = Environment() - amas = Amas(environment) + amas = SimplerAmas(environment) agent1 = Agent(amas) agent2 = Agent(amas) agent3 = Agent(amas) amas.remove_agent(agent2) + amas.cycle() self.assertEqual(amas.get_agents(), []) amas.add_agents([agent1, agent2, agent3]) amas.remove_agent(agent2) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent3]) amas.remove_agent(agent2) + amas.cycle() self.assertEqual(amas.get_agents(), [agent1, agent3]) amas.remove_agent(agent1) amas.remove_agent(agent3) + amas.cycle() self.assertEqual(amas.get_agents(), [])