Mesa 3.0.0a4__py3-none-any.whl → 3.0.0a5__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 (40) hide show
  1. mesa/__init__.py +2 -3
  2. mesa/agent.py +106 -61
  3. mesa/batchrunner.py +15 -23
  4. mesa/cookiecutter-mesa/hooks/post_gen_project.py +2 -0
  5. mesa/cookiecutter-mesa/{{cookiecutter.snake}}/{{cookiecutter.snake}}/__init__.py +1 -0
  6. mesa/datacollection.py +138 -27
  7. mesa/experimental/UserParam.py +17 -6
  8. mesa/experimental/__init__.py +2 -0
  9. mesa/experimental/cell_space/__init__.py +7 -0
  10. mesa/experimental/cell_space/cell.py +61 -20
  11. mesa/experimental/cell_space/cell_agent.py +10 -5
  12. mesa/experimental/cell_space/cell_collection.py +54 -17
  13. mesa/experimental/cell_space/discrete_space.py +16 -5
  14. mesa/experimental/cell_space/grid.py +19 -8
  15. mesa/experimental/cell_space/network.py +9 -7
  16. mesa/experimental/cell_space/voronoi.py +26 -33
  17. mesa/experimental/components/altair.py +10 -0
  18. mesa/experimental/components/matplotlib.py +18 -0
  19. mesa/experimental/devs/__init__.py +2 -0
  20. mesa/experimental/devs/eventlist.py +36 -15
  21. mesa/experimental/devs/examples/epstein_civil_violence.py +65 -29
  22. mesa/experimental/devs/examples/wolf_sheep.py +38 -34
  23. mesa/experimental/devs/simulator.py +55 -15
  24. mesa/experimental/solara_viz.py +10 -19
  25. mesa/main.py +6 -4
  26. mesa/model.py +43 -45
  27. mesa/space.py +145 -120
  28. mesa/time.py +57 -67
  29. mesa/visualization/UserParam.py +19 -6
  30. mesa/visualization/__init__.py +3 -2
  31. mesa/visualization/components/altair.py +4 -2
  32. mesa/visualization/components/matplotlib.py +6 -4
  33. mesa/visualization/solara_viz.py +157 -83
  34. mesa/visualization/utils.py +3 -1
  35. {mesa-3.0.0a4.dist-info → mesa-3.0.0a5.dist-info}/METADATA +1 -1
  36. mesa-3.0.0a5.dist-info/RECORD +44 -0
  37. mesa-3.0.0a4.dist-info/RECORD +0 -44
  38. {mesa-3.0.0a4.dist-info → mesa-3.0.0a5.dist-info}/WHEEL +0 -0
  39. {mesa-3.0.0a4.dist-info → mesa-3.0.0a5.dist-info}/entry_points.txt +0 -0
  40. {mesa-3.0.0a4.dist-info → mesa-3.0.0a5.dist-info}/licenses/LICENSE +0 -0
@@ -1,5 +1,4 @@
1
- """
2
- Mesa visualization module for creating interactive model visualizations.
1
+ """Mesa visualization module for creating interactive model visualizations.
3
2
 
4
3
  This module provides components to create browser- and Jupyter notebook-based visualizations of
5
4
  Mesa models, allowing users to watch models run step-by-step and interact with model parameters.
@@ -8,7 +7,6 @@ Key features:
8
7
  - SolaraViz: Main component for creating visualizations, supporting grid displays and plots
9
8
  - ModelController: Handles model execution controls (step, play, pause, reset)
10
9
  - UserInputs: Generates UI elements for adjusting model parameters
11
- - Card: Renders individual visualization elements (space, measures)
12
10
 
13
11
  The module uses Solara for rendering in Jupyter notebooks or as standalone web applications.
14
12
  It supports various types of visualizations including matplotlib plots, agent grids, and
@@ -23,10 +21,14 @@ Usage:
23
21
  See the Visualization Tutorial and example models for more details.
