Path: blob/main/tools/contributed/sumopy/coremodules/demand/demandbase.py
169689 views
# Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo1# Copyright (C) 2016-2025 German Aerospace Center (DLR) and others.2# SUMOPy module3# Copyright (C) 2012-2021 University of Bologna - DICAM4# This program and the accompanying materials are made available under the5# terms of the Eclipse Public License 2.0 which is available at6# https://www.eclipse.org/legal/epl-2.0/7# This Source Code may also be made available under the following Secondary8# Licenses when the conditions for such availability set forth in the Eclipse9# Public License 2.0 are satisfied: GNU General Public License, version 210# or later which is available at11# https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html12# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later1314# @file demandbase.py15# @author Joerg Schweizer16# @date 2012171819import numpy as np20from xml.sax import saxutils, parse, handler21import agilepy.lib_base.classman as cm22import agilepy.lib_base.arrayman as am23import agilepy.lib_base.xmlman as xm24from agilepy.lib_base.misc import random_choice, get_inversemap, dict_to_str2526OPTIONMAP_POS_DEPARTURE = {"random": -1, "free": -2,27"random_free": -3, "base": -4, "last": -5, "first": -6}28OPTIONMAP_POS_ARRIVAL = {"random": -1, "max": -2}29OPTIONMAP_SPEED_DEPARTURE = {"random": -1, "max": -2}30OPTIONMAP_SPEED_ARRIVAL = {"current": -1}3132OPTIONMAP_LANE_DEPART = {"random": -1, "free": -2,33"allowed": -3, "best": -4, "first": -5}3435OPTIONMAP_LANE_ARRIVAL = {"current": -1}363738class TripoptionMixin:39"""40Class mixin wich defines some trip options.41To be used with different processes.42"""4344def add_posoptions(self):45attrsman = self.get_attrsman()4647self.add_option('pos_depart', OPTIONMAP_POS_DEPARTURE['base'],48groupnames=['options'],49cml='--departpos',50name='Departure position',51unit='m',52info="Departure position of vehicle.\n\nSpecial values:\n"53+ dict_to_str(OPTIONMAP_POS_DEPARTURE, intend=2),54cmlvaluemap=get_inversemap(OPTIONMAP_POS_DEPARTURE),55)5657self.add_option('pos_arrival', OPTIONMAP_POS_ARRIVAL['max'],58groupnames=['options'],59cml='--arrivalpos',60name='Arival position',61unit='m',62info="Arival position of vehicle.\n\nSpecial values:\n"63+ dict_to_str(OPTIONMAP_POS_ARRIVAL, intend=2),64cmlvaluemap=get_inversemap(OPTIONMAP_POS_ARRIVAL),65)6667def add_speedoptions(self):68attrsman = self.get_attrsman()6970self.add_option('speed_depart', OPTIONMAP_SPEED_DEPARTURE['max'],71groupnames=['options'],72cml='--departspeed',73name='Departure speed',74unit='m/s',75info="Departure speed of vehicle.\n\nSpecial values:\n"76+ dict_to_str(OPTIONMAP_SPEED_DEPARTURE, intend=2),77cmlvaluemap=get_inversemap(OPTIONMAP_SPEED_DEPARTURE),78)7980self.add_option('speed_arrival', OPTIONMAP_SPEED_ARRIVAL['current'],81groupnames=['options'],82cml='--arrivalspeed',83name='Arival speed',84unit='m/s',85info="Arival speed of vehicle.\n\nSpecial values:\n"86+ dict_to_str(OPTIONMAP_SPEED_ARRIVAL, intend=2),87cmlvaluemap=get_inversemap(OPTIONMAP_SPEED_ARRIVAL),88)8990def add_laneoptions(self):91attrsman = self.get_attrsman()9293self.add_option('ind_lane_depart', OPTIONMAP_LANE_DEPART['best'],94groupnames=['options'],95cml='--departlane',96name='Depart lane',97info="Departure lane index. 0 is rightmost lane or sidewalk, if existant.\n\nSpecial values:\n"98+ dict_to_str(OPTIONMAP_LANE_DEPART, intend=2),99cmlvaluemap=get_inversemap(OPTIONMAP_LANE_DEPART),100)101102self.add_option('ind_lane_arrival', OPTIONMAP_LANE_ARRIVAL['current'],103groupnames=['options'],104cml='--arrivallane',105name='Arrival lane',106info="Arrival lane index. 0 is rightmost lane or sidewalk, if existant.\n\nSpecial values:\n"107+ dict_to_str(OPTIONMAP_LANE_ARRIVAL, intend=2),108cmlvaluemap=get_inversemap(OPTIONMAP_LANE_ARRIVAL),109)110111112class ModeShares(am.ArrayObjman):113"""114Utility table with some default mode shares.115"""116117def __init__(self, ident, parent, modes, **kwargs):118119self._init_objman(ident, parent=parent, name='Mode shares',120version=0.0,121**kwargs)122123self.add_col(am.IdsArrayConf('ids_mode', modes,124groupnames=['parameters'],125name='Mode ID',126info='Transport Mode ID.',127))128129self.add_col(am.ArrayConf('shares', '',130dtype=np.float32,131is_index=True,132groupnames=['parameters'],133perm='rw',134name='Share',135info='Mode share.',136))137138# self.add_col(am.ArrayConf( 'speeds_max', 50.0/3.6,139# dtype = np.float32,140# groupnames = ['parameters'],141# perm='rw',142# name = 'Max. Speed',143# unit = 'm/s',144# info = 'Maximum possible speed for this mode. Speed is used to estimate free flow link travel times, mainly for routig purposes. Note that speeds are usully limited by the lane speed attribute',145# ))146self._init_attributes()147self.add_default()148149def _init_attributes(self, landuse=None):150# self.add_col(SumoIdsConf('Activitytypes'))151pass152153def add_share(self, mode, share):154modes = self.ids_mode.get_linktab()155return self.add_row(ids_mode=modes.get_id_from_formatted(mode),156shares=share)157158def add_default(self):159"""160Sets the default maximum possible speed for certain modes.161"""162self.add_share("pedestrian", 0.1)163self.add_share("bicycle", 0.1)164self.add_share("motorcycle", 0.1)165self.add_share("passenger", 0.5)166self.add_share("bus", 0.2)167168def get_modes_random(self, n):169"""170Return a vector with mode IDs of length n.171"""172ids = self.get_ids()173ids_modes_all = self.ids_mode[ids]174return ids_modes_all[random_choice(n, self.shares[ids])]175176177class ActivityTypes(am.ArrayObjman):178# https://sumo.dlr.de/docs/Networks/PlainXML.html#edge_descriptions179def __init__(self, ident, demand, **kwargs):180181self._init_objman(ident, parent=demand, name='Activity Types',182version=0.0,183xmltag=('actTypes', 'actType', 'names'),184**kwargs)185186self._init_attributes()187self.add_default()188189def _init_attributes(self, landuse=None):190# self.add_col(SumoIdsConf('Activitytypes'))191192self.add_col(am.ArrayConf('names', '',193dtype=np.object,194is_index=True,195groupnames=['parameters'],196perm='rw',197name='Type name',198info='Human readable name of activity type.',199))200201self.add_col(am.ArrayConf('symbols', '',202dtype=np.object,203perm='rw',204is_index=True,205name='Type symbol',206info='Symbol of activity type name. Used to represent activity sequences.',207))208209self.add_col(am.ArrayConf('descriptions', '',210dtype=np.object,211perm='rw',212name='Description',213info='Description of activity.',214))215216# this works only for first init217# if landuse is not None:218self.add_col(am.IdlistsArrayConf('ids_landusetypes', self.parent.get_scenario().landuse.landusetypes,219name='Landuse types',220info="Landuse type IDs, eher this activity type can take place.",221))222223self.add_col(am.ArrayConf('hours_begin_earliest', 0.0,224dtype=np.float32,225groupnames=['parameters'],226perm='rw',227name='Earliest hour begin',228unit='h',229info='Default value for earliest hour when this activity can begin.',230))231232self.add_col(am.ArrayConf('hours_begin_latest', 1.0,233dtype=np.float32,234groupnames=['parameters'],235perm='rw',236name='Latest begin hour',237unit='h',238info='Default value for latest hour when this activity can begin.',239))240241self.add_col(am.ArrayConf('durations_min', 6.0,242dtype=np.float32,243groupnames=['parameters'],244perm='rw',245name='Min. Duration',246unit='h',247info='Default value for minimum activity duration for a person within a day.',248))249250self.add_col(am.ArrayConf('durations_max', 8.0,251dtype=np.float32,252groupnames=['parameters'],253perm='rw',254name='Max. Duration',255unit='h',256info='Default value for maximum activity duration for a person within a day.',257))258259def format_ids(self, ids):260return ', '.join(self.names[ids])261262def get_id_from_formatted(self, idstr):263return self.names.get_id_from_index(idstr)264265def get_ids_from_formatted(self, idstrs):266return self.names.get_ids_from_indices_save(idstrs.split(','))267268def get_id_from_name(self, activitytypename):269return self.names.get_id_from_index(activitytypename)270271def get_id_from_symbol(self, activitytypesymbol):272return self.symbols.get_id_from_index(activitytypesymbol)273274def add_default(self):275"""276Sets the default maximum possible speed for certain modes.277"""278landusetypekeys = self.parent.get_scenario().landuse.landusetypes.typekeys279self.add_row(names='none',280descriptions='None activity type. Will be skipped when planning.',281ids_landusetypes=landusetypekeys.get_ids_from_indices([]),282symbols='n',283hours_begin_earliest=0.0,284hours_begin_latest=0.0,285durations_min=0.0,286durations_max=0.0,287)288289self.add_row(names='home',290descriptions='General home activity, like sleeping, eating, watching TV, etc.',291ids_landusetypes=landusetypekeys.get_ids_from_indices(292['residential', 'mixed']),293symbols='h',294hours_begin_earliest=-1.0,295hours_begin_latest=-1.0,296durations_min=7.0,297durations_max=8.0,298)299300self.add_row(names='work',301descriptions="""Work activity, for example work in302industry, offices or as employee at303educational facilities.""",304ids_landusetypes=landusetypekeys.get_ids_from_indices(305['industrial', 'commercial', 'education', 'mixed']),306symbols='w',307hours_begin_earliest=8.5,308hours_begin_latest=9.0,309durations_min=6.0,310durations_max=9.0,311)312313self.add_row(names='education',314descriptions='Education activity, for example visiting courses at schools or at universities.',315ids_landusetypes=landusetypekeys.get_ids_from_indices(316['education', ]),317symbols='e',318hours_begin_earliest=8.0,319hours_begin_latest=10.0,320durations_min=4.0,321durations_max=6.0,322)323324self.add_row(names='shopping',325descriptions='Shopping activity',326ids_landusetypes=landusetypekeys.get_ids_from_indices(327['commercial', 'mixed']),328symbols='s',329hours_begin_earliest=16.0,330hours_begin_latest=19.0,331durations_min=0.2,332durations_max=2.0,333)334335self.add_row(names='leisure',336descriptions='Leisure activity',337ids_landusetypes=landusetypekeys.get_ids_from_indices(338['leisure', 'mixed']),339symbols='l',340hours_begin_earliest=12.0,341hours_begin_latest=15.0,342durations_min=1.0,343durations_max=3.0,344)345346347class DemandobjMixin:348def export_trips_xml(self, filepath=None, encoding='UTF-8',349ids_vtype_exclude=[], **kwargs):350"""351Export trips to SUMO xml file.352Method takes care of sorting trips by departure time.353"""354return False355356def get_writexmlinfo(self, is_route=False, **kwargs):357"""358Returns three array where the first array is the359begin time of the first vehicle and the second array is the360write function to be called for the respectice vehicle and361the third array contains the vehicle ids362363Method used to sort trips when exporting to route or trip xml file364"""365return [], [], []366367def config_results(self, results):368# tripresults = res.Tripresults( 'tripresults', results,369# self,370# self.get_net().edges371# )372#373#374#results.add_resultobj(tripresults, groupnames = ['Trip results'])375pass376377def process_results(self, results, process=None):378pass379380def get_time_depart_first(self):381return np.inf382383def get_time_depart_last(self):384return 0.0385386def import_routes_xml(self, routefilepath, **kwargs):387"""388Import routes from filepath an store them somwhere.389Demand object specific.390"""391392pass393394395class TripCounter(handler.ContentHandler):396"""Parses a SUMO route XML file and counts trips."""397398def __init__(self):399self.n_trip = 0400401def startElement(self, name, attrs):402# print 'startElement',name,self.n_trip403if name == 'trip':404self.n_trip += 1405406407class TripReader(handler.ContentHandler):408"""Reads trips from trip or route file into trip table"""409410def __init__(self, trips, n_trip, vtype_default=None):411# print 'RouteReader.__init__',demand.ident412self._trips = trips413demand = trips.parent414415net = demand.get_scenario().net416417self._ids_vtype_sumo = demand.vtypes.ids_sumo418self._modemap = net.modes.names.get_indexmap()419self._get_vtype_for_mode = demand.vtypes.get_vtype_for_mode420421if id_vtype_default is None:422self._id_vtype_default = self.get_ids()[0]423else:424self._id_vtype_default = id_vtype_default425426self._ids_edge_sumo = net.edges.ids_sumo427428self.ids_sumo = np.zeros(n_trip, np.object)429self.ids_vtype = np.zeros(n_trip, np.int32)430self.times_depart = np.zeros(n_trip, np.int32)431self.ids_edge_depart = np.zeros(n_trip, np.int32)432self.ids_edge_arrival = np.zeros(n_trip, np.int32)433self.inds_lane_depart = np.zeros(n_trip, np.int32)434self.positions_depart = np.zeros(n_trip, np.float32)435self.speeds_depart = np.zeros(n_trip, np.float32)436self.inds_lane_arrival = np.zeros(n_trip, np.int32)437self.positions_arrival = np.zeros(n_trip, np.float32)438self.speeds_arrival = np.zeros(n_trip, np.float32)439self.routes = np.zeros(n_trip, np.object)440441self._ind_trip = -1442443self._has_routes = False444self._ids_sumoedge_current = []445self._id_sumoveh_current = None446#self._time_depart = 0447#self._attrs = {}448#self._is_generate_ids = is_generate_ids449self._intervals_current = ''450451# def _init_reader(self):452453def _get_id_vtype(self, attrs):454vtype = str(attrs['type'])455if self._ids_vtype_sumo.has_index(vtype):456# vtype is known457return self._ids_vtype_sumo.get_id_from_index(vtype)458459# vtype is not known, so check out whether vtype460# is actually a mode461elif vtype in self._modemap:462# pick id_vtype according to its probability with463# all vtypes of this mode464id_vtype = self._get_vtype_for_mode(self._modemap[vtype])465466if id_vtype >= 0:467return id_vtype468else:469return self._id_vtype_default470471else:472# no valid vtype, get a default473return self._id_vtype_default474475def startElement(self, name, attrs):476# <vehicle id="3_21" type="bus" depart="2520.00">477# <route edges="bottom1to1/0 1/0to0/0 0/0tobottom0"/>478# </vehicle>479# print 'startElement',name480if name == 'trip':481# print ' startElement',attrs['id'],attrs['depart']482self._ind_trip += 1483484self._id_sumoveh_current = attrs['id']485self.ids_sumo[self._ind_trip] = self._id_sumoveh_current486# print 'startElement ids_vtype',attrs['type'], self._ids_vtype_sumo.get_id_from_index(str(attrs['type']))487488self.ids_vtype[self._ind_trip] = self._get_id_vtype(attrs)489self.times_depart[self._ind_trip] = int(float(attrs['depart']))490491if attrs.has_key('from'):492self.ids_edge_depart[self._ind_trip] = self._ids_edge_sumo.get_id_from_index(str(attrs['from']))493if attrs.has_key('to'):494self.ids_edge_arrival[self._ind_trip] = self._ids_edge_sumo.get_id_from_index(str(attrs['to']))495496ind_lane_depart_raw = attrs.get('departLane', 'free')497if OPTIONMAP_LANE_DEPART.has_key(ind_lane_depart_raw):498self.inds_lane_depart[self._ind_trip] = OPTIONMAP_LANE_DEPART[ind_lane_depart_raw]499else:500self.inds_lane_depart[self._ind_trip] = int(ind_lane_depart_raw)501502positions_depart_raw = attrs.get('departPos', 'base')503if OPTIONMAP_POS_DEPARTURE.has_key(positions_depart_raw):504self.positions_depart[self._ind_trip] = OPTIONMAP_POS_DEPARTURE[positions_depart_raw]505else:506self.positions_depart[self._ind_trip] = float(positions_depart_raw)507508self.speeds_depart[self._ind_trip] = attrs.get('departSpeed', 0.0)509510ind_lane_arrival_raw = attrs.get('arrivalLane', 'current')511if OPTIONMAP_LANE_ARRIVAL.has_key(ind_lane_arrival_raw):512self.inds_lane_arrival[self._ind_trip] = OPTIONMAP_LANE_ARRIVAL[ind_lane_arrival_raw]513else:514self.inds_lane_arrival[self._ind_trip] = int(ind_lane_arrival_raw)515516positions_arrival_raw = attrs.get('arrivalPos', 'max')517if OPTIONMAP_POS_ARRIVAL.has_key(positions_arrival_raw):518self.positions_arrival[self._ind_trip] = OPTIONMAP_POS_ARRIVAL[positions_arrival_raw]519else:520self.positions_arrival[self._ind_trip] = float(positions_arrival_raw)521522self.speeds_arrival[self._ind_trip] = attrs.get('arrivalSpeed', 0.0)523524def _get_kwargs(self):525return {'ids_sumo': self.ids_sumo,526'times_depart': self.times_depart,527'ids_edge_depart': self.ids_edge_depart,528'ids_edge_arrival': self.ids_edge_arrival,529'inds_lane_depart': self.inds_lane_depart,530'positions_depart': self.positions_depart,531'speeds_depart': self.speeds_depart,532'inds_lane_arrival': self.inds_lane_arrival,533'positions_arrival': self.positions_arrival,534'speeds_arrival': self.speeds_arrival,535}536537def insert_trips(self, is_generate_ids=True):538539# print 'TripReader.insert_trips self.ids_vtype',self.ids_vtype540kwargs = self._get_kwargs()541ids_trips = self._trips.make_trips(self.ids_vtype,542is_generate_ids=is_generate_ids,543**kwargs)544545return ids_trips546547548class RouteCounter(handler.ContentHandler):549"""Parses a SUMO route XML file and counts trips."""550551def __init__(self):552self.n_veh = 0553self.n_pers = 0554#self.n_rou = 0555556def startElement(self, name, attrs):557# print 'startElement',name,self.n_trip558if name == 'vehicle':559self.n_veh += 1560elif name == 'person':561self.n_pers += 1562# elif name == 'route':563# if attrs.has_key('id'):564# self.n_rou += 1565566567class RouteReader(TripReader):568"""Reads trips from trip or route file into trip table"""569570def __init__(self, trips, counter):571# print 'RouteReader.__init__',demand.ident572self._trips = trips573n_veh = counter.n_veh574n_per = counter.n_pers575#n_rou = counter.n_rou576n_trip = n_veh+n_per577demand = trips.parent578579net = demand.get_scenario().net580self._modemap = net.modes.names.get_indexmap()581self._get_vtype_for_mode = demand.vtypes.get_vtype_for_mode582583self._ids_vtype_sumo = demand.vtypes.ids_sumo584self._ids_edge_sumo = net.edges.ids_sumo585586self.ids_sumo = np.zeros(n_trip, np.object)587self.ids_sumo[:] = ''588self.ids_vtype = np.zeros(n_trip, np.int32)589self.times_depart = np.zeros(n_trip, np.int32)590self.times_arrival = np.zeros(n_trip, np.int32)591self.type = np.zeros(n_trip, np.object)592self.ids_edge_depart = np.zeros(n_trip, np.int32)593self.ids_edge_arrival = np.zeros(n_trip, np.int32)594self.inds_lane_depart = np.zeros(n_trip, np.int32)595self.positions_depart = np.zeros(n_trip, np.float32)596self.speeds_depart = np.zeros(n_trip, np.float32)597self.inds_lane_arrival = np.zeros(n_trip, np.int32)598self.positions_arrival = np.zeros(n_trip, np.float32)599self.speeds_arrival = np.zeros(n_trip, np.float32)600self.routes = np.zeros(n_trip, np.object)601602self._ind_trip = -1603604self._has_routes = False605self._ids_sumoedge_current = []606self._id_sumoveh_current = None607#self._time_depart = 0608#self._attrs = {}609#self._is_generate_ids = is_generate_ids610self._intervals_current = ''611612def startElement(self, name, attrs):613# <vehicle id="3_21" type="bus" depart="2520.00">614# <route edges="bottom1to1/0 1/0to0/0 0/0tobottom0"/>615# </vehicle>616# print 'startElement',name617if name == 'vehicle':618# print ' startElement',attrs['id'],attrs['depart']619self._ind_trip += 1620621self._id_sumoveh_current = attrs['id']622self.ids_sumo[self._ind_trip] = self._id_sumoveh_current623# print 'startElement ids_vtype',attrs['type'], self._ids_vtype_sumo.get_id_from_index(str(attrs['type']))624625self.ids_vtype[self._ind_trip] = self.ids_vtype[self._ind_trip] = self._get_id_vtype(attrs)626627self.times_depart[self._ind_trip] = int(float(attrs['depart']))628if attrs.has_key('arrival'):629self.times_arrival[self._ind_trip] = int(float(attrs['arrival']))630else:631# duarouter is not calculating arrival time in results!632self.times_arrival[self._ind_trip] = 0.0633634self.type[self._ind_trip] = attrs['type']635if attrs.has_key('from'):636self.ids_edge_depart[self._ind_trip] = self._ids_edge_sumo.get_id_from_index(str(attrs['from']))637if attrs.has_key('to'):638self.ids_edge_arrival[self._ind_trip] = self._ids_edge_sumo.get_id_from_index(str(attrs['to']))639640ind_lane_depart_raw = attrs.get('departLane', 'free')641if OPTIONMAP_LANE_DEPART.has_key(ind_lane_depart_raw):642self.inds_lane_depart[self._ind_trip] = OPTIONMAP_LANE_DEPART[ind_lane_depart_raw]643else:644self.inds_lane_depart[self._ind_trip] = int(ind_lane_depart_raw)645646positions_depart_raw = attrs.get('departPos', 'base')647if OPTIONMAP_POS_DEPARTURE.has_key(positions_depart_raw):648self.positions_depart[self._ind_trip] = OPTIONMAP_POS_DEPARTURE[positions_depart_raw]649else:650self.positions_depart[self._ind_trip] = float(positions_depart_raw)651652speed_depart_raw = attrs.get('departSpeed', 'max')653if OPTIONMAP_SPEED_DEPARTURE.has_key(speed_depart_raw):654self.speeds_depart[self._ind_trip] = OPTIONMAP_SPEED_DEPARTURE[speed_depart_raw]655else:656self.speeds_depart[self._ind_trip] = float(speed_depart_raw)657658ind_lane_arrival_raw = attrs.get('arrivalLane', 'current')659if OPTIONMAP_LANE_ARRIVAL.has_key(ind_lane_arrival_raw):660self.inds_lane_arrival[self._ind_trip] = OPTIONMAP_LANE_ARRIVAL[ind_lane_arrival_raw]661else:662self.inds_lane_arrival[self._ind_trip] = int(ind_lane_arrival_raw)663664positions_arrival_raw = attrs.get('arrivalPos', 'max')665if OPTIONMAP_POS_ARRIVAL.has_key(positions_arrival_raw):666self.positions_arrival[self._ind_trip] = OPTIONMAP_POS_ARRIVAL[positions_arrival_raw]667else:668self.positions_arrival[self._ind_trip] = float(positions_arrival_raw)669670speed_arrival_raw = attrs.get('arrivalSpeed', 'current')671if OPTIONMAP_SPEED_ARRIVAL.has_key(speed_arrival_raw):672self.speeds_arrival[self._ind_trip] = OPTIONMAP_SPEED_ARRIVAL[speed_arrival_raw]673else:674self.speeds_arrival[self._ind_trip] = float(speed_arrival_raw)675676if name == 'route':677self._has_routes = True678# print ' ',attrs.get('edges', '')679self._ids_sumoedge_current = attrs.get('edges', '')680self._intervals_current = attrs.get('intervals', '')681682# def characters(self, content):683# if (len(self._route_current)>0)&(self._intervals_current!=''):684# self._intervals_current = self._intervals_current + content685686def endElement(self, name):687688if name == 'vehicle':689# print 'endElement',name,self._id_current,len(self._intervals_current)690if (self._id_sumoveh_current is not None):691ids_edge = []692for id_sumoedge in self._ids_sumoedge_current.split(' '):693if not id_sumoedge in ('', ' ', ','):694if self._ids_edge_sumo.has_index(id_sumoedge):695ids_edge.append(self._ids_edge_sumo.get_id_from_index(id_sumoedge.strip()))696self.routes[self._ind_trip] = ids_edge697698if len(ids_edge) >= 1:699self.ids_edge_depart[self._ind_trip] = ids_edge[0]700self.ids_edge_arrival[self._ind_trip] = ids_edge[-1]701702self._id_sumoveh_current = None703#self._attrs = {}704self._ids_sumoedge_current = []705706# elif name in ['routes','trips']:707# self.make_trips()708709def process_intervals(self):710interval = []711es = self._intervals_current.rstrip().split(" ")712for e in es:713p = e.split(",")714interval.append((float(p[0]), float(p[1])))715self._intervals_current = ''716return interval717718def _get_kwargs(self, inds=None):719if inds is None:720inds = np.arange(len(self.ids_sumo))721return {'ids_sumo': self.ids_sumo[inds],722'times_depart': self.times_depart[inds],723'times_arrival': self.times_arrival[inds],724'type': self.type[inds],725'ids_edge_depart': self.ids_edge_depart[inds],726'ids_edge_arrival': self.ids_edge_arrival[inds],727'inds_lane_depart': self.inds_lane_depart[inds],728'positions_depart': self.positions_depart[inds],729'speeds_depart': self.speeds_depart[inds],730'inds_lane_arrival': self.inds_lane_arrival[inds],731'positions_arrival': self.positions_arrival[inds],732'speeds_arrival': self.speeds_arrival[inds],733'ids_edges': self.routes[inds]734}735736def insert_routes(self, is_generate_ids=True, is_add=False, is_overwrite_only=False):737print 'TripReader.make_routes is_generate_ids', is_generate_ids, 'is_add', is_add, 'is_overwrite_only', is_overwrite_only738739# self._trips is scenario trip database740# self.ids_sumo is a list of SUMO IDs read from xml file741742if is_overwrite_only & (not is_add):743is_generate_ids = False744is_add = False745# get trip ids from xml file746# ony import routes ids from existing sumo ids747748# this is index of self.ids_sumo to be overwritten749inds = np.flatnonzero(np.array(self._trips.ids_sumo.has_indices(self.ids_sumo)))750# print ' overwrite trip ids_sumo',self.ids_sumo[inds]751752ids_trip = np.array(self._trips.ids_sumo.get_ids_from_indices(self.ids_sumo[inds]), dtype=np.int32)753# print ' ids_trip',ids_trip754# print 'n_trips',len(ids_trip)755756ids_routes, ids_trip = self._trips.make_routes(self.ids_vtype[inds],757# is_generate_ids = is_generate_ids,# depricated758routes=self.routes[inds],759ids_trip=ids_trip,760is_add=is_add,761**self._get_kwargs(inds=inds)762)763# print ' ids_routes',ids_routes764765else:766if is_add:767#is_generate_ids = False768# get trip ids from xml file769770inds = np.flatnonzero(self.ids_sumo != '') # ony import routes from specified sumo ids771# print ' self.ids_sumo',self.ids_sumo[inds]772# print ' inds',inds773ids_trip = np.array(self._trips.ids_sumo.get_ids_from_indices_save(self.ids_sumo[inds]), dtype=np.int32)774inds_valid = np.array(ids_trip, dtype=np.int32) > -1775776ids_routes, ids_trip = self._trips.make_routes(self.ids_vtype[inds[inds_valid]],777# is_generate_ids = is_generate_ids,# depricated778routes=self.routes[inds[inds_valid]],779ids_trip=ids_trip[inds_valid],780is_add=is_add,781**self._get_kwargs(inds=inds[inds_valid])782)783784if (not is_add) & is_generate_ids:785inds = np.arange(len(self.routes))786ids_trip = None787788# print ' ids_trip',ids_trip789ids_routes, ids_trip = self._trips.make_routes(self.ids_vtype[inds],790is_generate_ids=is_generate_ids,791routes=self.routes[inds],792ids_trip=ids_trip,793is_add=is_add,794**self._get_kwargs(inds=inds)795)796797return ids_routes, ids_trip798799# def get_data(self):800# values = {'ids_sumo': {}, 'times_depart': {},'ids_edge_depart': {},'ids_edge_arrival': {},\801# 'inds_lane_depart': {},'positions_depart': {},'speeds_depart': {},'inds_lane_arrival': {},\802# 'positions_arrival': {},'speeds_arrival' : {}, 'ids_edges' : {}}803# attrnames = ['ids_sumo', 'times_depart','ids_edge_depart','ids_edge_arrival',\804# 'inds_lane_depart','positions_depart','speeds_depart','inds_lane_arrival',\805# 'positions_arrival','speeds_arrival', 'ids_edges' ]806# valuess = [self.ids_sumo,807# self.times_depart,808# self.ids_edge_depart,809# self.ids_edge_arrival,810# self.inds_lane_depart,811# self.positions_depart,812# self.speeds_depart,813# self.inds_lane_arrival,814# self.positions_arrival,815# self.speeds_arrival,816# self.routes817# ]818# for attrname, value in zip(attrnames, valuess):819# print attrname820# print values821# for id_elem , val in zip(self.get_ids(), value):822## values[attrname][id_elem] = (val,1)823# return values824##825826# def get_ids(self):827# return range(len(self.ids_sumo[(self.ids_sumo!='')])+1)[1:]828829830