Skip to content

Commit d056009

Browse files
committed
Replaces "h" mode with "F" for bike assignment. "F" is only added for the model run and mostly invisible to the end user. The reason for the solution is backwards compatibility.
1 parent 602410b commit d056009

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

Scripts/assignment/assignment_period.py

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ def assign(self, matrices: dict, iteration: Union[int,str]) -> Dict:
121121
self.event_handler.on_assignment_started(self, iteration, matrices)
122122
self._set_emmebank_matrices(matrices, iteration=="last")
123123
if iteration=="init":
124+
self._create_bike_auto_mode()
124125
self._assign_pedestrians()
125126
self._set_bike_vdfs()
126127
self._assign_bikes(self.emme_matrices["bike"]["dist"], "all")
@@ -131,6 +132,7 @@ def assign(self, matrices: dict, iteration: Union[int,str]) -> Dict:
131132
self._calc_extra_wait_time()
132133
self._assign_congested_transit() if param.always_congested else self._assign_transit()
133134
elif iteration==0:
135+
self._create_bike_auto_mode()
134136
self._set_bike_vdfs()
135137
self._assign_bikes(self.emme_matrices["bike"]["dist"], "all")
136138
self._set_car_and_transit_vdfs()
@@ -159,6 +161,7 @@ def assign(self, matrices: dict, iteration: Union[int,str]) -> Dict:
159161
self._calc_extra_wait_time()
160162
self._assign_congested_transit() if param.always_congested else self._assign_transit()
161163
elif iteration=="last":
164+
self._create_bike_auto_mode()
162165
self._set_bike_vdfs()
163166
self._assign_bikes(self.emme_matrices["bike"]["dist"], "all")
164167
self._set_car_and_transit_vdfs()
@@ -167,6 +170,7 @@ def assign(self, matrices: dict, iteration: Union[int,str]) -> Dict:
167170
self._calc_boarding_penalties(is_last_iteration=True)
168171
self._calc_extra_wait_time()
169172
self._assign_congested_transit()
173+
self._delete_bike_auto_mode()
170174
else:
171175
raise ValueError("Iteration number not valid")
172176

@@ -335,7 +339,7 @@ def _set_car_and_transit_vdfs(self):
335339
break
336340
else:
337341
# Link with no car traffic
338-
link.volume_delay_func = 0
342+
link.volume_delay_func = 10 #good enough as default function
339343

340344
# Transit function definition
341345
for modeset in param.transit_delay_funcs:
@@ -376,8 +380,7 @@ def _set_car_and_transit_vdfs(self):
376380
segment.transit_time_func = func
377381
if car_mode in link.modes:
378382
link.modes |= {main_mode}
379-
elif main_mode in link.modes:
380-
link.modes -= {main_mode}
383+
if link.num_lanes == 0: link.num_lanes = 1
381384
self.event_handler.on_car_and_transit_vdfs_set(self, network)
382385
self.emme_scenario.publish_network(network)
383386

@@ -394,6 +397,7 @@ def _set_bike_vdfs(self):
394397
network = self.emme_scenario.get_network()
395398
main_mode = network.mode(param.main_mode)
396399
bike_mode = network.mode(param.bike_mode)
400+
bike_mode_traffic = network.mode(param.bike_mode_traffic)
397401
for turn in network.turns():
398402
if turn.penalty_func == 0:
399403
turn.penalty_func = 1
@@ -405,7 +409,7 @@ def _set_bike_vdfs(self):
405409
roadtype = param.custom_roadtypes[linktype]
406410
else:
407411
roadtype = None
408-
if (roadtype == "motorway" and network.mode('f') in link.modes
412+
if (roadtype == "motorway" and network.mode(param.bike_mode) in link.modes
409413
and link["@pyoratieluokka"] == 0):
410414
# Force bikes on motorways onto separate bikepaths
411415
link["@pyoratieluokka"] = 3
@@ -418,10 +422,21 @@ def _set_bike_vdfs(self):
418422
except KeyError:
419423
link.volume_delay_func = 98
420424
if bike_mode in link.modes:
421-
link.modes |= {main_mode}
422-
elif main_mode in link.modes:
423-
link.modes -= {main_mode}
425+
link.modes |= {bike_mode_traffic}
424426
self.event_handler.on_bike_vdfs_set(self, network)
427+
self.emme_scenario.publish_network(network)
428+
429+
def _create_bike_auto_mode(self):
430+
"""Create special bike mode just for the purpose of bike assignment"""
431+
network = self.emme_scenario.get_network()
432+
if not any(m.id == param.bike_mode_traffic for m in network.modes()):
433+
network.create_mode("AUX_AUTO", param.bike_mode_traffic)
434+
self.emme_scenario.publish_network(network)
435+
436+
def _delete_bike_auto_mode(self):
437+
"""Remove special bike mode from results"""
438+
network = self.emme_scenario.get_network()
439+
network.delete_mode(param.bike_mode_traffic, cascade = True)
425440
self.emme_scenario.publish_network(network)
426441

427442
def _set_emmebank_matrices(self,
@@ -627,7 +642,7 @@ def _specify(self):
627642
"type": "STANDARD_TRAFFIC_ASSIGNMENT",
628643
"classes": [
629644
{
630-
"mode": param.main_mode,
645+
"mode": param.bike_mode_traffic,
631646
"demand": self.emme_matrices["bike"]["demand"],
632647
"results": {
633648
"od_travel_times": {
@@ -702,6 +717,10 @@ def _assign_cars(self,
702717
time_attr = self.extra("car_time")
703718
for link in network.links():
704719
link[time_attr] = link.auto_time
720+
#prevent errors from non-car links
721+
#assignment only uses mode-based subnetworks,
722+
# these should not be used in practice
723+
if link.auto_time > 1e3: link.auto_time = 1e3
705724
self.emme_scenario.publish_network(network)
706725
log.info("Car assignment performed for scenario {}".format(
707726
self.emme_scenario.id))
@@ -750,6 +769,13 @@ def _assign_bikes(self,
750769

751770
def _assign_pedestrians(self):
752771
"""Perform pedestrian assignment for one scenario."""
772+
#Add h mode everywhere just to be sure
773+
network = self.emme_scenario.get_network()
774+
main_mode = network.mode(param.main_mode)
775+
for link in network.links():
776+
link.modes |= {main_mode}
777+
self.emme_scenario.publish_network(network)
778+
753779
log.info("Pedestrian assignment started...")
754780
self.emme_project.pedestrian_assignment(
755781
specification=self.walk_spec, scenario=self.emme_scenario)

Scripts/parameters/assignment.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ def calc_segment_cost(transit_volume, line_capacity, segment):
435435
}
436436
main_mode = 'h'
437437
bike_mode = 'f'
438+
bike_mode_traffic = 'F'
438439
assignment_modes = {
439440
"car_work": 'c',
440441
"car_leisure": 'c',

0 commit comments

Comments
 (0)