24
22
  """
25
23
 
24
+ from __future__ import annotations
25
+
26
+ import asyncio
26
27
  import copy
27
- import time
28
+ from collections.abc import Callable
28
29
  from typing import TYPE_CHECKING, Literal
29
30
 
31
+ import reacton.core
30
32
  import solara
31
33
  from solara.alias import rv
32
34
 
@@ -44,8 +46,7 @@ if TYPE_CHECKING:
44
46
  def Card(
45
47
  model, measures, agent_portrayal, space_drawer, dependencies, color, layout_type
46
48
  ):
47
- """
48
- Create a card component for visualizing model space or measures.
49
+ """Create a card component for visualizing model space or measures.
49
50
 
50
51
  Args:
51
52
  model: The Mesa model instance
@@ -91,21 +92,57 @@ def Card(
91
92
 
92
93
  @solara.component
93
94
  def SolaraViz(
94
- model: "Model" | solara.Reactive["Model"],
95
- components: list[solara.component] | Literal["default"] = "default",
96
- *args,
97
- play_interval=100,
95
+ model: Model | solara.Reactive[Model],
96
+ components: list[reacton.core.Component]
97
+ | list[Callable[[Model], reacton.core.Component]]
98
+ | Literal["default"] = "default",
99
+ play_interval: int = 100,
98
100
  model_params=None,
99
- seed=0,
101
+ seed: float = 0,
100
102
  name: str | None = None,
101
103
  ):
102
- update_counter.get()
104
+ """Solara visualization component.
105
+
106
+ This component provides a visualization interface for a given model using Solara.
107
+ It supports various visualization components and allows for interactive model
108
+ stepping and parameter adjustments.
109
+
110
+ Args:
111
+ model (Model | solara.Reactive[Model]): A Model instance or a reactive Model.
112
+ This is the main model to be visualized. If a non-reactive model is provided,
113
+ it will be converted to a reactive model.
114
+ components (list[solara.component] | Literal["default"], optional): List of solara
115
+ components or functions that return a solara component.
116
+ These components are used to render different parts of the model visualization.
117
+ Defaults to "default", which uses the default Altair space visualization.
118
+ play_interval (int, optional): Interval for playing the model steps in milliseconds.
119
+ This controls the speed of the model's automatic stepping. Defaults to 100 ms.
120
+ model_params (dict, optional): Parameters for (re-)instantiating a model.
121
+ Can include user-adjustable parameters and fixed parameters. Defaults to None.
122
+ seed (int, optional): Seed for the random number generator. This ensures reproducibility
123
+ of the model's behavior. Defaults to 0.
124
+ name (str | None, optional): Name of the visualization. Defaults to the models class name.
125
+
126
+ Returns:
127
+ solara.component: A Solara component that renders the visualization interface for the model.
128
+
129
+ Example:
130
+ >>> model = MyModel()
131
+ >>> page = SolaraViz(model)
132
+ >>> page
133
+
134
+ Notes:
135
+ - The `model` argument can be either a direct model instance or a reactive model. If a direct
136
+ model instance is provided, it will be converted to a reactive model using `solara.use_reactive`.
137
+ - The `play_interval` argument controls the speed of the model's automatic stepping. A lower
138
+ value results in faster stepping, while a higher value results in slower stepping.
139
+ """
103
140
  if components == "default":
104
141
  components = [components_altair.make_space_altair()]
105
142
 
106
143
  # Convert model to reactive
107
144
  if not isinstance(model, solara.Reactive):
108
- model = solara.use_reactive(model)
145
+ model = solara.use_reactive(model) # noqa: SH102, RUF100
109
146
 
110
147
  def connect_to_model():
111
148
  # Patch the step function to force updates
@@ -125,40 +162,68 @@ def SolaraViz(
125
162
  with solara.AppBar():
126
163
  solara.AppBarTitle(name if name else model.value.__class__.__name__)
127
164
 
128
- with solara.Sidebar():
129
- with solara.Card("Controls", margin=1, elevation=2):
130
- if model_params is not None:
165
+ with solara.Sidebar(), solara.Column():
166
+ with solara.Card("Controls"):
167
+ ModelController(model, play_interval)
168
+
169
+ if model_params is not None:
170
+ with solara.Card("Model Parameters"):
131
171
  ModelCreator(
132
172
  model,
133
173
  model_params,
134
174
  seed=seed,
135
175
  )
136
- ModelController(model, play_interval)
137
- with solara.Card("Information", margin=1, elevation=2):
176
+ with solara.Card("Information"):
138
177
  ShowSteps(model.value)
139
178
 
140
- solara.Column(
141
- [
142
- *(component(model.value) for component in components),
143
- ]
144
- )
179
+ ComponentsView(components, model.value)
145
180
 
146
181
 
147
- JupyterViz = SolaraViz
182
+ def _wrap_component(
183
+ component: reacton.core.Component | Callable[[Model], reacton.core.Component],
184
+ ) -> reacton.core.Component:
185
+ """Wrap a component in an auto-updated Solara component if needed."""
186
+ if isinstance(component, reacton.core.Component):
187
+ return component
188
+
189
+ @solara.component
190
+ def WrappedComponent(model):
191
+ update_counter.get()
192
+ return component(model)
193
+
194
+ return WrappedComponent
148
195
 
149
196
 
150
197
  @solara.component
151
- def ModelController(model: solara.Reactive["Model"], play_interval=100):
152
- """
153
- Create controls for model execution (step, play, pause, reset).
198
+ def ComponentsView(
199
+ components: list[reacton.core.Component]
200
+ | list[Callable[[Model], reacton.core.Component]],
201
+ model: Model,
202
+ ):
203
+ """Display a list of components.
154
204
 
155
205
  Args:
156
- model: The reactive model being visualized
157
- play_interval: Interval between steps during play
206
+ components: List of components to display
207
+ model: Model instance to pass to each component
158
208
  """
