Mesa 3.1.4__py3-none-any.whl → 3.2.0.dev0__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 +3 -1
  2. mesa/agent.py +20 -5
  3. mesa/batchrunner.py +6 -3
  4. mesa/discrete_space/__init__.py +50 -0
  5. mesa/{experimental/cell_space → discrete_space}/cell.py +29 -10
  6. mesa/{experimental/cell_space → discrete_space}/cell_agent.py +1 -1
  7. mesa/{experimental/cell_space → discrete_space}/cell_collection.py +3 -3
  8. mesa/{experimental/cell_space → discrete_space}/discrete_space.py +65 -3
  9. mesa/{experimental/cell_space → discrete_space}/grid.py +2 -2
  10. mesa/{experimental/cell_space → discrete_space}/network.py +22 -2
  11. mesa/{experimental/cell_space → discrete_space}/property_layer.py +1 -10
  12. mesa/{experimental/cell_space → discrete_space}/voronoi.py +2 -2
  13. mesa/examples/README.md +9 -4
  14. mesa/examples/advanced/epstein_civil_violence/agents.py +1 -1
  15. mesa/examples/advanced/epstein_civil_violence/model.py +1 -1
  16. mesa/examples/advanced/pd_grid/agents.py +1 -1
  17. mesa/examples/advanced/pd_grid/model.py +1 -1
  18. mesa/examples/advanced/sugarscape_g1mt/agents.py +1 -1
  19. mesa/examples/advanced/sugarscape_g1mt/model.py +2 -2
  20. mesa/examples/advanced/wolf_sheep/agents.py +1 -1
  21. mesa/examples/advanced/wolf_sheep/app.py +2 -1
  22. mesa/examples/advanced/wolf_sheep/model.py +1 -1
  23. mesa/examples/basic/boid_flockers/agents.py +1 -0
  24. mesa/examples/basic/boid_flockers/app.py +17 -2
  25. mesa/examples/basic/boid_flockers/model.py +12 -0
  26. mesa/examples/basic/boltzmann_wealth_model/agents.py +6 -11
  27. mesa/examples/basic/boltzmann_wealth_model/app.py +2 -2
  28. mesa/examples/basic/boltzmann_wealth_model/model.py +7 -11
  29. mesa/examples/basic/conways_game_of_life/agents.py +13 -5
  30. mesa/examples/basic/conways_game_of_life/model.py +10 -7
  31. mesa/examples/basic/schelling/agents.py +13 -8
  32. mesa/examples/basic/schelling/model.py +6 -9
  33. mesa/examples/basic/virus_on_network/agents.py +13 -17
  34. mesa/examples/basic/virus_on_network/model.py +20 -24
  35. mesa/experimental/__init__.py +2 -2
  36. mesa/experimental/cell_space/__init__.py +18 -8
  37. mesa/space.py +1 -12
  38. mesa/visualization/__init__.py +2 -0
  39. mesa/visualization/command_console.py +482 -0
  40. mesa/visualization/components/altair_components.py +276 -16
  41. mesa/visualization/mpl_space_drawing.py +17 -9
  42. mesa/visualization/solara_viz.py +150 -21
  43. {mesa-3.1.4.dist-info → mesa-3.2.0.dev0.dist-info}/METADATA +12 -8
  44. {mesa-3.1.4.dist-info → mesa-3.2.0.dev0.dist-info}/RECORD +47 -45
  45. {mesa-3.1.4.dist-info → mesa-3.2.0.dev0.dist-info}/WHEEL +0 -0
  46. {mesa-3.1.4.dist-info → mesa-3.2.0.dev0.dist-info}/licenses/LICENSE +0 -0
  47. {mesa-3.1.4.dist-info → mesa-3.2.0.dev0.dist-info}/licenses/NOTICE +0 -0
@@ -25,15 +25,20 @@ from __future__ import annotations
25
25
 
26
26
  import asyncio
27
27
  import inspect
28
+ import threading
29
+ import time
30
+ import traceback
28
31
  from collections.abc import Callable
29
32
  from typing import TYPE_CHECKING, Literal
30
33
 
31
34
  import reacton.core
32
35
  import solara
36
+ import solara.lab
33
37
 
34
38
  import mesa.visualization.components.altair_components as components_altair
35
39
  from mesa.experimental.devs.simulator import Simulator
36
40
  from mesa.mesa_logging import create_module_logger, function_logger
41
+ from mesa.visualization.command_console import CommandConsole
37
42
  from mesa.visualization.user_param import Slider
38
43
  from mesa.visualization.utils import force_update, update_counter
39
44
 
@@ -56,6 +61,8 @@ def SolaraViz(
56
61
  simulator: Simulator | None = None,
57
62
  model_params=None,
58
63
  name: str | None = None,
64
+ use_threads: bool = False,
65
+ **console_kwargs,
59
66
  ):
