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

Fix bug 33 : amas-when-agent-is-destroyed-it-should-wait-the-end-of-current-cycle

parent 67030ad5
No related branches found
No related tags found
No related merge requests found
...@@ -30,6 +30,9 @@ class Amas(Schedulable, Loggable): ...@@ -30,6 +30,9 @@ class Amas(Schedulable, Loggable):
Loggable.__init__(self) Loggable.__init__(self)
self.__environment: Environment = environment self.__environment: Environment = environment
self.__agents: List[Agent] = [] self.__agents: List[Agent] = []
self.__agent_to_add: List[Agent] = []
self.__agent_to_remove: List[Agent] = []
self.__nbrcycle: int = 0 self.__nbrcycle: int = 0
self.__scheduler: Scheduler = Scheduler() self.__scheduler: Scheduler = Scheduler()
...@@ -40,6 +43,11 @@ class Amas(Schedulable, Loggable): ...@@ -40,6 +43,11 @@ class Amas(Schedulable, Loggable):
self.on_initial_agents_creation() 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: for agent in self.__agents:
agent.compute_criticality() agent.compute_criticality()
...@@ -52,9 +60,9 @@ class Amas(Schedulable, Loggable): ...@@ -52,9 +60,9 @@ class Amas(Schedulable, Loggable):
""" """
add agent in the amas agents list without duplicate 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 return
self.__agents.append(agent) self.__agent_to_add.append(agent)
def add_agents(self, agents: List[Agent]) -> None: def add_agents(self, agents: List[Agent]) -> None:
""" """
...@@ -67,9 +75,7 @@ class Amas(Schedulable, Loggable): ...@@ -67,9 +75,7 @@ class Amas(Schedulable, Loggable):
""" """
remove agent from amas remove agent from amas
""" """
if agent not in self.__agents: self.__agent_to_remove.append(agent)
return
self.__agents.remove(agent)
def get_environment(self) -> Environment: def get_environment(self) -> Environment:
""" """
...@@ -120,6 +126,11 @@ class Amas(Schedulable, Loggable): ...@@ -120,6 +126,11 @@ class Amas(Schedulable, Loggable):
""" """
print("Cycle : ", self.__nbrcycle) 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.on_cycle_begin()
self.synchronization() self.synchronization()
...@@ -146,6 +157,12 @@ class Amas(Schedulable, Loggable): ...@@ -146,6 +157,12 @@ class Amas(Schedulable, Loggable):
self.synchronization() self.synchronization()
self.on_cycle_end() 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.to_csv(self.get_cycle(), self.get_agents())
self.__nbrcycle += 1 self.__nbrcycle += 1
......
...@@ -8,6 +8,11 @@ from pyAmakCore.classes.amas import Amas ...@@ -8,6 +8,11 @@ from pyAmakCore.classes.amas import Amas
from pyAmakCore.classes.environment import Environment from pyAmakCore.classes.environment import Environment
from pyAmakCore.classes.agent import Agent from pyAmakCore.classes.agent import Agent
class SimplerAmas(Amas):
def synchronization(self):
self._Amas__scheduler.give_amas_token()
super().synchronization()
class TestAmasAgents(TestCase): class TestAmasAgents(TestCase):
""" """
...@@ -33,27 +38,31 @@ class TestAmasAgents(TestCase): ...@@ -33,27 +38,31 @@ class TestAmasAgents(TestCase):
""" """
environment = Environment() environment = Environment()
amas = Amas(environment) amas = SimplerAmas(environment)
agent1 = Agent(amas) agent1 = Agent(amas)
agent2 = Agent(amas) agent2 = Agent(amas)
agent3 = Agent(amas) agent3 = Agent(amas)
# add 1 agent # add 1 agent
amas.add_agent(agent1) amas.add_agent(agent1)
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1]) self.assertEqual(amas.get_agents(), [agent1])
# don't remove previous agent # don't remove previous agent
amas.add_agent(agent2) amas.add_agent(agent2)
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent2]) self.assertEqual(amas.get_agents(), [agent1, agent2])
# add agent in good order # add agent in good order
amas.add_agent(agent3) amas.add_agent(agent3)
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent2, agent3]) self.assertEqual(amas.get_agents(), [agent1, agent2, agent3])
# don't add duplicate # don't add duplicate
amas.add_agent(agent1) amas.add_agent(agent1)
amas.add_agent(agent2) amas.add_agent(agent2)
amas.add_agent(agent3) amas.add_agent(agent3)
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent2, agent3]) self.assertEqual(amas.get_agents(), [agent1, agent2, agent3])
def test_add_agents(self) -> None: def test_add_agents(self) -> None:
...@@ -62,7 +71,7 @@ class TestAmasAgents(TestCase): ...@@ -62,7 +71,7 @@ class TestAmasAgents(TestCase):
""" """
environment = Environment() environment = Environment()
amas = Amas(environment) amas = SimplerAmas(environment)
agent1 = Agent(amas) agent1 = Agent(amas)
agent2 = Agent(amas) agent2 = Agent(amas)
...@@ -71,36 +80,43 @@ class TestAmasAgents(TestCase): ...@@ -71,36 +80,43 @@ class TestAmasAgents(TestCase):
agent5 = Agent(amas) agent5 = Agent(amas)
amas.add_agents([agent1, agent2, agent3, agent4, agent5]) amas.add_agents([agent1, agent2, agent3, agent4, agent5])
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent2, agent3, agent4, agent5]) self.assertEqual(amas.get_agents(), [agent1, agent2, agent3, agent4, agent5])
amas = Amas(environment) amas = SimplerAmas(environment)
amas.add_agents([agent1, agent2]) amas.add_agents([agent1, agent2])
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent2]) self.assertEqual(amas.get_agents(), [agent1, agent2])
amas.add_agents([agent1, agent2, agent4, agent2, agent3]) amas.add_agents([agent1, agent2, agent4, agent2, agent3])
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent2, agent4, agent3]) self.assertEqual(amas.get_agents(), [agent1, agent2, agent4, agent3])
def test_remove_agent(self) -> None: def test_remove_agent(self) -> None:
environment = Environment() environment = Environment()
amas = Amas(environment) amas = SimplerAmas(environment)
agent1 = Agent(amas) agent1 = Agent(amas)
agent2 = Agent(amas) agent2 = Agent(amas)
agent3 = Agent(amas) agent3 = Agent(amas)
amas.remove_agent(agent2) amas.remove_agent(agent2)
amas.cycle()
self.assertEqual(amas.get_agents(), []) self.assertEqual(amas.get_agents(), [])
amas.add_agents([agent1, agent2, agent3]) amas.add_agents([agent1, agent2, agent3])
amas.remove_agent(agent2) amas.remove_agent(agent2)
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent3]) self.assertEqual(amas.get_agents(), [agent1, agent3])
amas.remove_agent(agent2) amas.remove_agent(agent2)
amas.cycle()
self.assertEqual(amas.get_agents(), [agent1, agent3]) self.assertEqual(amas.get_agents(), [agent1, agent3])
amas.remove_agent(agent1) amas.remove_agent(agent1)
amas.remove_agent(agent3) amas.remove_agent(agent3)
amas.cycle()
self.assertEqual(amas.get_agents(), []) self.assertEqual(amas.get_agents(), [])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment