Skip to content

Commit de5cda9

Browse files
authored
gis: Replace schedulers with AgentSet functionality (#207)
1 parent 2c05149 commit de5cda9

File tree

6 files changed

+16
-29
lines changed

6 files changed

+16
-29
lines changed

gis/agents_and_networks/src/model/model.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,21 @@ def get_time(model) -> pd.Timedelta:
2222

2323
def get_num_commuters_by_status(model, status: str) -> int:
2424
commuters = [
25-
commuter for commuter in model.schedule.agents if commuter.status == status
25+
commuter
26+
for commuter in model.agents_by_type[Commuter]
27+
if commuter.status == status
2628
]
2729
return len(commuters)
2830

2931

3032
def get_total_friendships_by_type(model, friendship_type: str) -> int:
3133
if friendship_type == "home":
3234
num_friendships = [
33-
commuter.num_home_friends for commuter in model.schedule.agents
35+
commuter.num_home_friends for commuter in model.agents_by_type[Commuter]
3436
]
3537
elif friendship_type == "work":
3638
num_friendships = [
37-
commuter.num_work_friends for commuter in model.schedule.agents
39+
commuter.num_work_friends for commuter in model.agents_by_type[Commuter]
3840
]
3941
else:
4042
raise ValueError(
@@ -45,7 +47,6 @@ def get_total_friendships_by_type(model, friendship_type: str) -> int:
4547

4648
class AgentsAndNetworks(mesa.Model):
4749
running: bool
48-
schedule: mesa.time.RandomActivation
4950
show_walkway: bool
5051
show_lakes_and_rivers: bool
5152
current_id: int
@@ -82,7 +83,6 @@ def __init__(
8283
show_driveway=False,
8384
) -> None:
8485
super().__init__()
85-
self.schedule = mesa.time.RandomActivation(self)
8686
self.show_walkway = show_walkway
8787
self.show_lakes_and_rivers = show_lakes_and_rivers
8888
self.data_crs = data_crs
@@ -144,7 +144,6 @@ def _create_commuters(self) -> None:
144144
commuter.set_work(random_work)
145145
commuter.status = "home"
146146
self.space.add_commuter(commuter)
147-
self.schedule.add(commuter)
148147

149148
def _load_buildings_from_file(
150149
self, buildings_file: str, crs: str, campus: str
@@ -215,7 +214,7 @@ def _set_building_entrance(self) -> None:
215214

216215
def step(self) -> None:
217216
self.__update_clock()
218-
self.schedule.step()
217+
self.agents.shuffle_do("step")
219218
self.datacollector.collect(self)
220219

221220
def __update_clock(self) -> None:

gis/geo_schelling/model.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,11 @@ def step(self):
5555
if similar < different:
5656
# Select an empty region
5757
empties = [a for a in self.model.space.agents if a.atype is None]
58-
# Switch atypes and add/remove from scheduler
58+
# Switch atypes
5959
new_region = random.choice(empties)
6060
new_region.atype = self.atype
61-
self.model.schedule.add(new_region)
6261
self.atype = None
63-
self.model.schedule.remove(self)
62+
self.remove()
6463
else:
6564
self.model.happy += 1
6665

@@ -77,7 +76,6 @@ def __init__(self, density=0.6, minority_pc=0.2, export_data=False):
7776
self.minority_pc = minority_pc
7877
self.export_data = export_data
7978

80-
self.schedule = mesa.time.RandomActivation(self)
8179
self.space = mg.GeoSpace(warn_crs_conversion=False)
8280

8381
self.happy = 0
@@ -100,7 +98,6 @@ def __init__(self, density=0.6, minority_pc=0.2, export_data=False):
10098
agent.atype = 1
10199
else:
102100
agent.atype = 0
103-
self.schedule.add(agent)
104101

105102
def export_agents_to_file(self) -> None:
106103
self.space.get_agents_as_GeoDataFrame(agent_cls=SchellingAgent).to_crs(
@@ -113,10 +110,10 @@ def step(self):
113110
If All agents are happy, halt the model.
114111
"""
115112
self.happy = 0 # Reset counter of happy agents
116-
self.schedule.step()
113+
self.agents.shuffle_do("step")
117114
self.datacollector.collect(self)
118115

119-
if self.happy == self.schedule.get_agent_count():
116+
if self.happy == len(self.agents):
120117
self.running = False
121118

122119
if not self.running and self.export_data:

gis/geo_schelling_points/geo_schelling_points/model.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ def __init__(self, red_percentage=0.5, similarity_threshold=0.5):
1717
self.red_percentage = red_percentage
1818
PersonAgent.SIMILARITY_THRESHOLD = similarity_threshold
1919

20-
self.schedule = mesa.time.RandomActivation(self)
2120
self.space = Nuts2Eu()
2221

2322
self.datacollector = mesa.DataCollector(
@@ -40,7 +39,6 @@ def __init__(self, red_percentage=0.5, similarity_threshold=0.5):
4039
region_id=region.unique_id,
4140
)
4241
self.space.add_person_to_region(person, region_id=region.unique_id)
43-
self.schedule.add(person)
4442

4543
self.datacollector.collect(self)
4644

@@ -57,7 +55,7 @@ def happy(self):
5755
return self.space.num_people - self.unhappy
5856

5957
def step(self):
60-
self.schedule.step()
58+
self.agents.shuffle_do("step")
6159
self.datacollector.collect(self)
6260

6361
if not self.unhappy:

gis/population/population/model.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ def __init__(
7070
Person.MOBILITY_RANGE_X = pixel_size_x / 2.0
7171
Person.MOBILITY_RANGE_Y = pixel_size_y / 2.0
7272

73-
self.schedule = mesa.time.RandomActivation(self)
7473
self._create_agents()
7574

7675
def _create_agents(self):
@@ -90,7 +89,6 @@ def _create_agents(self):
9089
)
9190
person.set_random_world_coord()
9291
self.space.add_agents(person)
93-
self.schedule.add(person)
9492

9593
def step(self):
96-
self.schedule.step()
94+
self.agents.shuffle_do("step")

gis/rainfall/rainfall/model.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def pos(self, pos):
4444

4545
def step(self):
4646
if self.is_at_boundary:
47-
self.model.schedule.remove(self)
47+
self.remove()
4848
else:
4949
lowest_pos = min(
5050
self.model.space.raster_layer.get_neighboring_cells(
@@ -65,7 +65,6 @@ def __init__(self, rain_rate=500, water_height=5, export_data=False, num_steps=2
6565
self.num_steps = num_steps
6666

6767
self.space = CraterLake(crs="epsg:4326", water_height=water_height, model=self)
68-
self.schedule = mesa.time.RandomActivation(self)
6968
self.datacollector = mesa.DataCollector(
7069
{
7170
"Total Amount of Water": "water_amount",
@@ -101,10 +100,9 @@ def step(self):
101100
pos=(random_x, random_y),
102101
)
103102
self.space.add_raindrop(raindrop)
104-
self.schedule.add(raindrop)
105103
self.water_amount += 1
106104

107-
self.schedule.step()
105+
self.agents.shuffle_do("step")
108106
self.datacollector.collect(self)
109107

110108
current_water_level = self.space.raster_layer.get_raster("water_level")
@@ -113,8 +111,7 @@ def step(self):
113111
"water_level_normalized",
114112
)
115113

116-
self.num_steps -= 1
117-
if self.num_steps == 0:
114+
if self.steps >= self.num_steps:
118115
self.running = False
119116
if not self.running and self.export_data:
120117
self.export_water_level_to_file()

gis/urban_growth/urban_growth/model.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ def __init__(
3333
self.slope_coefficient = slope_coefficient
3434
self.critical_slope = critical_slope
3535
self.road_influence = road_influence
36-
self.schedule = mesa.time.RandomActivation(self)
3736

3837
self.dispersion_value = (dispersion_coefficient * 0.005) * (
3938
world_width**2 + world_height**2
@@ -52,7 +51,6 @@ def __init__(
5251
cell.road_found = False
5352
cell.road_pixel = None
5453
cell.model = self
55-
self.schedule.add(cell)
5654

5755
self.initialize_data_collector(
5856
model_reporters={"Percentage Urbanized": "pct_urbanized"}
@@ -110,7 +108,7 @@ def _check_suitability(self) -> None:
110108

111109
def step(self):
112110
self._spontaneous_growth()
113-
self.schedule.step()
111+
self.agents.shuffle_do("step")
114112
if self.road_influence:
115113
self._road_influenced_growth()
116114
self.datacollector.collect(self)

0 commit comments

Comments
 (0)