60
67
  """Solara visualization component.
61
68
 
@@ -75,10 +82,18 @@ def SolaraViz(
75
82
  This controls the speed of the model's automatic stepping. Defaults to 100 ms.
76
83
  render_interval (int, optional): Controls how often plots are updated during a simulation,
77
84
  allowing users to skip intermediate steps and update graphs less frequently.
85
+ use_threads: Flag for indicating whether to utilize multi-threading for model execution.
86
+ When checked, the model will utilize multiple threads,adjust based on system capabilities.
78
87
  simulator: A simulator that controls the model (optional)
79
88
  model_params (dict, optional): Parameters for (re-)instantiating a model.
80
89
  Can include user-adjustable parameters and fixed parameters. Defaults to None.
81
- name (str | None, optional): Name of the visualization. Defaults to the models class name.
90
+ name (str | None, optional): Name of the visualization. Defaults to the model's class name.
91
+ **console_kwargs (dict, optional): Arguments to pass to the command console.
92
+ Currently supported arguments:
93
+ - additional_imports: Dictionary of names to objects to import into the command console.
94
+ - Example:
95
+ >>> console_kwargs = {"additional_imports": {"numpy": np}}
96
+ >>> SolaraViz(model, console_kwargs=console_kwargs)
82
97
 
83
98
  Returns:
84
99
  solara.component: A Solara component that renders the visualization interface for the model.
@@ -94,7 +109,7 @@ def SolaraViz(
94
109
  - The `play_interval` argument controls the speed of the model's automatic stepping. A lower
95
110
  value results in faster stepping, while a higher value results in slower stepping.
96
111
  - The `render_interval` argument determines how often plots are updated during simulation. Higher values
97
- reduce update frequency,resulting in faster execution.
112
+ reduce update frequency, resulting in faster execution.
98
113
  """
99
114
  if components == "default":
