1
1
from __future__ import annotations
2
- from typing import Dict , Iterable , List , Optional , Union
2
+ from typing import Dict , Iterable , List , Optional , Tuple , Union
3
3
import numpy # type: ignore
4
4
from collections import namedtuple
5
5
import copy
@@ -241,10 +241,7 @@ def transit_line_transaction(self, transaction_file, revert_on_error=True,
241
241
vehicle_id = int (rec [3 ])
242
242
headway = float (rec [4 ])
243
243
itinerary = []
244
- ttf = []
245
- data1 = []
246
- data2 = []
247
- data3 = []
244
+ segment_data = []
248
245
while True :
249
246
segrec = f .readline ().replace ("'" , " " ).split ()
250
247
if not segrec or segrec [0 ] in "amd" :
@@ -253,21 +250,24 @@ def transit_line_transaction(self, transaction_file, revert_on_error=True,
253
250
elif segrec [0 ] not in ("c" , "path=no" ):
254
251
itinerary .append (segrec [0 ])
255
252
try :
256
- ttf .append (int (segrec [2 ][4 :]))
257
- data1 .append (float (segrec [3 ][4 :]))
258
- data2 .append (float (segrec [4 ][4 :]))
259
- data3 .append (float (segrec [5 ][4 :]))
253
+ symbol = segrec [1 ][4 ]
254
+ segment_data .append ({
255
+ "allow_alightings" : symbol in ">+" ,
256
+ "allow_boardings" : symbol in "<+" ,
257
+ "transit_time_func" : int (segrec [2 ][4 :]),
258
+ "data1" : float (segrec [3 ][4 :]),
259
+ "data2" : float (segrec [4 ][4 :]),
260
+ "data3" : float (segrec [5 ][4 :]),
261
+ })
260
262
except IndexError :
261
263
pass
262
264
line = network .create_transit_line (
263
265
line_id , vehicle_id , itinerary )
264
- for i , segment in enumerate (line .segments ()):
265
- segment .transit_time_func = ttf [i ]
266
- segment .data1 = data1 [i ]
267
- segment .data2 = data2 [i ]
268
- segment .data3 = data3 [i ]
266
+ for data , segment in zip (segment_data , line .segments ()):
267
+ segment .__dict__ .update (data )
269
268
elif rec [0 ] == "m" :
270
269
line = network .transit_line (idx = rec [1 ])
270
+ vehicle_id = int (rec [3 ])
271
271
headway = float (rec [4 ])
272
272
else :
273
273
raise SyntaxError ("Unknown update code" )
@@ -532,7 +532,6 @@ def __init__(self):
532
532
self ._links = {}
533
533
self ._vehicles = {}
534
534
self ._lines = {}
535
- self ._segments = []
536
535
self ._objects = {
537
536
"NODE" : self .nodes ,
538
537
"LINK" : self .links ,
@@ -614,18 +613,20 @@ def transit_line(self, idx) -> 'TransitLine':
614
613
def transit_lines (self ) -> Iterable ['TransitLine' ]:
615
614
return iter (self ._lines .values ())
616
615
617
- def transit_segments (self ) -> Iterable :
618
- return iter (self ._segments )
616
+ def transit_segments (self , include_hidden = False ) -> Tuple ['Segment' ]:
617
+ return (segment for line in self .transit_lines ()
618
+ for segment in line .segments (include_hidden ))
619
619
620
620
def create_transit_line (self , idx : str , transit_vehicle_id : int , itinerary : List [List [str ]]) -> 'TransitLine' :
621
621
line = TransitLine (self , idx , transit_vehicle_id )
622
622
self ._lines [idx ] = line
623
623
for i in range (len (itinerary ) - 1 ):
624
624
link = self .link (itinerary [i ], itinerary [i + 1 ])
625
625
segment = TransitSegment (self , line , link )
626
- self ._segments .append (segment )
627
626
line ._segments .append (segment )
628
627
link ._segments .append (segment )
628
+ line ._segments .append (
629
+ HiddenSegment (self , line , self .node (itinerary [- 1 ])))
629
630
return line
630
631
631
632
@@ -700,6 +701,9 @@ def __init__(self,
700
701
def id (self ):
701
702
return str (self .number )
702
703
704
+ def outgoing_segments (self , include_hidden = False ):
705
+ return (s for s in self .network .transit_segments (include_hidden )
706
+ if s .i_node is self )
703
707
704
708
class Link (NetworkObject ):
705
709
def __init__ (self ,
@@ -766,8 +770,11 @@ def mode(self) -> Mode:
766
770
def segment (self , idx ) -> 'TransitSegment' :
767
771
return self ._segments [idx ]
768
772
769
- def segments (self ) -> Iterable :
770
- return iter (self ._segments )
773
+ def segments (self , include_hidden = False ) -> Iterable :
774
+ if include_hidden :
775
+ return iter (self ._segments )
776
+ else :
777
+ return iter (self ._segments [:- 1 ])
771
778
772
779
773
780
class TransitSegment (NetworkObject ):
@@ -776,6 +783,8 @@ def __init__(self, network: Network, line: TransitLine, link: Link):
776
783
self , network , network ._extra_attr ["TRANSIT_SEGMENT" ])
777
784
self .line = line
778
785
self .link = link
786
+ self .allow_alightings = False
787
+ self .allow_boardings = False
779
788
self .transit_time_func = 0
780
789
self .dwell_time = 0.01
781
790
@@ -792,6 +801,24 @@ def j_node(self) -> Node:
792
801
return self .link .j_node
793
802
794
803
804
+ class HiddenSegment (TransitSegment ):
805
+ def __init__ (self , network , line , node ):
806
+ TransitSegment .__init__ (self , network , line , None )
807
+ self ._node = node
808
+
809
+ @property
810
+ def id (self ):
811
+ return "{}-{}" .format (self .line , self .i_node )
812
+
813
+ @property
814
+ def i_node (self ):
815
+ return self ._node
816
+
817
+ @property
818
+ def j_node (self ):
819
+ return None
820
+
821
+
795
822
class ExistenceError (Exception ):
796
823
pass
797
824
0 commit comments