Mesa 3.1.0.dev0__py3-none-any.whl → 3.1.2__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 (60) hide show
  1. mesa/__init__.py +3 -3
  2. mesa/agent.py +48 -0
  3. mesa/batchrunner.py +14 -1
  4. mesa/datacollection.py +1 -6
  5. mesa/examples/__init__.py +2 -2
  6. mesa/examples/advanced/epstein_civil_violence/app.py +5 -0
  7. mesa/examples/advanced/pd_grid/agents.py +2 -1
  8. mesa/examples/advanced/pd_grid/analysis.ipynb +44 -89
  9. mesa/examples/advanced/pd_grid/app.py +5 -0
  10. mesa/examples/advanced/pd_grid/model.py +3 -5
  11. mesa/examples/advanced/sugarscape_g1mt/agents.py +12 -65
  12. mesa/examples/advanced/sugarscape_g1mt/app.py +24 -19
  13. mesa/examples/advanced/sugarscape_g1mt/model.py +45 -52
  14. mesa/examples/advanced/wolf_sheep/agents.py +36 -2
  15. mesa/examples/advanced/wolf_sheep/model.py +17 -16
  16. mesa/examples/basic/boid_flockers/app.py +5 -0
  17. mesa/examples/basic/boltzmann_wealth_model/app.py +8 -5
  18. mesa/examples/basic/boltzmann_wealth_model/st_app.py +1 -1
  19. mesa/examples/basic/conways_game_of_life/app.py +5 -0
  20. mesa/examples/basic/conways_game_of_life/st_app.py +2 -2
  21. mesa/examples/basic/schelling/agents.py +11 -5
  22. mesa/examples/basic/schelling/analysis.ipynb +42 -36
  23. mesa/examples/basic/schelling/app.py +6 -1
  24. mesa/examples/basic/schelling/model.py +3 -3
  25. mesa/examples/basic/virus_on_network/app.py +5 -0
  26. mesa/experimental/__init__.py +17 -10
  27. mesa/experimental/cell_space/__init__.py +19 -7
  28. mesa/experimental/cell_space/cell.py +22 -37
  29. mesa/experimental/cell_space/cell_agent.py +12 -1
  30. mesa/experimental/cell_space/cell_collection.py +18 -3
  31. mesa/experimental/cell_space/discrete_space.py +15 -64
  32. mesa/experimental/cell_space/grid.py +74 -4
  33. mesa/experimental/cell_space/network.py +13 -1
  34. mesa/experimental/cell_space/property_layer.py +444 -0
  35. mesa/experimental/cell_space/voronoi.py +13 -1
  36. mesa/experimental/devs/__init__.py +20 -2
  37. mesa/experimental/devs/eventlist.py +19 -1
  38. mesa/experimental/devs/simulator.py +24 -8
  39. mesa/experimental/mesa_signals/__init__.py +23 -0
  40. mesa/experimental/mesa_signals/mesa_signal.py +485 -0
  41. mesa/experimental/mesa_signals/observable_collections.py +133 -0
  42. mesa/experimental/mesa_signals/signals_util.py +52 -0
  43. mesa/mesa_logging.py +190 -0
  44. mesa/model.py +17 -23
  45. mesa/visualization/__init__.py +2 -2
  46. mesa/visualization/mpl_space_drawing.py +8 -6
  47. mesa/visualization/solara_viz.py +49 -11
  48. {mesa-3.1.0.dev0.dist-info → mesa-3.1.2.dist-info}/METADATA +4 -2
  49. mesa-3.1.2.dist-info/RECORD +94 -0
  50. {mesa-3.1.0.dev0.dist-info → mesa-3.1.2.dist-info}/WHEEL +1 -1
  51. mesa/experimental/UserParam.py +0 -67
  52. mesa/experimental/components/altair.py +0 -81
  53. mesa/experimental/components/matplotlib.py +0 -242
  54. mesa/experimental/devs/examples/epstein_civil_violence.py +0 -305
  55. mesa/experimental/devs/examples/wolf_sheep.py +0 -250
  56. mesa/experimental/solara_viz.py +0 -453
  57. mesa-3.1.0.dev0.dist-info/RECORD +0 -94
  58. {mesa-3.1.0.dev0.dist-info → mesa-3.1.2.dist-info}/entry_points.txt +0 -0
  59. {mesa-3.1.0.dev0.dist-info → mesa-3.1.2.dist-info}/licenses/LICENSE +0 -0
  60. {mesa-3.1.0.dev0.dist-info → mesa-3.1.2.dist-info}/licenses/NOTICE +0 -0