100
115
  components = [
@@ -113,8 +128,10 @@ def SolaraViz(
113
128
  reactive_model_parameters = solara.use_reactive({})
114
129
  reactive_play_interval = solara.use_reactive(play_interval)
115
130
  reactive_render_interval = solara.use_reactive(render_interval)
131
+ reactive_use_threads = solara.use_reactive(use_threads)
116
132
  with solara.AppBar():
117
133
  solara.AppBarTitle(name if name else model.value.__class__.__name__)
134
+ solara.lab.ThemeToggle()
118
135
 
119
136
  with solara.Sidebar(), solara.Column():
120
137
  with solara.Card("Controls"):
@@ -134,12 +151,25 @@ def SolaraViz(
134
151
  max=100,
135
152
  step=2,
136
153
  )
154
+ if reactive_use_threads.value:
155
+ solara.Text("Increase play interval to avoid skipping plots")
156
+
157
+ def set_reactive_use_threads(value):
158
+ reactive_use_threads.set(value)
159
+
160
+ solara.Checkbox(
161
+ label="Use Threads",
162
+ value=reactive_use_threads,
163
+ on_value=set_reactive_use_threads,
164
+ )
165
+
137
166
  if not isinstance(simulator, Simulator):
138
167
  ModelController(
139
168
  model,
140
169
  model_parameters=reactive_model_parameters,
141
170
  play_interval=reactive_play_interval,
142
171
  render_interval=reactive_render_interval,
172
+ use_threads=reactive_use_threads,
143
173
  )
144
174
  else:
145
175
  SimulatorController(
@@ -148,6 +178,7 @@ def SolaraViz(
148
178
  model_parameters=reactive_model_parameters,
149
179
  play_interval=reactive_play_interval,
150
180
  render_interval=reactive_render_interval,
181
+ use_threads=reactive_use_threads,
151
182
  )
152
183
  with solara.Card("Model Parameters"):
153
184
  ModelCreator(
@@ -155,6 +186,13 @@ def SolaraViz(
155
186
  )
156
187
  with solara.Card("Information"):
157
188
  ShowSteps(model.value)
189
+ if (
190
+ CommandConsole in components
191
+ ): # If command console in components show it in sidebar
192
+ components.remove(CommandConsole)
193
+ additional_imports = console_kwargs.get("additional_imports", {})
194
+ with solara.Card("Command Console"):
195
+ CommandConsole(model.value, additional_imports=additional_imports)
158
196
 
159
197
  ComponentsView(components, model.value)
160
198
 
@@ -209,6 +247,7 @@ def ModelController(
209
247
  model_parameters: dict | solara.Reactive[dict] = None,
210
248
  play_interval: int | solara.Reactive[int] = 100,
211
249
  render_interval: int | solara.Reactive[int] = 1,
250
+ use_threads: bool | solara.Reactive[bool] = False,
212
251
  ):
213
252
  """Create controls for model execution (step, play, pause, reset).
214
253
 
@@ -217,37 +256,76 @@ def ModelController(
217
256
  model_parameters: Reactive parameters for (re-)instantiating a model.
218
257
  play_interval: Interval for playing the model steps in milliseconds.
219
258
  render_interval: Controls how often the plots are updated during simulation steps.Higher value reduce update frequency.
259
+ use_threads: Flag for indicating whether to utilize multi-threading for model execution.
220
260
  """
221
261
  playing = solara.use_reactive(False)
222
262
  running = solara.use_reactive(True)
263
+
223
264
  if model_parameters is None:
224
265
  model_parameters = {}
225
266
  model_parameters = solara.use_reactive(model_parameters)
226
-
227
- async def step():
228
- while playing.value and running.value:
229
- await asyncio.sleep(play_interval.value / 1000)
230
- do_step()
267
+ visualization_pause_event = solara.use_memo(lambda: threading.Event(), [])
268
+
269
+ error_message = solara.use_reactive(None)
270
+
271
+ def step():
272
+ try:
273
+ while running.value and playing.value:
274
+ time.sleep(play_interval.value / 1000)
275
+ do_step()
276
+ if use_threads.value:
277
+ visualization_pause_event.set()
278
+ except Exception as e:
279
+ error_message.value = f"error in step: {e}"
280
+ traceback.print_exc()
281
+ return
282
+
283
+ def visualization_task():
284
+ if use_threads.value:
285
+ try:
286
+ while playing.value and running.value:
287
+ visualization_pause_event.wait()
288
+ visualization_pause_event.clear()
289
+ force_update()
290
+
291
+ except Exception as e:
292
+ error_message.value = f"error in visualization: {e}"
293
+ traceback.print_exc()
231
294
 
232
295
  solara.lab.use_task(
233
- step, dependencies=[playing.value, running.value], prefer_threaded=False
296
+ step, dependencies=[playing.value, running.value], prefer_threaded=True
297
+ )
298
+
299
+ solara.use_thread(
300
+ visualization_task,
301
+ dependencies=[playing.value, running.value],
234
302
  )
235
303
 
236
304
  @function_logger(__name__)
237
305
  def do_step():
238
306
  """Advance the model by the number of steps specified by the render_interval slider."""
239
- for _ in range(render_interval.value):
240
- model.value.step()
307
+ if playing.value:
308
+ for _ in range(render_interval.value):
309
+ model.value.step()
310
+ running.value = model.value.running
311
+ if not playing.value:
312
+ break
313
+ if not use_threads.value:
314
+ force_update()
241
315
 
242
- running.value = model.value.running
243
-
244
- force_update()
316
+ else:
317
+ for _ in range(render_interval.value):
318
+ model.value.step()
319
+ running.value = model.value.running
320
+ force_update()
245
321
 
246
322
  @function_logger(__name__)
247
323
  def do_reset():
248
324
  """Reset the model to its initial state."""
325
+ error_message.set(None)
249
326
  playing.value = False
250
327
  running.value = True
328
+ visualization_pause_event.clear()
251
329
  _mesa_logger.log(
252
330
  10,
253
331
  f"creating new {model.value.__class__} instance with {model_parameters.value}",
@@ -274,6 +352,9 @@ def ModelController(
274
352
  disabled=playing.value or not running.value,
275
353
  )
276
354
 
355
+ if error_message.value:
356
+ solara.Error(label=error_message.value)
357
+
277
358
 
278
359
  @solara.component
279
360
  def SimulatorController(
@@ -283,6 +364,7 @@ def SimulatorController(
283
364
  model_parameters: dict | solara.Reactive[dict] = None,
284
365
  play_interval: int | solara.Reactive[int] = 100,
285
366
  render_interval: int | solara.Reactive[int] = 1,
367
+ use_threads: bool | solara.Reactive[bool] = False,
286
368
  ):
287
369
  """Create controls for model execution (step, play, pause, reset).
288
370
 
@@ -292,6 +374,7 @@ def SimulatorController(
292
374
  model_parameters: Reactive parameters for (re-)instantiating a model.
293
375
  play_interval: Interval for playing the model steps in milliseconds.
294
376
  render_interval: Controls how often the plots are updated during simulation steps.Higher values reduce update frequency.
377
+ use_threads: Flag for indicating whether to utilize multi-threading for model execution.
295
378
 
296
379
  Notes:
297
380
  The `step button` increments the step by the value specified in the `render_interval` slider.
@@ -302,27 +385,71 @@ def SimulatorController(
302
385
  if model_parameters is None:
303
386
  model_parameters = {}
304
387
  model_parameters = solara.use_reactive(model_parameters)
305
-
306
- async def step():
307
- while playing.value and running.value:
308
- await asyncio.sleep(play_interval.value / 1000)
309
- do_step()
388
+ visualization_pause_event = solara.use_memo(lambda: threading.Event(), [])
389
+ pause_step_event = solara.use_memo(lambda: threading.Event(), [])
390
+
391
+ error_message = solara.use_reactive(None)
392
+
393
+ def step():
394
+ try:
395
+ while running.value and playing.value:
396
+ time.sleep(play_interval.value / 1000)
397
+ if use_threads.value:
398
+ pause_step_event.wait()
399
+ pause_step_event.clear()
400
+ do_step()
401
+ if use_threads.value:
402
+ visualization_pause_event.set()
403
+ except Exception as e:
404
+ error_message.value = f"error in step: {e}"
405
+ traceback.print_exc()
406
+
407
+ def visualization_task():
408
+ if use_threads.value:
409
+ try:
410
+ loop = asyncio.new_event_loop()
411
+ asyncio.set_event_loop(loop)
412
+ pause_step_event.set()
413
+ while playing.value and running.value:
414
+ visualization_pause_event.wait()
415
+ visualization_pause_event.clear()
416
+ force_update()
417
+ pause_step_event.set()
418
+ except Exception as e:
419
+ error_message.value = f"error in visualization: {e}"
420
+ traceback.print_exc()
421
+ return
310
422
 
311
423
  solara.lab.use_task(
312
424
  step, dependencies=[playing.value, running.value], prefer_threaded=False
313
425
  )
426
+ solara.lab.use_task(visualization_task, dependencies=[playing.value])
314
427
 
315
428
  def do_step():
316
429
  """Advance the model by the number of steps specified by the render_interval slider."""
317
- simulator.run_for(render_interval.value)
318
- running.value = model.value.running
319
- force_update()
430
+ if playing.value:
431
+ for _ in range(render_interval.value):
432
+ simulator.run_for(1)
433
+ running.value = model.value.running
434
+ if not playing.value:
435
+ break
436
+ if not use_threads.value:
437
+ force_update()
438
+
439
+ else:
440
+ for _ in range(render_interval.value):
441
+ simulator.run_for(1)
442
+ running.value = model.value.running
443
+ force_update()
320
444
 
321
445
  def do_reset():
322
446
  """Reset the model to its initial state."""
447
+ error_message.set(None)
323
448
  playing.value = False
324
449
  running.value = True
325
450
  simulator.reset()
451
+ visualization_pause_event.clear()
452
+ pause_step_event.clear()
326
453
  model.value = model.value = model.value.__class__(
327
454
  simulator=simulator, **model_parameters.value
328
455
  )
@@ -345,6 +472,8 @@ def SimulatorController(
345
472
  on_click=do_step,
346
473
  disabled=playing.value or not running.value,
347
474
  )
475
+ if error_message.value:
476
+ solara.Error(label=error_message.value)
348
477
 
349
478
 
350
479
  def split_model_params(model_params):
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Mesa
3
- Version: 3.1.4
3
+ Version: 3.2.0.dev0
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
- Author-email: Project Mesa Team <projectmesa@googlegroups.com>
7
+ Author-email: Project Mesa Team <maintainers@projectmesa.dev>
8
8
  License: Apache 2.0
9
9
  License-File: LICENSE
10
10
  License-File: NOTICE
@@ -87,12 +87,13 @@ Description-Content-Type: text/markdown
87
87
 
88
88
  # Mesa: Agent-based modeling in Python
89
89
 
90
- | | |
91
- | --- | --- |
92
- | CI/CD | [![GitHub Actions build status](https://github.com/projectmesa/mesa/workflows/build/badge.svg)](https://github.com/projectmesa/mesa/actions) [![Coverage status](https://codecov.io/gh/projectmesa/mesa/branch/main/graph/badge.svg)](https://codecov.io/gh/projectmesa/mesa) |
90
+ | | |
91
+ |---------| --- |
92
+ | CI/CD | [![GitHub Actions build status](https://github.com/projectmesa/mesa/workflows/build/badge.svg)](https://github.com/projectmesa/mesa/actions) [![Coverage status](https://codecov.io/gh/projectmesa/mesa/branch/main/graph/badge.svg)](https://codecov.io/gh/projectmesa/mesa) |
93
93
  | Package | [![PyPI - Version](https://img.shields.io/pypi/v/mesa.svg?logo=pypi&label=PyPI&logoColor=gold)](https://pypi.org/project/Mesa/) [![PyPI - Downloads](https://img.shields.io/pypi/dm/mesa.svg?color=blue&label=Downloads&logo=pypi&logoColor=gold)](https://pypi.org/project/Mesa/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mesa.svg?logo=python&label=Python&logoColor=gold)](https://pypi.org/project/Mesa/) |
94
- | Meta | [![linting - Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg)](https://github.com/pypa/hatch) [![SPEC 0 — Minimum Supported Dependencies](https://img.shields.io/badge/SPEC-0-green?labelColor=%23004811&color=%235CA038)](https://scientific-python.org/specs/spec-0000/) |
95
- | Chat | [![chat](https://img.shields.io/matrix/project-mesa:matrix.org?label=chat&logo=Matrix)](https://matrix.to/#/#project-mesa:matrix.org) |
94
+ | Meta | [![linting - Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg)](https://github.com/pypa/hatch) [![SPEC 0 — Minimum Supported Dependencies](https://img.shields.io/badge/SPEC-0-green?labelColor=%23004811&color=%235CA038)](https://scientific-python.org/specs/spec-0000/) |
95
+ | Chat | [![chat](https://img.shields.io/matrix/project-mesa:matrix.org?label=chat&logo=Matrix)](https://matrix.to/#/#project-mesa:matrix.org) |
96
+ | Cite | [![DOI](https://joss.theoj.org/papers/10.21105/joss.07668/status.svg)](https://doi.org/10.21105/joss.07668) |
96
97
 
97
98
  Mesa allows users to quickly create agent-based models using built-in
98
99
  core components (such as spatial grids and agent schedulers) or
@@ -220,4 +221,7 @@ Don't forget to checkout the [Contributors guide](https://github.com/projectmesa
220
221
 
221
222
  ## Citing Mesa
222
223
 
223
- To cite Mesa in your publication, you can use the [CITATION.bib](https://github.com/projectmesa/mesa/blob/main/CITATION.bib).
224
+ To cite Mesa in your publication, you can refer to our peer-reviewed article in the Journal of Open Source Software (JOSS):
225
+ - ter Hoeven, E., Kwakkel, J., Hess, V., Pike, T., Wang, B., rht, & Kazil, J. (2025). Mesa 3: Agent-based modeling with Python in 2025. Journal of Open Source Software, 10(107), 7668. https://doi.org/10.21105/joss.07668
226
+
227
+ Our [CITATION.cff](https://github.com/projectmesa/mesa/blob/main/CITATION.cff) can be used to generate APA, BibTeX and other citation formats.
@@ -1,76 +1,77 @@
1
- mesa/__init__.py,sha256=wLwKIsmbzCJwpwM_L7SH--8rPFOpXmSEK2F7LlkTyCM,611
2
- mesa/agent.py,sha256=4CXMOFA9KhvTypaV_OHZGqxOR4GVwyX4x8DOtQENUQA,26130
3
- mesa/batchrunner.py,sha256=w8StV82F_7DAAVQc5V7_Ggp0EL1NYn__UcBE-Nwrgv4,7771
1
+ mesa/__init__.py,sha256=nqgo-dnFqgwZIqBeMyOmzZmMO819PQlf6SSm4Nm9fok,682
2
+ mesa/agent.py,sha256=AKDktUOkBahLZymnWAIzvLHgMt2WDuIHRl2eptjp_sc,26649
3
+ mesa/batchrunner.py,sha256=ZeBOQw6-SLnECMUyKSRThh7vecP0DV6F6fGGk8UAboA,8041
4
4
  mesa/datacollection.py,sha256=vxW0KEmx6BHMM6SnKrRJJr7Eb_siGLyofwuyN8pSWXg,18483
5
5
  mesa/mesa_logging.py,sha256=PEDqUaQ2Y4bkYBkrHVkGT0sF86gUdbSH1T3vCg3qQeE,4949
6
6
  mesa/model.py,sha256=VkdBea_mkWcBMxMq-pwuU23UlI1gbG4TOIyqkBfeiFo,8354
7
- mesa/space.py,sha256=MNCblKf862pdkoIAa-VpjaurmI8GJtb02W3q3QWFjTE,64458
8
- mesa/examples/README.md,sha256=dNn8kv0BNQem3NNhO5mbOANQoK8UUYOo7rnkCFV9tnE,2882
7
+ mesa/space.py,sha256=g57TiwmMCRZLwDqgaHzQfSjF1wNE6oNi4rUjzeQ9E6g,63792
8
+ mesa/discrete_space/__init__.py,sha256=wXVr3eUpJAK-Y9DRlsQxhnQAxWLsrA7X6X9QhukDyTI,1672
9
+ mesa/discrete_space/cell.py,sha256=lok80RMnby09pxbJA631v14XmrfObwxfpw8EOkcwzao,7222
10
+ mesa/discrete_space/cell_agent.py,sha256=jSGP0xLVgdAx434piwQ9cQqUnPQSlFtJkiDibPWKXe0,4253
11
+ mesa/discrete_space/cell_collection.py,sha256=4yFImIijwCdFoHu3h6k8SEjn8yaSq5NGEEJsSMp-yR0,4698
12
+ mesa/discrete_space/discrete_space.py,sha256=6axHN04oX8OUKYrq2NbGPBeymiZKQXMDW2Fefa5w8pE,6555
13
+ mesa/discrete_space/grid.py,sha256=HEakDqB8mzS21PpCjcgUx2JBJTID5Ji82xmXLZ3wOr0,10408
14
+ mesa/discrete_space/network.py,sha256=Qa29Uj1bEuMrvN9xg0oizaCM-daALjWjqr2z4nPPqFY,2598
15
+ mesa/discrete_space/property_layer.py,sha256=8W6CsB-CtB5m1kncysS7hFG2Vf6lbCrSOsyJrVMDpYs,16755
16
+ mesa/discrete_space/voronoi.py,sha256=DtJPmHHRVccBc73U1QvUSUCdjN55SGOJ5FL-GjoELMk,10181
17
+ mesa/examples/README.md,sha256=TSVX0wD5C2iNAWW8OE0gl3SBZqxooJopmGKTk-7Fj2k,3262
9
18
  mesa/examples/__init__.py,sha256=pyPWFRUxyYtQilJECbH7LY1eYBk8VB0Yg-_SbFEEvFA,825
10
19
  mesa/examples/advanced/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
20
  mesa/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb,sha256=yh50ZAK2BVJyJIKsQTTxywnasqWn1IiQUVrwmZKue4w,29032
12
21
  mesa/examples/advanced/epstein_civil_violence/Readme.md,sha256=RXuGIZAibz3KVkP51PGjwzcRx2R9Ettmh3qbDTPqDcg,1735
13
22
  mesa/examples/advanced/epstein_civil_violence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- mesa/examples/advanced/epstein_civil_violence/agents.py,sha256=0X4JLj2K2cl1bACkFLI6-K6tKbr2SLZlAy_kjgUDjzA,5863
23
+ mesa/examples/advanced/epstein_civil_violence/agents.py,sha256=SMYKkKhNlMCXk-gmeakesxstqB-jpY44FtS8CiMl0l8,5854
15
24
  mesa/examples/advanced/epstein_civil_violence/app.py,sha256=fFlPijAUDLs_WfROGIlUXRakkkfbWnytcXFTAzdRplU,1890
16
- mesa/examples/advanced/epstein_civil_violence/model.py,sha256=fcTkjCRhEhDerDC1W_lrezdoWD1y5xIublkGIhCak8w,3918
25
+ mesa/examples/advanced/epstein_civil_violence/model.py,sha256=_ds6Wrq2Zf66VSxamTN5gK8A3itHU5DEVcydA--hlkY,3909
17
26
  mesa/examples/advanced/pd_grid/Readme.md,sha256=UVUQxZRFdfymCKDdQEn3ZEwgSqgp9cKJPsU8oZpLFnY,2367
18
27
  mesa/examples/advanced/pd_grid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- mesa/examples/advanced/pd_grid/agents.py,sha256=8JnezmnwxjcqAUAgXa1iWls0Nz4yBS-TJi1TSVcHbqM,1752
28
+ mesa/examples/advanced/pd_grid/agents.py,sha256=giX63EUq3TzJt916dglTSMsdzkIdtyOmwSoj2ynUQ2c,1743
20
29
  mesa/examples/advanced/pd_grid/analysis.ipynb,sha256=TTSY7mZlIYPjPjpW7cxr7Gzpo-NKKEBpXX4_f0V6NfI,5432
21
30
  mesa/examples/advanced/pd_grid/app.py,sha256=-_fTP7f_oITKHt7dDVJou7Oa7u7v_C4Ml5yw7D1sbx8,1457
22
- mesa/examples/advanced/pd_grid/model.py,sha256=-ytTSW0a_TQGTQW02k7XKAMiMak_b2XkJUw5kkGNHMQ,2291
31
+ mesa/examples/advanced/pd_grid/model.py,sha256=2YrTVNVThIf0FH1vKbYef0IYeJiR8Ws6eepsH6UjMLQ,2282
23
32
  mesa/examples/advanced/sugarscape_g1mt/Readme.md,sha256=x3kKw1Rre2FPkNhGDLtdzeThmH089mxsGYUPZUeu26k,3595
24
33
  mesa/examples/advanced/sugarscape_g1mt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- mesa/examples/advanced/sugarscape_g1mt/agents.py,sha256=ugTNvWjQNm_jMInv9d0sOIFaChIDs-TWazN78YrDP9g,8466
34
+ mesa/examples/advanced/sugarscape_g1mt/agents.py,sha256=foix7_00fFop6GLl5uEu1_bmeQ5oH04Fcc9-E06WWkk,8457
26
35
  mesa/examples/advanced/sugarscape_g1mt/app.py,sha256=fg8ZXBoc4tPI9AfOLF0fgMk3Ey4H8xZu6tUaTwDp3Nk,1952
27
- mesa/examples/advanced/sugarscape_g1mt/model.py,sha256=s4n9SRaaMNY9CXFtry83BELZU69UJOCa4DMrw_eehr4,5763
36
+ mesa/examples/advanced/sugarscape_g1mt/model.py,sha256=VwHaLuqrX8g6XP3wHw16Opu5vaW-kyL31pe7Mja-HvQ,5745
28
37
  mesa/examples/advanced/sugarscape_g1mt/sugar-map.txt,sha256=zZtGYciBPT4miZVnbVuoQ5TugTmGrbDWV9yb5KH6tnU,5000
29
38
  mesa/examples/advanced/sugarscape_g1mt/tests.py,sha256=UNahmZTgLquSqmoi_9GcE3JP0qBHjkrHFZ15NMm0ce8,2517
30
39
  mesa/examples/advanced/wolf_sheep/Readme.md,sha256=6zrtCg4Fb-hgQxqdLMpTkIYMwD6owCv8BMz_qn0N98Q,3165
31
40
  mesa/examples/advanced/wolf_sheep/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- mesa/examples/advanced/wolf_sheep/agents.py,sha256=lxk9nxDaIGxB7zJ0pIOF2PfOAee8lX-vG447Cklt7UQ,5090
33
- mesa/examples/advanced/wolf_sheep/app.py,sha256=IIl-gDh1O3oYIvrXXGmKHbW5Iw3ZpCn691dGwKgyI3E,2508
34
- mesa/examples/advanced/wolf_sheep/model.py,sha256=IUN1STm6jCGuzXo2sCF86r1U-dI63yhLhnI14tu9BSw,4567
41
+ mesa/examples/advanced/wolf_sheep/agents.py,sha256=kqW8ITdFHtkMqF5auHoP0dHUbXk-rSMt4XI340NZ5Qg,5081
42
+ mesa/examples/advanced/wolf_sheep/app.py,sha256=MEoQzjSvXJC0ua_4okUZOucL0UnBfWRZ42ij4iQVMp4,2544
43
+ mesa/examples/advanced/wolf_sheep/model.py,sha256=mHmn5r9EdRtoOGSbubcKtlSBClKmjDIri8uhcokIeBE,4558
35
44
  mesa/examples/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
45
  mesa/examples/basic/boid_flockers/Readme.md,sha256=4KJinsLPtUciQSMzvaX3tU5r1HTUg3AFOFDKy73W5RE,894
37
46
  mesa/examples/basic/boid_flockers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- mesa/examples/basic/boid_flockers/agents.py,sha256=f9IpVMpuo6WPtMffLOqgKsxoG4syJt8-k9Njvh4fMN8,3232
39
- mesa/examples/basic/boid_flockers/app.py,sha256=5y52V_PRENzNGkmV_-KB5ZQeUN589i1ntJW-AIgZD0s,1323
40
- mesa/examples/basic/boid_flockers/model.py,sha256=hgYScacUAv6Yq240al41r9Iv3Iqbn4wfFVQEHyorJ3c,2981
47
+ mesa/examples/basic/boid_flockers/agents.py,sha256=oA0A0NilTHi0XYouYaNcMSmpKDdNYPwfS96FNqRuTUI,3309
48
+ mesa/examples/basic/boid_flockers/app.py,sha256=9Cf6f2Ctjz0yWYQHCKE2owBOmnIuXqkVkLIJz6hqGCc,1861
49
+ mesa/examples/basic/boid_flockers/model.py,sha256=RQh9GfsSPvshUQedlmEEjk1dJHuyL8o4VWiAamgH1EU,3551
41
50
  mesa/examples/basic/boltzmann_wealth_model/Readme.md,sha256=wl1ylO9KWoTiuIJKOnk2FGdcmyVUqJ5wiSbVUa3WWAc,2725
42
51
  mesa/examples/basic/boltzmann_wealth_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- mesa/examples/basic/boltzmann_wealth_model/agents.py,sha256=Jol2aspw--UtQn0EiReXVmlWtzpdC2o_YUTAyu1sDk4,1546
44
- mesa/examples/basic/boltzmann_wealth_model/app.py,sha256=wTQBu9A3uscTZSPqZ5jYssykGPiseye2YBjMngYI48A,2233
45
- mesa/examples/basic/boltzmann_wealth_model/model.py,sha256=ED4EFHJlrrcF12WYOEpXpPt5asK2T6uzpq_S97EtfHo,2941
52
+ mesa/examples/basic/boltzmann_wealth_model/agents.py,sha256=GF4mNEjqLS4Vg4vtdeDAetby_t69J-LcFhtQIMOBDNU,1330
53
+ mesa/examples/basic/boltzmann_wealth_model/app.py,sha256=GwyNQvwu0S5l7ASRTF70xE9ozjhtT1xAetWGlQmNtDk,2231
54
+ mesa/examples/basic/boltzmann_wealth_model/model.py,sha256=9d-x5Y2T49R4Pt1u7lY63Z0y8impZ2f47_ahrxohvaY,2828
46
55
  mesa/examples/basic/boltzmann_wealth_model/st_app.py,sha256=PQ65LkYPXn-lx4lCfXuFJmzcmAfVB3oEEdIyuq9a7iU,3454
47
56
  mesa/examples/basic/conways_game_of_life/Readme.md,sha256=VRgN6roF6leQ_IMYwxFypSfFjZo9jnCd-rkPTjpp7II,1453
48
57
  mesa/examples/basic/conways_game_of_life/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- mesa/examples/basic/conways_game_of_life/agents.py,sha256=ETn87GV8it9p0nlSn6f1qu5CDEmqokkr6Rq7KWaT-5U,1627
58
+ mesa/examples/basic/conways_game_of_life/agents.py,sha256=pByQeucyW5UDBnl90xbRGJJNJHpM8NLuqSmft5AkVN0,1766
50
59
  mesa/examples/basic/conways_game_of_life/app.py,sha256=HPzss2X3ntTOgdmg0C0EWw3lmAF7WiN9MZEgGdLW-xU,1997
51
- mesa/examples/basic/conways_game_of_life/model.py,sha256=8L88m8F_YauwWeDef6UA2myQoAwC0B5sH5jsfyLn-u8,1221
60
+ mesa/examples/basic/conways_game_of_life/model.py,sha256=GGHg8Qni1R4RGQrfvJcsqG6btNTuQhCWOwS_9crU6tc,1269
52
61
  mesa/examples/basic/conways_game_of_life/st_app.py,sha256=9qz3o0pOuvLZR-_aPPVHN-RIwFSNzvwWWfxCaD2K5cs,2402
53
62
  mesa/examples/basic/schelling/Readme.md,sha256=CRKBfYtnLJLlTKLsTRQ-7gsQRxVxDooOBN5uP8PEtaU,2296
54
63
  mesa/examples/basic/schelling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
- mesa/examples/basic/schelling/agents.py,sha256=WdDM-BYeOUuIL_2U5rlZz4Rs_5orstHY2Z6G6zvQEyg,1224
64
+ mesa/examples/basic/schelling/agents.py,sha256=jyMzafsAhOTYOfl3rZgasYLhxW3YEHv3oOIh9Re3LmU,1517
56
65
  mesa/examples/basic/schelling/analysis.ipynb,sha256=UMDoumvBFhZilwJhxl5Mou2bmDDqxguK5RdnoY2gkNc,5910
57
66
  mesa/examples/basic/schelling/app.py,sha256=eqgqCu6_6jk1RrmT82e_AoEDMvy8eZ0OJnnlITpiBXQ,1067
58
- mesa/examples/basic/schelling/model.py,sha256=ZNTK42pJnIJfsnqaI0ZXFxw9xtWPXkUMIemMr4uXmW8,2766
67
+ mesa/examples/basic/schelling/model.py,sha256=dUfQ4bG-nqvYPSUcLNSI7LOTfs8IxTbVi_Clj8y2rS8,2712
59
68
  mesa/examples/basic/virus_on_network/Readme.md,sha256=qmXGx4Fo0tRBvJiiJ684bkWJPn2gcFaiikLwgc5APWI,2336
60
69
  mesa/examples/basic/virus_on_network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- mesa/examples/basic/virus_on_network/agents.py,sha256=a_WhqYblJlW6od67eXfU-nb7IMRyYpgxtf0le--VYoA,1975
70
+ mesa/examples/basic/virus_on_network/agents.py,sha256=yVPZCiKI53qXlsUus3vdNZ39IG0cLoY2wQXeYZHiahs,1814
62
71
  mesa/examples/basic/virus_on_network/app.py,sha256=8I8VWQ7pBcOaNGyLDEO4IbNSTRy161-eWg-iEUVQ3-I,2553
63
- mesa/examples/basic/virus_on_network/model.py,sha256=jQoCmvygwCvhUrlL0l7V8GcDLv94CgwtuK7DDGU8q8g,2813
64
- mesa/experimental/__init__.py,sha256=hSGXGvsVANvqhgA994HcLBLIRC2WhSF3e_w2gvoCMUo,943
65
- mesa/experimental/cell_space/__init__.py,sha256=0A3YTen0Lk-e3Q73VEXK7N2UEHb9f50gW11H_jx7DXc,1744
66
- mesa/experimental/cell_space/cell.py,sha256=Dl0ek7W_vgAZOp6zXBvkwYTG7E36OQ-4zZ5bW43mKtw,6600
67
- mesa/experimental/cell_space/cell_agent.py,sha256=LOTLKR2To9hU-igKsauA5sikS7k8wgwlt-Pi0C7lGU0,4262
68
- mesa/experimental/cell_space/cell_collection.py,sha256=VnD3I4bqnwgFxKSzTElYYJIBFJGdaEaNTggrbFKgPrc,4715
69
- mesa/experimental/cell_space/discrete_space.py,sha256=qNGez9SV4E83Outs_12suuS0ZtTHcwyv6ZB1xzTXUWk,3846
70
- mesa/experimental/cell_space/grid.py,sha256=VTPjqzryAX6I9EunuqSvZvYD2zHznlt6Ct7HXQ_7STQ,10426
71
- mesa/experimental/cell_space/network.py,sha256=ujN2dV1i9hcXh6H0s7gwTuPT6gh7BCaziOUYPCybQKk,1862
72
- mesa/experimental/cell_space/property_layer.py,sha256=HFpBWOjI7PFU_K8VDb_pl9h62MftCBWL7PUKQNT3Ke8,17379
73
- mesa/experimental/cell_space/voronoi.py,sha256=FXJD8ci81Jil3FaL7ZFNfMPGvXvg3uym5Ooo1ZqKSKs,10199
72
+ mesa/examples/basic/virus_on_network/model.py,sha256=sljdQlTPeUCbmWSxnCJJv706lN3uVMF8pS1gAMNHreM,2543
73
+ mesa/experimental/__init__.py,sha256=Q5ryonToiKyhg_AvNOFSJXdD8JmZEmt54YHq81MXn3M,917
74
+ mesa/experimental/cell_space/__init__.py,sha256=IOXd0RcJP34kaHvEHv_AeN7PGpvoYPpaZYsx3Mz8dNo,1872
74
75
  mesa/experimental/continuous_space/__init__.py,sha256=JkCkL4zZpe8c0GHqw4huM2-uoGOYqrCyt7J1M454kFA,269
75
76
  mesa/experimental/continuous_space/continuous_space.py,sha256=UcD-nsi5oEAJzf8ZI7BU26FYn6DdJzsW-dgXqaZIrQk,9530
76
77
  mesa/experimental/continuous_space/continuous_space_agents.py,sha256=859ypIiWMgjknTsER0i8Y6aCWjMpw6MC5cfoKa6l_iA,3044
@@ -81,16 +82,17 @@ mesa/experimental/mesa_signals/__init__.py,sha256=QjG4FSKQl5ZSzV9ctiaB7UqYDR3FAR
81
82
  mesa/experimental/mesa_signals/mesa_signal.py,sha256=Vxo4gIV6a959MANL3RMANsGh0R9lkZTNO19XIYzvKSM,16860
82
83
  mesa/experimental/mesa_signals/observable_collections.py,sha256=rHEj6BYxLHFFGzSdoDKAdtzJ6y-IHHfcP3qEDJJsY6Y,3917
83
84
  mesa/experimental/mesa_signals/signals_util.py,sha256=fmq_FsIxsIvGjtmc4A9TGdBUtdliMHhEOpjRXivRDjA,1618
84
- mesa/visualization/__init__.py,sha256=wnafHqOc7q-niu8HDOLwcmwuYu5BuvdjLTHmfpyXAoA,664
85
- mesa/visualization/mpl_space_drawing.py,sha256=9byWxbKHVVT5GLmu-6U0qVFddThEag612JBGYmZiWps,22686
86
- mesa/visualization/solara_viz.py,sha256=AoMVDdjMc99qCClAvsFXg-jBNPaDF5kfIhXa5Hd57MA,21052
85
+ mesa/visualization/__init__.py,sha256=h7YZnBUNrgiK5KbIikPIdQgn6KusmgiDh7tMql8Q39Y,730
86
+ mesa/visualization/command_console.py,sha256=-sVNYdXxmc5diQyqfFHUByzVSOpP3eoPcdLL2J6gwD4,17086
87
+ mesa/visualization/mpl_space_drawing.py,sha256=axIaq7MTaYIb_-ME2z5TbXufREl9jgFLebZSredyfwA,22956
88
+ mesa/visualization/solara_viz.py,sha256=coG5o0A5iCOBIqzsrlUG_S2rYrTcOYubESzj4zcW-ro,26274
87
89
  mesa/visualization/user_param.py,sha256=Dl2WOwLYLf0pfLpabCZtIdFRyKZrK6Qtc3utZx5GPYg,2139
88
90
  mesa/visualization/utils.py,sha256=lJHgRKF5BHLf72Tw3YpwyiWuRoIimaTKQ7xBCw_Rx3A,146
89
91
  mesa/visualization/components/__init__.py,sha256=Bq3nrPikcaIo9BSs0O3zptWVLlUmAkLo3s0mEmpH1RE,3022
90
- mesa/visualization/components/altair_components.py,sha256=7OdVdZOvAx4p3j6iux6FqUYrWT0OADBIhFGf6EeGcb4,6071
92
+ mesa/visualization/components/altair_components.py,sha256=cSce9_QNaJ5EF6sZ8tu2cZ4NIczocKfjdRCxiC8w0fY,16164
91
93
  mesa/visualization/components/matplotlib_components.py,sha256=xQETaFyHIfmL_9JwrLIgubuIQ7-pp7TMoXT1WMmozus,5441
92
- mesa-3.1.4.dist-info/METADATA,sha256=NFoxMdQKJ_fLTMOskESPV6JZ1nfKJHzD2Vu4qxChx4o,10197
93
- mesa-3.1.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
94
- mesa-3.1.4.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
95
- mesa-3.1.4.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
96
- mesa-3.1.4.dist-info/RECORD,,
94
+ mesa-3.2.0.dev0.dist-info/METADATA,sha256=n-xigxoTixo2_f7hEBqNXNOY-IiZxl5wyi2f7bqJtek,10705
95
+ mesa-3.2.0.dev0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
96
+ mesa-3.2.0.dev0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
97
+ mesa-3.2.0.dev0.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
98
+ mesa-3.2.0.dev0.dist-info/RECORD,,