Mesa 2.2.3__py3-none-any.whl → 2.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/space.py CHANGED
@@ -71,6 +71,21 @@ def is_integer(x: Real) -> bool:
71
71
  return isinstance(x, _types_integer)
72
72
 
73
73
 
74
+ def warn_if_agent_has_position_already(placement_func):
75
+ def wrapper(self, agent, *args, **kwargs):
76
+ if agent.pos is not None:
77
+ warnings.warn(
78
+ f"""Agent {agent.unique_id} is being placed with
79
+ place_agent() despite already having the position {agent.pos}. In most
80
+ cases, you'd want to clear the current position with remove_agent()
81
+ before placing the agent again.""",
82
+ stacklevel=2,
83
+ )
84
+ placement_func(self, agent, *args, **kwargs)
85
+
86
+ return wrapper
87
+
88
+
74
89
  class _Grid:
75
90
  """Base class for a rectangular grid.
76
91
 
@@ -135,14 +150,12 @@ class _Grid:
135
150
  self._empties_built = True
136
151
 
137
152
  @overload
138
- def __getitem__(self, index: int | Sequence[Coordinate]) -> list[GridContent]:
139
- ...
153
+ def __getitem__(self, index: int | Sequence[Coordinate]) -> list[GridContent]: ...
140
154
 
141
155
  @overload
142
156
  def __getitem__(
143
157
  self, index: tuple[int | slice, int | slice]
144
- ) -> GridContent | list[GridContent]:
145
- ...
158
+ ) -> GridContent | list[GridContent]: ...
146
159
 
147
160
  def __getitem__(self, index):
148
161
  """Access contents from the grid."""
@@ -405,11 +418,9 @@ class _Grid:
405
418
  """
406
419
  return list(self.iter_cell_list_contents(cell_list))
407
420
 
408
- def place_agent(self, agent: Agent, pos: Coordinate) -> None:
409
- ...
421
+ def place_agent(self, agent: Agent, pos: Coordinate) -> None: ...
410
422
 
411
- def remove_agent(self, agent: Agent) -> None:
412
- ...
423
+ def remove_agent(self, agent: Agent) -> None: ...
413
424
 
414
425
  def move_agent(self, agent: Agent, pos: Coordinate) -> None:
415
426
  """Move an agent from its current position to a new position.
@@ -450,6 +461,7 @@ class _Grid:
450
461
  # Find the closest position without sorting all positions
451
462
  closest_pos = None
452
463
  min_distance = float("inf")
464
+ agent.random.shuffle(pos)
453
465
  for p in pos:
454
466
  distance = self._distance_squared(p, current_pos)
455
467
  if distance < min_distance:
@@ -763,16 +775,14 @@ class _PropertyGrid(_Grid):
763
775
 
764
776
  Attributes:
765
777
  properties (dict): A dictionary mapping property layer names to PropertyLayer instances.
766
- empty_mask: Returns a boolean mask indicating empty cells on the grid.
778
+ empty_mask (np.ndarray): A boolean array indicating empty cells on the grid.
767
779
 
768
780
  Methods:
769
781
  add_property_layer(property_layer): Adds a new property layer to the grid.
770
782
  remove_property_layer(property_name): Removes a property layer from the grid by its name.
771
783
  get_neighborhood_mask(pos, moore, include_center, radius): Generates a boolean mask of the neighborhood.
772
- select_cells_by_properties(conditions, mask, return_list): Selects cells based on multiple property conditions,
773
- optionally with a mask, returning either a list of coordinates or a mask.
774
- select_extreme_value_cells(property_name, mode, mask, return_list): Selects cells with extreme values of a property,
775
- optionally with a mask, returning either a list of coordinates or a mask.
784
+ select_cells(conditions, extreme_values, masks, only_empty, return_list): Selects cells based on multiple conditions,
785
+ extreme values, masks, with an option to select only empty cells, returning either a list of coordinates or a mask.
776
786
 
777
787
  Mask Usage:
778
788
  Several methods in this class accept a mask as an input, which is a NumPy ndarray of boolean values. This mask
@@ -978,6 +988,7 @@ class SingleGrid(_PropertyGrid):
978
988
  the grid for empty spaces.
979
989
  """
