"""
splits a route file randomly in two parts
"""
from __future__ import print_function
from __future__ import absolute_import
import os
import sys
import random
if 'SUMO_HOME' in os.environ:
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
sys.path.append(tools)
else:
sys.exit("please declare environment variable 'SUMO_HOME'")
import sumolib
from sumolib.options import ArgumentParser
def get_options(args=None):
ap = ArgumentParser()
ap.add_argument("-r", "--route-file", dest="routefile", category="input", type=ap.route_file,
help="define the input route file with trips or vehicles")
ap.add_argument("-n", "--number", dest="number", category="input", type=int,
help="number of trips/vehicles to split (not together with percent)")
ap.add_argument("-p", "--percent", dest="percent", category="input", type=float,
help="percent of trips/vehicles to split (not together with number")
ap.add_argument("-a", "--output-file-a", dest="outputA", default="tripsA.rou.xml",
category="output", type=ap.route_file, help="define the first output route file")
ap.add_argument("-b", "--output-file-b", dest="outputB", default="tripsB.rou.xml",
category="output", type=ap.route_file, help="define the second output route file")
ap.add_argument("--random", action="store_true", default=False, category="random",
help="use a random seed to initialize the random number generator")
ap.add_argument("-s", "--seed", type=int, default=42, category="random",
help="random seed")
options = ap.parse_args(args=args)
if not options.routefile or not (options.number or options.percent) or (options.number and options.percent):
ap.print_help()
sys.exit()
return options
def main(options):
if not options.random:
random.seed(options.seed)
infile = options.routefile
tripsArray = list(sumolib.xml.parse(infile, ["trip", "vehicle", "flow"]))
tripsRange = range(0, len(tripsArray))
numVehicles = 0
if (options.number):
numVehicles = int(options.number)
elif (options.percent):
numVehicles = int(len(tripsArray) * int(options.percent) / 100.0)
if (numVehicles < len(tripsArray)):
randomSample = random.sample(tripsRange, numVehicles)
else:
randomSample = tripsRange
tripsArrayA = []
tripsArrayB = []
index = 0
for trip in tripsArray:
if index in randomSample:
tripsArrayB.append(trip)
else:
tripsArrayA.append(trip)
index += 1
for fname, trips in [
(options.outputA, tripsArrayA),
(options.outputB, tripsArrayB)]:
with open(fname, 'w') as outf:
sumolib.writeXMLHeader(outf, "$Id$", "routes")
for trip in trips:
outf.write(trip.toXML(initialIndent=" "))
outf.write("</routes>\n")
if __name__ == "__main__":
options = get_options(sys.argv[1:])
main(options)