Mesa 3.1.1__py3-none-any.whl → 3.1.3__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.

@@ -0,0 +1,101 @@
1
+ """Continuous space agents."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from itertools import compress
6
+ from typing import Protocol
7
+
8
+ import numpy as np
9
+
10
+ from mesa.agent import Agent
11
+ from mesa.experimental.continuous_space import ContinuousSpace
12
+
13
+
14
+ class HasPositionProtocol(Protocol):
15
+ """Protocol for continuous space position holders."""
16
+
17
+ position: np.ndarray
18
+
19
+
20
+ class ContinuousSpaceAgent(Agent):
21
+ """A continuous space agent.
22
+
23
+ Attributes:
24
+ space (ContinuousSpace): the continuous space in which the agent is located
25
+ position (np.ndarray): the position of the agent
26
+
27
+ """
28
+
29
+ __slots__ = ["_mesa_index", "space"]
30
+
31
+ @property
32
+ def position(self) -> np.ndarray:
33
+ """Position of the agent."""
34
+ return self.space.agent_positions[self.space._agent_to_index[self]]
35
+
36
+ @position.setter
37
+ def position(self, value: np.ndarray) -> None:
38
+ if not self.space.in_bounds(value):
39
+ if self.space.torus:
40
+ value = self.space.torus_correct(value)
41
+ else:
42
+ raise ValueError(f"point {value} is outside the bounds of the space")
43
+
44
+ self.space.agent_positions[self.space._agent_to_index[self]] = value
45
+
46
+ @property
47
+ def pos(self): # noqa: D102
48
+ # just here for compatibility with solara_viz.
49
+ return self.position
50
+
51
+ @pos.setter
52
+ def pos(self, value):
53
+ # just here for compatibility solara_viz.
54
+ pass
55
+
56
+ def __init__(self, space: ContinuousSpace, model):
57
+ """Initialize a continuous space agent.
58
+
59
+ Args:
60
+ space: the continuous space in which the agent is located
61
+ model: the model to which the agent belongs
62
+
63
+ """
64
+ super().__init__(model)
65
+ self.space: ContinuousSpace = space
66
+ self.space._add_agent(self)
67
+ # self.position[:] = np.nan
68
+
69
+ def remove(self) -> None:
70
+ """Remove and delete the agent from the model and continuous space."""
71
+ super().remove()
72
+ self.space._remove_agent(self)
73
+ self._mesa_index = None
74
+ self.space = None
75
+
76
+ def get_neighbors_in_radius(
77
+ self, radius: float | int = 1
78
+ ) -> tuple[list, np.ndarray]:
79
+ """Get neighbors within radius.
80
+
81
+ Args:
82
+ radius: radius within which to look for neighbors
83
+
84
+ """
85
+ agents, dists = self.space.get_agents_in_radius(self.position, radius=radius)
86
+ logical = np.asarray([agent is not self for agent in agents])
87
+ agents = list(compress(agents, logical))
88
+ return agents, dists[logical]
89
+
90
+ def get_nearest_neighbors(self, k: int = 1) -> tuple[list, np.ndarray]:
91
+ """Get neighbors within radius.
92
+
93
+ Args:
94
+ k: the number of nearest neighbors to return
95
+
96
+ """
97
+ # return includes self, so we need to get k+1
98
+ agents, dists = self.space.get_k_nearest_agents(self.position, k=k + 1)
99
+ logical = np.asarray([agent is not self for agent in agents])
100
+ agents = list(compress(agents, logical))
101
+ return agents, dists[logical]
mesa/model.py CHANGED
@@ -94,7 +94,7 @@ class Model:
94
94
  self._seed = seed # this allows for reproducing stdlib.random
95
95
 
96
96
  try:
97
- self.rng: np.random.Generator = np.random.default_rng(rng)
97
+ self.rng: np.random.Generator = np.random.default_rng(seed)
98
98
  except TypeError:
99
99
  rng = self.random.randint(0, sys.maxsize)
100
100
  self.rng: np.random.Generator = np.random.default_rng(rng)
mesa/space.py CHANGED
@@ -1415,6 +1415,13 @@ class ContinuousSpace:
1415
1415
  coordinates. i.e. if you are searching for the
1416
1416
  neighbors of a given agent, True will include that
1417
1417
  agent in the results.
1418
+
1419
+ Notes:
1420
+ If 1 or more agents are located on pos, include_center=False will remove all these agents
1421
+ from the results. So, if you really want to get the neighbors of a given agent,
1422
+ you should set include_center=True, and then filter the list of agents to remove
1423
+ the given agent (i.e., self when calling it from an agent).
1424
+
1418
1425
  """