980
990
 
991
+ @warn_if_agent_has_position_already
981
992
  def place_agent(self, agent: Agent, pos: Coordinate) -> None:
982
993
  """Place the agent at the specified location, and set its pos variable."""
983
994
  if self.is_cell_empty(pos):
@@ -1026,6 +1037,7 @@ class MultiGrid(_PropertyGrid):
1026
1037
  """Default value for new cell elements."""
1027
1038
  return []
1028
1039
 
1040
+ @warn_if_agent_has_position_already
1029
1041
  def place_agent(self, agent: Agent, pos: Coordinate) -> None:
1030
1042
  """Place the agent at the specified location, and set its pos variable."""
1031
1043
  x, y = pos
@@ -1357,6 +1369,7 @@ class ContinuousSpace:
1357
1369
  self._agent_points = None
1358
1370
  self._index_to_agent = {}
1359
1371
 
1372
+ @warn_if_agent_has_position_already
1360
1373
  def place_agent(self, agent: Agent, pos: FloatCoordinate) -> None:
1361
1374
  """Place a new agent in the space.
1362
1375
 
@@ -1517,6 +1530,7 @@ class NetworkGrid:
1517
1530
  """Default value for a new node."""
1518
1531
  return []
1519
1532
 
1533
+ @warn_if_agent_has_position_already
1520
1534
  def place_agent(self, agent: Agent, node_id: int) -> None:
1521
1535
  """Place an agent in a node."""
1522
1536
  self.G.nodes[node_id]["agent"].append(agent)
@@ -1539,9 +1553,11 @@ class NetworkGrid:
1539
1553
  neighborhood = sorted(neighbors_with_distance.keys())
1540
1554
  return neighborhood
1541
1555
 
1542
- def get_neighbors(self, node_id: int, include_center: bool = False) -> list[Agent]:
1543
- """Get all agents in adjacent nodes."""
1544
- neighborhood = self.get_neighborhood(node_id, include_center)
1556
+ def get_neighbors(
1557
+ self, node_id: int, include_center: bool = False, radius: int = 1
1558
+ ) -> list[Agent]:
1559
+ """Get all agents in adjacent nodes (within a certain radius)."""
1560
+ neighborhood = self.get_neighborhood(node_id, include_center, radius)
1545
1561
  return self.get_cell_list_contents(neighborhood)
1546
1562
 
1547
1563
  def move_agent(self, agent: Agent, node_id: int) -> None:
mesa/time.py CHANGED
@@ -25,9 +25,7 @@ Key concepts:
25
25
  # Remove this __future__ import once the oldest supported Python is 3.10
26
26
  from __future__ import annotations
27
27
 
28
- import heapq
29
28
  import warnings
30
- import weakref
31
29
  from collections import defaultdict
32
30
  from collections.abc import Iterable
33
31
 
@@ -73,6 +71,8 @@ class BaseScheduler:
73
71
  self.model = model
74
72
  self.steps = 0
75
73
  self.time: TimeT = 0
74
+ self._original_step = self.step
75
+ self.step = self._wrapped_step
76
76
 
77
77
  if agents is None:
78
78
  agents = []
@@ -115,6 +115,11 @@ class BaseScheduler:
115
115
  self.steps += 1
116
116
  self.time += 1
117
117
 
118
+ def _wrapped_step(self):
119
+ """Wrapper for the step method to include time and step updating."""
120
+ self._original_step()
121
+ self.model._advance_time()
122
+
118
123
  def get_agent_count(self) -> int:
119
124
  """Returns the current number of agents in the queue."""
120
125
  return len(self._agents)
@@ -143,8 +148,8 @@ class BaseScheduler:
143
148
 
144
149
  def do_each(self, method, shuffle=False):
145
150
  if shuffle:
146
- self.agents.shuffle(inplace=True)
147
- self.agents.do(method)
151
+ self._agents.shuffle(inplace=True)
152
+ self._agents.do(method)
148
153
 
149
154
 
150
155
  class RandomActivation(BaseScheduler):
@@ -299,7 +304,7 @@ class RandomActivationByType(BaseScheduler):
299
304
 
300
305
  agentsbytype = defaultdict(dict)
301
306
  for k, v in self._agents_by_type.items():
302
- agentsbytype[k] = {agent: agent.unique_id for agent in v}
307
+ agentsbytype[k] = {agent.unique_id: agent for agent in v}
303
308
 
304
309
  return agentsbytype
305
310
 
@@ -386,46 +391,7 @@ class RandomActivationByType(BaseScheduler):
386
391
 
387
392
  class DiscreteEventScheduler(BaseScheduler):
388
393
  """
