Eclipse SUMO - Simulation of Urban MObility
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 
70 void
72  myAllVeh.add(veh);
73 }
74 
75 
76 bool
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 
94 double
95 MSInsertionControl::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 
116 void
117 MSInsertionControl::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 
126 int
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 
155 int
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)
164  && edge.insertVehicle(*veh, time, false, myEagerInsertionCheck)) {
165  // Successful insertion
166  return 1;
167  }
168  if (myMaxDepartDelay >= 0 && time - veh->getParameter().depart > myMaxDepartDelay) {
169  // remove vehicles waiting too long for departure
170  myVehicleControl.deleteVehicle(veh, true);
171  } else if (edge.isVaporizing()) {
172  // remove vehicles if the edge shall be empty
173  myVehicleControl.deleteVehicle(veh, true);
174  } else if (myAbortedEmits.count(veh) > 0) {
175  // remove vehicles which shall not be inserted for some reason
176  myAbortedEmits.erase(veh);
177  myVehicleControl.deleteVehicle(veh, true);
178  } else if ((veh->getRouteValidity(false) & (
181  myVehicleControl.deleteVehicle(veh, true);
182  } else {
183  // let the vehicle wait one step, we'll retry then
184  refusedEmits.push_back(veh);
185  }
186  edge.setLastFailedInsertionTime(time);
187  return 0;
188 }
189 
190 
191 void
192 MSInsertionControl::checkCandidates(SUMOTime time, const bool preCheck) {
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 
216 void
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 
302 int
304  return (int)myPendingEmits.size();
305 }
306 
307 
308 int
310  return (int)myFlows.size();
311 }
312 
313 
314 void
316  myAbortedEmits.insert(veh);
317 }
318 
319 void
321  myAbortedEmits.erase(veh);
322 }
323 
324 
325 void
327  myPendingEmits.erase(std::remove(myPendingEmits.begin(), myPendingEmits.end(), veh), myPendingEmits.end());
328  myAllVeh.remove(veh);
329 }
330 
331 
332 void
333 MSInsertionControl::clearPendingVehicles(const std::string& route) {
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 == "") {
338  myVehicleControl.deleteVehicle(*veh, true);
339  veh = myPendingEmits.erase(veh);
340  } else {
341  ++veh;
342  }
343  }
344 }
345 
346 
347 int
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 
370 void
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 
382 void
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 
414 void
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 
429 SUMOTime
431  if (myMaxRandomDepartOffset > 0) {
432  // round to the closest usable simulation step
434  }
435  return 0;
436 }
437 
439 MSInsertionControl::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 
451 MSInsertionControl::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:35
#define TLF(string,...)
Definition: MsgHandler.h:317
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition: Route.h:31
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 int VEHPARS_FORCE_REROUTE
@ BEGIN
The departure is at simulation start.
@ GIVEN
The time is given.
@ 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_LANE
Definition: MSBaseVehicle.h:78
@ ROUTE_START_INVALID_PERMISSIONS
Definition: MSBaseVehicle.h:76
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
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition: MSEdge.h:168
bool isVaporizing() const
Returns whether vehicles on this edge shall be vaporized.
Definition: MSEdge.h:431
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:711
void setLastFailedInsertionTime(SUMOTime time) const
Sets the last time a vehicle could not be inserted.
Definition: MSEdge.h:580
static bool gCheckRoutes
Definition: MSGlobals.h:88
static bool gStateLoaded
Information whether a state has been loaded.
Definition: MSGlobals.h:100
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
MSEdge & getEdge() const
Returns the lane's edge.
Definition: MSLane.h:756
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:182
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:378
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:320
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.
virtual SUMOVehicle * buildVehicle(SUMOVehicleParameter *defs, ConstMSRoutePtr route, MSVehicleType *type, const bool ignoreStopErrors, const bool fromRouteFile=true, bool addRouteStops=true)
Builds a vehicle, increases the number of built vehicles.
double getScale() const
sets the demand scaling factor
bool hasVTypeDistribution(const std::string &id) const
Asks for a vehicle type distribution.
virtual void deleteVehicle(SUMOVehicle *v, bool discard=false)
Deletes the vehicle.
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.
const RandomDistributor< MSVehicleType * > * getVTypeDistribution(const std::string &typeDistID) const
return the vehicle type distribution with the given id
The car-following model and parameter.
Definition: MSVehicleType.h:63
const SUMOVTypeParameter & getParameter() const
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:60
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:254
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)
Definition: RandHelper.cpp:94
static void initRandGlobal(SumoRNG *which=nullptr)
Reads the given random number options and initialises the random number generator in accordance.
Definition: RandHelper.cpp:87
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:60
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.