From ed9b5aa81cb72e55d3cfa4b7e7086cb2603ee6e5 Mon Sep 17 00:00:00 2001 From: rht Date: Sat, 6 Jan 2024 18:54:14 -0500 Subject: [PATCH] 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 https://github.com/projectmesa/mesa/discussions/1938.# Please enter the commit message for your changes. Lines starting --- mesa/model.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/mesa/model.py b/mesa/model.py index ca0c653cd30..c08ac5f9c50 100644 --- a/mesa/model.py +++ b/mesa/model.py @@ -45,17 +45,6 @@ class Model: initialize_data_collector: Sets up the data collector for the model, requiring an initialized scheduler and agents. """ - def __new__(cls, *args: Any, **kwargs: Any) -> Any: - """Create a new model object and instantiate its RNG automatically.""" - obj = object.__new__(cls) - obj._seed = kwargs.get("seed") - if obj._seed is None: - # We explicitly specify the seed here so that we know its value in - # advance. - obj._seed = random.random() # noqa: S311 - obj.random = random.Random(obj._seed) - return obj - def __init__(self, *args: Any, **kwargs: Any) -> None: """Create a new model. Overload this method with the actual code to start the model. Always start with super().__init__() to initialize the @@ -65,6 +54,14 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.running = True self.schedule = None self.current_id = 0 + + self._seed = kwargs.get("seed") + if self._seed is None: + # We explicitly specify the seed here so that we know its value in + # advance. + self._seed = random.random() # noqa: S311 + self.random = random.Random(self._seed) + self._agents: defaultdict[type, dict] = defaultdict(dict) # Warning flags for current experimental features. These make sure a warning is only printed once per model.