159
- if not isinstance(model, solara.Reactive):
160
- model = solara.use_reactive(model)
209
+ wrapped_components = [_wrap_component(component) for component in components]
210
+
211
+ with solara.Column():
212
+ for component in wrapped_components:
213
+ component(model)
214
+
215
+
216
+ JupyterViz = SolaraViz
161
217
 
218
+
219
+ @solara.component
220
+ def ModelController(model: solara.Reactive[Model], play_interval=100):
221
+ """Create controls for model execution (step, play, pause, reset).
222
+
223
+ Args:
224
+ model (solara.Reactive[Model]): Reactive model instance
225
+ play_interval (int, optional): Interval for playing the model steps in milliseconds.
226
+ """
162
227
  playing = solara.use_reactive(False)
163
228
  original_model = solara.use_reactive(None)
164
229
 
@@ -170,40 +235,40 @@ def ModelController(model: solara.Reactive["Model"], play_interval=100):
170
235
 
171
236
  solara.use_effect(save_initial_model, [model.value])
172
237
 
173
- def step():
238
+ async def step():
174
239
  while playing.value:
175
- time.sleep(play_interval / 1000)
240
+ await asyncio.sleep(play_interval / 1000)
176
241
  do_step()
177
242
 
178
- solara.use_thread(step, [playing.value])
243
+ solara.lab.use_task(step, dependencies=[playing.value], prefer_threaded=False)
179
244
 
180
245
  def do_step():
181
246
  """Advance the model by one step."""
182
247
  model.value.step()
183
248
 
184
- def do_play():
185
- """Run the model continuously."""
186
- playing.value = True
187
-
188
- def do_pause():
189
- """Pause the model execution."""
190
- playing.value = False
191
-
192
249
  def do_reset():
193
250
  """Reset the model to its initial state."""
194
251
  playing.value = False
195
252
  model.value = copy.deepcopy(original_model.value)
196
253
 
254
+ def do_play_pause():
255
+ """Toggle play/pause."""
256
+ playing.value = not playing.value
257
+
197
258
  with solara.Row(justify="space-between"):
198
259
  solara.Button(label="Reset", color="primary", on_click=do_reset)
199
- solara.Button(label="Step", color="primary", on_click=do_step)
200
- solara.Button(label="▶", color="primary", on_click=do_play)
201
- solara.Button(label="⏸︎", color="primary", on_click=do_pause)
260
+ solara.Button(
261
+ label="▶" if not playing.value else "❚❚",
262
+ color="primary",
263
+ on_click=do_play_pause,
264
+ )
265
+ solara.Button(
266
+ label="Step", color="primary", on_click=do_step, disabled=playing.value
267
+ )
202
268
 
203
269
 
204
270
  def split_model_params(model_params):