1419
1426
  if self._agent_points is None:
1420
1427
  self._build_agent_cache()
@@ -20,7 +20,7 @@ from matplotlib.axes import Axes
20
20
  from matplotlib.cm import ScalarMappable
21
21
  from matplotlib.collections import PatchCollection
22
22
  from matplotlib.colors import LinearSegmentedColormap, Normalize, to_rgba
23
- from matplotlib.patches import RegularPolygon
23
+ from matplotlib.patches import Polygon, RegularPolygon
24
24
 
25
25
  import mesa
26
26
  from mesa.experimental.cell_space import (
@@ -117,7 +117,6 @@ def draw_space(
117
117
  agent_portrayal: A callable that returns a dict specifying how to show the agent
118
118
  propertylayer_portrayal: a dict specifying how to show propertylayer(s)
119
119
  ax: the axes upon which to draw the plot
120
- post_process: a callable called with the Axes instance
121
120
  space_drawing_kwargs: any additional keyword arguments to be passed on to the underlying function for drawing the space.
122
121
 
123
122
  Returns:
@@ -144,7 +143,10 @@ def draw_space(
144
143
  draw_orthogonal_grid(space, agent_portrayal, ax=ax, **space_drawing_kwargs)
145
144
  case mesa.space.NetworkGrid() | mesa.experimental.cell_space.Network():
146
145
  draw_network(space, agent_portrayal, ax=ax, **space_drawing_kwargs)
147
- case mesa.space.ContinuousSpace():
146
+ case (
147
+ mesa.space.ContinuousSpace()
148
+ | mesa.experimental.continuous_space.ContinuousSpace()
149
+ ):
148
150
  draw_continuous_space(space, agent_portrayal, ax=ax)
149
151
  case VoronoiGrid():
150
152
  draw_voronoi_grid(space, agent_portrayal, ax=ax)
@@ -499,7 +501,11 @@ def draw_continuous_space(
499
501
 
500
502
 
501
503
  def draw_voronoi_grid(
502
- space: VoronoiGrid, agent_portrayal: Callable, ax: Axes | None = None, **kwargs
504
+ space: VoronoiGrid,
505
+ agent_portrayal: Callable,
506
+ ax: Axes | None = None,
507
+ draw_grid: bool = True,
508
+ **kwargs,
503
509
  ):
504
510
  """Visualize a voronoi grid.
505
511
 
@@ -507,6 +513,7 @@ def draw_voronoi_grid(
507
513
  space: the space to visualize
508
514
  agent_portrayal: a callable that is called with the agent and returns a dict
509
515
  ax: a Matplotlib Axes instance. If none is provided a new figure and ax will be created using plt.subplots
516
+ draw_grid: whether to draw the grid or not
510
517
  kwargs: additional keyword arguments passed to ax.scatter
511
518
 
512
519
  Returns:
@@ -539,16 +546,18 @@ def draw_voronoi_grid(
539
546
 
540
547
  _scatter(ax, arguments, **kwargs)
541
548
 
542
- for cell in space.all_cells:
543
- polygon = cell.properties["polygon"]
544
- ax.fill(
545
- *zip(*polygon),
546
- alpha=min(1, cell.properties[space.cell_coloring_property]),
547
- c="red",
548
- zorder=0,
549
- ) # Plot filled polygon
550
- ax.plot(*zip(*polygon), color="black") # Plot polygon edges in black
549
+ def setup_voroinoimesh(cells):
550
+ patches = []
551
+ for cell in cells:
552
+ patch = Polygon(cell.properties["polygon"])
553
+ patches.append(patch)
554
+ mesh = PatchCollection(
555
+ patches, edgecolor="k", facecolor=(1, 1, 1, 0), linestyle="dotted", lw=1
556
+ )
557
+ return mesh
551
558
 
559
+ if draw_grid:
560
+ ax.add_collection(setup_voroinoimesh(space.all_cells.cells))
552
561
  return ax
553
562
 
554
563
 
@@ -52,6 +52,7 @@ def SolaraViz(
52
52
  | Literal["default"] = "default",
53
53
  *,
54
54
  play_interval: int = 100,
55
+ render_interval: int = 1,
55
56
  simulator: Simulator | None = None,
56
57
  model_params=None,
57
58
  name: str | None = None,
@@ -72,6 +73,8 @@ def SolaraViz(
72
73
  Defaults to "default", which uses the default Altair space visualization.
73
74
  play_interval (int, optional): Interval for playing the model steps in milliseconds.
74
75
  This controls the speed of the model's automatic stepping. Defaults to 100 ms.
76
+ render_interval (int, optional): Controls how often plots are updated during a simulation,
77
+ allowing users to skip intermediate steps and update graphs less frequently.
75
78
  simulator: A simulator that controls the model (optional)
76
79
  model_params (dict, optional): Parameters for (re-)instantiating a model.
77
80
  Can include user-adjustable parameters and fixed parameters. Defaults to None.
@@ -90,6 +93,8 @@ def SolaraViz(
90
93
  model instance is provided, it will be converted to a reactive model using `solara.use_reactive`.
91
94
  - The `play_interval` argument controls the speed of the model's automatic stepping. A lower
92
95
  value results in faster stepping, while a higher value results in slower stepping.
96
+ - The `render_interval` argument determines how often plots are updated during simulation. Higher values
97
+ reduce update frequency,resulting in faster execution.
93
98
  """
94
99
  if components == "default":
95
100
  components = [components_altair.make_altair_space()]
@@ -103,7 +108,7 @@ def SolaraViz(
103
108
  # set up reactive model_parameters shared by ModelCreator and ModelController
104
109
  reactive_model_parameters = solara.use_reactive({})
105
110
  reactive_play_interval = solara.use_reactive(play_interval)
106
-
111
+ reactive_render_interval = solara.use_reactive(render_interval)
107
112
  with solara.AppBar():
108
113
  solara.AppBarTitle(name if name else model.value.__class__.__name__)
109
114
 
@@ -117,11 +122,20 @@ def SolaraViz(
117
122
  max=500,
118
123
  step=10,
119
124
  )
125
+ solara.SliderInt(
126
+ label="Render Interval (steps)",
127
+ value=reactive_render_interval,
128
+ on_value=lambda v: reactive_render_interval.set(v),
129
+ min=1,
130
+ max=100,
131
+ step=2,
132
+ )
120
133
  if not isinstance(simulator, Simulator):
121
134
  ModelController(
122
135
  model,
123
136
  model_parameters=reactive_model_parameters,
124
137
  play_interval=reactive_play_interval,
138
+ render_interval=reactive_render_interval,
125
139
  )
126
140
  else:
127
141
  SimulatorController(
@@ -129,6 +143,7 @@ def SolaraViz(
129
143
  simulator,
130
144
  model_parameters=reactive_model_parameters,
131
145
  play_interval=reactive_play_interval,
146
+ render_interval=reactive_render_interval,
132
147
  )
133
148
  with solara.Card("Model Parameters"):
134
149
  ModelCreator(
@@ -189,6 +204,7 @@ def ModelController(
189
204
  *,
190
205
  model_parameters: dict | solara.Reactive[dict] = None,
191
206
  play_interval: int | solara.Reactive[int] = 100,
207
+ render_interval: int | solara.Reactive[int] = 1,
192
208
  ):
193
209
  """Create controls for model execution (step, play, pause, reset).
194
210
 
@@ -196,7 +212,7 @@ def ModelController(
196
212
  model: Reactive model instance
197
213
  model_parameters: Reactive parameters for (re-)instantiating a model.
198
214
  play_interval: Interval for playing the model steps in milliseconds.
199
-
215
+ render_interval: Controls how often the plots are updated during simulation steps.Higher value reduce update frequency.
200
216
  """
201
217
  playing = solara.use_reactive(False)
202
218
  running = solara.use_reactive(True)
@@ -215,9 +231,12 @@ def ModelController(
215
231
 
216
232
  @function_logger(__name__)
217
233
  def do_step():
218
- """Advance the model by one step."""
219
- model.value.step()
234
+ """Advance the model by the number of steps specified by the render_interval slider."""
235
+ for _ in range(render_interval.value):
236
+ model.value.step()
237
+
220
238
  running.value = model.value.running
239
+
221
240
  force_update()
222
241
 
223
242
  @function_logger(__name__)
@@ -259,6 +278,7 @@ def SimulatorController(
259
278
  *,
260
279
  model_parameters: dict | solara.Reactive[dict] = None,
261
280
  play_interval: int | solara.Reactive[int] = 100,
281
+ render_interval: int | solara.Reactive[int] = 1,
262
282
  ):
263
283
  """Create controls for model execution (step, play, pause, reset).
264
284
 
@@ -267,7 +287,11 @@ def SimulatorController(
267
287
  simulator: Simulator instance
268
288
  model_parameters: Reactive parameters for (re-)instantiating a model.
269
289
  play_interval: Interval for playing the model steps in milliseconds.
290
+ render_interval: Controls how often the plots are updated during simulation steps.Higher values reduce update frequency.
270
291
 
292
+ Notes:
293
+ The `step button` increments the step by the value specified in the `render_interval` slider.
294
+ This behavior ensures synchronization between simulation steps and plot updates.
271
295
  """
272
296
  playing = solara.use_reactive(False)
273
297
  running = solara.use_reactive(True)
@@ -285,8 +309,8 @@ def SimulatorController(
285
309
  )
286
310
 
287
311
  def do_step():
288
- """Advance the model by one step."""
289
- simulator.run_for(1)
312
+ """Advance the model by the number of steps specified by the render_interval slider."""
313
+ simulator.run_for(render_interval.value)
290
314
  running.value = model.value.running
291
315
  force_update()
292
316
 
@@ -390,7 +414,6 @@ def ModelCreator(
390
414
  or are dictionaries containing parameter details such as type, value, min, and max.
391
415
  - The `seed` argument ensures reproducibility by setting the initial seed for the model's random number generator.
392
416
  - The component provides an interface for adjusting user-defined parameters and reseeding the model.
393
-
394
417
  """
395
418
  if model_parameters is None:
396
419
  model_parameters = {}
@@ -1,11 +1,13 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: Mesa
3
- Version: 3.1.1
3
+ Version: 3.1.3
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
9
11
  Keywords: ABM,agent,based,model,modeling,multi-agent,simulation
10
12
  Classifier: Development Status :: 3 - Alpha
11
13
  Classifier: Intended Audience :: Science/Research
@@ -22,6 +24,7 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Life
22
24
  Requires-Python: >=3.11
23
25
  Requires-Dist: numpy
24
26
  Requires-Dist: pandas
27
+ Requires-Dist: scipy
25
28
  Requires-Dist: tqdm
26
29
  Provides-Extra: all
27
30
  Requires-Dist: ipython; extra == 'all'
@@ -1,10 +1,10 @@
1
- mesa/__init__.py,sha256=4-j7gALmGrWuSOiUaI2o6UN6TyHL1MPwaAUC9C7PP04,611
1
+ mesa/__init__.py,sha256=cQpR402xBpOx0vJjUbQB8d6D9d2JK_ZpWkmWSlm4cWk,611
2
2
  mesa/agent.py,sha256=4CXMOFA9KhvTypaV_OHZGqxOR4GVwyX4x8DOtQENUQA,26130
3
3
  mesa/batchrunner.py,sha256=w8StV82F_7DAAVQc5V7_Ggp0EL1NYn__UcBE-Nwrgv4,7771
4
4
  mesa/datacollection.py,sha256=8loT4pQsXcHArxHSsbRc7HTc2GP5gsEIeKFKr3xya4I,15991
5
5
  mesa/mesa_logging.py,sha256=PEDqUaQ2Y4bkYBkrHVkGT0sF86gUdbSH1T3vCg3qQeE,4949
6
- mesa/model.py,sha256=oVcV-_OZ3GVv1sb3KqyGA9TAWCDQu9qEDWwRi_AXR40,8353
7
- mesa/space.py,sha256=cfzlRfy9chegp8d89k2aqI29jo9cb18USlz2G2iOZU4,64082
6
+ mesa/model.py,sha256=VkdBea_mkWcBMxMq-pwuU23UlI1gbG4TOIyqkBfeiFo,8354
7
+ mesa/space.py,sha256=MNCblKf862pdkoIAa-VpjaurmI8GJtb02W3q3QWFjTE,64458
8
8
  mesa/examples/README.md,sha256=dNn8kv0BNQem3NNhO5mbOANQoK8UUYOo7rnkCFV9tnE,2882
9
9
  mesa/examples/__init__.py,sha256=pyPWFRUxyYtQilJECbH7LY1eYBk8VB0Yg-_SbFEEvFA,825
10
10
  mesa/examples/advanced/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -17,7 +17,7 @@ mesa/examples/advanced/epstein_civil_violence/model.py,sha256=fcTkjCRhEhDerDC1W_
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=8JnezmnwxjcqAUAgXa1iWls0Nz4yBS-TJi1TSVcHbqM,1752
20
- mesa/examples/advanced/pd_grid/analysis.ipynb,sha256=ReYtRe2JVyCCXoMBONvynXDQ_eGtQSWhNcuJY3CYTTI,82323
20
+ mesa/examples/advanced/pd_grid/analysis.ipynb,sha256=TTSY7mZlIYPjPjpW7cxr7Gzpo-NKKEBpXX4_f0V6NfI,5432
21
21
  mesa/examples/advanced/pd_grid/app.py,sha256=-_fTP7f_oITKHt7dDVJou7Oa7u7v_C4Ml5yw7D1sbx8,1457
22
22
  mesa/examples/advanced/pd_grid/model.py,sha256=-ytTSW0a_TQGTQW02k7XKAMiMak_b2XkJUw5kkGNHMQ,2291
23
23
  mesa/examples/advanced/sugarscape_g1mt/Readme.md,sha256=x3kKw1Rre2FPkNhGDLtdzeThmH089mxsGYUPZUeu26k,3595
@@ -29,15 +29,15 @@ mesa/examples/advanced/sugarscape_g1mt/sugar-map.txt,sha256=zZtGYciBPT4miZVnbVuo
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=QH0WsJbxcKjAeHY63j7dVXCUGIPc5G1vl7MaC-k8UZw,3829
32
+ mesa/examples/advanced/wolf_sheep/agents.py,sha256=lxk9nxDaIGxB7zJ0pIOF2PfOAee8lX-vG447Cklt7UQ,5090
33
33
  mesa/examples/advanced/wolf_sheep/app.py,sha256=IIl-gDh1O3oYIvrXXGmKHbW5Iw3ZpCn691dGwKgyI3E,2508
34
34
  mesa/examples/advanced/wolf_sheep/model.py,sha256=IUN1STm6jCGuzXo2sCF86r1U-dI63yhLhnI14tu9BSw,4567
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=72oL4jWEiJfSgshSEcL44irptIY6WAQDRAQ0cO2MxS8,3827
39
- mesa/examples/basic/boid_flockers/app.py,sha256=oJbv_CbeiXu97q1W_2xlsXIVAqqLvfxshn2Y70_7PyA,1244
40
- mesa/examples/basic/boid_flockers/model.py,sha256=scy0OaYzQVY5vVarsI7dUydynwoH3-uYoYcsBTtwtyA,3399
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
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
43
  mesa/examples/basic/boltzmann_wealth_model/agents.py,sha256=Jol2aspw--UtQn0EiReXVmlWtzpdC2o_YUTAyu1sDk4,1546
@@ -53,15 +53,15 @@ mesa/examples/basic/conways_game_of_life/st_app.py,sha256=9qz3o0pOuvLZR-_aPPVHN-
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
55
  mesa/examples/basic/schelling/agents.py,sha256=WdDM-BYeOUuIL_2U5rlZz4Rs_5orstHY2Z6G6zvQEyg,1224
56
- mesa/examples/basic/schelling/analysis.ipynb,sha256=JDJy6-U6eO-LrHWxZr1c3lkvtoY0DNHa-kJ4J-Z-wwo,5804
57
- mesa/examples/basic/schelling/app.py,sha256=DOu7aWjDeFGjD1yXlBbQ9qCUHguDDkYh4bmFBjM0Vb8,1065
58
- mesa/examples/basic/schelling/model.py,sha256=ruqiMNBBsWV81srYZgdsfDVwgMWYuw2VAzSQhsK5E98,2762
56
+ mesa/examples/basic/schelling/analysis.ipynb,sha256=UMDoumvBFhZilwJhxl5Mou2bmDDqxguK5RdnoY2gkNc,5910
57
+ mesa/examples/basic/schelling/app.py,sha256=eqgqCu6_6jk1RrmT82e_AoEDMvy8eZ0OJnnlITpiBXQ,1067
58
+ mesa/examples/basic/schelling/model.py,sha256=ZNTK42pJnIJfsnqaI0ZXFxw9xtWPXkUMIemMr4uXmW8,2766
59
59
  mesa/examples/basic/virus_on_network/Readme.md,sha256=qmXGx4Fo0tRBvJiiJ684bkWJPn2gcFaiikLwgc5APWI,2336
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
62
  mesa/examples/basic/virus_on_network/app.py,sha256=8I8VWQ7pBcOaNGyLDEO4IbNSTRy161-eWg-iEUVQ3-I,2553
63
63
  mesa/examples/basic/virus_on_network/model.py,sha256=jQoCmvygwCvhUrlL0l7V8GcDLv94CgwtuK7DDGU8q8g,2813
64
- mesa/experimental/__init__.py,sha256=32D_blj5droexwyh83MjPska0_xYzL1ncJFgyuyBaWs,905
64
+ mesa/experimental/__init__.py,sha256=hSGXGvsVANvqhgA994HcLBLIRC2WhSF3e_w2gvoCMUo,943
65
65
  mesa/experimental/cell_space/__init__.py,sha256=0A3YTen0Lk-e3Q73VEXK7N2UEHb9f50gW11H_jx7DXc,1744
66
66
  mesa/experimental/cell_space/cell.py,sha256=Dl0ek7W_vgAZOp6zXBvkwYTG7E36OQ-4zZ5bW43mKtw,6600
67
67
  mesa/experimental/cell_space/cell_agent.py,sha256=LOTLKR2To9hU-igKsauA5sikS7k8wgwlt-Pi0C7lGU0,4262
@@ -70,7 +70,10 @@ mesa/experimental/cell_space/discrete_space.py,sha256=qNGez9SV4E83Outs_12suuS0Zt
70
70
  mesa/experimental/cell_space/grid.py,sha256=d-1S2iXijGkoJ9yc271pB8iXlzsX13usJjcjevCs_rU,10432
71
71
  mesa/experimental/cell_space/network.py,sha256=ujN2dV1i9hcXh6H0s7gwTuPT6gh7BCaziOUYPCybQKk,1862
72
72
  mesa/experimental/cell_space/property_layer.py,sha256=HFpBWOjI7PFU_K8VDb_pl9h62MftCBWL7PUKQNT3Ke8,17379
73
- mesa/experimental/cell_space/voronoi.py,sha256=5D9j45FW2IVPcZrp-hskw_z84QwHIdduwXLdTKeqWMQ,10472
73
+ mesa/experimental/cell_space/voronoi.py,sha256=FXJD8ci81Jil3FaL7ZFNfMPGvXvg3uym5Ooo1ZqKSKs,10199
74
+ mesa/experimental/continuous_space/__init__.py,sha256=JkCkL4zZpe8c0GHqw4huM2-uoGOYqrCyt7J1M454kFA,269
75
+ mesa/experimental/continuous_space/continuous_space.py,sha256=UcD-nsi5oEAJzf8ZI7BU26FYn6DdJzsW-dgXqaZIrQk,9530
76
+ mesa/experimental/continuous_space/continuous_space_agents.py,sha256=859ypIiWMgjknTsER0i8Y6aCWjMpw6MC5cfoKa6l_iA,3044
74
77
  mesa/experimental/devs/__init__.py,sha256=wkDrpqQ3qHGqrsOSTD-UOj-qOw0oFgnCw_ZXr9xFs90,1200
75
78
  mesa/experimental/devs/eventlist.py,sha256=6igPkHJt-syLcdpFV14_n6HGej2F1cM9giDQo85fHPw,7217
76
79
  mesa/experimental/devs/simulator.py,sha256=UiVRIlNodSIveD2mS_8-vj0T_FulU8vhXxSxCfsK1Vc,12991
@@ -79,16 +82,16 @@ mesa/experimental/mesa_signals/mesa_signal.py,sha256=Vxo4gIV6a959MANL3RMANsGh0R9
79
82
  mesa/experimental/mesa_signals/observable_collections.py,sha256=rHEj6BYxLHFFGzSdoDKAdtzJ6y-IHHfcP3qEDJJsY6Y,3917
80
83
  mesa/experimental/mesa_signals/signals_util.py,sha256=fmq_FsIxsIvGjtmc4A9TGdBUtdliMHhEOpjRXivRDjA,1618
81
84
  mesa/visualization/__init__.py,sha256=YW-oHEOTjbtDKD_TylAMtVnt8mrsz1Fw7ifdc4WeHxA,743
82
- mesa/visualization/mpl_space_drawing.py,sha256=ZqZ-THsmdyTcwaUMik_S8990K8_FqliLeQMZwY45waM,20140
83
- mesa/visualization/solara_viz.py,sha256=BjhmH2FLlVc8rxfAze9Ex1wj_0jkVOH-_bXz2MYzd2A,19325
85
+ mesa/visualization/mpl_space_drawing.py,sha256=iqm1PYUUsmhUIraK8L9OTcTaDPDYQtlQCKtepREBA5c,20326
86
+ mesa/visualization/solara_viz.py,sha256=ItExWMLjg7rHb5RGlZx99YsuPhmC4i0ZCaY1MYzgqZ4,20931
84
87
  mesa/visualization/user_param.py,sha256=Dl2WOwLYLf0pfLpabCZtIdFRyKZrK6Qtc3utZx5GPYg,2139
85
88
  mesa/visualization/utils.py,sha256=lJHgRKF5BHLf72Tw3YpwyiWuRoIimaTKQ7xBCw_Rx3A,146
86
89
  mesa/visualization/components/__init__.py,sha256=Bq3nrPikcaIo9BSs0O3zptWVLlUmAkLo3s0mEmpH1RE,3022
87
90
  mesa/visualization/components/altair_components.py,sha256=wotpFFQgMY-ZR3lNVm_fRos-iDg0Wjnj6Tk67_7f1SQ,5847
88
91
  mesa/visualization/components/matplotlib_components.py,sha256=xQETaFyHIfmL_9JwrLIgubuIQ7-pp7TMoXT1WMmozus,5441
89
- mesa-3.1.1.dist-info/METADATA,sha256=s-5wsI5DiH4EK2qbn1UhNObxe-jB9hOoBvh5GwEU-eg,9906
90
- mesa-3.1.1.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
91
- mesa-3.1.1.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
92
- mesa-3.1.1.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
93
- mesa-3.1.1.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
94
- mesa-3.1.1.dist-info/RECORD,,
92
+ mesa-3.1.3.dist-info/METADATA,sha256=4-LYctEQ5WYoTPl1jXxSOrIn6vfKV4lLTR_l7byd7E8,9970
93
+ mesa-3.1.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
94
+ mesa-3.1.3.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
95
+ mesa-3.1.3.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
96
+ mesa-3.1.3.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
97
+ mesa-3.1.3.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.26.3
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any