From 3460e3add5b2d3d42278ff5a07814b8b0d9e3c33 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 15 Mar 2025 04:21:37 +0530 Subject: [PATCH 1/3] added steps functionality to ModelDF --- mesa_frames/concrete/model.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mesa_frames/concrete/model.py b/mesa_frames/concrete/model.py index 8e9bfa23..f59553ff 100644 --- a/mesa_frames/concrete/model.py +++ b/mesa_frames/concrete/model.py @@ -85,6 +85,7 @@ def __init__(self, seed: int | Sequence[int] | None = None) -> None: self.current_id = 0 self._agents = AgentsDF(self) self._space = None + self._steps = 0 def get_agents_of_type(self, agent_type: type) -> "AgentSetDF": """Retrieve the AgentSetDF of a specified type. @@ -131,8 +132,20 @@ def step(self) -> None: The default method calls the step() method of all agents. Overload as needed. """ + self._steps += 1 self.agents.step() + @property + def steps(self) -> int: + """Get the current step count. + + Returns + ------- + int + The current step count of the model. + """ + return self._steps + @property def agents(self) -> AgentsDF: """Get the AgentsDF object containing all agents in the model. From 3f4908c6f6dada9da17d5b61c84b82e5c8b4aef6 Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 15 Mar 2025 04:38:47 +0530 Subject: [PATCH 2/3] added tests for _steps Modeldf --- tests/test_modeldf.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/test_modeldf.py diff --git a/tests/test_modeldf.py b/tests/test_modeldf.py new file mode 100644 index 00000000..6c9fea43 --- /dev/null +++ b/tests/test_modeldf.py @@ -0,0 +1,14 @@ +from mesa_frames import ModelDF + + +class Test_ModelDF: + def test_steps(self): + model = ModelDF() + + assert model.steps == 0 + + model.step() + assert model.steps == 1 + + model.step() + assert model.steps == 2 From 6a39aa49f7125b4d42cbf3aa1e584b4e5973ce6d Mon Sep 17 00:00:00 2001 From: Ben Date: Sat, 15 Mar 2025 16:25:26 +0530 Subject: [PATCH 3/3] added a wrapped user defined step that won't affect the internal step --- mesa_frames/concrete/model.py | 14 +++++++++++++- tests/test_modeldf.py | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/mesa_frames/concrete/model.py b/mesa_frames/concrete/model.py index f59553ff..3bcc4d76 100644 --- a/mesa_frames/concrete/model.py +++ b/mesa_frames/concrete/model.py @@ -87,6 +87,19 @@ def __init__(self, seed: int | Sequence[int] | None = None) -> None: self._space = None self._steps = 0 + self._user_step = self.step + self.step = self._wrapped_step + + def _wrapped_step(self) -> None: + """Automatically increments step counter and calls user-defined step().""" + self._steps += 1 + self._user_step() + + @property + def steps(self) -> int: + """Get the current step count.""" + return self._steps + def get_agents_of_type(self, agent_type: type) -> "AgentSetDF": """Retrieve the AgentSetDF of a specified type. @@ -132,7 +145,6 @@ def step(self) -> None: The default method calls the step() method of all agents. Overload as needed. """ - self._steps += 1 self.agents.step() @property diff --git a/tests/test_modeldf.py b/tests/test_modeldf.py index 6c9fea43..afc45405 100644 --- a/tests/test_modeldf.py +++ b/tests/test_modeldf.py @@ -1,6 +1,15 @@ from mesa_frames import ModelDF +class CustomModel(ModelDF): + def __init__(self): + super().__init__() + self.custom_step_count = 0 + + def step(self): + self.custom_step_count += 2 + + class Test_ModelDF: def test_steps(self): model = ModelDF() @@ -12,3 +21,17 @@ def test_steps(self): model.step() assert model.steps == 2 + + def test_user_defined_step(self): + model = CustomModel() + + assert model.steps == 0 + assert model.custom_step_count == 0 + + model.step() + assert model.steps == 1 + assert model.custom_step_count == 2 + + model.step() + assert model.steps == 2 + assert model.custom_step_count == 4