205
- """
206
- Split model parameters into user-adjustable and fixed parameters.
271
+ """Split model parameters into user-adjustable and fixed parameters.
207
272
 
208
273
  Args:
209
274
  model_params: Dictionary of all model parameters
@@ -222,8 +287,7 @@ def split_model_params(model_params):
222
287
 
223
288
 
224
289
  def check_param_is_fixed(param):
225
- """
226
- Check if a parameter is fixed (not user-adjustable).
290
+ """Check if a parameter is fixed (not user-adjustable).
227
291
 
228
292
  Args:
229
293
  param: Parameter to check
@@ -241,6 +305,36 @@ def check_param_is_fixed(param):
241
305
 
242
306
  @solara.component
243
307
  def ModelCreator(model, model_params, seed=1):
308
+ """Solara component for creating and managing a model instance with user-defined parameters.
309
+
310
+ This component allows users to create a model instance with specified parameters and seed.
311
+ It provides an interface for adjusting model parameters and reseeding the model's random
312
+ number generator.
313
+
314
+ Args:
315
+ model (solara.Reactive[Model]): A reactive model instance. This is the main model to be created and managed.
316
+ model_params (dict): Dictionary of model parameters. This includes both user-adjustable parameters and fixed parameters.
317
+ seed (int, optional): Initial seed for the random number generator. Defaults to 1.
318
+
319
+ Returns:
320
+ solara.component: A Solara component that renders the model creation and management interface.
321
+
322
+ Example:
323
+ >>> model = solara.reactive(MyModel())
324
+ >>> model_params = {
325
+ >>> "param1": {"type": "slider", "value": 10, "min": 0, "max": 100},
326
+ >>> "param2": {"type": "slider", "value": 5, "min": 1, "max": 10},
327
+ >>> }
328
+ >>> creator = ModelCreator(model, model_params)
329
+ >>> creator
330
+
331
+ Notes:
332
+ - The `model_params` argument should be a dictionary where keys are parameter names and values either fixed values
333
+ or are dictionaries containing parameter details such as type, value, min, and max.
334
+ - The `seed` argument ensures reproducibility by setting the initial seed for the model's random number generator.
335
+ - The component provides an interface for adjusting user-defined parameters and reseeding the model.
336
+
337
+ """
244
338
  user_params, fixed_params = split_model_params(model_params)
245
339
 
246
340
  reactive_seed = solara.use_reactive(seed)
@@ -260,37 +354,34 @@ def ModelCreator(model, model_params, seed=1):
260
354
  set_model_parameters({**model_parameters, name: value})
261
355
 
262
356
  def create_model():
263
- model.value = model.value.__class__.__new__(
264
- model.value.__class__, **model_parameters, seed=reactive_seed.value
265
- )
266
- model.value.__init__(**model_parameters)
357
+ model.value = model.value.__class__(**model_parameters)
358
+ model.value._seed = reactive_seed.value
267
359
 
268
360
  solara.use_effect(create_model, [model_parameters, reactive_seed.value])
269
361
 
270
- solara.InputText(
271
- label="Seed",
272
- value=reactive_seed,
273
- continuous_update=True,
274
- )
362
+ with solara.Row(justify="space-between"):
363
+ solara.InputText(
364
+ label="Seed",
365
+ value=reactive_seed,
366
+ continuous_update=True,
367
+ )
275
368
 
276
- solara.Button(label="Reseed", color="primary", on_click=do_reseed)
369
+ solara.Button(label="Reseed", color="primary", on_click=do_reseed)
277
370
 
278
371
  UserInputs(user_params, on_change=on_change)
279
372
 
280
373
 
281
374
  @solara.component
282
375
  def UserInputs(user_params, on_change=None):
283
- """
284
- Initialize user inputs for configurable model parameters.
376
+ """Initialize user inputs for configurable model parameters.
377
+
285
378
  Currently supports :class:`solara.SliderInt`, :class:`solara.SliderFloat`,
286
379
  :class:`solara.Select`, and :class:`solara.Checkbox`.
287
380
 
288
381
  Args:
289
- user_params: Dictionary with options for the input, including label,
290
- min and max values, and other fields specific to the input type.
382
+ user_params: Dictionary with options for the input, including label, min and max values, and other fields specific to the input type.
291
383
  on_change: Function to be called with (name, value) when the value of an input changes.
