Mesa 3.0.0b2__py3-none-any.whl → 3.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Mesa might be problematic. Click here for more details.

Files changed (47) hide show
  1. mesa/__init__.py +1 -1
  2. mesa/agent.py +15 -3
  3. mesa/batchrunner.py +26 -1
  4. mesa/examples/README.md +11 -11
  5. mesa/examples/__init__.py +2 -2
  6. mesa/examples/advanced/epstein_civil_violence/agents.py +44 -38
  7. mesa/examples/advanced/epstein_civil_violence/app.py +29 -28
  8. mesa/examples/advanced/epstein_civil_violence/model.py +33 -65
  9. mesa/examples/advanced/pd_grid/app.py +9 -5
  10. mesa/examples/advanced/pd_grid/model.py +1 -1
  11. mesa/examples/advanced/sugarscape_g1mt/app.py +5 -13
  12. mesa/examples/advanced/sugarscape_g1mt/model.py +3 -1
  13. mesa/examples/advanced/wolf_sheep/agents.py +53 -39
  14. mesa/examples/advanced/wolf_sheep/app.py +37 -19
  15. mesa/examples/advanced/wolf_sheep/model.py +68 -74
  16. mesa/examples/basic/boid_flockers/agents.py +49 -18
  17. mesa/examples/basic/boid_flockers/app.py +2 -2
  18. mesa/examples/basic/boid_flockers/model.py +55 -19
  19. mesa/examples/basic/boltzmann_wealth_model/agents.py +23 -5
  20. mesa/examples/basic/boltzmann_wealth_model/app.py +22 -13
  21. mesa/examples/basic/boltzmann_wealth_model/model.py +48 -13
  22. mesa/examples/basic/boltzmann_wealth_model/st_app.py +2 -2
  23. mesa/examples/basic/conways_game_of_life/app.py +15 -3
  24. mesa/examples/basic/schelling/agents.py +9 -5
  25. mesa/examples/basic/schelling/app.py +5 -5
  26. mesa/examples/basic/schelling/model.py +48 -26
  27. mesa/examples/basic/virus_on_network/app.py +25 -47
  28. mesa/experimental/cell_space/cell_collection.py +14 -2
  29. mesa/experimental/cell_space/discrete_space.py +16 -2
  30. mesa/experimental/devs/simulator.py +59 -14
  31. mesa/model.py +4 -4
  32. mesa/space.py +0 -30
  33. mesa/time.py +4 -4
  34. mesa/visualization/__init__.py +17 -6
  35. mesa/visualization/components/__init__.py +83 -0
  36. mesa/visualization/components/{altair.py → altair_components.py} +34 -2
  37. mesa/visualization/components/matplotlib_components.py +175 -0
  38. mesa/visualization/mpl_space_drawing.py +593 -0
  39. mesa/visualization/solara_viz.py +156 -67
  40. {mesa-3.0.0b2.dist-info → mesa-3.0.1.dist-info}/METADATA +6 -8
  41. {mesa-3.0.0b2.dist-info → mesa-3.0.1.dist-info}/RECORD +46 -44
  42. {mesa-3.0.0b2.dist-info → mesa-3.0.1.dist-info}/WHEEL +1 -1
  43. mesa/visualization/components/matplotlib.py +0 -386
  44. /mesa/visualization/{UserParam.py → user_param.py} +0 -0
  45. {mesa-3.0.0b2.dist-info → mesa-3.0.1.dist-info}/entry_points.txt +0 -0
  46. {mesa-3.0.0b2.dist-info → mesa-3.0.1.dist-info}/licenses/LICENSE +0 -0
  47. {mesa-3.0.0b2.dist-info → mesa-3.0.1.dist-info}/licenses/NOTICE +0 -0
@@ -24,15 +24,16 @@ See the Visualization Tutorial and example models for more details.
24
24
  from __future__ import annotations
25
25
 
26
26
  import asyncio
27
- import copy
27
+ import inspect
28
28
  from collections.abc import Callable
29
29
  from typing import TYPE_CHECKING, Literal
30
30
 
31
31
  import reacton.core
32
32
  import solara
33
33
 
34
- import mesa.visualization.components.altair as components_altair
35
- from mesa.visualization.UserParam import Slider
34
+ import mesa.visualization.components.altair_components as components_altair
35
+ from mesa.experimental.devs.simulator import Simulator
36
+ from mesa.visualization.user_param import Slider
36
37
  from mesa.visualization.utils import force_update, update_counter
37
38
 
38
39
  if TYPE_CHECKING:
@@ -42,12 +43,13 @@ if TYPE_CHECKING:
42
43
  @solara.component
43
44
  def SolaraViz(
44
45
  model: Model | solara.Reactive[Model],
46
+ *,
45
47
  components: list[reacton.core.Component]
46
48
  | list[Callable[[Model], reacton.core.Component]]
47
49
  | Literal["default"] = "default",
48
50
  play_interval: int = 100,
51
+ simulator: Simulator | None = None,
49
52
  model_params=None,
50
- seed: float = 0,
51
53
  name: str | None = None,
52
54
  ):