389
- A scheduler for discrete event simulation in Mesa.
390
-
391
- This scheduler manages events where each event is associated with a
392
- specific time and agent. The scheduler advances time not in fixed
393
- increments, but to the moment the next event is scheduled to occur.
394
-
395
- This implementation uses a priority queue (heapq) to manage events. Each
396
- event is a tuple of the form (time, random_value, agent), where:
397
- - time (float): The scheduled time for the event.
398
- - random_value (float): A secondary sorting criterion to randomize
399
- the order of events that are scheduled for the same time.
400
- - agent (Agent): The agent associated with the event.
401
-
402
- The random value for secondary sorting ensures that when two events are
403
- scheduled for the same time, their execution order is randomized, thus
404
- preventing direct comparison issues between different types of agents and
405
- maintaining the integrity of the simulation's randomness.
406
-
407
- Attributes:
408
- model (Model): The model instance associated with the scheduler.
409
- event_queue (list): A priority queue of scheduled events.
410
- time_step (int or float): The fixed time period by which the model advances
411
- on each step. Defaults to 1.
412
-
413
- Methods:
414
- schedule_event(time, agent): Schedule an event for a specific time.
415
- schedule_in(delay, agent): Schedule an event after a specified delay.
416
- step(): Execute all events within the next time_step period.
417
- get_next_event_time(): Returns the time of the next scheduled event.
418
-
419
- Usage:
420
- 1. Instantiate the DiscreteEventScheduler with a model instance and a time_step period.
421
- 2. Add agents to the scheduler using schedule.add(). With schedule_now=True (default),
422
- the first event for the agent will be scheduled immediately.
423
- 3. In the Agent step() method, schedule the next event for the agent
424
- (using schedule_in or schedule_event).
425
- 3. Add self.schedule.step() to the model's step() method, as usual.
426
-
427
- Now, with each model step, the scheduler will execute all events within the
428
- next time_step period, and advance time one time_step forward.
394
+ This class has been deprecated and replaced by the functionality provided by experimental.devs
429
395
  """
430
396
 
431
397
  def __init__(self, model: Model, time_step: TimeT = 1) -> None:
@@ -437,72 +403,6 @@ class DiscreteEventScheduler(BaseScheduler):
437
403
 
438
404
  """
439
405
  super().__init__(model)