292
384
  """
293
-
294
385
  for name, options in user_params.items():
295
386
 
296
387
  def change_handler(value, name=name):
@@ -348,26 +439,8 @@ def UserInputs(user_params, on_change=None):
348
439
  raise ValueError(f"{input_type} is not a supported input type")
349
440
 
350
441
 
351
- def make_text(renderer):
352
- """
353
- Create a function that renders text using Markdown.
354
-
355
- Args:
356
- renderer: Function that takes a model and returns a string
357
-
358
- Returns:
359
- function: A function that renders the text as Markdown
360
- """
361
-
362
- def function(model):
363
- solara.Markdown(renderer(model))
364
-
365
- return function
366
-
367
-
368
442
  def make_initial_grid_layout(layout_types):
369
- """
370
- Create an initial grid layout for visualization components.
443
+ """Create an initial grid layout for visualization components.
371
444
 
372
445
  Args:
373
446
  layout_types: List of layout types (Space or Measure)
@@ -390,5 +463,6 @@ def make_initial_grid_layout(layout_types):
390
463
 
391
464
  @solara.component
392
465
  def ShowSteps(model):
466
+ """Display the current step of the model."""
393
467
  update_counter.get()
394
468
  return solara.Text(f"Step: {model.steps}")
@@ -1,7 +1,9 @@
1
+ """Solara related utils."""
2
+
1
3
  import solara
2
4
 
3
5
  update_counter = solara.reactive(0)
4
6
 
5
7
 
6
- def force_update():
8
+ def force_update(): # noqa: D103
7
9
  update_counter.value += 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: Mesa
3
- Version: 3.0.0a4
3
+ Version: 3.0.0a5
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
@@ -0,0 +1,44 @@
1
+ mesa/__init__.py,sha256=rKO9SY4p-VL83PFsk5hAbDCbhhUO8azgxc9buDoFCX4,618
2
+ mesa/agent.py,sha256=-KwohXkdrj6CZMn7paf3Jv_7fCfDPhsJasRNm-jgTTY,25043
3
+ mesa/batchrunner.py,sha256=YUYyCy8XBxbUj83BczXmxA6tsT6ttimIeqiD3-wkYL4,6103
4
+ mesa/datacollection.py,sha256=xyb07aBpd-HSDh5bk-XcVqGiDu5bfaLlxj5eDlGIwqY,16138
5
+ mesa/main.py,sha256=_KgeVGbi0znzezjjoM09vhGdyaqcuDEwb9M7vH2c_O4,1668
6
+ mesa/model.py,sha256=vUS64fuZI26b3TYX0BTK90S8lxPdmFI1tgxatNEYUI8,7981
7
+ mesa/space.py,sha256=1sVl78o5lYP6aEg32QIb9-tcv3V3UeFdC7A_h_8CgO8,62838
8
+ mesa/time.py,sha256=kGXHDjnRn-Ixwgxt3fijEvLRybWQe0g9pE5ZpW4Kaaw,14983
9
+ mesa/cookiecutter-mesa/cookiecutter.json,sha256=tBSWli39fOWUXGfiDCTKd92M7uKaBIswXbkOdbUufYY,337
10
+ mesa/cookiecutter-mesa/hooks/post_gen_project.py,sha256=UKz12l6mKc7fILK0MvV5djsTKwkmD4DlH8LYjFO8ehI,316
11
+ mesa/cookiecutter-mesa/{{cookiecutter.snake}}/README.md,sha256=Yji4lGY-NtQSnW-oBj0_Jhs-XhCfZA8R1mBBM_IllGs,80
12
+ mesa/cookiecutter-mesa/{{cookiecutter.snake}}/app.pytemplate,sha256=36f9k9CH6TK6VrXsPvTFXGUfCKzCLwgYTeK-Gt27GNg,584
13
+ mesa/cookiecutter-mesa/{{cookiecutter.snake}}/setup.pytemplate,sha256=UtRpLM_CkeUZRec-Ef_LiO_x7SKaWN11fOiH9T1UmTw,214
14
+ mesa/cookiecutter-mesa/{{cookiecutter.snake}}/{{cookiecutter.snake}}/__init__.py,sha256=WgJccMfsAlD_mA3zTBPJVHadF3FtO8xgi8SPKORzyMs,22
15
+ mesa/cookiecutter-mesa/{{cookiecutter.snake}}/{{cookiecutter.snake}}/model.pytemplate,sha256=Aml4Z6E1yj7E7DtHNSUqnKNRUdkxG9WWtJyW8fkxCng,1870
16
+ mesa/experimental/UserParam.py,sha256=f32nmFjroe76HpxU75ZCEOqFW2nAsDfmqIf8kQ1zt-E,2086
17
+ mesa/experimental/__init__.py,sha256=1hxkjcZvdJhhQx4iLlTTUAPs_SqRyN-us4qR8U6JKkw,209
18
+ mesa/experimental/solara_viz.py,sha256=uWrNQAX3oEWSftmyjNorN839dBCUp86hnhpL704dyGQ,15212
19
+ mesa/experimental/cell_space/__init__.py,sha256=Nz1EkgzhvrTcfOJI1M_WkHsIgPkU8QIOCNJl7jLlYpw,908
20
+ mesa/experimental/cell_space/cell.py,sha256=L1XMxq1mIaouviiPSgurj4uda0dAx7zMWnam6_aK79s,5907
21
+ mesa/experimental/cell_space/cell_agent.py,sha256=06R_7djVlD2S-kS86ugxiaeualWaTrSUmF82t3UBi44,1169
22
+ mesa/experimental/cell_space/cell_collection.py,sha256=ZcyuPEevCZEXW7jFnX6StjBMw4UBDQvUspZRcFi2dFg,3426
23
+ mesa/experimental/cell_space/discrete_space.py,sha256=q5MRPzMYzZb3hQW90L0PmVFJepXhjbZK_9hT4y6OLdY,2293
24
+ mesa/experimental/cell_space/grid.py,sha256=WT9AtQCgPzV8VonX0oSPRXgZNXoOR_mVgEAEOp5I4YA,7319
25
+ mesa/experimental/cell_space/network.py,sha256=hzhxGipRyM1PWOQFlPz--tc3pA_RRBT8Xq4pXHx5sD8,1252
26
+ mesa/experimental/cell_space/voronoi.py,sha256=lSY8zQhELvOy0RfDyZIek09UMwY9_20UY9SPqFWsNoM,10014
27
+ mesa/experimental/components/altair.py,sha256=49OHgrm1JncfrKqDfw_5ifPtsbMKdgVYCacL9SMwucc,2624
28
+ mesa/experimental/components/matplotlib.py,sha256=j477UBk_7yW5vzT3rjhnuTixpA7PedDNghoK9TLgHVY,8043
29
+ mesa/experimental/devs/__init__.py,sha256=EByaC66ikUIu9G9p1geLm6ESEMWZOPTO9r9627S83j0,211
30
+ mesa/experimental/devs/eventlist.py,sha256=Trvc5S-NG5B792uuk_cY8Q_5Rw99zioUYDQXcXWVuCo,5972
31
+ mesa/experimental/devs/simulator.py,sha256=wvqkLIDgbJNaem9nwMacyEYRp0W3ai5Oxptw3-QmbSw,10595
32
+ mesa/experimental/devs/examples/epstein_civil_violence.py,sha256=E8YSV3O5ihKsntGtnltHM-4IyS8eg2DSRUqmIiw_1iU,10916
33
+ mesa/experimental/devs/examples/wolf_sheep.py,sha256=aj5kiEWy-ezQXOomc5mgEdkup1yRYQknQm65ajPWBxs,8051
34
+ mesa/visualization/UserParam.py,sha256=Dl2WOwLYLf0pfLpabCZtIdFRyKZrK6Qtc3utZx5GPYg,2139
35
+ mesa/visualization/__init__.py,sha256=sa8lqeLcDtte19SMzFiKP6K4CrVLxAPwrhDu_AsDWTs,395
36
+ mesa/visualization/solara_viz.py,sha256=vVyAqp3aov8EKmYAvDELEdb5Fonr5JxLws6YZZ02GIk,16459
37
+ mesa/visualization/utils.py,sha256=lJHgRKF5BHLf72Tw3YpwyiWuRoIimaTKQ7xBCw_Rx3A,146
38
+ mesa/visualization/components/altair.py,sha256=E-iblqpWhx72qrjkNz4Ie9c66Hh1OFpLVjuDIg9m2sA,2804
39
+ mesa/visualization/components/matplotlib.py,sha256=wGPxZAS6c3HZgyrkoFKA6z5CqaTr2YVB6sDZtywTt_I,8277
40
+ mesa-3.0.0a5.dist-info/METADATA,sha256=EqwMNNaGiRZhmZVkg032KxexPwvNlEYGmzF9jQ5N05s,8339
41
+ mesa-3.0.0a5.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
42
+ mesa-3.0.0a5.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
43
+ mesa-3.0.0a5.dist-info/licenses/LICENSE,sha256=OGUgret9fRrm8J3pdsPXETIjf0H8puK_Nmy970ZzT78,572
44
+ mesa-3.0.0a5.dist-info/RECORD,,
@@ -1,44 +0,0 @@
1
- mesa/__init__.py,sha256=UIq0dHx3cmtSSVuVFYYLpYS1rzbfn_tcT7vbqo1XLa0,618
2
- mesa/agent.py,sha256=45KS_Cus2Yu-2g5moA8W6ntLWPKNnj9jUeNZiO4NqoI,22920
3
- mesa/batchrunner.py,sha256=-n5mtNGWuKkE0kxWVenXw8b4LXe_LVAZ3rNEBcR2l1A,6097
4
- mesa/datacollection.py,sha256=WUpZoFC2ZdLtKZ0oTwZTqraoP_yNx_yQY9pxO0TR8y0,11442
5
- mesa/main.py,sha256=7MovfNz88VWNnfXP0kcERB6C3GfkVOh0hb0o32hM9LU,1602
6
- mesa/model.py,sha256=_z_aPVu3ADJHZZD7YavBG7fdCYaDQqpkVNEcatWMM90,8551
7
- mesa/space.py,sha256=5St5E26Np_b_fWv-_NEH82ZU0H3C9xHBAschRJtPpng,62698
8
- mesa/time.py,sha256=53VX0x8zujaq32R6w_aBv1NmLpWO_h5K5BQTaK4mO3Q,14960
9
- mesa/cookiecutter-mesa/cookiecutter.json,sha256=tBSWli39fOWUXGfiDCTKd92M7uKaBIswXbkOdbUufYY,337
10
- mesa/cookiecutter-mesa/hooks/post_gen_project.py,sha256=8JoXZKIioRYEWJURC0udj8WS3rg0c4So62sOZSGbrMY,294
11
- mesa/cookiecutter-mesa/{{cookiecutter.snake}}/README.md,sha256=Yji4lGY-NtQSnW-oBj0_Jhs-XhCfZA8R1mBBM_IllGs,80
12
- mesa/cookiecutter-mesa/{{cookiecutter.snake}}/app.pytemplate,sha256=36f9k9CH6TK6VrXsPvTFXGUfCKzCLwgYTeK-Gt27GNg,584
13
- mesa/cookiecutter-mesa/{{cookiecutter.snake}}/setup.pytemplate,sha256=UtRpLM_CkeUZRec-Ef_LiO_x7SKaWN11fOiH9T1UmTw,214
14
- mesa/cookiecutter-mesa/{{cookiecutter.snake}}/{{cookiecutter.snake}}/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- mesa/cookiecutter-mesa/{{cookiecutter.snake}}/{{cookiecutter.snake}}/model.pytemplate,sha256=Aml4Z6E1yj7E7DtHNSUqnKNRUdkxG9WWtJyW8fkxCng,1870
16
- mesa/experimental/UserParam.py,sha256=WgnY3Q0padtGqUCaezgYzd6cZ7LziuIQnGKP3DBuHZY,1641
17
- mesa/experimental/__init__.py,sha256=8KfQcTMv9HJEAjmK5A_KdnFYfoY0nHAz97G_JLJVMNM,183
18
- mesa/experimental/solara_viz.py,sha256=WXQY4b5jLp_ABvhV2df6yerDIijBzns3pXd4hCl5fAA,15253
19
- mesa/experimental/cell_space/__init__.py,sha256=gXntv_Ie13SIegBumJNaIPcTUmTQLb4LlGd1JxoIn9M,708
20
- mesa/experimental/cell_space/cell.py,sha256=AUnvVnXWhdgzr0bLKDRDO9c93v22Zkw6W-tWxhEhGdQ,4578
21
- mesa/experimental/cell_space/cell_agent.py,sha256=Q3SoeK8Af7p4bdcm_E6Hr2uiHCSRsXYvttPUAOo4lRs,1080
22
- mesa/experimental/cell_space/cell_collection.py,sha256=4FmfDEg9LoFiJ0mF_nC8KUt9fCJ7Q21erjWPeBTQ_lw,2293
23
- mesa/experimental/cell_space/discrete_space.py,sha256=ta__YojsrrhWL4DgMzUqZpSgbeexKMrA6bxlYPJGfK0,1921
24
- mesa/experimental/cell_space/grid.py,sha256=gYDExuFBMF3OThUkhbXmolQFKBOqTukcibjfgXicP00,6948
25
- mesa/experimental/cell_space/network.py,sha256=mAaFHBdd4s9kxUWHbViovLW2-pU2yXH0dtY_vF8sCJg,1179
26
- mesa/experimental/cell_space/voronoi.py,sha256=swwfV1Hfi7wp3XfM-rb9Lq5H0yAPH9zohZnXzU8SiHM,9997
27
- mesa/experimental/components/altair.py,sha256=V2CQ-Zr7PeijgWtYBNH3VklGVfrf1ee70XVh0DBBONQ,2366
28
- mesa/experimental/components/matplotlib.py,sha256=J61gHkXd37XyZiNLGF1NaQPOYqDdh9tpSfbOzMqK3dI,7570
29
- mesa/experimental/devs/__init__.py,sha256=CWam15vCj-RD_biMyqv4sJfos1fsL823P7MDEGrbwW8,174
30
- mesa/experimental/devs/eventlist.py,sha256=nyUFNDWnnSPQnrMtj7Qj1PexxKyOwSJuIGBoxtSwVI0,5269
31
- mesa/experimental/devs/simulator.py,sha256=0SMC7daIOyL2rYfoQOOTaTOYDos0gLeBUbU1Krd42HA,9557
32
- mesa/experimental/devs/examples/epstein_civil_violence.py,sha256=wCquOwcNYc--DYGM9Vg4YGx1Kh--HRhSVGjGgzT4k-I,9491
33
- mesa/experimental/devs/examples/wolf_sheep.py,sha256=Hz3sExzjKEzrkFcE2gd7p7a0Ubg-QBGrV-4XQYWgt3c,7501
34
- mesa/visualization/UserParam.py,sha256=WgnY3Q0padtGqUCaezgYzd6cZ7LziuIQnGKP3DBuHZY,1641
35
- mesa/visualization/__init__.py,sha256=T_3QNz9BVuyfcbcMK_2RGGfMYhB7J-8XtaVPViXm1OU,372
36
- mesa/visualization/solara_viz.py,sha256=8eQ-4dTYWuP0fmoaRMV3QqA1DL0tG0wPLmLAiYiiDO0,12188
37
- mesa/visualization/utils.py,sha256=ade9YVhKx3gEaqDySj4YeSixTOHWGjzIIFDPGXL4uAs,103
38
- mesa/visualization/components/altair.py,sha256=2VE4yRHrvBNXpDQUPuj0ejsPU0v3BqSzkphjbIcqzoc,2707
39
- mesa/visualization/components/matplotlib.py,sha256=v-XwsChqWy9ukLe3zi-Q93UBUF20lxTB7lwckX4pB3M,8138
40
- mesa-3.0.0a4.dist-info/METADATA,sha256=2DMGHgOya24WeUxtyEsBY1rzGlFxVkMZ2bcKFXeCZRw,8339
41
- mesa-3.0.0a4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
42
- mesa-3.0.0a4.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
43
- mesa-3.0.0a4.dist-info/licenses/LICENSE,sha256=OGUgret9fRrm8J3pdsPXETIjf0H8puK_Nmy970ZzT78,572
44
- mesa-3.0.0a4.dist-info/RECORD,,
File without changes