Skip to content

Commit dc32a3e

Browse files
hsl-petrhajzptro
andauthored
Network validation vol2 (#534)
*Reorganizing validation tests *Adjusting the testing data so that it passes through the validation checks --------- Co-authored-by: Jens West <jens.west@traficom.fi>
1 parent 0fbcbc6 commit dc32a3e

File tree

16 files changed

+258
-108
lines changed

16 files changed

+258
-108
lines changed

Scripts/assignment/emme_assignment.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ def _add_bus_stops(self):
336336
else:
337337
segment.allow_alightings = is_stop
338338
segment.allow_boardings = is_stop
339+
339340
self.mod_scenario.publish_network(network)
340341

341342
def _create_matrices(self, time_period, id_hundred, id_ten):

Scripts/assignment/emme_bindings/mock_project.py

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from __future__ import annotations
2-
from typing import Dict, Iterable, List, Optional, Union
2+
from typing import Dict, Iterable, List, Optional, Tuple, Union
33
import numpy # type: ignore
44
from collections import namedtuple
55
import copy
@@ -241,10 +241,7 @@ def transit_line_transaction(self, transaction_file, revert_on_error=True,
241241
vehicle_id = int(rec[3])
242242
headway = float(rec[4])
243243
itinerary = []
244-
ttf = []
245-
data1 = []
246-
data2 = []
247-
data3 = []
244+
segment_data = []
248245
while True:
249246
segrec = f.readline().replace("'", " ").split()
250247
if not segrec or segrec[0] in "amd":
@@ -253,21 +250,24 @@ def transit_line_transaction(self, transaction_file, revert_on_error=True,
253250
elif segrec[0] not in ("c", "path=no"):
254251
itinerary.append(segrec[0])
255252
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+
})
260262
except IndexError:
261263
pass
262264
line = network.create_transit_line(
263265
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)
269268
elif rec[0] == "m":
270269
line = network.transit_line(idx=rec[1])
270+
vehicle_id = int(rec[3])
271271
headway = float(rec[4])
272272
else:
273273
raise SyntaxError("Unknown update code")
@@ -532,7 +532,6 @@ def __init__(self):
532532
self._links = {}
533533
self._vehicles = {}
534534
self._lines = {}
535-
self._segments = []
536535
self._objects = {
537536
"NODE": self.nodes,
538537
"LINK": self.links,
@@ -614,18 +613,20 @@ def transit_line(self, idx) -> 'TransitLine':
614613
def transit_lines(self) -> Iterable['TransitLine']:
615614
return iter(self._lines.values())
616615

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))
619619

620620
def create_transit_line(self, idx: str, transit_vehicle_id: int, itinerary: List[List[str]]) -> 'TransitLine':
621621
line = TransitLine(self, idx, transit_vehicle_id)
622622
self._lines[idx] = line
623623
for i in range(len(itinerary) - 1):
624624
link = self.link(itinerary[i], itinerary[i + 1])
625625
segment = TransitSegment(self, line, link)
626-
self._segments.append(segment)
627626
line._segments.append(segment)
628627
link._segments.append(segment)
628+
line._segments.append(
629+
HiddenSegment(self, line, self.node(itinerary[-1])))
629630
return line
630631

631632

@@ -700,6 +701,9 @@ def __init__(self,
700701
def id(self):
701702
return str(self.number)
702703

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)
703707

704708
class Link(NetworkObject):
705709
def __init__(self,
@@ -766,8 +770,11 @@ def mode(self) -> Mode:
766770
def segment(self, idx) -> 'TransitSegment':
767771
return self._segments[idx]
768772

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])
771778

772779

773780
class TransitSegment(NetworkObject):
@@ -776,6 +783,8 @@ def __init__(self, network: Network, line: TransitLine, link: Link):
776783
self, network, network._extra_attr["TRANSIT_SEGMENT"])
777784
self.line = line
778785
self.link = link
786+
self.allow_alightings = False
787+
self.allow_boardings = False
779788
self.transit_time_func = 0
780789
self.dwell_time = 0.01
781790

@@ -792,6 +801,24 @@ def j_node(self) -> Node:
792801
return self.link.j_node
793802

794803

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+
795822
class ExistenceError(Exception):
796823
pass
797824

Scripts/tests/emme_only/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)