53
55
  """Solara visualization component.
@@ -66,10 +68,9 @@ def SolaraViz(
66
68
  Defaults to "default", which uses the default Altair space visualization.
67
69
  play_interval (int, optional): Interval for playing the model steps in milliseconds.
68
70
  This controls the speed of the model's automatic stepping. Defaults to 100 ms.
71
+ simulator: A simulator that controls the model (optional)
69
72
  model_params (dict, optional): Parameters for (re-)instantiating a model.
70
73
  Can include user-adjustable parameters and fixed parameters. Defaults to None.
71
- seed (int, optional): Seed for the random number generator. This ensures reproducibility
72
- of the model's behavior. Defaults to 0.
73
74
  name (str | None, optional): Name of the visualization. Defaults to the models class name.
74
75
 
75
76
  Returns:
@@ -87,41 +88,39 @@ def SolaraViz(
87
88
  value results in faster stepping, while a higher value results in slower stepping.
88
89
  """
89
90
  if components == "default":
90
- components = [components_altair.make_space_altair()]
91
+ components = [components_altair.make_altair_space()]
92
+ if model_params is None:
93
+ model_params = {}
91
94
 
92
95
  # Convert model to reactive
93
96
  if not isinstance(model, solara.Reactive):
94
97
  model = solara.use_reactive(model) # noqa: SH102, RUF100
95
98
 
96
- def connect_to_model():
97
- # Patch the step function to force updates
98
- original_step = model.value.step
99
-
100
- def step():
101
- original_step()
102
- force_update()
103
-
104
- model.value.step = step
105
- # Add a trigger to model itself
106
- model.value.force_update = force_update
107
- force_update()
108
-
109
- solara.use_effect(connect_to_model, [model.value])
99
+ # set up reactive model_parameters shared by ModelCreator and ModelController
100
+ reactive_model_parameters = solara.use_reactive({})
110
101
 
111
102
  with solara.AppBar():
112
103
  solara.AppBarTitle(name if name else model.value.__class__.__name__)
113
104
 
114
105
  with solara.Sidebar(), solara.Column():
115
106
  with solara.Card("Controls"):
