@@ -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 )
0 commit comments