440
- self.event_queue: list[tuple[TimeT, float, weakref.ref]] = []
441
- self.time_step: TimeT = time_step # Fixed time period for each step
442
-
443
- warnings.warn(
444
- "The DiscreteEventScheduler is experimental. It may be changed or removed in any and all future releases, including patch releases.\n"
445
- "We would love to hear what you think about this new feature. If you have any thoughts, share them with us here: https://github.com/projectmesa/mesa/discussions/1923",
446
- FutureWarning,
447
- stacklevel=2,
406
+ raise Exception(
407
+ "DiscreteEventScheduler is deprecated in favor of the functionality provided by experimental.devs"
448
408
  )
449
-
450
- def schedule_event(self, time: TimeT, agent: Agent) -> None:
451
- """Schedule an event for an agent at a specific time."""
452
- if time < self.time:
453
- raise ValueError(
454
- f"Scheduled time ({time}) must be >= the current time ({self.time})"
455
- )
456
- if agent not in self._agents:
457
- raise ValueError(
458
- "trying to schedule an event for agent which is not known to the scheduler"
459
- )
460
-
461
- # Create an event, sorted first on time, secondary on a random value
462
- event = (time, self.model.random.random(), weakref.ref(agent))
463
- heapq.heappush(self.event_queue, event)
464
-
465
- def schedule_in(self, delay: TimeT, agent: Agent) -> None:
466
- """Schedule an event for an agent after a specified delay."""
467
- if delay < 0:
468
- raise ValueError("Delay must be non-negative")
469
- event_time = self.time + delay
470
- self.schedule_event(event_time, agent)
471
-
472
- def step(self) -> None:
473
- """Execute the next event and advance the time."""
474
- end_time = self.time + self.time_step
475
-
476
- while self.event_queue and self.event_queue[0][0] <= end_time:
477
- # Get the next event (ignore the random value during unpacking)
478
- time, _, agent = heapq.heappop(self.event_queue)
479
- agent = agent() # unpack weakref
480
-
481
- if agent:
482
- # Advance time to the event's time
483
- self.time = time
484
- # Execute the event
485
- agent.step()
486
-
487
- # After processing events, advance time by the time_step
488
- self.time = end_time
489
- self.steps += 1
490
-
491
- def get_next_event_time(self) -> TimeT | None:
492
- """Returns the time of the next scheduled event."""
493
- if not self.event_queue:
494
- return None
495
- return self.event_queue[0][0]
496
-
497
- def add(self, agent: Agent, schedule_now: bool = True) -> None:
498
- """Add an Agent object to the schedule and optionally schedule its first event.
499
-
500
- Args:
501
- agent: An Agent to be added to the schedule. Must have a step() method.
502
- schedule_now: If True, schedules the first event for the agent immediately.
503
- """
504
- super().add(agent) # Call the add method from BaseScheduler
505
-
506
- if schedule_now:
507
- # Schedule the first event immediately
508
- self.schedule_event(self.time, agent)
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: Mesa
3
- Version: 2.2.3
3
+ Version: 2.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
@@ -16,6 +16,8 @@ Classifier: Operating System :: OS Independent
16
16
  Classifier: Programming Language :: Python :: 3 :: Only
17
17
  Classifier: Programming Language :: Python :: 3.9
18
18
  Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
19
21
  Classifier: Topic :: Scientific/Engineering
20
22
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
23
  Classifier: Topic :: Scientific/Engineering :: Artificial Life
@@ -32,6 +34,7 @@ Requires-Dist: tqdm
32
34
  Provides-Extra: dev
33
35
  Requires-Dist: coverage; extra == 'dev'
34
36
  Requires-Dist: pytest-cov; extra == 'dev'
37
+ Requires-Dist: pytest-mock; extra == 'dev'
35
38
  Requires-Dist: pytest>=4.6; extra == 'dev'
36
39
  Requires-Dist: ruff~=0.1.1; extra == 'dev'
37
40
  Requires-Dist: sphinx; extra == 'dev'
@@ -46,12 +49,12 @@ Description-Content-Type: text/markdown
46
49
 
47
50
  # Mesa: Agent-based modeling in Python
48
51
 
49
- [![PyPi](https://img.shields.io/pypi/v/mesa.svg)](https://pypi.python.org/pypi/Mesa)
50
- [![GitHub Actions build status](https://github.com/projectmesa/mesa/workflows/build/badge.svg)](https://github.com/projectmesa/mesa/actions)
51
- [![Coverage status](https://codecov.io/gh/projectmesa/mesa/branch/main/graph/badge.svg)](https://codecov.io/gh/projectmesa/mesa)
52
- [![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
53
- [![chat](https://img.shields.io/matrix/project-mesa:matrix.org?label=chat&logo=Matrix)](https://matrix.to/#/#project-mesa:matrix.org)
54
- [![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg)](https://github.com/pypa/hatch)
52
+ | | |
53
+ | --- | --- |
54
+ | CI/CD | [![GitHub Actions build status](https://github.com/projectmesa/mesa/workflows/build/badge.svg)](https://github.com/projectmesa/mesa/actions) [![Coverage status](https://codecov.io/gh/projectmesa/mesa/branch/main/graph/badge.svg)](https://codecov.io/gh/projectmesa/mesa) |
55
+ | Package | [![PyPI - Version](https://img.shields.io/pypi/v/mesa.svg?logo=pypi&label=PyPI&logoColor=gold)](https://pypi.org/project/Mesa/) [![PyPI - Downloads](https://img.shields.io/pypi/dm/mesa.svg?color=blue&label=Downloads&logo=pypi&logoColor=gold)](https://pypi.org/project/Mesa/) [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/mesa.svg?logo=python&label=Python&logoColor=gold)](https://pypi.org/project/Mesa/) |
56
+ | Meta | [![linting - Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Hatch project](https://img.shields.io/badge/%F0%9F%A5%9A-Hatch-4051b5.svg)](https://github.com/pypa/hatch) |
57
+ | Chat | [![chat](https://img.shields.io/matrix/project-mesa:matrix.org?label=chat&logo=Matrix)](https://matrix.to/#/#project-mesa:matrix.org) |
55
58
 
56
59
  Mesa allows users to quickly create agent-based models using built-in
57
60
  core components (such as spatial grids and agent schedulers) or
@@ -160,7 +163,7 @@ If you would like to add a feature, please reach out via [ticket](https://github
160
163
  join a dev session (see [Mesa discussions](https://github.com/projectmesa/mesa/discussions)). A feature is most likely
161
164
  to be added if you build it!
162
165
 
163
- Don't forget to checkout the [Contributors guide](https://github.com/projectmesa/mesa/blob/main/CONTRIBUTING.rst).
166
+ Don't forget to checkout the [Contributors guide](https://github.com/projectmesa/mesa/blob/main/CONTRIBUTING.md).
164
167
 
165
168
  ## Citing Mesa
166
169
 
@@ -0,0 +1,45 @@
1
+ mesa/__init__.py,sha256=Hhvyt9tR-PXIbP9nhT3WxDOURSucRP7mVZM3YXUxkMo,680
2
+ mesa/agent.py,sha256=L_kHMM3lTVLq8EM3UsX1xVLLo-P5IqFrJEqg83gT7xs,12902
3
+ mesa/batchrunner.py,sha256=2A1_FbFlSCkDm8xfv1ZamFiBE4VYce8sKP5SR_CledE,6087
4
+ mesa/datacollection.py,sha256=Iwz8Nuib1Fmo8sJ0ng-qstBhAkdKXn-CXomylCkCRGQ,11195
5
+ mesa/main.py,sha256=7MovfNz88VWNnfXP0kcERB6C3GfkVOh0hb0o32hM9LU,1602
6
+ mesa/model.py,sha256=RxTCJUBfEgRIu3dXiMK9oMlxS3owwNQaQIrVRs6HsZY,5823
7
+ mesa/space.py,sha256=K2QsFXbBPPSzsPQMJMxERNX0kJ5dhlp0NNrWxuQpq-Q,62471
8
+ mesa/time.py,sha256=G83UKWeMFMnQV9-79Ps2gbD_Qz3hM07IFYLzf5Rvz1w,15243
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}}/run.pytemplate,sha256=7bYSRdq83--T1gnEuFls5aunb7lLNtUKFS2MUrovEg0,74
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=gTxSZ9t8My_Qiwuusqaf8DmspncrLKptxbg9cvfbloc,1842
16
+ mesa/cookiecutter-mesa/{{cookiecutter.snake}}/{{cookiecutter.snake}}/server.pytemplate,sha256=nqi6cPjhiyrYw82_Y9hLSrfZtSVCGIhMLOXRB7kKTlQ,823
17
+ mesa/experimental/UserParam.py,sha256=kpFu5yH_RSTI4S2XQxYAGWJgGwQo6j-yCADYJHry4lE,1641
18
+ mesa/experimental/__init__.py,sha256=ncy-EG4IMoSzknYXLMt3Z61nkMwkrH96QbJpGUqOpxQ,168
19
+ mesa/experimental/jupyter_viz.py,sha256=q2Xn-QjH0nqJoxY1RV_SSHC_OgMFZyKWHJjrn5jHCRk,13444
20
+ mesa/experimental/cell_space/__init__.py,sha256=trFVKf2l5RbkCUyxP09Kox_J3ak2YdM4o3t40Tsjjm4,628
21
+ mesa/experimental/cell_space/cell.py,sha256=AUnvVnXWhdgzr0bLKDRDO9c93v22Zkw6W-tWxhEhGdQ,4578
22
+ mesa/experimental/cell_space/cell_agent.py,sha256=G4u9ht4gW9ns1y2L7pFumF3K4HiP6ROuxwrxHZ-mL1M,1107
23
+ mesa/experimental/cell_space/cell_collection.py,sha256=Rjho3zIyKaamO2X9XEZu16qlmEP41tIHyhMST2KHK4o,2293
24
+ mesa/experimental/cell_space/discrete_space.py,sha256=ta__YojsrrhWL4DgMzUqZpSgbeexKMrA6bxlYPJGfK0,1921
25
+ mesa/experimental/cell_space/grid.py,sha256=IltngMSlMwLsJSNYrs6B4J5ylUbL5Vk1vPX_OhWGzTs,6949
26
+ mesa/experimental/cell_space/network.py,sha256=NWEdROFyO18pHOTb6_t9zjjUyGhAztPJm8a9b21c8ZU,1195
27
+ mesa/experimental/components/altair.py,sha256=_atxt79OpRjykAEwockKm0K9dp1jDPmcLeKqffZ0Bfo,2397
28
+ mesa/experimental/components/matplotlib.py,sha256=DVf41wdN1J56IQJXaeonqL4rcwYlsUIUB7C6r5ozdfg,4325
29
+ mesa/experimental/devs/__init__.py,sha256=CWam15vCj-RD_biMyqv4sJfos1fsL823P7MDEGrbwW8,174
30
+ mesa/experimental/devs/eventlist.py,sha256=H9hufe9VmwvlXQr146wCa7PgbzVvivG4Bk9rlEERZ7A,4880
31
+ mesa/experimental/devs/simulator.py,sha256=NQ3rtBIzykBtMWNslG_Fg04NQn2lYT8cmH-7ndr8v0Y,9530
32
+ mesa/experimental/devs/examples/epstein_civil_violence.py,sha256=KqH9KI-A_BYt7oWi9kaOhTzjrf2pETqzSpAQG8ewud0,9667
33
+ mesa/experimental/devs/examples/wolf_sheep.py,sha256=h5z-eDqMpYeOjrq293N2BcQbs_LDVsgtg9vblXJM7XQ,7697
34
+ mesa/flat/__init__.py,sha256=hSqQDjkfIgDu7B3aYtjPeNEUXdlKPHQuNN8HEV0XR6s,218
35
+ mesa/flat/visualization.py,sha256=5aCm8xDCmZij3hoJZvOVmmpzU9ACXSSSvmQr51buLVg,290
36
+ mesa/visualization/ModularVisualization.py,sha256=gT-FYRnvTFFxtehu-N-8eBLShCF8t_Ut8Au4iVPZIlA,60
37
+ mesa/visualization/TextVisualization.py,sha256=BIP0XcmIdYhz0igqe8yRZXlXeOOqJZeu8q9XViJTuLc,57
38
+ mesa/visualization/UserParam.py,sha256=D3qxoX-Cpqhyn06IdIO_C5s0u8nlhv3988lVwkBlcGo,49
39
+ mesa/visualization/__init__.py,sha256=5fwVAzgVsmxAzgoLxdC26l2ZE-m2bWj963xPNSDaQEQ,287
40
+ mesa/visualization/modules.py,sha256=pf6K3KECX51VNNqpFCm2EE5KV0A22UYmfXzTVXPnF_o,47
41
+ mesa-2.3.0.dist-info/METADATA,sha256=l0JwAmr_TViBClkM7zKIc3JfS9sv28dgyzsjZ-2ERmU,7865
42
+ mesa-2.3.0.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
43
+ mesa-2.3.0.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
44
+ mesa-2.3.0.dist-info/licenses/LICENSE,sha256=OGUgret9fRrm8J3pdsPXETIjf0H8puK_Nmy970ZzT78,572
45
+ mesa-2.3.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.21.0
2
+ Generator: hatchling 1.24.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,31 +0,0 @@
1
- mesa/__init__.py,sha256=Yc2zjRJrWikG5FSdvxPgv_Zw-yZarIuveZ8NUNy_N0w,679
2
- mesa/agent.py,sha256=tyRUsZTRGEiv8GLEZJ77eH75N0OYyy8DQ3eBFqgRyK8,13047
3
- mesa/batchrunner.py,sha256=2A1_FbFlSCkDm8xfv1ZamFiBE4VYce8sKP5SR_CledE,6087
4
- mesa/datacollection.py,sha256=uyPLY5LYNH2lfDvPsar3-WtsgoIMYdaqB9k_889PhAQ,11169
5
- mesa/main.py,sha256=_7y918D0EEHJBLgiV7rqVNWvCyzjamHUSQ873OeEGf8,1468
6
- mesa/model.py,sha256=sH0rJEe5x0bLanbyeNCsqQDD7bU-xtxTs3B4qUqwvsg,5629
7
- mesa/space.py,sha256=9cN0fW0E850oBFp1lBVvr9_JWKN8wEbUrWuG05QHTE8,61870
8
- mesa/time.py,sha256=ldt5TbXQ3vVuwMECafcHiMDBEe2VFvYfEVsNFR9kWKk,19955
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}}/run.pytemplate,sha256=7bYSRdq83--T1gnEuFls5aunb7lLNtUKFS2MUrovEg0,74
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=gTxSZ9t8My_Qiwuusqaf8DmspncrLKptxbg9cvfbloc,1842
16
- mesa/cookiecutter-mesa/{{cookiecutter.snake}}/{{cookiecutter.snake}}/server.pytemplate,sha256=nqi6cPjhiyrYw82_Y9hLSrfZtSVCGIhMLOXRB7kKTlQ,823
17
- mesa/experimental/__init__.py,sha256=lHhvI2jfsLHfICO7q-LRA6UK4Pyxr7edkBDbjTqPGVo,55
18
- mesa/experimental/jupyter_viz.py,sha256=-E8Ie4J3N0894Wr8kmsSGabELbh34GG_elOxUjEutOw,11712
19
- mesa/experimental/components/matplotlib.py,sha256=5xqlSc8wwYxVc_M0GNt0NC0BRS8cdEp6TvBqHoRMhvY,4065
20
- mesa/flat/__init__.py,sha256=hSqQDjkfIgDu7B3aYtjPeNEUXdlKPHQuNN8HEV0XR6s,218
21
- mesa/flat/visualization.py,sha256=5aCm8xDCmZij3hoJZvOVmmpzU9ACXSSSvmQr51buLVg,290
22
- mesa/visualization/ModularVisualization.py,sha256=gT-FYRnvTFFxtehu-N-8eBLShCF8t_Ut8Au4iVPZIlA,60
23
- mesa/visualization/TextVisualization.py,sha256=BIP0XcmIdYhz0igqe8yRZXlXeOOqJZeu8q9XViJTuLc,57
24
- mesa/visualization/UserParam.py,sha256=D3qxoX-Cpqhyn06IdIO_C5s0u8nlhv3988lVwkBlcGo,49
25
- mesa/visualization/__init__.py,sha256=5fwVAzgVsmxAzgoLxdC26l2ZE-m2bWj963xPNSDaQEQ,287
26
- mesa/visualization/modules.py,sha256=pf6K3KECX51VNNqpFCm2EE5KV0A22UYmfXzTVXPnF_o,47
27
- mesa-2.2.3.dist-info/METADATA,sha256=URL5-0xna14R6lkaZhfzf1sbYnevYauiq9R3K1rLY0E,7148
28
- mesa-2.2.3.dist-info/WHEEL,sha256=mRYSEL3Ih6g5a_CVMIcwiF__0Ae4_gLYh01YFNwiq1k,87
29
- mesa-2.2.3.dist-info/entry_points.txt,sha256=IOcQtetGF8l4wHpOs_hGb19Rz-FS__BMXOJR10IBPsA,39
30
- mesa-2.2.3.dist-info/licenses/LICENSE,sha256=OGUgret9fRrm8J3pdsPXETIjf0H8puK_Nmy970ZzT78,572
31
- mesa-2.2.3.dist-info/RECORD,,