From bc1718ce3c48cfa31ae5f660a1a53112e6a24d08 Mon Sep 17 00:00:00 2001 From: Jan Kwakkel Date: Mon, 15 Jan 2024 11:23:43 +0100 Subject: [PATCH 1/3] Make RandomActivationByType.agents_by_type backward compatible --- mesa/time.py | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/mesa/time.py b/mesa/time.py index b93b7863d29..633813024fa 100644 --- a/mesa/time.py +++ b/mesa/time.py @@ -28,6 +28,7 @@ import heapq import warnings import weakref +from collections import defaultdict from collections.abc import Iterable # mypy @@ -287,6 +288,22 @@ class RandomActivationByType(BaseScheduler): - get_type_count: Returns the count of agents of a specific type. """ + @property + def agents_by_type(self): + warnings.warn( + "Because of the shift to using AgentSet, in the future this attribute will return a dict with" + "type as key as AgentSet as value", + DeprecationWarning, + stacklevel=2, + ) + + agentsbytype = defaultdict(dict) + for k, v in self._agents_by_type.items(): + agentsbytype[k] = {agent: agent.unique_id for agent in v} + + return agentsbytype + + def __init__(self, model: Model, agents: Iterable[Agent] | None = None) -> None: super().__init__(model, agents) """ @@ -297,14 +314,14 @@ def __init__(self, model: Model, agents: Iterable[Agent] | None = None) -> None: """ # can't be a defaultdict because we need to pass model to AgentSet - self.agents_by_type: [type, AgentSet] = {} + self._agents_by_type: [type, AgentSet] = {} if agents is not None: for agent in agents: try: - self.agents_by_type[type(agent)].add(agent) + self._agents_by_type[type(agent)].add(agent) except KeyError: - self.agents_by_type[type(agent)] = AgentSet([agent], self.model) + self._agents_by_type[type(agent)] = AgentSet([agent], self.model) def add(self, agent: Agent) -> None: """ @@ -316,16 +333,16 @@ def add(self, agent: Agent) -> None: super().add(agent) try: - self.agents_by_type[type(agent)].add(agent) + self._agents_by_type[type(agent)].add(agent) except KeyError: - self.agents_by_type[type(agent)] = AgentSet([agent], self.model) + self._agents_by_type[type(agent)] = AgentSet([agent], self.model) def remove(self, agent: Agent) -> None: """ Remove all instances of a given agent from the schedule. """ super().remove(agent) - self.agents_by_type[type(agent)].remove(agent) + self._agents_by_type[type(agent)].remove(agent) def step(self, shuffle_types: bool = True, shuffle_agents: bool = True) -> None: """ @@ -339,7 +356,7 @@ def step(self, shuffle_types: bool = True, shuffle_agents: bool = True) -> None: """ # To be able to remove and/or add agents during stepping # it's necessary to cast the keys view to a list. - type_keys: list[type[Agent]] = list(self.agents_by_type.keys()) + type_keys: list[type[Agent]] = list(self._agents_by_type.keys()) if shuffle_types: self.model.random.shuffle(type_keys) for agent_class in type_keys: @@ -355,7 +372,7 @@ def step_type(self, agenttype: type[Agent], shuffle_agents: bool = True) -> None Args: agenttype: Class object of the type to run. """ - agents = self.agents_by_type[agenttype] + agents = self._agents_by_type[agenttype] if shuffle_agents: agents.shuffle(inplace=True) @@ -365,7 +382,7 @@ def get_type_count(self, agenttype: type[Agent]) -> int: """ Returns the current number of agents of certain type in the queue. """ - return len(self.agents_by_type[agenttype]) + return len(self._agents_by_type[agenttype]) class DiscreteEventScheduler(BaseScheduler): From a7ddad55f53c58e1f84a1f08fdfc56e6d1c45453 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 10:48:57 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mesa/time.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mesa/time.py b/mesa/time.py index 633813024fa..bb6c55883a9 100644 --- a/mesa/time.py +++ b/mesa/time.py @@ -303,7 +303,6 @@ def agents_by_type(self): return agentsbytype - def __init__(self, model: Model, agents: Iterable[Agent] | None = None) -> None: super().__init__(model, agents) """ From 1f9af4925070856959176688e585fe812778011f Mon Sep 17 00:00:00 2001 From: Jan Kwakkel Date: Mon, 15 Jan 2024 13:07:04 +0100 Subject: [PATCH 3/3] updated warning --- mesa/time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesa/time.py b/mesa/time.py index bb6c55883a9..c56fa638236 100644 --- a/mesa/time.py +++ b/mesa/time.py @@ -292,7 +292,7 @@ class RandomActivationByType(BaseScheduler): def agents_by_type(self): warnings.warn( "Because of the shift to using AgentSet, in the future this attribute will return a dict with" - "type as key as AgentSet as value", + "type as key as AgentSet as value. Future behavior is available via RandomActivationByType._agents_by_type", DeprecationWarning, stacklevel=2, )