Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MSInsertionControl.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
23// Inserts vehicles into the network when their departure time is reached
24/****************************************************************************/
25#include <config.h>
26
27#include <iostream>
28#include <algorithm>
29#include <cassert>
30#include <iterator>
34#include "MSGlobals.h"
35#include "MSVehicle.h"
36#include "MSVehicleControl.h"
37#include "MSLane.h"
38#include "MSEdge.h"
39#include "MSNet.h"
40#include "MSRouteHandler.h"
41#include "MSInsertionControl.h"
42
43
44// ===========================================================================
45// member method definitions
46// ===========================================================================
48 SUMOTime maxDepartDelay,
49 bool eagerInsertionCheck,
50 int maxVehicleNumber,
51 SUMOTime randomDepartOffset) :
52 myVehicleControl(vc),
53 myMaxDepartDelay(maxDepartDelay),
54 myEagerInsertionCheck(eagerInsertionCheck),
55 myMaxVehicleNumber(maxVehicleNumber),
56 myPendingEmitsUpdateTime(SUMOTime_MIN),
57 myFlowRNG("flow") {
58 myMaxRandomDepartOffset = randomDepartOffset;
60}
61
62
64 for (const Flow& f : myFlows) {
65 delete (f.pars);
66 }
67}
68
69
70void
74
75
76bool
78 if (myFlowIDs.count(pars->id) > 0) {
79 return false;
80 }
81 const bool loadingFromState = index >= 0;
82 Flow flow{pars, loadingFromState ? index : 0, initScale(pars->vtypeid)};
83 if (!loadingFromState && pars->repetitionProbability < 0 && pars->repetitionOffset < 0) {
84 // init poisson flow (but only the timing)
85 flow.pars->incrementFlow(flow.scale, &myFlowRNG);
86 flow.pars->repetitionsDone--;
87 }
88 myFlows.emplace_back(flow);
89 myFlowIDs.insert(std::make_pair(pars->id, flow.index));
90 return true;
91}
92
93
94double
95MSInsertionControl::initScale(const std::string vtypeid) {
97 if (vc.hasVTypeDistribution(vtypeid)) {
98 double result = -1;
100 for (const MSVehicleType* t : dist->getVals()) {
101 if (result == -1) {
102 result = t->getParameter().scale;
103 } else if (result != t->getParameter().scale) {
104 // unequal scales in distribution
105 return -1;
106 }
107 }
108 return result;
109 } else {
110 // rng is not used since vtypeid is not a distribution
111 return vc.getVType(vtypeid, nullptr, true)->getParameter().scale;
112 }
113}
114
115
116void
117MSInsertionControl::updateScale(const std::string vtypeid) {
118 for (Flow& f : myFlows) {
119 if (f.pars->vtypeid == vtypeid) {
120 f.scale = initScale(vtypeid);
121 }
122 }
123}
124
125
126int
128 // check whether any vehicles shall be emitted within this time step
129 const bool havePreChecked = MSRoutingEngine::isEnabled();
130 if (myPendingEmits.empty() || (havePreChecked && myEmitCandidates.empty())) {
131 return 0;
132 }
133 int numEmitted = 0;
134 // we use buffering for the refused emits to save time
135 // for this, we have two lists; one contains previously refused emits, the second
136 // will be used to append those vehicles that will not be able to depart in this
137 // time step
139
140 // go through the list of previously refused vehicles, first
142 MSVehicleContainer::VehicleVector::const_iterator veh;
143 for (veh = myPendingEmits.begin(); veh != myPendingEmits.end(); veh++) {
144 if (havePreChecked && (myEmitCandidates.count(*veh) == 0)) {
145 refusedEmits.push_back(*veh);
146 } else {
147 numEmitted += tryInsert(time, *veh, refusedEmits);
148 }
149 }
150 myEmitCandidates.clear();
151 myPendingEmits = refusedEmits;
153 return numEmitted;
154}
155
156
157int
159 MSVehicleContainer::VehicleVector& refusedEmits) {
160 assert(veh->getParameter().depart <= time);
161 const MSEdge& edge = *veh->getEdge();
162 if (veh->isOnRoad()) {
163 return 1;
164 }
165 if ((myMaxVehicleNumber < 0 || (int)MSNet::getInstance()->getVehicleControl().getRunningVehicleNo() < myMaxVehicleNumber)
167 // Successful insertion
168 return 1;
169 }
170 if (myMaxDepartDelay >= 0 && time - veh->getParameter().depart > myMaxDepartDelay) {
171 // remove vehicles waiting too long for departure
173 } else if (edge.isVaporizing()) {
174 // remove vehicles if the edge shall be empty
176 } else if (myAbortedEmits.count(veh) > 0) {
177 // remove vehicles which shall not be inserted for some reason
178 myAbortedEmits.erase(veh);
180 } else if ((veh->getRouteValidity(false) & (
184 } else {
185 // let the vehicle wait one step, we'll retry then
186 refusedEmits.push_back(veh);
187 }
189 return 0;
190}
191
192
193void
195 while (myAllVeh.anyWaitingBefore(time)) {
197 copy(top.begin(), top.end(), back_inserter(myPendingEmits));
198 myAllVeh.pop();
199 }
200 if (preCheck) {
201 MSVehicleContainer::VehicleVector::const_iterator veh;
202 for (veh = myPendingEmits.begin(); veh != myPendingEmits.end(); veh++) {
203 SUMOVehicle* const v = *veh;
204 const MSEdge* const edge = v->getEdge();
205 if (edge->insertVehicle(*v, time, true, myEagerInsertionCheck)) {
206 myEmitCandidates.insert(v);
207 } else {
208 MSDevice_Routing* dev = static_cast<MSDevice_Routing*>(v->getDevice(typeid(MSDevice_Routing)));
209 if (dev != nullptr) {
210 dev->skipRouting(time);
211 }
212 }
213 }
214 }
215}
216
217
218void
221 // for equidistant vehicles, up-scaling is done via repetitionOffset
222 for (std::vector<Flow>::iterator i = myFlows.begin(); i != myFlows.end();) {
223 MSVehicleType* vtype = nullptr;
224 SUMOVehicleParameter* const pars = i->pars;
225 double typeScale = i->scale;
226 if (typeScale < 0) {
227 // must sample from distribution to determine scale value
228 vtype = vehControl.getVType(pars->vtypeid, MSRouteHandler::getParsingRNG());
229 typeScale = vtype->getParameter().scale;
230 }
231 const double scale = vehControl.getScale() * typeScale;
232 const long long int scaledRepetitions = pars->repetitionNumber == std::numeric_limits<long long int>::max() ? std::numeric_limits<long long int>::max() :
233 (long long int)((double)pars->repetitionNumber * scale + 0.5);
234 bool tryEmitByProb = pars->repetitionProbability > 0;
235 while (scale > 0 && ((pars->repetitionProbability < 0
236 && pars->repetitionsDone < scaledRepetitions
237 && pars->depart + pars->repetitionTotalOffset <= time)
238 || (tryEmitByProb
239 && pars->depart <= time
240 && pars->repetitionEnd > time
241 // only call rand if all other conditions are met
243 )) {
244 tryEmitByProb = false; // only emit one per step
245 SUMOVehicleParameter* const newPars = new SUMOVehicleParameter(*pars);
246 newPars->id = pars->id + "." + toString(i->index);
247 newPars->depart = pars->repetitionProbability > 0 ? time : pars->depart + pars->repetitionTotalOffset + computeRandomDepartOffset();
248 pars->incrementFlow(scale, &myFlowRNG);
249 myFlowIDs[pars->id] = i->index;
250 //std::cout << SIMTIME << " flow=" << pars->id << " done=" << pars->repetitionsDone << " totalOffset=" << STEPS2TIME(pars->repetitionTotalOffset) << "\n";
251 // try to build the vehicle
252 if (vehControl.getVehicle(newPars->id) == nullptr) {
253 ConstMSRoutePtr const route = MSRoute::dictionary(pars->routeid);
254 if (vtype == nullptr) {
255 vtype = vehControl.getVType(pars->vtypeid, MSRouteHandler::getParsingRNG());
256 }
257 SUMOVehicle* const vehicle = vehControl.buildVehicle(newPars, route, vtype, !MSGlobals::gCheckRoutes);
258 // for equidistant vehicles, all scaling is done via repetitionOffset (to avoid artefacts, #11441)
259 // for probabilistic vehicles, we use the quota
260 int quota = pars->repetitionProbability < 0 ? 1 : vehControl.getQuota(scale);
261 if (quota > 0) {
262 vehControl.addVehicle(newPars->id, vehicle);
264 add(vehicle);
265 }
266 i->index++;
267 while (--quota > 0) {
268 SUMOVehicleParameter* const quotaPars = new SUMOVehicleParameter(*pars);
269 quotaPars->id = pars->id + "." + toString(i->index);
270 quotaPars->depart = pars->repetitionProbability > 0 ? time :
272 SUMOVehicle* const quotaVehicle = vehControl.buildVehicle(quotaPars, route, vtype, !MSGlobals::gCheckRoutes);
273 vehControl.addVehicle(quotaPars->id, quotaVehicle);
275 add(quotaVehicle);
276 }
277 pars->repetitionsDone++;
278 i->index++;
279 }
280 } else {
281 vehControl.deleteVehicle(vehicle, true);
282 }
283 } else {
286 break;
287 }
288 throw ProcessError(TLF("Another vehicle with the id '%' exists.", newPars->id));
289 }
290 vtype = nullptr;
291 }
292 if (time >= pars->repetitionEnd || pars->repetitionsDone >= scaledRepetitions) {
293 i = myFlows.erase(i);
295 delete pars;
296 } else {
297 ++i;
298 }
299 }
301}
302
303
304int
306 return (int)myPendingEmits.size();
307}
308
309
310int
312 return (int)myFlows.size();
313}
314
315
316void
320
321void
325
326
327void
329 myPendingEmits.erase(std::remove(myPendingEmits.begin(), myPendingEmits.end(), veh), myPendingEmits.end());
330 myAllVeh.remove(veh);
331}
332
333
334void
336 //clear out the refused vehicle list, deleting the vehicles entirely
337 MSVehicleContainer::VehicleVector::iterator veh;
338 for (veh = myPendingEmits.begin(); veh != myPendingEmits.end();) {
339 if ((*veh)->getRoute().getID() == route || route == "") {
341 veh = myPendingEmits.erase(veh);
342 } else {
343 ++veh;
344 }
345 }
346}
347
348
349int
351 const MSNet* net = MSNet::getInstance();
353 net->lockPendingEmits();
354 // updated pending emits (only once per time step)
355 myPendingEmitsForLane.clear();
356 for (const SUMOVehicle* const veh : myPendingEmits) {
357 const MSLane* const vlane = veh->getLane();
358 if (vlane != nullptr) {
359 myPendingEmitsForLane[vlane]++;
360 } else {
361 // no (tentative) departLane was set, increase count for all
362 // lanes of the depart edge
363 for (const MSLane* const l : veh->getEdge()->getLanes()) {
365 }
366 }
367 }
369 net->unlockPendingEmits();
370 }
371 return myPendingEmitsForLane[lane];
372}
373
374
375void
377 // fill the public transport router with pre-parsed public transport lines
378 for (const Flow& f : myFlows) {
379 if (f.pars->line != "") {
380 ConstMSRoutePtr const route = MSRoute::dictionary(f.pars->routeid);
381 router.getNetwork()->addSchedule(*f.pars, route == nullptr ? nullptr : &route->getStops());
382 }
383 }
384}
385
386
387void
389 // save flow states
390 for (const Flow& flow : myFlows) {
391 flow.pars->write(out, OptionsCont::getOptions(), SUMO_TAG_FLOWSTATE,
392 flow.pars->vtypeid == DEFAULT_VTYPE_ID ? "" : flow.pars->vtypeid);
393 if (flow.pars->repetitionProbability <= 0) {
394 out.writeAttr(SUMO_ATTR_NEXT, STEPS2TIME(flow.pars->repetitionTotalOffset));
395 }
396 out.writeAttr(SUMO_ATTR_ROUTE, flow.pars->routeid);
397 out.writeAttr(SUMO_ATTR_DONE, flow.pars->repetitionsDone);
398 out.writeAttr(SUMO_ATTR_INDEX, flow.index);
399 if (flow.pars->wasSet(VEHPARS_FORCE_REROUTE)) {
400 out.writeAttr(SUMO_ATTR_REROUTE, true);
401 }
402 for (const SUMOVehicleParameter::Stop& stop : flow.pars->stops) {
403 stop.write(out);
404 }
405 out.closeTag();
406 }
407}
408
409
410void
412 for (const Flow& f : myFlows) {
413 delete (f.pars);
414 }
415 myFlows.clear();
416 myFlowIDs.clear();
418 myPendingEmits.clear();
419 myEmitCandidates.clear();
420 myAbortedEmits.clear();
421 // myPendingEmitsForLane must not be cleared since it updates itself on the next call
422}
423
424
427 if (myMaxRandomDepartOffset > 0) {
428 // round to the closest usable simulation step
430 }
431 return 0;
432}
433
435MSInsertionControl::getFlowPars(const std::string& id) const {
436 if (hasFlow(id)) {
437 for (const Flow& f : myFlows) {
438 if (f.pars->id == id) {
439 return f.pars;
440 }
441 }
442 }
443 return nullptr;
444}
445
447MSInsertionControl::getLastFlowVehicle(const std::string& id) const {
448 const auto it = myFlowIDs.find(id);
449 if (it != myFlowIDs.end()) {
450 const std::string vehID = id + "." + toString(it->second);
452 }
453 return nullptr;
454}
455
456
457bool
459 SumoRNG tmp("tmp");
460 for (const Flow& flow : myFlows) {
461 if (flow.scale != 0 &&
462 (StringUtils::toBool(flow.pars->getParameter("has.taxi.device", "false"))
463 || hasTaxiDeviceType(flow.pars->vtypeid, tmp))) {
464 return true;
465 }
466 }
467 return false;
468}
469
470
471bool
472MSInsertionControl::hasTaxiDeviceType(const std::string& vtypeId, SumoRNG& rng) {
474 const MSVehicleType* vtype = vehControl.getVType(vtypeId, &rng);
475 return StringUtils::toBool(vtype->getParameter().getParameter("has.taxi.device", "false"));
476}
477
478/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define TLF(string,...)
Definition MsgHandler.h:306
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
#define STEPS2TIME(x)
Definition SUMOTime.h:58
#define SUMOTime_MIN
Definition SUMOTime.h:35
#define TS
Definition SUMOTime.h:45
const std::string DEFAULT_VTYPE_ID
const long long int VEHPARS_FORCE_REROUTE
@ BEGIN
The departure is at simulation start.
@ GIVEN
The time is given.
@ SPLIT
The departure is triggered by a train split.
@ SUMO_TAG_FLOWSTATE
a flow state definition (used when saving and loading simulatino state)
@ SUMO_ATTR_DONE
@ SUMO_ATTR_NEXT
succesor phase index
@ SUMO_ATTR_REROUTE
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_ROUTE
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
void addSchedule(const SUMOVehicleParameter &pars, const StopParVector *addStops=nullptr)
Network * getNetwork() const
@ ROUTE_START_INVALID_PERMISSIONS
A device that performs vehicle rerouting based on current edge speeds.
void skipRouting(const SUMOTime currentTime)
Labels the current time step as "unroutable".
A road/street connecting two junctions.
Definition MSEdge.h:77
bool isVaporizing() const
Returns whether vehicles on this edge shall be vaporized.
Definition MSEdge.h:443
bool insertVehicle(SUMOVehicle &v, SUMOTime time, const bool checkOnly=false, const bool forceCheck=false) const
Tries to insert the given vehicle into the network.
Definition MSEdge.cpp:803
void setLastFailedInsertionTime(SUMOTime time) const
Sets the last time a vehicle could not be inserted.
Definition MSEdge.h:612
static bool gCheckRoutes
Definition MSGlobals.h:91
static bool gStateLoaded
Information whether a state has been loaded.
Definition MSGlobals.h:103
std::vector< Flow > myFlows
Container for periodical vehicle parameters.
void adaptIntermodalRouter(MSTransportableRouter &router) const
int getWaitingVehicleNo() const
Returns the number of waiting vehicles.
void clearPendingVehicles(const std::string &route)
clears out all pending vehicles from a route, "" for all routes
std::map< const MSLane *, int > myPendingEmitsForLane
the number of pending emits for each edge in the current time step
int tryInsert(SUMOTime time, SUMOVehicle *veh, MSVehicleContainer::VehicleVector &refusedEmits)
Tries to emit the vehicle.
bool myEagerInsertionCheck
Whether an edge on which a vehicle could not depart should be ignored in the same step.
SUMOVehicle * getLastFlowVehicle(const std::string &id) const
return the last vehicle for the given flow
int emitVehicles(SUMOTime time)
Emits vehicles that want to depart at the given time.
int getPendingEmits(const MSLane *lane)
return the number of pending emits for the given lane
bool addFlow(SUMOVehicleParameter *const pars, int index=-1)
Adds parameter for a vehicle flow for departure.
static bool hasTaxiDeviceType(const std::string &vtypeId, SumoRNG &rng)
bool hasFlow(const std::string &id) const
checks whether the given flow still exists
const SUMOVehicleParameter * getFlowPars(const std::string &id) const
return parameters for the given flow
SUMOTime myPendingEmitsUpdateTime
Last time at which pending emits for each edge where counted.
void retractDescheduleDeparture(const SUMOVehicle *veh)
reverts a previous call to descheduleDeparture (only needed for departPos="random_free")
std::set< SUMOVehicle * > myEmitCandidates
Buffer for vehicles that may be inserted in the current step.
void alreadyDeparted(SUMOVehicle *veh)
stops trying to emit the given vehicle (because it already departed)
SUMOTime myMaxRandomDepartOffset
The maximum random offset to be added to vehicles departure times (non-negative)
MSVehicleContainer::VehicleVector myPendingEmits
Buffers for vehicles that could not be inserted.
MSInsertionControl(MSVehicleControl &vc, SUMOTime maxDepartDelay, bool checkEdgesOnce, int maxVehicleNumber, SUMOTime randomDepartOffset)
Constructor.
MSVehicleControl & myVehicleControl
The assigned vehicle control (needed for vehicle re-insertion and deletion)
std::map< std::string, int > myFlowIDs
Cache for periodical vehicle ids and their most recent index for quicker checking.
void add(SUMOVehicle *veh)
Adds a single vehicle for departure.
void determineCandidates(SUMOTime time)
Checks for all vehicles whether they can be emitted.
void updateScale(const std::string vtypeid)
updates the flow scale value to keep track of TraCI-induced change
void checkCandidates(SUMOTime time, const bool preCheck)
Adds all vehicles that should have been emitted earlier to the refuse container.
int getPendingFlowCount() const
Returns the number of flows that are still active.
std::set< const SUMOVehicle * > myAbortedEmits
Set of vehicles which shall not be inserted anymore.
void clearState()
Remove all vehicles before quick-loading state.
int myMaxVehicleNumber
Storage for maximum vehicle number.
void saveState(OutputDevice &out)
Saves the current state into the given stream.
SUMOTime myMaxDepartDelay
The maximum waiting time; vehicles waiting longer are deleted (-1: no deletion)
void descheduleDeparture(const SUMOVehicle *veh)
stops trying to emit the given vehicle (and delete it)
MSVehicleContainer myAllVeh
All loaded vehicles sorted by their departure time.
~MSInsertionControl()
Destructor.
SUMOTime computeRandomDepartOffset() const
compute (optional) random offset to the departure time
SumoRNG myFlowRNG
A random number generator for probabilistic flows.
static double initScale(const std::string vtypeid)
init scale value of flow
Representation of a lane in the micro simulation.
Definition MSLane.h:84
The simulated network and simulation perfomer.
Definition MSNet.h:89
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:199
virtual void unlockPendingEmits() const
release exclusive access to pending emits
Definition MSNet.h:860
virtual void lockPendingEmits() const
grant exclusive access to pending emits
Definition MSNet.h:857
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
static SumoRNG * getParsingRNG()
get parsing RNG
static bool dictionary(const std::string &id, ConstMSRoutePtr route)
Adds a route to the dictionary.
Definition MSRoute.cpp:116
static void checkDist(const std::string &id)
Checks the distribution whether it is permanent and deletes it if not.
Definition MSRoute.cpp:194
static bool isEnabled()
returns whether any routing actions take place
bool anyWaitingBefore(SUMOTime time) const
Returns the information whether any vehicles want to depart before the given time.
void remove(SUMOVehicle *veh)
Removes a single vehicle.
void add(SUMOVehicle *veh)
Adds a single vehicle.
void pop()
Removes the uppermost vehicle vector.
std::vector< SUMOVehicle * > VehicleVector
definition of a list of vehicles which have the same departure time
void clearState()
Remove all vehicles before quick-loading state.
const VehicleVector & top()
Returns the uppermost vehicle vector.
The class responsible for building and deletion of vehicles.
double getScale() const
sets the demand scaling factor
bool hasVTypeDistribution(const std::string &id) const
Asks for a vehicle type distribution.
virtual bool addVehicle(const std::string &id, SUMOVehicle *v)
Tries to insert the vehicle into the internal vehicle container.
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
int getQuota(double frac=-1, int loaded=-1) const
Returns the number of instances of the current vehicle that shall be emitted considering that "frac" ...
MSVehicleType * getVType(const std::string &id=DEFAULT_VTYPE_ID, SumoRNG *rng=nullptr, bool readOnly=false)
Returns the named vehicle type or a sample from the named distribution.
virtual SUMOVehicle * buildVehicle(SUMOVehicleParameter *defs, ConstMSRoutePtr route, MSVehicleType *type, const bool ignoreStopErrors, const VehicleDefinitionSource source=ROUTEFILE, bool addRouteStops=true)
Builds a vehicle, increases the number of built vehicles.
const RandomDistributor< MSVehicleType * > * getVTypeDistribution(const std::string &typeDistID) const
return the vehicle type distribution with the given id
virtual void deleteVehicle(SUMOVehicle *v, bool discard=false, bool wasKept=false)
Deletes the vehicle.
The car-following model and parameter.
const SUMOVTypeParameter & getParameter() const
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false, const bool escape=false)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
static void initRandGlobal(SumoRNG *which=nullptr)
Reads the given random number options and initialises the random number generator in accordance.
Represents a generic random distribution.
const std::vector< T > & getVals() const
Returns the members of the distribution.
virtual MSDevice * getDevice(const std::type_info &type) const =0
Returns a device of the given type if it exists or nullptr if not.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual const MSEdge * getEdge() const =0
Returns the (normal) route edge the object is currently at.
double scale
individual scaling factor (-1 for undefined)
Representation of a vehicle.
Definition SUMOVehicle.h:63
virtual int getRouteValidity(bool update=true, bool silent=false, std::string *msgReturn=nullptr)=0
computes validity attributes for the current route
virtual bool isOnRoad() const =0
Returns the information whether the vehicle is on a road (is simulated)
Definition of vehicle stop (position and duration)
Structure representing possible vehicle parameter.
double repetitionProbability
The probability for emitting a vehicle per second.
void incrementFlow(double scale, SumoRNG *rng=nullptr)
increment flow
std::string vtypeid
The vehicle's type id.
SUMOTime repetitionOffset
The time offset between vehicle reinsertions.
long long int repetitionsDone
The number of times the vehicle was already inserted.
SUMOTime repetitionTotalOffset
The offset between depart and the time for the next vehicle insertions.
SUMOTime repetitionEnd
The time at which the flow ends (only needed when using repetitionProbability)
std::string routeid
The vehicle's route id.
std::string id
The vehicle's id.
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
static bool toBool(const std::string &sData)
converts a string into the bool value described by it by calling the char-type converter
Definition of vehicle flow with the current index for vehicle numbering.