From 850da2ecc4f320c4a962fc721992a4f40403fd8c Mon Sep 17 00:00:00 2001 From: shinedday <shinedday@gmail.com> Date: Tue, 18 May 2021 09:11:09 +0200 Subject: [PATCH] Fix bug 33 : amas-when-agent-is-destroyed-it-should-wait-the-end-of-current-cycle --- pyAmakCore/classes/amas.py | 27 +++++++++++++++++++----- pyAmakCore/tests/test_amas/test_agent.py | 24 +++++++++++++++++---- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/pyAmakCore/classes/amas.py b/pyAmakCore/classes/amas.py index 39868c5..d24b115 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/tests/test_amas/test_agent.py b/pyAmakCore/tests/test_amas/test_agent.py index c5b623a..e43150f 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(), []) -- GitLab