Mesa 3.2.0.dev0__py3-none-any.whl → 3.3.0__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.
- mesa/__init__.py +1 -1
- mesa/agent.py +9 -7
- mesa/datacollection.py +1 -1
- mesa/examples/README.md +1 -1
- mesa/examples/__init__.py +2 -0
- mesa/examples/advanced/alliance_formation/Readme.md +50 -0
- mesa/examples/advanced/alliance_formation/__init__ .py +0 -0
- mesa/examples/advanced/alliance_formation/agents.py +20 -0
- mesa/examples/advanced/alliance_formation/app.py +71 -0
- mesa/examples/advanced/alliance_formation/model.py +184 -0
- mesa/examples/advanced/epstein_civil_violence/app.py +11 -11
- mesa/examples/advanced/pd_grid/Readme.md +4 -6
- mesa/examples/advanced/pd_grid/app.py +10 -11
- mesa/examples/advanced/sugarscape_g1mt/Readme.md +4 -5
- mesa/examples/advanced/sugarscape_g1mt/app.py +34 -16
- mesa/examples/advanced/wolf_sheep/Readme.md +2 -17
- mesa/examples/advanced/wolf_sheep/app.py +21 -18
- mesa/examples/basic/boid_flockers/Readme.md +6 -1
- mesa/examples/basic/boid_flockers/app.py +15 -11
- mesa/examples/basic/boltzmann_wealth_model/Readme.md +2 -12
- mesa/examples/basic/boltzmann_wealth_model/app.py +39 -32
- mesa/examples/basic/conways_game_of_life/Readme.md +1 -9
- mesa/examples/basic/conways_game_of_life/app.py +13 -16
- mesa/examples/basic/schelling/Readme.md +2 -10
- mesa/examples/basic/schelling/agents.py +9 -3
- mesa/examples/basic/schelling/app.py +50 -3
- mesa/examples/basic/schelling/model.py +2 -0
- mesa/examples/basic/schelling/resources/blue_happy.png +0 -0
- mesa/examples/basic/schelling/resources/blue_unhappy.png +0 -0
- mesa/examples/basic/schelling/resources/orange_happy.png +0 -0
- mesa/examples/basic/schelling/resources/orange_unhappy.png +0 -0
- mesa/examples/basic/virus_on_network/Readme.md +0 -4
- mesa/examples/basic/virus_on_network/app.py +31 -14
- mesa/experimental/__init__.py +2 -2
- mesa/experimental/continuous_space/continuous_space.py +1 -1
- mesa/experimental/meta_agents/__init__.py +25 -0
- mesa/experimental/meta_agents/meta_agent.py +387 -0
- mesa/model.py +3 -3
- mesa/space.py +4 -1
- mesa/visualization/__init__.py +2 -0
- mesa/visualization/backends/__init__.py +23 -0
- mesa/visualization/backends/abstract_renderer.py +97 -0
- mesa/visualization/backends/altair_backend.py +440 -0
- mesa/visualization/backends/matplotlib_backend.py +419 -0
- mesa/visualization/components/__init__.py +28 -8
- mesa/visualization/components/altair_components.py +86 -0
- mesa/visualization/components/matplotlib_components.py +4 -2
- mesa/visualization/components/portrayal_components.py +120 -0
- mesa/visualization/mpl_space_drawing.py +292 -129
- mesa/visualization/solara_viz.py +274 -32
- mesa/visualization/space_drawers.py +797 -0
- mesa/visualization/space_renderer.py +399 -0
- {mesa-3.2.0.dev0.dist-info → mesa-3.3.0.dist-info}/METADATA +13 -4
- {mesa-3.2.0.dev0.dist-info → mesa-3.3.0.dist-info}/RECORD +57 -40
- mesa/examples/advanced/sugarscape_g1mt/tests.py +0 -69
- {mesa-3.2.0.dev0.dist-info → mesa-3.3.0.dist-info}/WHEEL +0 -0
- {mesa-3.2.0.dev0.dist-info → mesa-3.3.0.dist-info}/licenses/LICENSE +0 -0
- {mesa-3.2.0.dev0.dist-info → mesa-3.3.0.dist-info}/licenses/NOTICE +0 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
"""Space rendering module for Mesa visualizations.
|
|
2
|
+
|
|
3
|
+
This module provides functionality to render Mesa model spaces with different
|
|
4
|
+
backends, supporting various space types and visualization components.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import contextlib
|
|
8
|
+
import warnings
|
|
9
|
+
from collections.abc import Callable
|
|
10
|
+
from typing import Literal
|
|
11
|
+
|
|
12
|
+
import altair as alt
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
|
|
16
|
+
import mesa
|
|
17
|
+
from mesa.discrete_space import (
|
|
18
|
+
OrthogonalMooreGrid,
|
|
19
|
+
OrthogonalVonNeumannGrid,
|
|
20
|
+
VoronoiGrid,
|
|
21
|
+
)
|
|
22
|
+
from mesa.space import (
|
|
23
|
+
ContinuousSpace,
|
|
24
|
+
HexMultiGrid,
|
|
25
|
+
HexSingleGrid,
|
|
26
|
+
MultiGrid,
|
|
27
|
+
NetworkGrid,
|
|
28
|
+
SingleGrid,
|
|
29
|
+
_HexGrid,
|
|
30
|
+
)
|
|
31
|
+
from mesa.visualization.backends import AltairBackend, MatplotlibBackend
|
|
32
|
+
from mesa.visualization.space_drawers import (
|
|
33
|
+
ContinuousSpaceDrawer,
|
|
34
|
+
HexSpaceDrawer,
|
|
35
|
+
NetworkSpaceDrawer,
|
|
36
|
+
OrthogonalSpaceDrawer,
|
|
37
|
+
VoronoiSpaceDrawer,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
OrthogonalGrid = SingleGrid | MultiGrid | OrthogonalMooreGrid | OrthogonalVonNeumannGrid
|
|
41
|
+
HexGrid = HexSingleGrid | HexMultiGrid | mesa.discrete_space.HexGrid
|
|
42
|
+
Network = NetworkGrid | mesa.discrete_space.Network
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class SpaceRenderer:
|
|
46
|
+
"""Renders Mesa spaces using different visualization backends.
|
|
47
|
+
|
|
48
|
+
Supports multiple space types and backends for flexible visualization
|
|
49
|
+
of agent-based models.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
model: mesa.Model,
|
|
55
|
+
backend: Literal["matplotlib", "altair"] | None = "matplotlib",
|
|
56
|
+
):
|
|
57
|
+
"""Initialize the space renderer.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
model (mesa.Model): The Mesa model to render.
|
|
61
|
+
backend (Literal["matplotlib", "altair"] | None): The visualization backend to use.
|
|
62
|
+
"""
|
|
63
|
+
self.space = getattr(model, "grid", getattr(model, "space", None))
|
|
64
|
+
|
|
65
|
+
self.space_drawer = self._get_space_drawer()
|
|
66
|
+
self.space_mesh = None
|
|
67
|
+
self.agent_mesh = None
|
|
68
|
+
self.propertylayer_mesh = None
|
|
69
|
+
|
|
70
|
+
self.post_process_func = None
|
|
71
|
+
# Keep track of whether post-processing has been applied
|
|
72
|
+
# to avoid multiple applications on the same axis.
|
|
73
|
+
self._post_process_applied = False
|
|
74
|
+
|
|
75
|
+
self.backend = backend
|
|
76
|
+
|
|
77
|
+
if backend == "matplotlib":
|
|
78
|
+
self.backend_renderer = MatplotlibBackend(
|
|
79
|
+
self.space_drawer,
|
|
80
|
+
)
|
|
81
|
+
elif backend == "altair":
|
|
82
|
+
self.backend_renderer = AltairBackend(
|
|
83
|
+
self.space_drawer,
|
|
84
|
+
)
|
|
85
|
+
else:
|
|
86
|
+
raise ValueError(f"Unsupported backend: {backend}")
|
|
87
|
+
|
|
88
|
+
self.backend_renderer.initialize_canvas()
|
|
89
|
+
|
|
90
|
+
def _get_space_drawer(self):
|
|
91
|
+
"""Get appropriate space drawer based on space type.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Space drawer instance for the model's space type.
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
ValueError: If the space type is not supported.
|
|
98
|
+
"""
|
|
99
|
+
if isinstance(self.space, HexGrid | _HexGrid):
|
|
100
|
+
return HexSpaceDrawer(self.space)
|
|
101
|
+
elif isinstance(self.space, OrthogonalGrid):
|
|
102
|
+
return OrthogonalSpaceDrawer(self.space)
|
|
103
|
+
elif isinstance(
|
|
104
|
+
self.space,
|
|
105
|
+
ContinuousSpace | mesa.experimental.continuous_space.ContinuousSpace,
|
|
106
|
+
):
|
|
107
|
+
return ContinuousSpaceDrawer(self.space)
|
|
108
|
+
elif isinstance(self.space, VoronoiGrid):
|
|
109
|
+
return VoronoiSpaceDrawer(self.space)
|
|
110
|
+
elif isinstance(self.space, Network):
|
|
111
|
+
return NetworkSpaceDrawer(self.space)
|
|
112
|
+
raise ValueError(
|
|
113
|
+
f"Unsupported space type: {type(self.space).__name__}. "
|
|
114
|
+
"Supported types are OrthogonalGrid, HexGrid, ContinuousSpace, VoronoiGrid, and Network."
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
def _map_coordinates(self, arguments):
|
|
118
|
+
"""Map agent coordinates to appropriate space coordinates.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
arguments (dict): Dictionary containing agent data with coordinates.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
dict: Dictionary with mapped coordinates appropriate for the space type.
|
|
125
|
+
"""
|
|
126
|
+
mapped_arguments = arguments.copy()
|
|
127
|
+
|
|
128
|
+
if isinstance(self.space, OrthogonalGrid | VoronoiGrid | ContinuousSpace):
|
|
129
|
+
# Use the coordinates directly for Orthogonal grids, Voronoi grids and Continuous spaces
|
|
130
|
+
mapped_arguments["loc"] = arguments["loc"].astype(float)
|
|
131
|
+
|
|
132
|
+
elif isinstance(self.space, HexGrid):
|
|
133
|
+
# Map rectangular coordinates to hexagonal grid coordinates
|
|
134
|
+
loc = arguments["loc"].astype(float)
|
|
135
|
+
if loc.size > 0:
|
|
136
|
+
# Calculate hexagon centers
|
|
137
|
+
loc[:, 0] = loc[:, 0] * self.space_drawer.x_spacing + (
|
|
138
|
+
(loc[:, 1] - 1) % 2
|
|
139
|
+
) * (self.space_drawer.x_spacing / 2)
|
|
140
|
+
loc[:, 1] = loc[:, 1] * self.space_drawer.y_spacing
|
|
141
|
+
mapped_arguments["loc"] = loc
|
|
142
|
+
|
|
143
|
+
elif isinstance(self.space, Network):
|
|
144
|
+
# Map coordinates for Network spaces
|
|
145
|
+
loc = arguments["loc"].astype(float)
|
|
146
|
+
pos = np.asarray(list(self.space_drawer.pos.values()))
|
|
147
|
+
# For network only both x and y contains the correct coordinates
|
|
148
|
+
# use one of them
|
|
149
|
+
x = loc[:, 0]
|
|
150
|
+
if x is None:
|
|
151
|
+
x = loc[:, 1]
|
|
152
|
+
|
|
153
|
+
# Ensure x is an integer index for the position mapping
|
|
154
|
+
x = x.astype(int)
|
|
155
|
+
|
|
156
|
+
# FIXME: Find better way to handle this case
|
|
157
|
+
# x updates before pos can, therefore gives us index error that
|
|
158
|
+
# needs to be ignored.
|
|
159
|
+
with contextlib.suppress(IndexError):
|
|
160
|
+
mapped_arguments["loc"] = pos[x]
|
|
161
|
+
|
|
162
|
+
return mapped_arguments
|
|
163
|
+
|
|
164
|
+
def draw_structure(self, **kwargs):
|
|
165
|
+
"""Draw the space structure.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
**kwargs: Additional keyword arguments for the drawing function.
|
|
169
|
+
Checkout respective `SpaceDrawer` class on details how to pass **kwargs.
|
|
170
|
+
|
|
171
|
+
Returns:
|
|
172
|
+
The visual representation of the space structure.
|
|
173
|
+
"""
|
|
174
|
+
# Store space_kwargs for internal use
|
|
175
|
+
self.space_kwargs = kwargs
|
|
176
|
+
|
|
177
|
+
self.space_mesh = self.backend_renderer.draw_structure(**self.space_kwargs)
|
|
178
|
+
return self.space_mesh
|
|
179
|
+
|
|
180
|
+
def draw_agents(self, agent_portrayal: Callable, **kwargs):
|
|
181
|
+
"""Draw agents on the space.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
agent_portrayal (Callable): Function that takes an agent and returns AgentPortrayalStyle.
|
|
185
|
+
**kwargs: Additional keyword arguments for the drawing function.
|
|
186
|
+
Checkout respective `SpaceDrawer` class on details how to pass **kwargs.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
The visual representation of the agents.
|
|
190
|
+
"""
|
|
191
|
+
# Store data for internal use
|
|
192
|
+
self.agent_portrayal = agent_portrayal
|
|
193
|
+
self.agent_kwargs = kwargs
|
|
194
|
+
|
|
195
|
+
# Prepare data for agent plotting
|
|
196
|
+
arguments = self.backend_renderer.collect_agent_data(
|
|
197
|
+
self.space, agent_portrayal, default_size=self.space_drawer.s_default
|
|
198
|
+
)
|
|
199
|
+
arguments = self._map_coordinates(arguments)
|
|
200
|
+
|
|
201
|
+
self.agent_mesh = self.backend_renderer.draw_agents(
|
|
202
|
+
arguments, **self.agent_kwargs
|
|
203
|
+
)
|
|
204
|
+
return self.agent_mesh
|
|
205
|
+
|
|
206
|
+
def draw_propertylayer(self, propertylayer_portrayal: Callable | dict):
|
|
207
|
+
"""Draw property layers on the space.
|
|
208
|
+
|
|
209
|
+
Args:
|
|
210
|
+
propertylayer_portrayal (Callable | dict): Function that returns PropertyLayerStyle
|
|
211
|
+
or dict with portrayal parameters.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
The visual representation of the property layers.
|
|
215
|
+
|
|
216
|
+
Raises:
|
|
217
|
+
Exception: If no property layers are found on the space.
|
|
218
|
+
"""
|
|
219
|
+
# Import here to avoid circular imports
|
|
220
|
+
from mesa.visualization.components import PropertyLayerStyle # noqa: PLC0415
|
|
221
|
+
|
|
222
|
+
def _dict_to_callable(portrayal_dict):
|
|
223
|
+
"""Convert legacy dict portrayal to callable.
|
|
224
|
+
|
|
225
|
+
Args:
|
|
226
|
+
portrayal_dict (dict): Dictionary with portrayal parameters.
|
|
227
|
+
|
|
228
|
+
Returns:
|
|
229
|
+
Callable: Function that returns PropertyLayerStyle.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
def style_callable(layer_object):
|
|
233
|
+
layer_name = layer_object.name
|
|
234
|
+
params = portrayal_dict.get(layer_name)
|
|
235
|
+
|
|
236
|
+
warnings.warn(
|
|
237
|
+
"Dict propertylayer_portrayal is deprecated. "
|
|
238
|
+
"Use a callable returning PropertyLayerStyle instead.",
|
|
239
|
+
PendingDeprecationWarning,
|
|
240
|
+
stacklevel=2,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
if params is None:
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
return PropertyLayerStyle(
|
|
247
|
+
color=params.get("color"),
|
|
248
|
+
colormap=params.get("colormap"),
|
|
249
|
+
alpha=params.get("alpha", PropertyLayerStyle.alpha),
|
|
250
|
+
vmin=params.get("vmin"),
|
|
251
|
+
vmax=params.get("vmax"),
|
|
252
|
+
colorbar=params.get("colorbar", PropertyLayerStyle.colorbar),
|
|
253
|
+
)
|
|
254
|
+
|
|
255
|
+
return style_callable
|
|
256
|
+
|
|
257
|
+
# Get property layers
|
|
258
|
+
try:
|
|
259
|
+
# old style spaces
|
|
260
|
+
property_layers = self.space.properties
|
|
261
|
+
except AttributeError:
|
|
262
|
+
# new style spaces
|
|
263
|
+
property_layers = self.space._mesa_property_layers
|
|
264
|
+
|
|
265
|
+
# Convert portrayal to callable if needed
|
|
266
|
+
if isinstance(propertylayer_portrayal, dict):
|
|
267
|
+
self.propertylayer_portrayal = _dict_to_callable(propertylayer_portrayal)
|
|
268
|
+
else:
|
|
269
|
+
self.propertylayer_portrayal = propertylayer_portrayal
|
|
270
|
+
|
|
271
|
+
number_of_propertylayers = sum(
|
|
272
|
+
[1 for layer in property_layers if layer != "empty"]
|
|
273
|
+
)
|
|
274
|
+
if number_of_propertylayers < 1:
|
|
275
|
+
raise Exception("No property layers were found on the space.")
|
|
276
|
+
|
|
277
|
+
self.propertylayer_mesh = self.backend_renderer.draw_propertylayer(
|
|
278
|
+
self.space, property_layers, self.propertylayer_portrayal
|
|
279
|
+
)
|
|
280
|
+
return self.propertylayer_mesh
|
|
281
|
+
|
|
282
|
+
def render(
|
|
283
|
+
self,
|
|
284
|
+
agent_portrayal: Callable | None = None,
|
|
285
|
+
propertylayer_portrayal: Callable | dict | None = None,
|
|
286
|
+
post_process: Callable | None = None,
|
|
287
|
+
**kwargs,
|
|
288
|
+
):
|
|
289
|
+
"""Render the complete space with structure, agents, and property layers.
|
|
290
|
+
|
|
291
|
+
It is an all-in-one method that draws everything required therefore eliminates
|
|
292
|
+
the need of calling each method separately, but has a drawback, if want to pass
|
|
293
|
+
kwargs to customize the drawing, they have to be broken into
|
|
294
|
+
space_kwargs and agent_kwargs.
|
|
295
|
+
|
|
296
|
+
Args:
|
|
297
|
+
agent_portrayal (Callable | None): Function that returns AgentPortrayalStyle.
|
|
298
|
+
If None, agents won't be drawn.
|
|
299
|
+
propertylayer_portrayal (Callable | dict | None): Function that returns
|
|
300
|
+
PropertyLayerStyle or dict with portrayal parameters. If None,
|
|
301
|
+
property layers won't be drawn.
|
|
302
|
+
post_process (Callable | None): Function to apply post-processing to the canvas.
|
|
303
|
+
**kwargs: Additional keyword arguments for drawing functions.
|
|
304
|
+
* ``space_kwargs`` (dict): Arguments for ``draw_structure()``.
|
|
305
|
+
* ``agent_kwargs`` (dict): Arguments for ``draw_agents()``.
|
|
306
|
+
"""
|
|
307
|
+
space_kwargs = kwargs.pop("space_kwargs", {})
|
|
308
|
+
agent_kwargs = kwargs.pop("agent_kwargs", {})
|
|
309
|
+
if self.space_mesh is None:
|
|
310
|
+
self.draw_structure(**space_kwargs)
|
|
311
|
+
if self.agent_mesh is None and agent_portrayal is not None:
|
|
312
|
+
self.draw_agents(agent_portrayal, **agent_kwargs)
|
|
313
|
+
if self.propertylayer_mesh is None and propertylayer_portrayal is not None:
|
|
314
|
+
self.draw_propertylayer(propertylayer_portrayal)
|
|
315
|
+
|
|
316
|
+
self.post_process_func = post_process
|
|
317
|
+
return self
|
|
318
|
+
|
|
319
|
+
@property
|
|
320
|
+
def canvas(self):
|
|
321
|
+
"""Get the current canvas object.
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
The backend-specific canvas object.
|
|
325
|
+
"""
|
|
326
|
+
if self.backend == "matplotlib":
|
|
327
|
+
ax = self.backend_renderer.ax
|
|
328
|
+
if ax is None:
|
|
329
|
+
self.backend_renderer.initialize_canvas()
|
|
330
|
+
return ax
|
|
331
|
+
|
|
332
|
+
elif self.backend == "altair":
|
|
333
|
+
structure = self.space_mesh if self.space_mesh else None
|
|
334
|
+
agents = self.agent_mesh if self.agent_mesh else None
|
|
335
|
+
prop_base, prop_cbar = self.propertylayer_mesh or (None, None)
|
|
336
|
+
|
|
337
|
+
if self.space_mesh:
|
|
338
|
+
structure = self.draw_structure(**self.space_kwargs)
|
|
339
|
+
if self.agent_mesh:
|
|
340
|
+
agents = self.draw_agents(self.agent_portrayal, **self.agent_kwargs)
|
|
341
|
+
if self.propertylayer_mesh:
|
|
342
|
+
prop_base, prop_cbar = self.draw_propertylayer(
|
|
343
|
+
self.propertylayer_portrayal
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
spatial_charts_list = [
|
|
347
|
+
chart for chart in [structure, prop_base, agents] if chart
|
|
348
|
+
]
|
|
349
|
+
|
|
350
|
+
main_spatial = None
|
|
351
|
+
if spatial_charts_list:
|
|
352
|
+
main_spatial = (
|
|
353
|
+
spatial_charts_list[0]
|
|
354
|
+
if len(spatial_charts_list) == 1
|
|
355
|
+
else alt.layer(*spatial_charts_list)
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
# Determine final chart by combining with color bar if present
|
|
359
|
+
final_chart = None
|
|
360
|
+
if main_spatial and prop_cbar:
|
|
361
|
+
final_chart = alt.vconcat(main_spatial, prop_cbar).configure_view(
|
|
362
|
+
stroke=None
|
|
363
|
+
)
|
|
364
|
+
elif main_spatial: # Only main_spatial, no prop_cbar
|
|
365
|
+
final_chart = main_spatial
|
|
366
|
+
elif prop_cbar: # Only prop_cbar, no main_spatial
|
|
367
|
+
final_chart = prop_cbar
|
|
368
|
+
final_chart = final_chart.configure_view(grid=False)
|
|
369
|
+
|
|
370
|
+
if final_chart is None:
|
|
371
|
+
# If no charts are available, return an empty chart
|
|
372
|
+
final_chart = (
|
|
373
|
+
alt.Chart(pd.DataFrame())
|
|
374
|
+
.mark_point()
|
|
375
|
+
.properties(width=450, height=350)
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
final_chart = final_chart.configure_view(stroke="black", strokeWidth=1.5)
|
|
379
|
+
|
|
380
|
+
return final_chart
|
|
381
|
+
|
|
382
|
+
@property
|
|
383
|
+
def post_process(self):
|
|
384
|
+
"""Get the current post-processing function.
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
Callable | None: The post-processing function, or None if not set.
|
|
388
|
+
"""
|
|
389
|
+
return self.post_process_func
|
|
390
|
+
|
|
391
|
+
@post_process.setter
|
|
392
|
+
def post_process(self, func: Callable | None):
|
|
393
|
+
"""Set the post-processing function.
|
|
394
|
+
|
|
395
|
+
Args:
|
|
396
|
+
func (Callable | None): Function to apply post-processing to the canvas.
|
|
397
|
+
Should accept the canvas object as its first argument.
|
|
398
|
+
"""
|
|
399
|
+
self.post_process_func = func
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: Mesa
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.0
|
|
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
|
|
@@ -24,19 +24,24 @@ Classifier: Topic :: Scientific/Engineering :: Artificial Life
|
|
|
24
24
|
Requires-Python: >=3.11
|
|
25
25
|
Requires-Dist: numpy
|
|
26
26
|
Requires-Dist: pandas
|
|
27
|
+
Requires-Dist: pythran>=0.17.0; sys_platform == 'darwin'
|
|
27
28
|
Requires-Dist: scipy
|
|
28
29
|
Requires-Dist: tqdm
|
|
29
30
|
Provides-Extra: all
|
|
30
31
|
Requires-Dist: altair; extra == 'all'
|
|
31
32
|
Requires-Dist: ipython; extra == 'all'
|
|
33
|
+
Requires-Dist: ipython>=9.2.0; extra == 'all'
|
|
32
34
|
Requires-Dist: matplotlib; extra == 'all'
|
|
33
35
|
Requires-Dist: myst-nb; extra == 'all'
|
|
34
36
|
Requires-Dist: myst-parser; extra == 'all'
|
|
35
37
|
Requires-Dist: networkx; extra == 'all'
|
|
38
|
+
Requires-Dist: playwright; extra == 'all'
|
|
36
39
|
Requires-Dist: pydata-sphinx-theme; extra == 'all'
|
|
37
40
|
Requires-Dist: pytest; extra == 'all'
|
|
38
41
|
Requires-Dist: pytest-cov; extra == 'all'
|
|
42
|
+
Requires-Dist: pytest-ipywidgets; extra == 'all'
|
|
39
43
|
Requires-Dist: pytest-mock; extra == 'all'
|
|
44
|
+
Requires-Dist: pytest-playwright; extra == 'all'
|
|
40
45
|
Requires-Dist: ruff; extra == 'all'
|
|
41
46
|
Requires-Dist: scipy; extra == 'all'
|
|
42
47
|
Requires-Dist: seaborn; extra == 'all'
|
|
@@ -45,11 +50,15 @@ Requires-Dist: sphinx; extra == 'all'
|
|
|
45
50
|
Requires-Dist: sphinx-copybutton; extra == 'all'
|
|
46
51
|
Provides-Extra: dev
|
|
47
52
|
Requires-Dist: altair; extra == 'dev'
|
|
53
|
+
Requires-Dist: ipython>=9.2.0; extra == 'dev'
|
|
48
54
|
Requires-Dist: matplotlib; extra == 'dev'
|
|
49
55
|
Requires-Dist: networkx; extra == 'dev'
|
|
56
|
+
Requires-Dist: playwright; extra == 'dev'
|
|
50
57
|
Requires-Dist: pytest; extra == 'dev'
|
|
51
58
|
Requires-Dist: pytest-cov; extra == 'dev'
|
|
59
|
+
Requires-Dist: pytest-ipywidgets; extra == 'dev'
|
|
52
60
|
Requires-Dist: pytest-mock; extra == 'dev'
|
|
61
|
+
Requires-Dist: pytest-playwright; extra == 'dev'
|
|
53
62
|
Requires-Dist: ruff; extra == 'dev'
|
|
54
63
|
Requires-Dist: solara; extra == 'dev'
|
|
55
64
|
Requires-Dist: sphinx; extra == 'dev'
|
|
@@ -125,13 +134,13 @@ pip install -U mesa
|
|
|
125
134
|
Starting with Mesa 3.0, we don't install all our dependencies anymore by default.
|
|
126
135
|
```bash
|
|
127
136
|
# You can customize the additional dependencies you need, if you want. Available are:
|
|
128
|
-
pip install -U mesa[network,viz]
|
|
137
|
+
pip install -U "mesa[network,viz]"
|
|
129
138
|
|
|
130
139
|
# This is equivalent to our recommended dependencies:
|
|
131
|
-
pip install -U mesa[rec]
|
|
140
|
+
pip install -U "mesa[rec]"
|
|
132
141
|
|
|
133
142
|
# To install all, including developer, dependencies:
|
|
134
|
-
pip install -U mesa[all]
|
|
143
|
+
pip install -U "mesa[all]"
|
|
135
144
|
```
|
|
136
145
|
|
|
137
146
|
You can also use `pip` to install the latest GitHub version:
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
mesa/__init__.py,sha256=
|
|
2
|
-
mesa/agent.py,sha256=
|
|
1
|
+
mesa/__init__.py,sha256=h25vcSmnMDIvmR2LQL6urke1lrEXpiH-33STC8sXKKY,678
|
|
2
|
+
mesa/agent.py,sha256=OC1OiZoIe4jOyQmx__ijXSr82RmekAkJWihcrv4tEf0,26648
|
|
3
3
|
mesa/batchrunner.py,sha256=ZeBOQw6-SLnECMUyKSRThh7vecP0DV6F6fGGk8UAboA,8041
|
|
4
|
-
mesa/datacollection.py,sha256=
|
|
4
|
+
mesa/datacollection.py,sha256=yZhFeQbwIuncIJ5O3mQB69TS2boqncAM-e0nlUxO2X4,18500
|
|
5
5
|
mesa/mesa_logging.py,sha256=PEDqUaQ2Y4bkYBkrHVkGT0sF86gUdbSH1T3vCg3qQeE,4949
|
|
6
|
-
mesa/model.py,sha256=
|
|
7
|
-
mesa/space.py,sha256=
|
|
6
|
+
mesa/model.py,sha256=8QZoE8Dy-S7MGznhoeHHT1S8VeUh-UbzcBroJqlXkRY,8365
|
|
7
|
+
mesa/space.py,sha256=A3MDPhjh-0CUQavFGkspfRGA2QQ_rgTuAPvDvHGSVKs,63939
|
|
8
8
|
mesa/discrete_space/__init__.py,sha256=wXVr3eUpJAK-Y9DRlsQxhnQAxWLsrA7X6X9QhukDyTI,1672
|
|
9
9
|
mesa/discrete_space/cell.py,sha256=lok80RMnby09pxbJA631v14XmrfObwxfpw8EOkcwzao,7222
|
|
10
10
|
mesa/discrete_space/cell_agent.py,sha256=jSGP0xLVgdAx434piwQ9cQqUnPQSlFtJkiDibPWKXe0,4253
|
|
@@ -14,66 +14,74 @@ mesa/discrete_space/grid.py,sha256=HEakDqB8mzS21PpCjcgUx2JBJTID5Ji82xmXLZ3wOr0,1
|
|
|
14
14
|
mesa/discrete_space/network.py,sha256=Qa29Uj1bEuMrvN9xg0oizaCM-daALjWjqr2z4nPPqFY,2598
|
|
15
15
|
mesa/discrete_space/property_layer.py,sha256=8W6CsB-CtB5m1kncysS7hFG2Vf6lbCrSOsyJrVMDpYs,16755
|
|
16
16
|
mesa/discrete_space/voronoi.py,sha256=DtJPmHHRVccBc73U1QvUSUCdjN55SGOJ5FL-GjoELMk,10181
|
|
17
|
-
mesa/examples/README.md,sha256=
|
|
18
|
-
mesa/examples/__init__.py,sha256=
|
|
17
|
+
mesa/examples/README.md,sha256=yJumn3Go4nh1oZgTUlqFGMTRYAcTnIPp-jmLFK0Mlws,3261
|
|
18
|
+
mesa/examples/__init__.py,sha256=UGZF04lEg5NtEumSYKgaXxKdh5BA8ixFqW9pO0omMv0,940
|
|
19
19
|
mesa/examples/advanced/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
+
mesa/examples/advanced/alliance_formation/Readme.md,sha256=A0pNRDNleAYxFbcWVHf7n3R_qsdNCLmK6NOnDXzcUTc,3223
|
|
21
|
+
mesa/examples/advanced/alliance_formation/__init__ .py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
+
mesa/examples/advanced/alliance_formation/agents.py,sha256=EQubhQX8yjhSD1OYyL4t9CfoTQ-8fJ78HH3kIsLdOwk,463
|
|
23
|
+
mesa/examples/advanced/alliance_formation/app.py,sha256=3nv4zctmSmP2CLnjbXvXlSi-gsz7jPLmwh_VFEPmBdU,2047
|
|
24
|
+
mesa/examples/advanced/alliance_formation/model.py,sha256=iMfb84uIA9s8ilfZKRLZlaGNrWeaqY1qS_gnd0rNq_o,7029
|
|
20
25
|
mesa/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb,sha256=yh50ZAK2BVJyJIKsQTTxywnasqWn1IiQUVrwmZKue4w,29032
|
|
21
26
|
mesa/examples/advanced/epstein_civil_violence/Readme.md,sha256=RXuGIZAibz3KVkP51PGjwzcRx2R9Ettmh3qbDTPqDcg,1735
|
|
22
27
|
mesa/examples/advanced/epstein_civil_violence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
28
|
mesa/examples/advanced/epstein_civil_violence/agents.py,sha256=SMYKkKhNlMCXk-gmeakesxstqB-jpY44FtS8CiMl0l8,5854
|
|
24
|
-
mesa/examples/advanced/epstein_civil_violence/app.py,sha256=
|
|
29
|
+
mesa/examples/advanced/epstein_civil_violence/app.py,sha256=8uRRzNg7UY0ST1f_K69B9YpLonqmiUG1r6UsK-KHPSM,1991
|
|
25
30
|
mesa/examples/advanced/epstein_civil_violence/model.py,sha256=_ds6Wrq2Zf66VSxamTN5gK8A3itHU5DEVcydA--hlkY,3909
|
|
26
|
-
mesa/examples/advanced/pd_grid/Readme.md,sha256=
|
|
31
|
+
mesa/examples/advanced/pd_grid/Readme.md,sha256=weEQe1qZBKUYBj3J3WyGbRHa5Ia1zje18SFctZm3esE,2242
|
|
27
32
|
mesa/examples/advanced/pd_grid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
33
|
mesa/examples/advanced/pd_grid/agents.py,sha256=giX63EUq3TzJt916dglTSMsdzkIdtyOmwSoj2ynUQ2c,1743
|
|
29
34
|
mesa/examples/advanced/pd_grid/analysis.ipynb,sha256=TTSY7mZlIYPjPjpW7cxr7Gzpo-NKKEBpXX4_f0V6NfI,5432
|
|
30
|
-
mesa/examples/advanced/pd_grid/app.py,sha256
|
|
35
|
+
mesa/examples/advanced/pd_grid/app.py,sha256=LQkXW0zsiTuvSQRK0RCABkxfhB04KFV_dYB3gjbbCy4,1556
|
|
31
36
|
mesa/examples/advanced/pd_grid/model.py,sha256=2YrTVNVThIf0FH1vKbYef0IYeJiR8Ws6eepsH6UjMLQ,2282
|
|
32
|
-
mesa/examples/advanced/sugarscape_g1mt/Readme.md,sha256=
|
|
37
|
+
mesa/examples/advanced/sugarscape_g1mt/Readme.md,sha256=_q52DMprCQGELsPCJ_jAJ6cFHBc8sE7L8WIa4a3LQPs,3535
|
|
33
38
|
mesa/examples/advanced/sugarscape_g1mt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
39
|
mesa/examples/advanced/sugarscape_g1mt/agents.py,sha256=foix7_00fFop6GLl5uEu1_bmeQ5oH04Fcc9-E06WWkk,8457
|
|
35
|
-
mesa/examples/advanced/sugarscape_g1mt/app.py,sha256=
|
|
40
|
+
mesa/examples/advanced/sugarscape_g1mt/app.py,sha256=CFfM75mcroo16Tt1-tROUOwANNYj9lloLMFLI_B0Pts,2518
|
|
36
41
|
mesa/examples/advanced/sugarscape_g1mt/model.py,sha256=VwHaLuqrX8g6XP3wHw16Opu5vaW-kyL31pe7Mja-HvQ,5745
|
|
37
42
|
mesa/examples/advanced/sugarscape_g1mt/sugar-map.txt,sha256=zZtGYciBPT4miZVnbVuoQ5TugTmGrbDWV9yb5KH6tnU,5000
|
|
38
|
-
mesa/examples/advanced/
|
|
39
|
-
mesa/examples/advanced/wolf_sheep/Readme.md,sha256=6zrtCg4Fb-hgQxqdLMpTkIYMwD6owCv8BMz_qn0N98Q,3165
|
|
43
|
+
mesa/examples/advanced/wolf_sheep/Readme.md,sha256=oLJSJ1o7WnExDWts8CRKyxVOMeCcp8rGZzvjufpnKZc,2736
|
|
40
44
|
mesa/examples/advanced/wolf_sheep/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
45
|
mesa/examples/advanced/wolf_sheep/agents.py,sha256=kqW8ITdFHtkMqF5auHoP0dHUbXk-rSMt4XI340NZ5Qg,5081
|
|
42
|
-
mesa/examples/advanced/wolf_sheep/app.py,sha256=
|
|
46
|
+
mesa/examples/advanced/wolf_sheep/app.py,sha256=VCWb9OwZjqHsTOJ6BZxnaxgmbe01yhV6j6BruHtOO98,2584
|
|
43
47
|
mesa/examples/advanced/wolf_sheep/model.py,sha256=mHmn5r9EdRtoOGSbubcKtlSBClKmjDIri8uhcokIeBE,4558
|
|
44
48
|
mesa/examples/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
-
mesa/examples/basic/boid_flockers/Readme.md,sha256=
|
|
49
|
+
mesa/examples/basic/boid_flockers/Readme.md,sha256=z4p0KZmVpH0JK2M-xnAZM7LSoRdjjR7qGe1OPOq2BzQ,873
|
|
46
50
|
mesa/examples/basic/boid_flockers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
51
|
mesa/examples/basic/boid_flockers/agents.py,sha256=oA0A0NilTHi0XYouYaNcMSmpKDdNYPwfS96FNqRuTUI,3309
|
|
48
|
-
mesa/examples/basic/boid_flockers/app.py,sha256=
|
|
52
|
+
mesa/examples/basic/boid_flockers/app.py,sha256=QKmIN0BIr_AzV0EwW-4sBUgJSQvGuXndY7FCJV4wDBU,1964
|
|
49
53
|
mesa/examples/basic/boid_flockers/model.py,sha256=RQh9GfsSPvshUQedlmEEjk1dJHuyL8o4VWiAamgH1EU,3551
|
|
50
|
-
mesa/examples/basic/boltzmann_wealth_model/Readme.md,sha256=
|
|
54
|
+
mesa/examples/basic/boltzmann_wealth_model/Readme.md,sha256=tif1-GDqTGkSAYAYgMf3D3nxT3kYeZ3gCLPvuivQxsI,1956
|
|
51
55
|
mesa/examples/basic/boltzmann_wealth_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
52
56
|
mesa/examples/basic/boltzmann_wealth_model/agents.py,sha256=GF4mNEjqLS4Vg4vtdeDAetby_t69J-LcFhtQIMOBDNU,1330
|
|
53
|
-
mesa/examples/basic/boltzmann_wealth_model/app.py,sha256=
|
|
57
|
+
mesa/examples/basic/boltzmann_wealth_model/app.py,sha256=ooOyJO27R0ISWWAhUJB98DNbHaE4yY9KncoMVy8FKHg,2442
|
|
54
58
|
mesa/examples/basic/boltzmann_wealth_model/model.py,sha256=9d-x5Y2T49R4Pt1u7lY63Z0y8impZ2f47_ahrxohvaY,2828
|
|
55
59
|
mesa/examples/basic/boltzmann_wealth_model/st_app.py,sha256=PQ65LkYPXn-lx4lCfXuFJmzcmAfVB3oEEdIyuq9a7iU,3454
|
|
56
|
-
mesa/examples/basic/conways_game_of_life/Readme.md,sha256=
|
|
60
|
+
mesa/examples/basic/conways_game_of_life/Readme.md,sha256=SylexP0Owrq1n_v5mJJyqs3wFeKtOMB0pLh0oLDOcV8,1256
|
|
57
61
|
mesa/examples/basic/conways_game_of_life/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
58
62
|
mesa/examples/basic/conways_game_of_life/agents.py,sha256=pByQeucyW5UDBnl90xbRGJJNJHpM8NLuqSmft5AkVN0,1766
|
|
59
|
-
mesa/examples/basic/conways_game_of_life/app.py,sha256=
|
|
63
|
+
mesa/examples/basic/conways_game_of_life/app.py,sha256=tt1W_RVHu_erojvOSdtyNsVLyW8qXgJFU7F1As3xVwc,1843
|
|
60
64
|
mesa/examples/basic/conways_game_of_life/model.py,sha256=GGHg8Qni1R4RGQrfvJcsqG6btNTuQhCWOwS_9crU6tc,1269
|
|
61
65
|
mesa/examples/basic/conways_game_of_life/st_app.py,sha256=9qz3o0pOuvLZR-_aPPVHN-RIwFSNzvwWWfxCaD2K5cs,2402
|
|
62
|
-
mesa/examples/basic/schelling/Readme.md,sha256=
|
|
66
|
+
mesa/examples/basic/schelling/Readme.md,sha256=7VUHfl58BvE08XkqprNPNwHyOhyturKnt2kquizXFzM,1883
|
|
63
67
|
mesa/examples/basic/schelling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
64
|
-
mesa/examples/basic/schelling/agents.py,sha256=
|
|
68
|
+
mesa/examples/basic/schelling/agents.py,sha256=WQbyTT4nlnQvkNHTs4ynlTvSKeQ2EvfW7JcPUf-R5Z0,1669
|
|
65
69
|
mesa/examples/basic/schelling/analysis.ipynb,sha256=UMDoumvBFhZilwJhxl5Mou2bmDDqxguK5RdnoY2gkNc,5910
|
|
66
|
-
mesa/examples/basic/schelling/app.py,sha256=
|
|
67
|
-
mesa/examples/basic/schelling/model.py,sha256=
|
|
68
|
-
mesa/examples/basic/
|
|
70
|
+
mesa/examples/basic/schelling/app.py,sha256=97RpHp2BTdJdJzP-f6WRHo9k7jxBkCBQp5nKC8nNasU,2523
|
|
71
|
+
mesa/examples/basic/schelling/model.py,sha256=NFXvFjAQ-0rEwsMI0UWmL3WgMm071Yg0YOxnNQQA0sc,2790
|
|
72
|
+
mesa/examples/basic/schelling/resources/blue_happy.png,sha256=5x-_Klytq-wui1-xtgWxXTIkJQ0IwZ5pLtiG7g-RSbk,4053
|
|
73
|
+
mesa/examples/basic/schelling/resources/blue_unhappy.png,sha256=cfD4Rmk-B6-4XDJtjo4c1pwEoKmlZ1O95ZdE7TNa9q4,4054
|
|
74
|
+
mesa/examples/basic/schelling/resources/orange_happy.png,sha256=6P-W83hxOxrDfbTzsZUdFrqRQQp9k8qcTCSNJ4XQyFM,3406
|
|
75
|
+
mesa/examples/basic/schelling/resources/orange_unhappy.png,sha256=amITDukQoQIO4vEyEQP96UIGQa_9dYWiraYsz8TWvHY,3409
|
|
76
|
+
mesa/examples/basic/virus_on_network/Readme.md,sha256=h3yGmF9Jl7rCuRGnXJoPqxQPs9Nr-KCMIGs3l8JYQG8,2197
|
|
69
77
|
mesa/examples/basic/virus_on_network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
78
|
mesa/examples/basic/virus_on_network/agents.py,sha256=yVPZCiKI53qXlsUus3vdNZ39IG0cLoY2wQXeYZHiahs,1814
|
|
71
|
-
mesa/examples/basic/virus_on_network/app.py,sha256=
|
|
79
|
+
mesa/examples/basic/virus_on_network/app.py,sha256=njeBwy-_2j-tw8Yjfqm5fXyZHDm8HsEY4NlOCLKLk08,3069
|
|
72
80
|
mesa/examples/basic/virus_on_network/model.py,sha256=sljdQlTPeUCbmWSxnCJJv706lN3uVMF8pS1gAMNHreM,2543
|
|
73
|
-
mesa/experimental/__init__.py,sha256=
|
|
81
|
+
mesa/experimental/__init__.py,sha256=9q6lv_NDYoWuKBzBzMdbisdxvzA-T5L6xT8quSArNT4,945
|
|
74
82
|
mesa/experimental/cell_space/__init__.py,sha256=IOXd0RcJP34kaHvEHv_AeN7PGpvoYPpaZYsx3Mz8dNo,1872
|
|
75
83
|
mesa/experimental/continuous_space/__init__.py,sha256=JkCkL4zZpe8c0GHqw4huM2-uoGOYqrCyt7J1M454kFA,269
|
|
76
|
-
mesa/experimental/continuous_space/continuous_space.py,sha256=
|
|
84
|
+
mesa/experimental/continuous_space/continuous_space.py,sha256=IFsX3iZ3GTyHmfIqjtEyi7H9oLN7NkX4QaqmNl_JhQc,9531
|
|
77
85
|
mesa/experimental/continuous_space/continuous_space_agents.py,sha256=859ypIiWMgjknTsER0i8Y6aCWjMpw6MC5cfoKa6l_iA,3044
|
|
78
86
|
mesa/experimental/devs/__init__.py,sha256=wkDrpqQ3qHGqrsOSTD-UOj-qOw0oFgnCw_ZXr9xFs90,1200
|
|
79
87
|
mesa/experimental/devs/eventlist.py,sha256=6igPkHJt-syLcdpFV14_n6HGej2F1cM9giDQo85fHPw,7217
|
|
@@ -82,17 +90,26 @@ mesa/experimental/mesa_signals/__init__.py,sha256=QjG4FSKQl5ZSzV9ctiaB7UqYDR3FAR
|
|
|
82
90
|
mesa/experimental/mesa_signals/mesa_signal.py,sha256=Vxo4gIV6a959MANL3RMANsGh0R9lkZTNO19XIYzvKSM,16860
|
|
83
91
|
mesa/experimental/mesa_signals/observable_collections.py,sha256=rHEj6BYxLHFFGzSdoDKAdtzJ6y-IHHfcP3qEDJJsY6Y,3917
|
|
84
92
|
mesa/experimental/mesa_signals/signals_util.py,sha256=fmq_FsIxsIvGjtmc4A9TGdBUtdliMHhEOpjRXivRDjA,1618
|
|
85
|
-
mesa/
|
|
93
|
+
mesa/experimental/meta_agents/__init__.py,sha256=UpX_1WpmXtg4iKdPTcPVViCt1H9fRydA-l3a6i4KR1w,949
|
|
94
|
+
mesa/experimental/meta_agents/meta_agent.py,sha256=v9a09hU3kgKQdgjk5v5DDOaRCqEh_A8Xhzu9V185kZU,14801
|
|
95
|
+
mesa/visualization/__init__.py,sha256=qt05BmHoTWWKdvdSOC7u2JSpJnK0RX9Eq9axO6K2pqU,793
|
|
86
96
|
mesa/visualization/command_console.py,sha256=-sVNYdXxmc5diQyqfFHUByzVSOpP3eoPcdLL2J6gwD4,17086
|
|
87
|
-
mesa/visualization/mpl_space_drawing.py,sha256=
|
|
88
|
-
mesa/visualization/solara_viz.py,sha256=
|
|
97
|
+
mesa/visualization/mpl_space_drawing.py,sha256=_s8YW0cQdcH3wt7o8mnmP7g6LizJB02zlveiGv74_UA,30135
|
|
98
|
+
mesa/visualization/solara_viz.py,sha256=X9pL-HxzHj8dd4OnjCQOKO2RtK9LiYLinRKQ--6uEOg,35056
|
|
99
|
+
mesa/visualization/space_drawers.py,sha256=B7LwovR7v6tXDIIasS_rjduvXFUkeMO6ZidunLWmhVs,26755
|
|
100
|
+
mesa/visualization/space_renderer.py,sha256=FDFDfWP-3WuXIbdZ8CNmAIXr9Vd-La8_PBjF3-_YmOY,14602
|
|
89
101
|
mesa/visualization/user_param.py,sha256=Dl2WOwLYLf0pfLpabCZtIdFRyKZrK6Qtc3utZx5GPYg,2139
|
|
90
102
|
mesa/visualization/utils.py,sha256=lJHgRKF5BHLf72Tw3YpwyiWuRoIimaTKQ7xBCw_Rx3A,146
|
|
91
|
-
mesa/visualization/
|
|
92
|
-
mesa/visualization/
|
|
93
|
-
mesa/visualization/
|
|
94
|
-
mesa
|
|
95
|
-
mesa
|
|
96
|
-
mesa
|
|
97
|
-
mesa
|
|
98
|
-
mesa
|
|
103
|
+
mesa/visualization/backends/__init__.py,sha256=U37F-zfULEQONawWNbsHMozEvWVWSJCJyhXTVRtap6c,590
|
|
104
|
+
mesa/visualization/backends/abstract_renderer.py,sha256=ckNqGiloS0KMrau-a7o0I1FZ1DcCqG1GedJU11lA7Oc,3216
|
|
105
|
+
mesa/visualization/backends/altair_backend.py,sha256=7lyTYR_at-BIIswm8Uqt77O_5DRrq0zV3TNHSEZHMW4,16031
|
|
106
|
+
mesa/visualization/backends/matplotlib_backend.py,sha256=aqh3IWhTEVwz09etu5oYRz6GL1FmZgy6b_hx9J4GWPI,15378
|
|
107
|
+
mesa/visualization/components/__init__.py,sha256=5_nUk0UzuVEYHXJ-kjsIZQLRvef-gbYBoiXCZd81kGQ,3524
|
|
108
|
+
mesa/visualization/components/altair_components.py,sha256=BuEwvWaMs4EMggRWn1upws4uNsVYSrr1k_IYl4UqT2U,18999
|
|
109
|
+
mesa/visualization/components/matplotlib_components.py,sha256=KfzP7eLT0d3Tqb2JatJ8IfpalyX8lveo6U3IC0EvvB8,5567
|
|
110
|
+
mesa/visualization/components/portrayal_components.py,sha256=FlLz_dZFXiaQobvfpfWsFAUgy4cnHs2R0tm6JikM0mU,4870
|
|
111
|
+
mesa-3.3.0.dist-info/METADATA,sha256=082hZvTM8-_aEHvR99yquciB_9aTbOq66Z-7YjGGTGA,11135
|
|
112
|
+
mesa-3.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
113
|
+
mesa-3.3.0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
114
|
+
mesa-3.3.0.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
|
|
115
|
+
mesa-3.3.0.dist-info/RECORD,,
|