116
- ModelController(model, play_interval)
117
-
118
- if model_params is not None:
119
- with solara.Card("Model Parameters"):
120
- ModelCreator(
107
+ if not isinstance(simulator, Simulator):
108
+ ModelController(
121
109
  model,
122
- model_params,
123
- seed=seed,
110
+ model_parameters=reactive_model_parameters,
111
+ play_interval=play_interval,
124
112
  )
113
+ else:
114
+ SimulatorController(
115
+ model,
116
+ simulator,
117
+ model_parameters=reactive_model_parameters,
118
+ play_interval=play_interval,
119
+ )
120
+ with solara.Card("Model Parameters"):
121
+ ModelCreator(
122
+ model, model_params, model_parameters=reactive_model_parameters
123
+ )
125
124
  with solara.Card("Information"):
126
125
  ShowSteps(model.value)
127
126
 
@@ -172,24 +171,89 @@ JupyterViz = SolaraViz
172
171
 
173
172
 
174
173
  @solara.component
175
- def ModelController(model: solara.Reactive[Model], play_interval=100):
174
+ def ModelController(
175
+ model: solara.Reactive[Model],
176
+ *,
177
+ model_parameters: dict | solara.Reactive[dict] = None,
178
+ play_interval: int = 100,
179
+ ):
176
180
  """Create controls for model execution (step, play, pause, reset).
177
181
 
178
182
  Args:
179
- model (solara.Reactive[Model]): Reactive model instance
180
- play_interval (int, optional): Interval for playing the model steps in milliseconds.
183
+ model: Reactive model instance
184
+ model_parameters: Reactive parameters for (re-)instantiating a model.
185
+ play_interval: Interval for playing the model steps in milliseconds.
186
+
181
187
  """
182
188
  playing = solara.use_reactive(False)
183
189
  running = solara.use_reactive(True)
184
- original_model = solara.use_reactive(None)
190
+ if model_parameters is None:
191
+ model_parameters = {}
192
+ model_parameters = solara.use_reactive(model_parameters)
185
193
 
186
- def save_initial_model():
187
- """Save the initial model for comparison."""
188
- original_model.set(copy.deepcopy(model.value))
189
- playing.value = False
194
+ async def step():
195
+ while playing.value and running.value:
196
+ await asyncio.sleep(play_interval / 1000)
197
+ do_step()
198
+
199
+ solara.lab.use_task(
200
+ step, dependencies=[playing.value, running.value], prefer_threaded=False
201
+ )
202
+
203
+ def do_step():
204
+ """Advance the model by one step."""
205
+ model.value.step()
206
+ running.value = model.value.running
190
207
  force_update()
191
208
 
192
- solara.use_effect(save_initial_model, [model.value])
209
+ def do_reset():
210
+ """Reset the model to its initial state."""
211
+ playing.value = False
212
+ running.value = True
213
+ model.value = model.value = model.value.__class__(**model_parameters.value)
214
+
215
+ def do_play_pause():
216
+ """Toggle play/pause."""
217
+ playing.value = not playing.value
218
+
219
+ with solara.Row(justify="space-between"):
220
+ solara.Button(label="Reset", color="primary", on_click=do_reset)
221
+ solara.Button(
222
+ label="▶" if not playing.value else "❚❚",
223
+ color="primary",
224
+ on_click=do_play_pause,
225
+ disabled=not running.value,
226
+ )
227
+ solara.Button(
228
+ label="Step",
229
+ color="primary",
230
+ on_click=do_step,
231
+ disabled=playing.value or not running.value,
232
+ )
233
+
234
+
235
+ @solara.component
236
+ def SimulatorController(
237
+ model: solara.Reactive[Model],
238
+ simulator,
239
+ *,
240
+ model_parameters: dict | solara.Reactive[dict] = None,
241
+ play_interval: int = 100,
242
+ ):
243
+ """Create controls for model execution (step, play, pause, reset).
244
+
245
+ Args:
246
+ model: Reactive model instance
247
+ simulator: Simulator instance
248
+ model_parameters: Reactive parameters for (re-)instantiating a model.
249
+ play_interval: Interval for playing the model steps in milliseconds.
250
+
251
+ """
252
+ playing = solara.use_reactive(False)
253
+ running = solara.use_reactive(True)
254
+ if model_parameters is None:
255
+ model_parameters = {}
256
+ model_parameters = solara.use_reactive(model_parameters)
193
257
 
194
258
  async def step():
195
259
  while playing.value and running.value:
@@ -202,14 +266,18 @@ def ModelController(model: solara.Reactive[Model], play_interval=100):
202
266
 
203
267
  def do_step():
204
268
  """Advance the model by one step."""
205
- model.value.step()
269
+ simulator.run_for(1)
206
270
  running.value = model.value.running
271
+ force_update()
207
272
 
208
273
  def do_reset():
209
274
  """Reset the model to its initial state."""
210
275
  playing.value = False
211
276
  running.value = True
212
- model.value = copy.deepcopy(original_model.value)
277
+ simulator.reset()
278
+ model.value = model.value = model.value.__class__(
279
+ simulator, **model_parameters.value
280
+ )
213
281
 
214
282
  def do_play_pause():
215
283
  """Toggle play/pause."""
@@ -268,7 +336,12 @@ def check_param_is_fixed(param):
268
336
 
269
337
 
270
338
  @solara.component
271
- def ModelCreator(model, model_params, seed=1):
339
+ def ModelCreator(
340
+ model: solara.Reactive[Model],
341
+ user_params: dict,
342
+ *,
343
+ model_parameters: dict | solara.Reactive[dict] = None,
344
+ ):
272
345
  """Solara component for creating and managing a model instance with user-defined parameters.
273
346
 
274
347
  This component allows users to create a model instance with specified parameters and seed.
@@ -276,9 +349,9 @@ def ModelCreator(model, model_params, seed=1):
276
349
  number generator.
277
350
 
278
351
  Args:
279
- model (solara.Reactive[Model]): A reactive model instance. This is the main model to be created and managed.
280
- model_params (dict): Dictionary of model parameters. This includes both user-adjustable parameters and fixed parameters.
281
- seed (int, optional): Initial seed for the random number generator. Defaults to 1.
352
+ model: A reactive model instance. This is the main model to be created and managed.
353
+ user_params: Parameters for (re-)instantiating a model. Can include user-adjustable parameters and fixed parameters. Defaults to None.
354
+ model_parameters: reactive parameters for reinitializing the model
282
355
 
283
356
  Returns:
284
357
  solara.component: A Solara component that renders the model creation and management interface.
@@ -299,40 +372,50 @@ def ModelCreator(model, model_params, seed=1):
299
372
  - The component provides an interface for adjusting user-defined parameters and reseeding the model.
300
373
 
301
374
  """
302
- user_params, fixed_params = split_model_params(model_params)
303
-
304
- reactive_seed = solara.use_reactive(seed)
375
+ if model_parameters is None:
376
+ model_parameters = {}
377
+ model_parameters = solara.use_reactive(model_parameters)
305
378
 
306
- model_parameters, set_model_parameters = solara.use_state(
307
- {
308
- **fixed_params,
309
- **{k: v.get("value") for k, v in user_params.items()},
310
- }
379
+ solara.use_effect(
380
+ lambda: _check_model_params(model.value.__class__.__init__, fixed_params),
381
+ [model.value],
311
382
  )
383
+ user_params, fixed_params = split_model_params(user_params)
312
384
 
313
- def do_reseed():
314
- """Update the random seed for the model."""
315
- reactive_seed.value = model.value.random.random()
385
+ # set model_parameters to the default values for all parameters
386
+ model_parameters.value = {
387
+ **fixed_params,
388
+ **{k: v.get("value") for k, v in user_params.items()},
389
+ }
316
390
 
317
391
  def on_change(name, value):
318
- set_model_parameters({**model_parameters, name: value})
392
+ model_parameters.value = {**model_parameters.value, name: value}
319
393
 
320
- def create_model():
321
- model.value = model.value.__class__(**model_parameters)
322
- model.value._seed = reactive_seed.value
394
+ UserInputs(user_params, on_change=on_change)
323
395
 
324
- solara.use_effect(create_model, [model_parameters, reactive_seed.value])
325
396
 
326
- with solara.Row(justify="space-between"):
327
- solara.InputText(
328
- label="Seed",
329
- value=reactive_seed,
330
- continuous_update=True,
331
- )
397
+ def _check_model_params(init_func, model_params):
398
+ """Check if model parameters are valid for the model's initialization function.
332
399
 
333
- solara.Button(label="Reseed", color="primary", on_click=do_reseed)
400
+ Args:
401
+ init_func: Model initialization function
402
+ model_params: Dictionary of model parameters
334
403
 
335
- UserInputs(user_params, on_change=on_change)
404
+ Raises:
405
+ ValueError: If a parameter is not valid for the model's initialization function
406
+ """
407
+ model_parameters = inspect.signature(init_func).parameters
408
+ for name in model_parameters:
409
+ if (
410
+ model_parameters[name].default == inspect.Parameter.empty
411
+ and name not in model_params
412
+ and name != "self"
413
+ and name != "kwargs"
414
+ ):
415
+ raise ValueError(f"Missing required model parameter: {name}")
416
+ for name in model_params:
417
+ if name not in model_parameters and "kwargs" not in model_parameters:
418
+ raise ValueError(f"Invalid model parameter: {name}")
336
419
 
337
420
 
338
421
  @solara.component
@@ -399,6 +482,12 @@ def UserInputs(user_params, on_change=None):
399
482
  on_value=change_handler,
400
483
  value=options.get("value"),
401
484
  )
485
+ elif input_type == "InputText":
486
+ solara.InputText(
487
+ label=label,
488
+ on_value=change_handler,
489
+ value=options.get("value"),
490
+ )
402
491
  else:
403
492
  raise ValueError(f"{input_type} is not a supported input type")
404
493
 
@@ -1,13 +1,11 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: Mesa
3
- Version: 3.0.0b2
3
+ Version: 3.0.1
4
4
  Summary: Agent-based modeling (ABM) in Python
5
5
  Project-URL: homepage, https://github.com/projectmesa/mesa
6
6
  Project-URL: repository, https://github.com/projectmesa/mesa
7
7
  Author-email: Project Mesa Team <projectmesa@googlegroups.com>
8
8
  License: Apache 2.0
9
- License-File: LICENSE
10
- License-File: NOTICE
11
9
  Keywords: ABM,agent,based,model,modeling,multi-agent,simulation
12
10
  Classifier: Development Status :: 3 - Alpha
13
11
  Classifier: Intended Audience :: Science/Research
@@ -93,9 +91,9 @@ interface; and analyze their results using Python's data analysis
93
91
  tools. Its goal is to be the Python-based alternative to NetLogo,
94
92
  Repast, or MASON.
95
93
 
96
- ![A screenshot of the Schelling Model in Mesa](https://raw.githubusercontent.com/projectmesa/mesa/main/docs/images/Mesa_Screenshot.png)
94
+ ![A screenshot of the WolfSheep Model in Mesa](https://raw.githubusercontent.com/projectmesa/mesa/main/docs/images/wolf_sheep.png)
97
95
 
98
- *Above: A Mesa implementation of the Schelling segregation model, this
96
+ *Above: A Mesa implementation of the WolfSheep model, this
99
97
  can be displayed in browser windows or Jupyter.*
100
98
 
101
99
  ## Features
@@ -107,18 +105,18 @@ can be displayed in browser windows or Jupyter.*
107
105
 
108
106
  ## Using Mesa
109
107
 
110
- To install our latest stable release (2.4.x), run:
108
+ To install our latest stable release (3.0.x), run:
111
109
 
112
110
  ``` bash
113
111
  pip install -U mesa
114
112
  ```
115
113
 
116
- To install our latest pre-release (3.0.0 alpha), run:
114
+ To install our latest pre-release, run:
117
115
 
118
116
  ``` bash
119
117
  pip install -U --pre mesa
120
118
  ```
121
- With Mesa 3.0, we don't install all our dependencies anymore by default.
119
+ Starting with Mesa 3.0, we don't install all our dependencies anymore by default.
122
120
  ```bash
123
121
  # You can customize the additional dependencies you need, if you want. Available are:
124
122
  pip install -U --pre mesa[network,viz]
@@ -1,65 +1,65 @@
1
- mesa/__init__.py,sha256=Bld7cqsOkGY-bJUf3fuXBts9eH5TRlebkX8pZNI7l9M,659
2
- mesa/agent.py,sha256=Ein1Ei7n1wZNKcv4L1NlP3iPu9q1pm-QGIL64dLC5Fw,24636
3
- mesa/batchrunner.py,sha256=0AqTcvjWNPp1aqn7zuUKSovx6Rnkk4M-KouCZ4Guqy0,6419
1
+ mesa/__init__.py,sha256=8B9IpZf-BdiuFZqO7WrQ9uT9O6Pe0o7oUr0U-q4v_xI,657
2
+ mesa/agent.py,sha256=k85bw5iVX0MmaVlJg3mG_liobN_sIVsrZf76YZ_hMyA,25289
3
+ mesa/batchrunner.py,sha256=sMFLTxj5avP_-HGO0leLVuxXK2dH0xdPopvhAmawwRQ,7213
4
4
  mesa/datacollection.py,sha256=xyb07aBpd-HSDh5bk-XcVqGiDu5bfaLlxj5eDlGIwqY,16138
5
- mesa/model.py,sha256=fojtI87UxDLnRB71CGUKbZWh0BrstBHoCU9xWcw-MsA,10406
6
- mesa/space.py,sha256=f9TaLgb2nFPNiZn-Mgr5votcn80BBU_LnOm8fbLkEWw,65052
7
- mesa/time.py,sha256=5yWubqst13MfjXpsYjY-MNdIQH3KWi373KRmRZT5BBo,15044
8
- mesa/examples/README.md,sha256=-H6ECbl2bqkAK3PKz6ixlm9pN13f-CyKfNssm2Kbyw0,2810
9
- mesa/examples/__init__.py,sha256=iJpTRiCJUwLVA253t5BIxoX3bFnPJ2_XPzET3ev5mxg,835
5
+ mesa/model.py,sha256=Eb7wksREf882HGY-t7IwHVRIYDLzNaYOSmOLIdbaykA,10502
6
+ mesa/space.py,sha256=cfzlRfy9chegp8d89k2aqI29jo9cb18USlz2G2iOZU4,64082
7
+ mesa/time.py,sha256=KXwDqZHHvYbuqzB8zRbHglN23qVMfj8RXD-T_kJ3DfY,15022
8
+ mesa/examples/README.md,sha256=dNn8kv0BNQem3NNhO5mbOANQoK8UUYOo7rnkCFV9tnE,2882
9
+ mesa/examples/__init__.py,sha256=fP1vcexySnKowS2CKhfeyYLt058VpIkK26EOo3btyO0,825
10
10
  mesa/examples/advanced/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  mesa/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb,sha256=yh50ZAK2BVJyJIKsQTTxywnasqWn1IiQUVrwmZKue4w,29032
12
12
  mesa/examples/advanced/epstein_civil_violence/Readme.md,sha256=IEU5IZTe5EbvAA2vkYxiIw8vK3O0MZcjbxzn8I2cQic,1874
13
13
  mesa/examples/advanced/epstein_civil_violence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- mesa/examples/advanced/epstein_civil_violence/agents.py,sha256=R1Nu-_c_qBPCvr1vl6GgamOP4AUV9GJdcF3V7frAgdY,5676
15
- mesa/examples/advanced/epstein_civil_violence/app.py,sha256=GpfqVX6iu3EydsikrPT_JZKkXpb-WHHuwBYP_NZqivY,2062
16
- mesa/examples/advanced/epstein_civil_violence/model.py,sha256=HFA6hsxHVXwjqSlTA7EB9-kctiuzIWWod0zdbEv7y84,5193
14
+ mesa/examples/advanced/epstein_civil_violence/agents.py,sha256=0X4JLj2K2cl1bACkFLI6-K6tKbr2SLZlAy_kjgUDjzA,5863
15
+ mesa/examples/advanced/epstein_civil_violence/app.py,sha256=puJmjkEevHyilfDpnkE65Y2ax6JEyOALg-IEtK8jBKk,1787
16
+ mesa/examples/advanced/epstein_civil_violence/model.py,sha256=fcTkjCRhEhDerDC1W_lrezdoWD1y5xIublkGIhCak8w,3918
17
17
  mesa/examples/advanced/pd_grid/Readme.md,sha256=UVUQxZRFdfymCKDdQEn3ZEwgSqgp9cKJPsU8oZpLFnY,2367
18
18
  mesa/examples/advanced/pd_grid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  mesa/examples/advanced/pd_grid/agents.py,sha256=DzGj4LZUjV0xMQAwkRsv2Aoap1cUvLscJswfA1PdVDs,1716
20
20
  mesa/examples/advanced/pd_grid/analysis.ipynb,sha256=ReYtRe2JVyCCXoMBONvynXDQ_eGtQSWhNcuJY3CYTTI,82323
21
- mesa/examples/advanced/pd_grid/app.py,sha256=y-W_cWeaXDtsK02ptM1tR8VbHUGO5DMua1Rf9qB7Cgo,1370
22
- mesa/examples/advanced/pd_grid/model.py,sha256=iKy1Oa5lG_hlxwlw67NfFLP9dKk5uDreaaT0xO9-55A,2325
21
+ mesa/examples/advanced/pd_grid/app.py,sha256=u8dnB3cXkTENU26O1XN3REFTxEwvXLFLD3EybgVQWP0,1354
22
+ mesa/examples/advanced/pd_grid/model.py,sha256=DiHGeX7fR1slvcAzbmDCxnmXJ2Txjmju_gII3e-EJgY,2345
23
23
  mesa/examples/advanced/sugarscape_g1mt/Readme.md,sha256=x3kKw1Rre2FPkNhGDLtdzeThmH089mxsGYUPZUeu26k,3595
24
24
  mesa/examples/advanced/sugarscape_g1mt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
25
  mesa/examples/advanced/sugarscape_g1mt/agents.py,sha256=zE7zbO2_OaQiFDq_-t-0hv4ButBWv26dnS1zaPc3_ZE,10183
26
- mesa/examples/advanced/sugarscape_g1mt/app.py,sha256=qyVXRABxwvl3bAC6kC_t69JdunBe-RE-jCUyXASN5lo,2032
27
- mesa/examples/advanced/sugarscape_g1mt/model.py,sha256=VVoUni3N2yk7vLEcWC1hiQemaa1vmzJU3gKxVRXxnqM,6069
26
+ mesa/examples/advanced/sugarscape_g1mt/app.py,sha256=PYuHoAH4AfU8fbrkBpY-ZW8evwz5izLEP8srN1CHp_Y,1946
27
+ mesa/examples/advanced/sugarscape_g1mt/model.py,sha256=NFQRqwuOwP3kz1fNNPEm2XkdbS0G3-TgneiJdQZHqck,6111
28
28
  mesa/examples/advanced/sugarscape_g1mt/sugar-map.txt,sha256=zZtGYciBPT4miZVnbVuoQ5TugTmGrbDWV9yb5KH6tnU,5000
29
29
  mesa/examples/advanced/sugarscape_g1mt/tests.py,sha256=UNahmZTgLquSqmoi_9GcE3JP0qBHjkrHFZ15NMm0ce8,2517
30
30
  mesa/examples/advanced/wolf_sheep/Readme.md,sha256=6zrtCg4Fb-hgQxqdLMpTkIYMwD6owCv8BMz_qn0N98Q,3165
31
31
  mesa/examples/advanced/wolf_sheep/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- mesa/examples/advanced/wolf_sheep/agents.py,sha256=UocDCsKmXkWxt0-ToVIOhBjX-amYwMtZbHN8U2AolFI,3068
33
- mesa/examples/advanced/wolf_sheep/app.py,sha256=oqb8ZsEj7aP-Rhh5RiuQ9c8Za1wrbmtrehq8lUDlGgA,2066
34
- mesa/examples/advanced/wolf_sheep/model.py,sha256=qtCTA2fBP9lA7jJ8UUJ5SIy8gXW7K73YoY8F3YDKp6k,4522
32
+ mesa/examples/advanced/wolf_sheep/agents.py,sha256=SISizN_alheFAXEP3NaeQTx22SPs0v3pRYqXKRyuXCo,3801
33
+ mesa/examples/advanced/wolf_sheep/app.py,sha256=PwXnrjqlx73I4nlXiG7himbscwyvr9LrueHXbSOqCA0,2498
34
+ mesa/examples/advanced/wolf_sheep/model.py,sha256=UYUY8GP6YA64mbJkWDr9eUSZlE8naxv8-a2qaGPdUXE,4531
35
35
  mesa/examples/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
36
  mesa/examples/basic/boid_flockers/Readme.md,sha256=4KJinsLPtUciQSMzvaX3tU5r1HTUg3AFOFDKy73W5RE,894
37
37
  mesa/examples/basic/boid_flockers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- mesa/examples/basic/boid_flockers/agents.py,sha256=QXT1zxOq_kdk_w60H2zPV3KpivzCHQ-ApyFIIDvxvok,2693
39
- mesa/examples/basic/boid_flockers/app.py,sha256=QutSC7do1EgYATzJ-uSJTyoAtvM3HoVv9E3JRSviFP4,1269
40
- mesa/examples/basic/boid_flockers/model.py,sha256=o335lgyGQ1E5TkAj4B-INhUL65mO0dEV3tf3gG40FvU,2201
38
+ mesa/examples/basic/boid_flockers/agents.py,sha256=OgmiMCgUa1723v8cBGI0SVAld2U4ZJguE3vqFF5JihU,3779
39
+ mesa/examples/basic/boid_flockers/app.py,sha256=5wKzyctjTq3iX1MJc69l3753a_iyYhFq3kv54h7dGSE,1289
40
+ mesa/examples/basic/boid_flockers/model.py,sha256=scy0OaYzQVY5vVarsI7dUydynwoH3-uYoYcsBTtwtyA,3399
41
41
  mesa/examples/basic/boltzmann_wealth_model/Readme.md,sha256=wl1ylO9KWoTiuIJKOnk2FGdcmyVUqJ5wiSbVUa3WWAc,2725
42
42
  mesa/examples/basic/boltzmann_wealth_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- mesa/examples/basic/boltzmann_wealth_model/agents.py,sha256=uVUo9jWQnv5I3uCaYE_N7X-cOdHhdy6RtLUL_znELgI,892
44
- mesa/examples/basic/boltzmann_wealth_model/app.py,sha256=MmTWGFT-BiWobXeTIAcfehVxjC0tQdsM9ILTGoPHXCw,1943
45
- mesa/examples/basic/boltzmann_wealth_model/model.py,sha256=BYcfR5Nw0zXkKP72CoVnLkIvV-IVnNKKNQ7KsbJ07pc,1508
46
- mesa/examples/basic/boltzmann_wealth_model/st_app.py,sha256=v3Je2hSe8nXPgfmZhX8lHM-7xs8dk2g1Zz0X81AqX3k,3466
43
+ mesa/examples/basic/boltzmann_wealth_model/agents.py,sha256=Jol2aspw--UtQn0EiReXVmlWtzpdC2o_YUTAyu1sDk4,1546
44
+ mesa/examples/basic/boltzmann_wealth_model/app.py,sha256=JlGpOmkjLut0hM9rY_BSGiRfHnrwpzlOi8Cw2Drv3-s,2160
45
+ mesa/examples/basic/boltzmann_wealth_model/model.py,sha256=ED4EFHJlrrcF12WYOEpXpPt5asK2T6uzpq_S97EtfHo,2941
46
+ mesa/examples/basic/boltzmann_wealth_model/st_app.py,sha256=X8C7w294UidciQqiiuBWkypaOQS79aS3kQKydT21V4c,3456
47
47
  mesa/examples/basic/conways_game_of_life/Readme.md,sha256=VRgN6roF6leQ_IMYwxFypSfFjZo9jnCd-rkPTjpp7II,1453
48
48
  mesa/examples/basic/conways_game_of_life/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  mesa/examples/basic/conways_game_of_life/agents.py,sha256=ETn87GV8it9p0nlSn6f1qu5CDEmqokkr6Rq7KWaT-5U,1627
50
- mesa/examples/basic/conways_game_of_life/app.py,sha256=2r3j5aFuNAMrlRd8nAAexRNViOfj86pLuZTd8FWKv0E,1232
50
+ mesa/examples/basic/conways_game_of_life/app.py,sha256=DrA1CwiT43rDMZGSDO62B77_QymySkq486IeV9K8nJY,1433
51
51
  mesa/examples/basic/conways_game_of_life/model.py,sha256=c7lwSelxTplbQlbfGjBSevS2TEg5DFJA8bvhbYbyD_s,1174
52
52
  mesa/examples/basic/conways_game_of_life/st_app.py,sha256=_poqU2VR4rfiiq4WFXTbOUSW7liuM86iq913mW6LS50,2400
53
53
  mesa/examples/basic/schelling/Readme.md,sha256=CRKBfYtnLJLlTKLsTRQ-7gsQRxVxDooOBN5uP8PEtaU,2296
54
54
  mesa/examples/basic/schelling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- mesa/examples/basic/schelling/agents.py,sha256=dvznzN2As979x-4EH8Y-i7HhlCuv1OdtWYebOdxTdhk,773
55
+ mesa/examples/basic/schelling/agents.py,sha256=BzipyAU5d_H4DoTm3xkeZLDazsr49rbaVr_kyk1rDJA,937
56
56
  mesa/examples/basic/schelling/analysis.ipynb,sha256=JDJy6-U6eO-LrHWxZr1c3lkvtoY0DNHa-kJ4J-Z-wwo,5804
57
- mesa/examples/basic/schelling/app.py,sha256=-SXLVg7KPzquh7LausjqTzJh_EA3fFn4xXmY3H4Ba38,973
58
- mesa/examples/basic/schelling/model.py,sha256=szYiw76JD-OMlZ2Op80Y9L2PZ3VMVfyuUNl1J_jC8BE,1856
57
+ mesa/examples/basic/schelling/app.py,sha256=DlePd3iTkBSzurRy1vbZXlAugpxcEMFFR5Iy6b9RWp8,973
58
+ mesa/examples/basic/schelling/model.py,sha256=ruqiMNBBsWV81srYZgdsfDVwgMWYuw2VAzSQhsK5E98,2762
59
59
  mesa/examples/basic/virus_on_network/Readme.md,sha256=UnCkKiJK7wVw40a-oDR6qdf3QpCsBhgNOVZg-2UXPlc,2528
60
60
  mesa/examples/basic/virus_on_network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  mesa/examples/basic/virus_on_network/agents.py,sha256=a_WhqYblJlW6od67eXfU-nb7IMRyYpgxtf0le--VYoA,1975
62
- mesa/examples/basic/virus_on_network/app.py,sha256=EQfXYV94GdnC71hVIl9Zpy4JqKNRFINCJxHFdOKbNTU,3340
62
+ mesa/examples/basic/virus_on_network/app.py,sha256=Bxjm2FHxnbjQd3V1absTM4GDOrWOlOYZtYMn3Yy0Ol8,2439
63
63
  mesa/examples/basic/virus_on_network/model.py,sha256=jQoCmvygwCvhUrlL0l7V8GcDLv94CgwtuK7DDGU8q8g,2813
64
64
  mesa/experimental/UserParam.py,sha256=f32nmFjroe76HpxU75ZCEOqFW2nAsDfmqIf8kQ1zt-E,2086
65
65
  mesa/experimental/__init__.py,sha256=faBYyHSp-sFQPaBx8-WsLToVKCndpSzpt18HmNZtasM,385
@@ -67,8 +67,8 @@ mesa/experimental/solara_viz.py,sha256=uWrNQAX3oEWSftmyjNorN839dBCUp86hnhpL704dy
67
67
  mesa/experimental/cell_space/__init__.py,sha256=-NtSCT7mA-aszLSAdqbICGqeFe2vBdb-GrcW562legY,999
68
68
  mesa/experimental/cell_space/cell.py,sha256=lDm7NQhPDFf3-SZu5W594lDNGtzcdSPUSSsELFRg0bs,7166
69
69
  mesa/experimental/cell_space/cell_agent.py,sha256=jvYOV9OIaBaqAsAG0YLV64X_f3BJe_wP7qfos_RXi0Y,3759
70
- mesa/experimental/cell_space/cell_collection.py,sha256=ZcyuPEevCZEXW7jFnX6StjBMw4UBDQvUspZRcFi2dFg,3426
71
- mesa/experimental/cell_space/discrete_space.py,sha256=sD5455phlIthnAK6OsgxVscQ4C_HSVWA9e476C3PuF0,5264
70
+ mesa/experimental/cell_space/cell_collection.py,sha256=ADK_42ykyWQpVGVSFE8GG_djqTgL8wfWwu2YTwXUPcs,4007
71
+ mesa/experimental/cell_space/discrete_space.py,sha256=A54lHbTo4udcU4zkJEnsWuWKOBrELg-1eU8-dPoLMPk,5826
72
72
  mesa/experimental/cell_space/grid.py,sha256=oWTy6kaaHXLPneA-w5XdqzwA0YItMWYgCq_UjNH9iA8,7711
73
73
  mesa/experimental/cell_space/network.py,sha256=_x0zKlI-odNCSRb_Zqh4nBPjqnW5iVj8sVheKPCLzmU,1321
74
74
  mesa/experimental/cell_space/voronoi.py,sha256=lSY8zQhELvOy0RfDyZIek09UMwY9_20UY9SPqFWsNoM,10014
@@ -76,18 +76,20 @@ mesa/experimental/components/altair.py,sha256=49OHgrm1JncfrKqDfw_5ifPtsbMKdgVYCa
76
76
  mesa/experimental/components/matplotlib.py,sha256=j477UBk_7yW5vzT3rjhnuTixpA7PedDNghoK9TLgHVY,8043
77
77
  mesa/experimental/devs/__init__.py,sha256=EByaC66ikUIu9G9p1geLm6ESEMWZOPTO9r9627S83j0,211
78
78
  mesa/experimental/devs/eventlist.py,sha256=fPj2jfW-jTe-UnIE6TsF1BM2ITKe3jGfVUhu3gBv7UQ,6250
79
- mesa/experimental/devs/simulator.py,sha256=wvqkLIDgbJNaem9nwMacyEYRp0W3ai5Oxptw3-QmbSw,10595
79
+ mesa/experimental/devs/simulator.py,sha256=RHlJsri57zf22i4fdEdUKekuJUunB1oRzEbhDntMuOk,12107
80
80
  mesa/experimental/devs/examples/epstein_civil_violence.py,sha256=E8YSV3O5ihKsntGtnltHM-4IyS8eg2DSRUqmIiw_1iU,10916
81
81
  mesa/experimental/devs/examples/wolf_sheep.py,sha256=1eb1CfYNQoprqSJat-LPYPvwWH1ENQdj39viEqwSk0s,8103
82
- mesa/visualization/UserParam.py,sha256=Dl2WOwLYLf0pfLpabCZtIdFRyKZrK6Qtc3utZx5GPYg,2139
83
- mesa/visualization/__init__.py,sha256=sa8lqeLcDtte19SMzFiKP6K4CrVLxAPwrhDu_AsDWTs,395
84
- mesa/visualization/solara_viz.py,sha256=SHlQ8Y4k6EU7LxlJjjvvjDJWGWryahjQXCwMiVgoF0E,14944
82
+ mesa/visualization/__init__.py,sha256=o30F2VApnDJ6Zq0_U5_wBnj-6-Bu7FGPsOq3A6p2EqA,743
83
+ mesa/visualization/mpl_space_drawing.py,sha256=yf3Sc7pm5EJLxfWQdtR-9PcUtZveEEjar1WUr7qwI4o,20057
84
+ mesa/visualization/solara_viz.py,sha256=zdM4OXol7-LGg0mSYm3XbxaEqKJPPqlxxuA5rY5G60o,17937
85
+ mesa/visualization/user_param.py,sha256=Dl2WOwLYLf0pfLpabCZtIdFRyKZrK6Qtc3utZx5GPYg,2139
85
86
  mesa/visualization/utils.py,sha256=lJHgRKF5BHLf72Tw3YpwyiWuRoIimaTKQ7xBCw_Rx3A,146
86
- mesa/visualization/components/altair.py,sha256=e_J3ZPv4ldtJje5pUm1UgNqcMh7Nc4fyIgvbbcCWESg,4856
87
- mesa/visualization/components/matplotlib.py,sha256=EBK1zRCl71LkOgeOV7eQE1Ig22n1ZFGtNBhweozPFYk,13241
88
- mesa-3.0.0b2.dist-info/METADATA,sha256=8FG5-NHehf7et0SOy8FKHCFH-9nvMwOhKpXNi6vfl10,9849
89
- mesa-3.0.0b2.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
90
- mesa-3.0.0b2.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
91
- mesa-3.0.0b2.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
92
- mesa-3.0.0b2.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
93
- mesa-3.0.0b2.dist-info/RECORD,,
87
+ mesa/visualization/components/__init__.py,sha256=Bq3nrPikcaIo9BSs0O3zptWVLlUmAkLo3s0mEmpH1RE,3022
88
+ mesa/visualization/components/altair_components.py,sha256=wotpFFQgMY-ZR3lNVm_fRos-iDg0Wjnj6Tk67_7f1SQ,5847
89
+ mesa/visualization/components/matplotlib_components.py,sha256=xQETaFyHIfmL_9JwrLIgubuIQ7-pp7TMoXT1WMmozus,5441
90
+ mesa-3.0.1.dist-info/METADATA,sha256=9jjOsPVzWuvIfpzrmHt1zghWhA4F64f3KRzbc_tJBmE,9782
91
+ mesa-3.0.1.dist-info/WHEEL,sha256=3U_NnUcV_1B1kPkYaPzN-irRckL5VW_lytn0ytO_kRY,87
92
+ mesa-3.0.1.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
93
+ mesa-3.0.1.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
94
+ mesa-3.0.1.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
95
+ mesa-3.0.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.25.0
2
+ Generator: hatchling 1.26.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any