Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/tools/output/vehrouteDiff.py
169674 views
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
4
# Copyright (C) 2012-2025 German Aerospace Center (DLR) and others.
5
# This program and the accompanying materials are made available under the
6
# terms of the Eclipse Public License 2.0 which is available at
7
# https://www.eclipse.org/legal/epl-2.0/
8
# This Source Code may also be made available under the following Secondary
9
# Licenses when the conditions for such availability set forth in the Eclipse
10
# Public License 2.0 are satisfied: GNU General Public License, version 2
11
# or later which is available at
12
# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
13
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
14
15
# @file vehrouteDiff.py
16
# @author Jakob Erdmann
17
# @author Michael Behrisch
18
# @date 2012-11-20
19
20
from __future__ import absolute_import
21
from __future__ import print_function
22
import os
23
import sys
24
from collections import defaultdict
25
sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), '..'))
26
from sumolib.output import parse # noqa
27
from sumolib.miscutils import uMax, Statistics, parseTime # noqa
28
from sumolib.options import ArgumentParser # noqa
29
30
31
def parse_args():
32
optParser = ArgumentParser()
33
optParser.add_argument("orig", help="original routes file")
34
optParser.add_argument("new", help="new routes file")
35
optParser.add_argument("out", help="output file")
36
optParser.add_option("--earliest", metavar="FILE",
37
help="write time of the first diff per vehicle to FILE")
38
return optParser.parse_args()
39
40
41
def update_earliest(earliest_diffs, diff, timestamp, tag):
42
if timestamp < earliest_diffs[diff][0]:
43
earliest_diffs[diff] = (timestamp, tag)
44
45
46
def write_diff(orig, new, out, earliest_out=None):
47
attr_conversions = {"depart": parseTime, "arrival": parseTime}
48
earliest_diffs = defaultdict(lambda: (uMax, None)) # diff -> (time, veh)
49
vehicles_orig = dict([(v.id, v) for v in parse(orig, 'vehicle',
50
attr_conversions=attr_conversions)])
51
origDurations = Statistics('original durations')
52
durations = Statistics('new durations')
53
durationDiffs = Statistics('duration differences')
54
with open(out, 'w') as f:
55
f.write("<routeDiff>\n")
56
for v in parse(new, 'vehicle', attr_conversions=attr_conversions):
57
if v.id in vehicles_orig:
58
vOrig = vehicles_orig[v.id]
59
departDiff = v.depart - vOrig.depart
60
arrivalDiff = v.arrival - vOrig.arrival
61
if v.route[0].exitTimes is None:
62
sys.exit("Error: Need route input with 'exitTimes'\n")
63
exitTimes = map(parseTime, v.route[0].exitTimes.split())
64
origExitTimes = map(parseTime, vOrig.route[0].exitTimes.split())
65
exitTimesDiff = [e - eOrig for e, eOrig in zip(exitTimes, origExitTimes)]
66
67
durations.add(v.arrival - v.depart, v.id)
68
origDurations.add(vOrig.arrival - vOrig.depart, v.id)
69
durationDiffs.add(arrivalDiff - departDiff, v.id)
70
71
update_earliest(earliest_diffs, departDiff, vOrig.depart, v.id + ' (depart)')
72
for diff, timestamp in zip(exitTimesDiff, origExitTimes):
73
update_earliest(earliest_diffs, diff, timestamp, v.id)
74
75
f.write(' <vehicle id="%s" departDiff="%s" arrivalDiff="%s" exitTimesDiff="%s"/>\n' %
76
(v.id, departDiff, arrivalDiff, ' '.join(map(str, exitTimesDiff))))
77
del vehicles_orig[v.id]
78
else:
79
f.write(' <vehicle id="%s" comment="new"/>\n' % v.id)
80
for id in vehicles_orig.keys():
81
f.write(' <vehicle id="%s" comment="missing"/>\n' % id)
82
f.write("</routeDiff>\n")
83
84
if earliest_out is not None:
85
with open(earliest_out, 'w') as f:
86
for diff in reversed(sorted(earliest_diffs.keys())):
87
f.write("%s, %s\n" % (diff, earliest_diffs[diff]))
88
89
print(origDurations)
90
print(durations)
91
print(durationDiffs)
92
93
94
if __name__ == "__main__":
95
options = parse_args()
96
write_diff(options.orig, options.new, options.out, options.earliest)
97
98