Skip to content

Commit 8739099

Browse files
rhtquaquelpre-commit-ci[bot]
authored
model: Move random seed and random to __init__ (#1940)
* model: Move random seed and random to __init__ Given that `super().__init__()` is now necessary for user's model class `__init__()`, this simplifies the `Model` construct. And `model.random` can be initialized with other RNG objects (`np.random.default_rng(...)`, or any other RNG). Prior discussion #1938 Please enter the commit message for your changes. Lines starting * model: Set seed as keyword argument * make_model: Set seed after model initialization This is because the seed param is no longer always passed by the user to mesa.Model.__init__. * add super call in model.__init__ * attempted debug * Update test_time.py * Update test_time.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Ensure object.__init__ has no other argument * fix: Remove need of __new__ in ModelCreator * Remove obsolete attributes * Remove superfluous code --------- Co-authored-by: Jan Kwakkel <[email protected]> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent ead9cd1 commit 8739099

File tree

4 files changed

+13
-19
lines changed

4 files changed

+13
-19
lines changed

mesa/model.py

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,29 +54,24 @@ class Model:
5454
5555
"""
5656

57-
def __new__(cls, *args: Any, **kwargs: Any) -> Any:
58-
"""Create a new model object and instantiate its RNG automatically."""
59-
obj = object.__new__(cls)
60-
obj._seed = kwargs.get("seed")
61-
if obj._seed is None:
62-
# We explicitly specify the seed here so that we know its value in
63-
# advance.
64-
obj._seed = random.random()
65-
obj.random = random.Random(obj._seed)
66-
return obj
67-
68-
def __init__(self, *args: Any, **kwargs: Any) -> None:
57+
def __init__(self, *args: Any, seed: float | None = None, **kwargs: Any) -> None:
6958
"""Create a new model. Overload this method with the actual code to
7059
start the model. Always start with super().__init__() to initialize the
7160
model object properly.
7261
"""
73-
7462
self.running = True
7563
self.schedule = None
7664
self.steps: int = 0
7765

7866
self._setup_agent_registration()
7967

68+
self._seed = seed
69+
if self._seed is None:
70+
# We explicitly specify the seed here so that we know its value in
71+
# advance.
72+
self._seed = random.random()
73+
self.random = random.Random(self._seed)
74+
8075
# Wrap the user-defined step method
8176
self._user_step = self.step
8277
self.step = self._wrapped_step

mesa/visualization/solara_viz.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,10 +260,8 @@ def on_change(name, value):
260260
set_model_parameters({**model_parameters, name: value})
261261

262262
def create_model():
263-
model.value = model.value.__class__.__new__(
264-
model.value.__class__, **model_parameters, seed=reactive_seed.value
265-
)
266-
model.value.__init__(**model_parameters)
263+
model.value = model.value.__class__(**model_parameters)
264+
model.value._seed = reactive_seed.value
267265

268266
solara.use_effect(create_model, [model_parameters, reactive_seed.value])
269267

tests/test_solara_viz.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ def test_call_space_drawer(mocker):
8989
)
9090

9191
model = mesa.Model()
92-
mocker.patch.object(mesa.Model, "__new__", return_value=model)
9392
mocker.patch.object(mesa.Model, "__init__", return_value=None)
9493

9594
agent_portrayal = {

tests/test_time.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import unittest
66
from unittest import TestCase, mock
77

8-
from mesa import Agent, Model
8+
from mesa.agent import Agent
9+
from mesa.model import Model
910
from mesa.time import (
1011
BaseScheduler,
1112
RandomActivation,
@@ -111,6 +112,7 @@ def test_no_shuffle(self):
111112
"""
112113
Testing the staged activation without shuffling.
113114
"""
115+
114116
model = MockModel(shuffle=False)
115117
model.step()
116118
model.step()

0 commit comments

Comments
 (0)