@@ -1,453 +0,0 @@
1
- """Mesa visualization module for creating interactive model visualizations.
2
-
3
- This module provides components to create browser- and Jupyter notebook-based visualizations of
4
- Mesa models, allowing users to watch models run step-by-step and interact with model parameters.
5
-
6
- Key features:
7
- - SolaraViz: Main component for creating visualizations, supporting grid displays and plots
8
- - ModelController: Handles model execution controls (step, play, pause, reset)
9
- - UserInputs: Generates UI elements for adjusting model parameters
10
- - Card: Renders individual visualization elements (space, measures)
11
-
12
- The module uses Solara for rendering in Jupyter notebooks or as standalone web applications.
13
- It supports various types of visualizations including matplotlib plots, agent grids, and
14
- custom visualization components.
15
-
16
- Usage:
17
- 1. Define an agent_portrayal function to specify how agents should be displayed
18
- 2. Set up model_params to define adjustable parameters
19
- 3. Create a SolaraViz instance with your model, parameters, and desired measures
20
- 4. Display the visualization in a Jupyter notebook or run as a Solara app
21
-
22
- See the Visualization Tutorial and example models for more details.
23
- """
24
-
25
- import threading
26
-
27
- import reacton.ipywidgets as widgets
28
- import solara
29
- from solara.alias import rv
30
-
31
- import mesa.experimental.components.altair as components_altair
32
- import mesa.experimental.components.matplotlib as components_matplotlib
33
- from mesa.experimental.UserParam import Slider
34
-
35
-
36
- # TODO: Turn this function into a Solara component once the current_step.value
37
- # dependency is passed to measure()
38
- def Card(
39
- model, measures, agent_portrayal, space_drawer, dependencies, color, layout_type
40
- ):
41
- """Create a card component for visualizing model space or measures.
42
-
43
- Args:
44
- model: The Mesa model instance
45
- measures: List of measures to be plotted
46
- agent_portrayal: Function to define agent appearance
47
- space_drawer: Method to render agent space
48
- dependencies: List of dependencies for updating the visualization
49
- color: Background color of the card
50
- layout_type: Type of layout (Space or Measure)
51
-
52
- Returns:
53
- rv.Card: A card component containing the visualization
54
- """
55
- with rv.Card(
56
- style_=f"background-color: {color}; width: 100%; height: 100%"
57
- ) as main:
58
- if "Space" in layout_type:
59
- rv.CardTitle(children=["Space"])
60
- if space_drawer == "default":
61
- # draw with the default implementation
62
- components_matplotlib.SpaceMatplotlib(
63
- model, agent_portrayal, dependencies=dependencies
64
- )
65
- elif space_drawer == "altair":
66
- components_altair.SpaceAltair(
67
- model, agent_portrayal, dependencies=dependencies
68
- )
69
- elif space_drawer:
70
- # if specified, draw agent space with an alternate renderer
71
- space_drawer(model, agent_portrayal, dependencies=dependencies)
72
- elif "Measure" in layout_type:
73
- rv.CardTitle(children=["Measure"])
74
- measure = measures[layout_type["Measure"]]
75
- if callable(measure):
76
- # Is a custom object
77
- measure(model)
78
- else:
79
- components_matplotlib.PlotMatplotlib(
80
- model, measure, dependencies=dependencies
81
- )
82
- return main
83
-
84
-
85
- @solara.component
86
- def SolaraViz(
87
- model_class,
88
- model_params,
89
- measures=None,
90
- name=None,
91
- agent_portrayal=None,
92
- space_drawer="default",
93
- play_interval=150,
94
- seed=None,
95
- ):
96
- """Initialize a component to visualize a model.
97
-
98
- Args:
99
- model_class: Class of the model to instantiate
100
- model_params: Parameters for initializing the model
101
- measures: List of callables or data attributes to plot
102
- name: Name for display
103
- agent_portrayal: Options for rendering agents (dictionary);
104
- Default drawer supports custom `"size"`, `"color"`, and `"shape"`.
105
- space_drawer: Method to render the agent space for
106
- the model; default implementation is the `SpaceMatplotlib` component;
107
- simulations with no space to visualize should
108
- specify `space_drawer=False`
109
- play_interval: Play interval (default: 150)
110
- seed: The random seed used to initialize the model
111
- """
112
- if name is None:
113
- name = model_class.__name__
114
-
115
- current_step = solara.use_reactive(0)
116
-
117
- # 1. Set up model parameters
118
- reactive_seed = solara.use_reactive(0)
119
- user_params, fixed_params = split_model_params(model_params)
120
- model_parameters, set_model_parameters = solara.use_state(
121
- {**fixed_params, **{k: v.get("value") for k, v in user_params.items()}}
122
- )
123
-
124
- # 2. Set up Model
125
- def make_model():
126
- """Create a new model instance with current parameters and seed."""
127
- model = model_class.__new__(
128
- model_class, **model_parameters, seed=reactive_seed.value
129
- )
130
- model.__init__(**model_parameters)
131
- current_step.value = 0
132
- return model
133
-
134
- reset_counter = solara.use_reactive(0)
135
- model = solara.use_memo(
136
- make_model,
137
- dependencies=[
138
- *list(model_parameters.values()),
139
- reset_counter.value,
140
- reactive_seed.value,
141
- ],
142
- )
143
-
144
- def handle_change_model_params(name: str, value: any):
145
- """Update model parameters when user input changes."""
146
- set_model_parameters({**model_parameters, name: value})
147
-
148
- # 3. Set up UI
149
-
150
- with solara.AppBar():
151
- solara.AppBarTitle(name)
152
-
153
- # render layout and plot
154
- def do_reseed():
155
- """Update the random seed for the model."""
156
- reactive_seed.value = model.random.random()
157
-
158
- dependencies = [
159
- *list(model_parameters.values()),
160
- current_step.value,
161
- reactive_seed.value,
162
- ]
163
-
164
- # if space drawer is disabled, do not include it
165
- layout_types = [{"Space": "default"}] if space_drawer else []
166
-
167
- if measures:
168
- layout_types += [{"Measure": elem} for elem in range(len(measures))]
169
-
170
- grid_layout_initial = make_initial_grid_layout(layout_types=layout_types)
171
- grid_layout, set_grid_layout = solara.use_state(grid_layout_initial)
172
-
173
- with solara.Sidebar():
174
- with solara.Card("Controls", margin=1, elevation=2):
175
- solara.InputText(
176
- label="Seed",
177
- value=reactive_seed,
178
- continuous_update=True,
179
- )
180
- UserInputs(user_params, on_change=handle_change_model_params)
181
- ModelController(model, play_interval, current_step, reset_counter)
182
- solara.Button(label="Reseed", color="primary", on_click=do_reseed)
183
- with solara.Card("Information", margin=1, elevation=2):
184
- solara.Markdown(md_text=f"Step - {current_step}")
185
-
186
- items = [
187
- Card(
188
- model,
189
- measures,
190
- agent_portrayal,
191
- space_drawer,
192
- dependencies,
193
- color="white",
194
- layout_type=layout_types[i],
195
- )
196
- for i in range(len(layout_types))
197
- ]
198
- solara.GridDraggable(
199
- items=items,
200
- grid_layout=grid_layout,
201
- resizable=True,
202
- draggable=True,
203
- on_grid_layout=set_grid_layout,
204
- )
205
-
206
-
207
- JupyterViz = SolaraViz
208
-
209
-
210
- @solara.component
211
- def ModelController(model, play_interval, current_step, reset_counter):
212
- """Create controls for model execution (step, play, pause, reset).
213
-
214
- Args:
215
- model: The model being visualized
216
- play_interval: Interval between steps during play
217
- current_step: Reactive value for the current step
218
- reset_counter: Counter to trigger model reset
219
- """
220
- playing = solara.use_reactive(False)
221
- thread = solara.use_reactive(None)
222
- # We track the previous step to detect if user resets the model via
223
- # clicking the reset button or changing the parameters. If previous_step >
224
- # current_step, it means a model reset happens while the simulation is
225
- # still playing.
226
- previous_step = solara.use_reactive(0)
227
-
228
- def on_value_play(change):
229
- """Handle play/pause state changes."""
230
- if previous_step.value > current_step.value and current_step.value == 0:
231
- # We add extra checks for current_step.value == 0, just to be sure.
232
- # We automatically stop the playing if a model is reset.
233
- playing.value = False
234
- elif model.running:
235
- do_step()
236
- else:
237
- playing.value = False
238
-
239
- def do_step():
240
- """Advance the model by one step."""
241
- model.step()
242
- previous_step.value = current_step.value
243
- current_step.value = model.steps
244
-
245
- def do_play():
246
- """Run the model continuously."""
247
- model.running = True
248
- while model.running:
249
- do_step()
250
-
251
- def threaded_do_play():
252
- """Start a new thread for continuous model execution."""
253
- if thread is not None and thread.is_alive():
254
- return
255
- thread.value = threading.Thread(target=do_play)
256
- thread.start()
257
-
258
- def do_pause():
259
- """Pause the model execution."""
260
- if (thread is None) or (not thread.is_alive()):
261
- return
262
- model.running = False
263
- thread.join()
264
-
265
- def do_reset():
266
- """Reset the model."""
267
- reset_counter.value += 1
268
-
269
- def do_set_playing(value):
270
- """Set the playing state."""
271
- if current_step.value == 0:
272
- # This means the model has been recreated, and the step resets to
273
- # 0. We want to avoid triggering the playing.value = False in the
274
- # on_value_play function.
275
- previous_step.value = current_step.value
276
- playing.set(value)
277
-
278
- with solara.Row():
279
- solara.Button(label="Step", color="primary", on_click=do_step)
280
- # This style is necessary so that the play widget has almost the same
281
- # height as typical Solara buttons.
282
- solara.Style(
283
- """
284
- .widget-play {
285
- height: 35px;
286
- }
287
- .widget-play button {
288
- color: white;
289
- background-color: #1976D2; // Solara blue color
290
- }
291
- """
292
- )
293
- widgets.Play(
294
- value=0,
295
- interval=play_interval,
296
- repeat=True,
297
- show_repeat=False,
298
- on_value=on_value_play,
299
- playing=playing.value,
300
- on_playing=do_set_playing,
301
- )
302
- solara.Button(label="Reset", color="primary", on_click=do_reset)
303
- # threaded_do_play is not used for now because it
304
- # doesn't work in Google colab. We use
305
- # ipywidgets.Play until it is fixed. The threading
306
- # version is definite a much better implementation,
307
- # if it works.
308
- # solara.Button(label="▶", color="primary", on_click=viz.threaded_do_play)
309
- # solara.Button(label="⏸︎", color="primary", on_click=viz.do_pause)
310
- # solara.Button(label="Reset", color="primary", on_click=do_reset)
311
-
312
-
313
- def split_model_params(model_params):
314
- """Split model parameters into user-adjustable and fixed parameters.
315
-
316
- Args:
317
- model_params: Dictionary of all model parameters
318
-
319
- Returns:
320
- tuple: (user_adjustable_params, fixed_params)
321
- """
322
- model_params_input = {}
323
- model_params_fixed = {}
324
- for k, v in model_params.items():
325
- if check_param_is_fixed(v):
326
- model_params_fixed[k] = v
327
- else:
328
- model_params_input[k] = v
329
- return model_params_input, model_params_fixed
330
-
331
-
332
- def check_param_is_fixed(param):
333
- """Check if a parameter is fixed (not user-adjustable).
334
-
335
- Args:
336
- param: Parameter to check
337
-
338
- Returns:
339
- bool: True if parameter is fixed, False otherwise
340
- """
341
- if isinstance(param, Slider):
342
- return False
343
- if not isinstance(param, dict):
344
- return True
345
- if "type" not in param:
346
- return True
347
-
348
-
349
- @solara.component
350
- def UserInputs(user_params, on_change=None):
351
- """Initialize user inputs for configurable model parameters.
352
-
353
- Currently supports :class:`solara.SliderInt`, :class:`solara.SliderFloat`,
354
- :class:`solara.Select`, and :class:`solara.Checkbox`.
355
-
356
- Args:
357
- user_params: Dictionary with options for the input, including label,
358
- min and max values, and other fields specific to the input type.
359
- on_change: Function to be called with (name, value) when the value of an input changes.
360
- """
361
- for name, options in user_params.items():
362
-
363
- def change_handler(value, name=name):
364
- on_change(name, value)
365
-
366
- if isinstance(options, Slider):
367
- slider_class = (
368
- solara.SliderFloat if options.is_float_slider else solara.SliderInt
369
- )
370
- slider_class(
371
- options.label,
372
- value=options.value,
373
- on_value=change_handler,
374
- min=options.min,
375
- max=options.max,
376
- step=options.step,
377
- )
378
- continue
379
-
380
- # label for the input is "label" from options or name
381
- label = options.get("label", name)
382
- input_type = options.get("type")
383
- if input_type == "SliderInt":
384
- solara.SliderInt(
385
- label,
386
- value=options.get("value"),
387
- on_value=change_handler,
388
- min=options.get("min"),
389
- max=options.get("max"),
390
- step=options.get("step"),
391
- )
392
- elif input_type == "SliderFloat":
393
- solara.SliderFloat(
394
- label,
395
- value=options.get("value"),
396
- on_value=change_handler,
397
- min=options.get("min"),
398
- max=options.get("max"),
399
- step=options.get("step"),
400
- )
401
- elif input_type == "Select":
402
- solara.Select(
403
- label,
404
- value=options.get("value"),
405
- on_value=change_handler,
406
- values=options.get("values"),
407
- )
408
- elif input_type == "Checkbox":
409
- solara.Checkbox(
410
- label=label,
411
- on_value=change_handler,
412
- value=options.get("value"),
413
- )
414
- else:
415
- raise ValueError(f"{input_type} is not a supported input type")
416
-
417
-
418
- def make_text(renderer):
419
- """Create a function that renders text using Markdown.
420
-
421
- Args:
422
- renderer: Function that takes a model and returns a string
423
-
424
- Returns:
425
- function: A function that renders the text as Markdown
426
- """
427
-
428
- def function(model):
429
- solara.Markdown(renderer(model))
430
-
431
- return function
432
-
433
-
434
- def make_initial_grid_layout(layout_types):
435
- """Create an initial grid layout for visualization components.
436
-
437
- Args:
438
- layout_types: List of layout types (Space or Measure)
439
-
440
- Returns:
441
- list: Initial grid layout configuration
442
- """
443
- return [
444
- {
445
- "i": i,
446
- "w": 6,
447
- "h": 10,
448
- "moved": False,
449
- "x": 6 * (i % 2),
450
- "y": 16 * (i - i % 2),
451
- }
452
- for i in range(len(layout_types))
453
- ]
@@ -1,94 +0,0 @@
1
- mesa/__init__.py,sha256=yfsF1GQ64lI5t02W_YGXJWnGEiiyGvxJeIKP8Gkc43I,615
2
- mesa/agent.py,sha256=_ZI_cR9ZR_mzEBrOXorFe3UlmeJM7e1-ODV8MoW6tRk,24406
3
- mesa/batchrunner.py,sha256=sMFLTxj5avP_-HGO0leLVuxXK2dH0xdPopvhAmawwRQ,7213
4
- mesa/datacollection.py,sha256=xyb07aBpd-HSDh5bk-XcVqGiDu5bfaLlxj5eDlGIwqY,16138
5
- mesa/model.py,sha256=EzDYnwkt9Bm5fEah8JztzjghFBzUmnIr4WknbaR7zzk,8573
6
- mesa/space.py,sha256=cfzlRfy9chegp8d89k2aqI29jo9cb18USlz2G2iOZU4,64082
7
- mesa/examples/README.md,sha256=dNn8kv0BNQem3NNhO5mbOANQoK8UUYOo7rnkCFV9tnE,2882
8
- mesa/examples/__init__.py,sha256=fP1vcexySnKowS2CKhfeyYLt058VpIkK26EOo3btyO0,825
9
- mesa/examples/advanced/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- mesa/examples/advanced/epstein_civil_violence/Epstein Civil Violence.ipynb,sha256=yh50ZAK2BVJyJIKsQTTxywnasqWn1IiQUVrwmZKue4w,29032
11
- mesa/examples/advanced/epstein_civil_violence/Readme.md,sha256=RXuGIZAibz3KVkP51PGjwzcRx2R9Ettmh3qbDTPqDcg,1735
12
- mesa/examples/advanced/epstein_civil_violence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- mesa/examples/advanced/epstein_civil_violence/agents.py,sha256=0X4JLj2K2cl1bACkFLI6-K6tKbr2SLZlAy_kjgUDjzA,5863
14
- mesa/examples/advanced/epstein_civil_violence/app.py,sha256=puJmjkEevHyilfDpnkE65Y2ax6JEyOALg-IEtK8jBKk,1787
15
- mesa/examples/advanced/epstein_civil_violence/model.py,sha256=fcTkjCRhEhDerDC1W_lrezdoWD1y5xIublkGIhCak8w,3918
16
- mesa/examples/advanced/pd_grid/Readme.md,sha256=UVUQxZRFdfymCKDdQEn3ZEwgSqgp9cKJPsU8oZpLFnY,2367
17
- mesa/examples/advanced/pd_grid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- mesa/examples/advanced/pd_grid/agents.py,sha256=DzGj4LZUjV0xMQAwkRsv2Aoap1cUvLscJswfA1PdVDs,1716
19
- mesa/examples/advanced/pd_grid/analysis.ipynb,sha256=ReYtRe2JVyCCXoMBONvynXDQ_eGtQSWhNcuJY3CYTTI,82323
20
- mesa/examples/advanced/pd_grid/app.py,sha256=u8dnB3cXkTENU26O1XN3REFTxEwvXLFLD3EybgVQWP0,1354
21
- mesa/examples/advanced/pd_grid/model.py,sha256=DiHGeX7fR1slvcAzbmDCxnmXJ2Txjmju_gII3e-EJgY,2345
22
- mesa/examples/advanced/sugarscape_g1mt/Readme.md,sha256=x3kKw1Rre2FPkNhGDLtdzeThmH089mxsGYUPZUeu26k,3595
23
- mesa/examples/advanced/sugarscape_g1mt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- mesa/examples/advanced/sugarscape_g1mt/agents.py,sha256=zE7zbO2_OaQiFDq_-t-0hv4ButBWv26dnS1zaPc3_ZE,10183
25
- mesa/examples/advanced/sugarscape_g1mt/app.py,sha256=ZB0jIBG6sLrVXxmuQyqqhJyaSCLvWmbe8oqgn7oaWcs,2781
26
- mesa/examples/advanced/sugarscape_g1mt/model.py,sha256=NFQRqwuOwP3kz1fNNPEm2XkdbS0G3-TgneiJdQZHqck,6111
27
- mesa/examples/advanced/sugarscape_g1mt/sugar-map.txt,sha256=zZtGYciBPT4miZVnbVuoQ5TugTmGrbDWV9yb5KH6tnU,5000
28
- mesa/examples/advanced/sugarscape_g1mt/tests.py,sha256=UNahmZTgLquSqmoi_9GcE3JP0qBHjkrHFZ15NMm0ce8,2517
29
- mesa/examples/advanced/wolf_sheep/Readme.md,sha256=6zrtCg4Fb-hgQxqdLMpTkIYMwD6owCv8BMz_qn0N98Q,3165
30
- mesa/examples/advanced/wolf_sheep/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- mesa/examples/advanced/wolf_sheep/agents.py,sha256=SISizN_alheFAXEP3NaeQTx22SPs0v3pRYqXKRyuXCo,3801
32
- mesa/examples/advanced/wolf_sheep/app.py,sha256=IIl-gDh1O3oYIvrXXGmKHbW5Iw3ZpCn691dGwKgyI3E,2508
33
- mesa/examples/advanced/wolf_sheep/model.py,sha256=UYUY8GP6YA64mbJkWDr9eUSZlE8naxv8-a2qaGPdUXE,4531
34
- mesa/examples/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- mesa/examples/basic/boid_flockers/Readme.md,sha256=4KJinsLPtUciQSMzvaX3tU5r1HTUg3AFOFDKy73W5RE,894
36
- mesa/examples/basic/boid_flockers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- mesa/examples/basic/boid_flockers/agents.py,sha256=72oL4jWEiJfSgshSEcL44irptIY6WAQDRAQ0cO2MxS8,3827
38
- mesa/examples/basic/boid_flockers/app.py,sha256=CLXzUJ8-9FdrNVElGsAas6l37n_qSv8akH4hXEZQ8OY,1141
39
- mesa/examples/basic/boid_flockers/model.py,sha256=scy0OaYzQVY5vVarsI7dUydynwoH3-uYoYcsBTtwtyA,3399
40
- mesa/examples/basic/boltzmann_wealth_model/Readme.md,sha256=wl1ylO9KWoTiuIJKOnk2FGdcmyVUqJ5wiSbVUa3WWAc,2725
41
- mesa/examples/basic/boltzmann_wealth_model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- mesa/examples/basic/boltzmann_wealth_model/agents.py,sha256=Jol2aspw--UtQn0EiReXVmlWtzpdC2o_YUTAyu1sDk4,1546
43
- mesa/examples/basic/boltzmann_wealth_model/app.py,sha256=JlGpOmkjLut0hM9rY_BSGiRfHnrwpzlOi8Cw2Drv3-s,2160
44
- mesa/examples/basic/boltzmann_wealth_model/model.py,sha256=ED4EFHJlrrcF12WYOEpXpPt5asK2T6uzpq_S97EtfHo,2941
45
- mesa/examples/basic/boltzmann_wealth_model/st_app.py,sha256=X8C7w294UidciQqiiuBWkypaOQS79aS3kQKydT21V4c,3456
46
- mesa/examples/basic/conways_game_of_life/Readme.md,sha256=VRgN6roF6leQ_IMYwxFypSfFjZo9jnCd-rkPTjpp7II,1453
47
- mesa/examples/basic/conways_game_of_life/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
- mesa/examples/basic/conways_game_of_life/agents.py,sha256=ETn87GV8it9p0nlSn6f1qu5CDEmqokkr6Rq7KWaT-5U,1627
49
- mesa/examples/basic/conways_game_of_life/app.py,sha256=Q2Z16x2D9e8BYErn7xIvgdwyxKeeQKO2wNPbxi2acEw,1894
50
- mesa/examples/basic/conways_game_of_life/model.py,sha256=8L88m8F_YauwWeDef6UA2myQoAwC0B5sH5jsfyLn-u8,1221
51
- mesa/examples/basic/conways_game_of_life/st_app.py,sha256=_poqU2VR4rfiiq4WFXTbOUSW7liuM86iq913mW6LS50,2400
52
- mesa/examples/basic/schelling/Readme.md,sha256=CRKBfYtnLJLlTKLsTRQ-7gsQRxVxDooOBN5uP8PEtaU,2296
53
- mesa/examples/basic/schelling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- mesa/examples/basic/schelling/agents.py,sha256=BzipyAU5d_H4DoTm3xkeZLDazsr49rbaVr_kyk1rDJA,937
55
- mesa/examples/basic/schelling/analysis.ipynb,sha256=JDJy6-U6eO-LrHWxZr1c3lkvtoY0DNHa-kJ4J-Z-wwo,5804
56
- mesa/examples/basic/schelling/app.py,sha256=UDIL6MBIfFPLNT8D9Y0sV0aJwfgQR9aNZxq5png8Gbs,954
57
- mesa/examples/basic/schelling/model.py,sha256=ruqiMNBBsWV81srYZgdsfDVwgMWYuw2VAzSQhsK5E98,2762
58
- mesa/examples/basic/virus_on_network/Readme.md,sha256=qmXGx4Fo0tRBvJiiJ684bkWJPn2gcFaiikLwgc5APWI,2336
59
- mesa/examples/basic/virus_on_network/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- mesa/examples/basic/virus_on_network/agents.py,sha256=a_WhqYblJlW6od67eXfU-nb7IMRyYpgxtf0le--VYoA,1975
61
- mesa/examples/basic/virus_on_network/app.py,sha256=6bkIYXj1cdhhBksVT5UN8OrrZFVrHJXRzIknhlQcuu4,2450
62
- mesa/examples/basic/virus_on_network/model.py,sha256=jQoCmvygwCvhUrlL0l7V8GcDLv94CgwtuK7DDGU8q8g,2813
63
- mesa/experimental/UserParam.py,sha256=f32nmFjroe76HpxU75ZCEOqFW2nAsDfmqIf8kQ1zt-E,2086
64
- mesa/experimental/__init__.py,sha256=faBYyHSp-sFQPaBx8-WsLToVKCndpSzpt18HmNZtasM,385
65
- mesa/experimental/solara_viz.py,sha256=uWrNQAX3oEWSftmyjNorN839dBCUp86hnhpL704dyGQ,15212
66
- mesa/experimental/cell_space/__init__.py,sha256=-NtSCT7mA-aszLSAdqbICGqeFe2vBdb-GrcW562legY,999
67
- mesa/experimental/cell_space/cell.py,sha256=lDm7NQhPDFf3-SZu5W594lDNGtzcdSPUSSsELFRg0bs,7166
68
- mesa/experimental/cell_space/cell_agent.py,sha256=jvYOV9OIaBaqAsAG0YLV64X_f3BJe_wP7qfos_RXi0Y,3759
69
- mesa/experimental/cell_space/cell_collection.py,sha256=ADK_42ykyWQpVGVSFE8GG_djqTgL8wfWwu2YTwXUPcs,4007
70
- mesa/experimental/cell_space/discrete_space.py,sha256=A54lHbTo4udcU4zkJEnsWuWKOBrELg-1eU8-dPoLMPk,5826
71
- mesa/experimental/cell_space/grid.py,sha256=oWTy6kaaHXLPneA-w5XdqzwA0YItMWYgCq_UjNH9iA8,7711
72
- mesa/experimental/cell_space/network.py,sha256=_x0zKlI-odNCSRb_Zqh4nBPjqnW5iVj8sVheKPCLzmU,1321
73
- mesa/experimental/cell_space/voronoi.py,sha256=lSY8zQhELvOy0RfDyZIek09UMwY9_20UY9SPqFWsNoM,10014
74
- mesa/experimental/components/altair.py,sha256=49OHgrm1JncfrKqDfw_5ifPtsbMKdgVYCacL9SMwucc,2624
75
- mesa/experimental/components/matplotlib.py,sha256=j477UBk_7yW5vzT3rjhnuTixpA7PedDNghoK9TLgHVY,8043
76
- mesa/experimental/devs/__init__.py,sha256=EByaC66ikUIu9G9p1geLm6ESEMWZOPTO9r9627S83j0,211
77
- mesa/experimental/devs/eventlist.py,sha256=fPj2jfW-jTe-UnIE6TsF1BM2ITKe3jGfVUhu3gBv7UQ,6250
78
- mesa/experimental/devs/simulator.py,sha256=RHlJsri57zf22i4fdEdUKekuJUunB1oRzEbhDntMuOk,12107
79
- mesa/experimental/devs/examples/epstein_civil_violence.py,sha256=E8YSV3O5ihKsntGtnltHM-4IyS8eg2DSRUqmIiw_1iU,10916
80
- mesa/experimental/devs/examples/wolf_sheep.py,sha256=1eb1CfYNQoprqSJat-LPYPvwWH1ENQdj39viEqwSk0s,8103
81
- mesa/visualization/__init__.py,sha256=o30F2VApnDJ6Zq0_U5_wBnj-6-Bu7FGPsOq3A6p2EqA,743
82
- mesa/visualization/mpl_space_drawing.py,sha256=yf3Sc7pm5EJLxfWQdtR-9PcUtZveEEjar1WUr7qwI4o,20057
83
- mesa/visualization/solara_viz.py,sha256=pGtfjFfFMLwF9vmy5btiHRZww6NGoiKu0tzNdhZaYj4,17947
84
- mesa/visualization/user_param.py,sha256=Dl2WOwLYLf0pfLpabCZtIdFRyKZrK6Qtc3utZx5GPYg,2139
85
- mesa/visualization/utils.py,sha256=lJHgRKF5BHLf72Tw3YpwyiWuRoIimaTKQ7xBCw_Rx3A,146
86
- mesa/visualization/components/__init__.py,sha256=Bq3nrPikcaIo9BSs0O3zptWVLlUmAkLo3s0mEmpH1RE,3022
87
- mesa/visualization/components/altair_components.py,sha256=wotpFFQgMY-ZR3lNVm_fRos-iDg0Wjnj6Tk67_7f1SQ,5847
88
- mesa/visualization/components/matplotlib_components.py,sha256=xQETaFyHIfmL_9JwrLIgubuIQ7-pp7TMoXT1WMmozus,5441
89
- mesa-3.1.0.dev0.dist-info/METADATA,sha256=iqUH3bKVcZW0XOY9KzYXKUBg3q3J2TO-EalHU9JIe-Q,9911
90
- mesa-3.1.0.dev0.dist-info/WHEEL,sha256=3U_NnUcV_1B1kPkYaPzN-irRckL5VW_lytn0ytO_kRY,87
91
- mesa-3.1.0.dev0.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
92
- mesa-3.1.0.dev0.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
93
- mesa-3.1.0.dev0.dist-info/licenses/NOTICE,sha256=GbsWoK0QWv1JyZ_xer2s-jNilv0RtWl-0UrtlJANHPg,578
94
- mesa-3.1.0.dev0.dist-info/RECORD,,