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-2024 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
141 MSVehicleContainer::VehicleVector::const_iterator veh;
142 for (veh = myPendingEmits.begin(); veh != myPendingEmits.end(); veh++) {
143 if (havePreChecked && (myEmitCandidates.count(*veh) == 0)) {
144 refusedEmits.push_back(*veh);
145 } else {
146 numEmitted += tryInsert(time, *veh, refusedEmits);
147 }
148 }
149 myEmitCandidates.clear();
150 myPendingEmits = refusedEmits;
151 return numEmitted;
152}
153
154
155int
157 MSVehicleContainer::VehicleVector& refusedEmits) {
158 assert(veh->getParameter().depart <= time);
159 const MSEdge& edge = *veh->getEdge();
160 if (veh->isOnRoad()) {
161 return 1;
162 }
163 if ((myMaxVehicleNumber < 0 || (int)MSNet::getInstance()->getVehicleControl().getRunningVehicleNo() < myMaxVehicleNumber)
165 // Successful insertion
166 return 1;
167 }
168 if (myMaxDepartDelay >= 0 && time - veh->getParameter().depart > myMaxDepartDelay) {
169 // remove vehicles waiting too long for departure
171 } else if (edge.isVaporizing()) {
172 // remove vehicles if the edge shall be empty
174 } else if (myAbortedEmits.count(veh) > 0) {
175 // remove vehicles which shall not be inserted for some reason
176 myAbortedEmits.erase(veh);
178 } else if ((veh->getRouteValidity(false) & (
182 } else {
183 // let the vehicle wait one step, we'll retry then
184 refusedEmits.push_back(veh);
185 }
187 return 0;
188}
189
190
191void
193 while (myAllVeh.anyWaitingBefore(time)) {
195 copy(top.begin(), top.end(), back_inserter(myPendingEmits));
196 myAllVeh.pop();
197 }
198 if (preCheck) {
199 MSVehicleContainer::VehicleVector::const_iterator veh;
200 for (veh = myPendingEmits.begin(); veh != myPendingEmits.end(); veh++) {
201 SUMOVehicle* const v = *veh;
202 const MSEdge* const edge = v->getEdge();
203 if (edge->insertVehicle(*v, time, true, myEagerInsertionCheck)) {
204 myEmitCandidates.insert(v);
205 } else {
206 MSDevice_Routing* dev = static_cast<MSDevice_Routing*>(v->getDevice(typeid(MSDevice_Routing)));
207 if (dev != nullptr) {
208 dev->skipRouting(time);
209 }
210 }
211 }
212 }
213}
214
215
216void
219 // for equidistant vehicles, up-scaling is done via repetitionOffset
220 for (std::vector<Flow>::iterator i = myFlows.begin(); i != myFlows.end();) {
221 MSVehicleType* vtype = nullptr;
222 SUMOVehicleParameter* pars = i->pars;
223 double typeScale = i->scale;
224 if (typeScale < 0) {
225 // must sample from distribution to determine scale value
226 vtype = vehControl.getVType(pars->vtypeid, MSRouteHandler::getParsingRNG());
227 typeScale = vtype->getParameter().scale;
228 }
229 double scale = vehControl.getScale() * typeScale;
230 bool tryEmitByProb = pars->repetitionProbability > 0;
231 while (scale > 0 && ((pars->repetitionProbability < 0
232 && pars->repetitionsDone < pars->repetitionNumber * scale
233 && pars->depart + pars->repetitionTotalOffset <= time)
234 || (tryEmitByProb
235 && pars->depart <= time
236 && pars->repetitionEnd > time
237 // only call rand if all other conditions are met
239 )) {
240 tryEmitByProb = false; // only emit one per step
241 SUMOVehicleParameter* newPars = new SUMOVehicleParameter(*pars);
242 newPars->id = pars->id + "." + toString(i->index);
243 newPars->depart = pars->repetitionProbability > 0 ? time : pars->depart + pars->repetitionTotalOffset + computeRandomDepartOffset();
244 pars->incrementFlow(scale, &myFlowRNG);
245 myFlowIDs[pars->id] = i->index;
246 //std::cout << SIMTIME << " flow=" << pars->id << " done=" << pars->repetitionsDone << " totalOffset=" << STEPS2TIME(pars->repetitionTotalOffset) << "\n";
247 // try to build the vehicle
248 if (vehControl.getVehicle(newPars->id) == nullptr) {
249 ConstMSRoutePtr const route = MSRoute::dictionary(pars->routeid);
250 if (vtype == nullptr) {
251 vtype = vehControl.getVType(pars->vtypeid, MSRouteHandler::getParsingRNG());
252 }
253 SUMOVehicle* const vehicle = vehControl.buildVehicle(newPars, route, vtype, !MSGlobals::gCheckRoutes);
254 // for equidistant vehicles, all scaling is done via repetitionOffset (to avoid artefacts, #11441)
255 // for probabilistic vehicles, we use the quota
256 int quota = pars->repetitionProbability < 0 ? 1 : vehControl.getQuota(scale);
257 if (quota > 0) {
258 vehControl.addVehicle(newPars->id, vehicle);
260 add(vehicle);
261 }
262 i->index++;
263 while (--quota > 0) {
264 SUMOVehicleParameter* const quotaPars = new SUMOVehicleParameter(*pars);
265 quotaPars->id = pars->id + "." + toString(i->index);
266 quotaPars->depart = pars->repetitionProbability > 0 ? time :
268 SUMOVehicle* const quotaVehicle = vehControl.buildVehicle(quotaPars, route, vtype, !MSGlobals::gCheckRoutes);
269 vehControl.addVehicle(quotaPars->id, quotaVehicle);
271 add(quotaVehicle);
272 }
273 pars->repetitionsDone++;
274 i->index++;
275 }
276 } else {
277 vehControl.deleteVehicle(vehicle, true);
278 }
279 } else {
282 break;
283 }
284 throw ProcessError(TLF("Another vehicle with the id '%' exists.", newPars->id));
285 }
286 vtype = nullptr;
287 }
288 if (time >= pars->repetitionEnd ||
289 (pars->repetitionNumber != std::numeric_limits<int>::max()
290 && pars->repetitionsDone >= (int)(pars->repetitionNumber * scale + 0.5))) {
291 i = myFlows.erase(i);
293 delete pars;
294 } else {
295 ++i;
296 }
297 }
299}
300
301
302int
304 return (int)myPendingEmits.size();
305}
306
307
308int
310 return (int)myFlows.size();
311}
312
313
314void
318
319void
323
324
325void
327 myPendingEmits.erase(std::remove(myPendingEmits.begin(), myPendingEmits.end(), veh), myPendingEmits.end());
328 myAllVeh.remove(veh);
329}
330
331
332void
334 //clear out the refused vehicle list, deleting the vehicles entirely
335 MSVehicleContainer::VehicleVector::iterator veh;
336 for (veh = myPendingEmits.begin(); veh != myPendingEmits.end();) {
337 if ((*veh)->getRoute().getID() == route || route == "") {
339 veh = myPendingEmits.erase(veh);
340 } else {
341 ++veh;
342 }
343 }
344}
345
346
347int
349 if (MSNet::getInstance()->getCurrentTimeStep() != myPendingEmitsUpdateTime) {
350 // updated pending emits (only once per time step)
351 myPendingEmitsForLane.clear();
352 for (const SUMOVehicle* const veh : myPendingEmits) {
353 const MSLane* const vlane = veh->getLane();
354 if (vlane != nullptr) {
355 myPendingEmitsForLane[vlane]++;
356 } else {
357 // no (tentative) departLane was set, increase count for all
358 // lanes of the depart edge
359 for (const MSLane* const l : veh->getEdge()->getLanes()) {
361 }
362 }
363 }
365 }
366 return myPendingEmitsForLane[lane];
367}
368
369
370void
372 // fill the public transport router with pre-parsed public transport lines
373 for (const Flow& f : myFlows) {
374 if (f.pars->line != "") {
375 ConstMSRoutePtr const route = MSRoute::dictionary(f.pars->routeid);
376 router.getNetwork()->addSchedule(*f.pars, route == nullptr ? nullptr : &route->getStops());
377 }
378 }
379}
380
381
382void
384 // save flow states
385 for (const Flow& flow : myFlows) {
386 flow.pars->write(out, OptionsCont::getOptions(), SUMO_TAG_FLOWSTATE,
387 flow.pars->vtypeid == DEFAULT_VTYPE_ID ? "" : flow.pars->vtypeid);
388 if (flow.pars->repetitionEnd == SUMOTime_MAX) {
389 out.writeAttr(SUMO_ATTR_NUMBER, flow.pars->repetitionNumber);
390 }
391 if (flow.pars->repetitionProbability > 0) {
392 out.writeAttr(SUMO_ATTR_PROB, flow.pars->repetitionProbability);
393 } else if (flow.pars->poissonRate > 0) {
394 out.writeAttr(SUMO_ATTR_PERIOD, "exp(" + toString(flow.pars->poissonRate) + ")");
395 out.writeAttr(SUMO_ATTR_NEXT, STEPS2TIME(flow.pars->repetitionTotalOffset));
396 } else {
397 out.writeAttr(SUMO_ATTR_PERIOD, STEPS2TIME(flow.pars->repetitionOffset));
398 out.writeAttr(SUMO_ATTR_NEXT, STEPS2TIME(flow.pars->repetitionTotalOffset));
399 }
400 if (flow.pars->repetitionEnd != SUMOTime_MAX) {
401 out.writeAttr(SUMO_ATTR_END, STEPS2TIME(flow.pars->repetitionEnd));
402 };
403 out.writeAttr(SUMO_ATTR_ROUTE, flow.pars->routeid);
404 out.writeAttr(SUMO_ATTR_DONE, flow.pars->repetitionsDone);
405 out.writeAttr(SUMO_ATTR_INDEX, flow.index);
406 if (flow.pars->wasSet(VEHPARS_FORCE_REROUTE)) {
407 out.writeAttr(SUMO_ATTR_REROUTE, true);
408 }
409 out.closeTag();
410 }
411}
412
413
414void
416 for (const Flow& f : myFlows) {
417 delete (f.pars);
418 }
419 myFlows.clear();
420 myFlowIDs.clear();
422 myPendingEmits.clear();
423 myEmitCandidates.clear();
424 myAbortedEmits.clear();
425 // myPendingEmitsForLane must not be cleared since it updates itself on the next call
426}
427
428
431 if (myMaxRandomDepartOffset > 0) {
432 // round to the closest usable simulation step
434 }
435 return 0;
436}
437
439MSInsertionControl::getFlowPars(const std::string& id) const {
440 if (hasFlow(id)) {
441 for (const Flow& f : myFlows) {
442 if (f.pars->id == id) {
443 return f.pars;
444 }
445 }
446 }
447 return nullptr;
448}
449
451MSInsertionControl::getLastFlowVehicle(const std::string& id) const {
452 const auto it = myFlowIDs.find(id);
453 if (it != myFlowIDs.end()) {
454 const std::string vehID = id + "." + toString(it->second);
456 }
457 return nullptr;
458}
459
460/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define TLF(string,...)
Definition MsgHandler.h:317
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define SUMOTime_MIN
Definition SUMOTime.h:35
#define TS
Definition SUMOTime.h:42
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_NUMBER
@ SUMO_ATTR_NEXT
succesor phase index
@ SUMO_ATTR_REROUTE
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_PERIOD
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_PROB
@ SUMO_ATTR_ROUTE
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
void addSchedule(const SUMOVehicleParameter &pars, const std::vector< SUMOVehicleParameter::Stop > *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:434
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:775
void setLastFailedInsertionTime(SUMOTime time) const
Sets the last time a vehicle could not be inserted.
Definition MSEdge.h:603
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.
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
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:186
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:320
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:378
static SumoRNG * getParsingRNG()
get parsing RNG
static bool dictionary(const std::string &id, ConstMSRoutePtr route)
Adds a route to the dictionary.
Definition MSRoute.cpp:109
static void checkDist(const std::string &id)
Checks the distribution whether it is permanent and deletes it if not.
Definition MSRoute.cpp:187
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 SumoXMLAttr attr, const T &val)
writes a named attribute
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
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 edge the object is currently at.
double scale
individual scaling factor (-1 for undefined)
Representation of a vehicle.
Definition SUMOVehicle.h:62
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)
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.
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.
Definition of vehicle flow with the current index for vehicle numbering.