Eclipse SUMO - Simulation of Urban MObility
MSVehicleControl.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 /****************************************************************************/
20 // The class responsible for building and deletion of vehicles
21 /****************************************************************************/
22 #include <config.h>
23 
24 #include "MSVehicleControl.h"
25 #include "MSVehicle.h"
26 #include "MSLane.h"
27 #include "MSEdge.h"
28 #include "MSNet.h"
29 #include "MSRouteHandler.h"
30 #include "MSEventControl.h"
31 #include "MSStop.h"
35 #include <utils/common/Named.h>
36 #include <utils/common/RGBColor.h>
41 
42 
43 // ===========================================================================
44 // member method definitions
45 // ===========================================================================
47  myLoadedVehNo(0),
48  myRunningVehNo(0),
49  myEndedVehNo(0),
50  myDiscarded(0),
51  myCollisions(0),
52  myTeleportsCollision(0),
53  myTeleportsJam(0),
54  myTeleportsYield(0),
55  myTeleportsWrongLane(0),
56  myEmergencyStops(0),
57  myEmergencyBrakingCount(0),
58  myStoppedVehicles(0),
59  myTotalDepartureDelay(0),
60  myTotalTravelTime(0),
61  myWaitingForTransportable(0),
62  myMaxSpeedFactor(1),
63  myMinDeceleration(SUMOVTypeParameter::getDefaultDecel(SVC_IGNORING)),
64  myMinDecelerationRail(SUMOVTypeParameter::getDefaultDecel(SVC_RAIL)),
65  myPendingRemovals(MSGlobals::gNumSimThreads > 1) {
66 
69  myKeepTime = string2time(OptionsCont::getOptions().getString("keep-after-arrival"));
70 }
71 
72 
74  clearState(false);
75 }
76 
77 
78 void
82 
86 
90 
94 
98 
100  // ISO Container TEU (cannot set this based on vClass)
101  defContainerType.length = 6.1;
102  defContainerType.width = 2.4;
103  defContainerType.height = 2.6;
104  defContainerType.parametersSet |= VTYPEPARS_VEHICLECLASS_SET;
106 
108 }
109 
110 
113  ConstMSRoutePtr route, MSVehicleType* type,
114  const bool ignoreStopErrors, const bool fromRouteFile, bool addRouteStops) {
115  MSVehicle* built = new MSVehicle(defs, route, type, type->computeChosenSpeedDeviation(fromRouteFile ? MSRouteHandler::getParsingRNG() : nullptr));
116  initVehicle(built, ignoreStopErrors, addRouteStops);
117  return built;
118 }
119 
120 
121 void
122 MSVehicleControl::initVehicle(MSBaseVehicle* built, const bool ignoreStopErrors, bool addRouteStops) {
123  myLoadedVehNo++;
124  try {
125  built->initDevices();
126  built->addStops(ignoreStopErrors, nullptr, addRouteStops);
127  } catch (ProcessError&) {
128  delete built;
129  throw;
130  }
132 }
133 
134 
135 void
137  assert(myRunningVehNo > 0);
138  if (!checkDuplicate || !isPendingRemoval(veh)) {
139  myPendingRemovals.push_back(veh);
140  }
141 }
142 
143 
144 bool
146 #ifdef HAVE_FOX
147  return myPendingRemovals.contains(veh);
148 #else
149  return std::find(myPendingRemovals.begin(), myPendingRemovals.end(), veh) == myPendingRemovals.end();
150 #endif
151 }
152 
153 
154 void
156  OutputDevice* const tripinfoOut = OptionsCont::getOptions().isSet("tripinfo-output") ? &OutputDevice::getDeviceByOption("tripinfo-output") : nullptr;
157 #ifdef HAVE_FOX
158  std::vector<SUMOVehicle*>& vehs = myPendingRemovals.getContainer();
159 #else
160  std::vector<SUMOVehicle*>& vehs = myPendingRemovals;
161 #endif
162  std::sort(vehs.begin(), vehs.end(), ComparatorNumericalIdLess());
163  for (SUMOVehicle* const veh : vehs) {
164  myTotalTravelTime += STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep() - veh->getDeparture());
165  myRunningVehNo--;
167  // vehicle is equipped with tripinfo device (not all vehicles are)
168  const bool hasTripinfo = veh->getDevice(typeid(MSDevice_Tripinfo)) != nullptr;
169  for (MSVehicleDevice* const dev : veh->getDevices()) {
170  dev->generateOutput(hasTripinfo ? tripinfoOut : nullptr);
171  }
172  if (tripinfoOut != nullptr && hasTripinfo) {
173  // close tag after tripinfo (possibly including emissions from another device) have been written
174  tripinfoOut->closeTag();
175  }
176  if (myKeepTime == 0) {
177  deleteVehicle(veh);
178  } else {
179  deleteKeptVehicle(veh);
180  }
181  }
182  vehs.clear();
183  if (tripinfoOut != nullptr) {
184  // there seem to be people who think reading an unfinished xml is a good idea ;-)
185  tripinfoOut->flush();
186  }
187 #ifdef HAVE_FOX
188  myPendingRemovals.unlock();
189 #endif
190 }
191 
192 
193 void
195  myEndedVehNo++;
197 }
198 
199 void
201  ++myRunningVehNo;
205  if ((v.getVClass() & (SVC_PEDESTRIAN | SVC_NON_ROAD)) == 0) {
206  // only worry about deceleration of road users
208  } else if ((v.getVClass() & SVC_RAIL_CLASSES) != 0) {
210  }
211 }
212 
213 
214 void
215 MSVehicleControl::setState(int runningVehNo, int loadedVehNo, int endedVehNo, double totalDepartureDelay, double totalTravelTime) {
216  myRunningVehNo = runningVehNo;
217  myLoadedVehNo = loadedVehNo;
218  myEndedVehNo = endedVehNo;
219  myTotalDepartureDelay = totalDepartureDelay;
220  myTotalTravelTime = totalTravelTime;
221 }
222 
223 
224 void
226  out.openTag(SUMO_TAG_DELAY);
232  // save vehicle types
233  for (const auto& item : myVTypeDict) {
234  if (myReplaceableDefaultVTypes.count(item.first) == 0) {
235  item.second->getParameter().write(out);
236  }
237  }
238  for (const auto& item : myVTypeDistDict) {
240  out.writeAttr(SUMO_ATTR_VTYPES, item.second->getVals());
241  out.writeAttr(SUMO_ATTR_PROBS, item.second->getProbs());
242  out.closeTag();
243  }
244  for (const auto& item : myVehicleDict) {
245  item.second->saveState(out);
246  }
247 }
248 
249 
250 void
251 MSVehicleControl::clearState(const bool reinit) {
252  for (const auto& item : myVehicleDict) {
253  delete item.second;
254  }
255  myVehicleDict.clear();
256  // delete vehicle type distributions
257  for (const auto& item : myVTypeDistDict) {
258  delete item.second;
259  }
260  myVTypeDistDict.clear();
261  // delete vehicle types
262  for (const auto& item : myVTypeDict) {
263  delete item.second;
264  }
265  myVTypeDict.clear();
266  myPendingRemovals.clear(); // could be leftovers from MSVehicleTransfer::checkInsertions (teleport beyond arrival)
267  if (reinit) {
269  }
270  myLoadedVehNo = 0;
271  myRunningVehNo = 0;
272  myEndedVehNo = 0;
273  myDiscarded = 0;
274  myCollisions = 0;
276  myTeleportsJam = 0;
277  myTeleportsYield = 0;
279  myEmergencyStops = 0;
281  myStoppedVehicles = 0;
283  myTotalTravelTime = 0;
284 }
285 
286 
287 bool
288 MSVehicleControl::addVehicle(const std::string& id, SUMOVehicle* v) {
289  VehicleDictType::iterator it = myVehicleDict.find(id);
290  if (it == myVehicleDict.end()) {
291  // id not in myVehicleDict.
292  myVehicleDict[id] = v;
293  handleTriggeredDepart(v, true);
294  const SUMOVehicleParameter& pars = v->getParameter();
295  if (v->getVClass() != SVC_TAXI && pars.line != "" && pars.repetitionNumber < 0) {
296  myPTVehicles.push_back(v);
297  }
298  return true;
299  }
300  return false;
301 }
302 
303 
304 void
306  const SUMOVehicleParameter& pars = v->getParameter();
308  const MSEdge* const firstEdge = v->getRoute().getEdges()[pars.departEdge];
309  if (add) {
310  if (!MSGlobals::gUseMesoSim) {
311  // position will be checked against person position later
312  static_cast<MSVehicle*>(v)->setTentativeLaneAndPosition(nullptr, v->getParameter().departPos);
313  }
314  if (firstEdge->isTazConnector()) {
315  for (MSEdge* out : firstEdge->getSuccessors()) {
316  out->addWaiting(v);
317  }
318  } else {
319  firstEdge->addWaiting(v);
320  }
322  } else {
323  if (firstEdge->isTazConnector()) {
324  for (MSEdge* out : firstEdge->getSuccessors()) {
325  out->removeWaiting(v);
326  }
327  } else {
328  firstEdge->removeWaiting(v);
329  }
331  }
332  }
333 }
334 
335 
337 MSVehicleControl::getVehicle(const std::string& id) const {
338  VehicleDictType::const_iterator it = myVehicleDict.find(id);
339  if (it == myVehicleDict.end()) {
340  return nullptr;
341  }
342  return it->second;
343 }
344 
345 
346 void
347 MSVehicleControl::deleteVehicle(SUMOVehicle* veh, bool discard, bool wasKept) {
348  if (!wasKept) {
349  myEndedVehNo++;
350  if (discard) {
351  myDiscarded++;
352  }
353  }
354  if (veh != nullptr) {
355  myVehicleDict.erase(veh->getID());
356  }
357  auto ptVehIt = std::find(myPTVehicles.begin(), myPTVehicles.end(), veh);
358  if (ptVehIt != myPTVehicles.end()) {
359  myPTVehicles.erase(ptVehIt);
360  }
361  delete veh;
362 }
363 
364 
365 bool
366 MSVehicleControl::checkVType(const std::string& id) {
367  if (myReplaceableDefaultVTypes.erase(id) > 0) {
368  delete myVTypeDict[id];
369  myVTypeDict.erase(myVTypeDict.find(id));
370  } else {
371  if (myVTypeDict.find(id) != myVTypeDict.end() || myVTypeDistDict.find(id) != myVTypeDistDict.end()) {
372  return false;
373  }
374  }
375  return true;
376 }
377 
378 
379 bool
381  if (checkVType(vehType->getID())) {
382  myVTypeDict[vehType->getID()] = vehType;
383  return true;
384  }
385  return false;
386 }
387 
388 
389 void
391  assert(vehType != nullptr);
392  assert(myVTypeDict.find(vehType->getID()) != myVTypeDict.end());
393  myVTypeDict.erase(vehType->getID());
394  if (myVTypeToDist.find(vehType->getID()) != myVTypeToDist.end()) {
395  myVTypeToDist.erase(vehType->getID());
396  }
397  delete vehType;
398 }
399 
400 
401 bool
402 MSVehicleControl::addVTypeDistribution(const std::string& id, RandomDistributor<MSVehicleType*>* vehTypeDistribution) {
403  if (checkVType(id)) {
404  myVTypeDistDict[id] = vehTypeDistribution;
405  std::vector<MSVehicleType*> vehTypes = vehTypeDistribution->getVals();
406  for (auto vehType : vehTypes) {
407  if (myVTypeToDist.find(vehType->getID()) != myVTypeToDist.end()) {
408  myVTypeToDist[vehType->getID()].insert(id);
409  } else {
410  myVTypeToDist[vehType->getID()] = { id };
411  }
412  }
413  return true;
414  }
415  return false;
416 }
417 
418 
419 bool
420 MSVehicleControl::hasVType(const std::string& id) const {
421  return myVTypeDict.count(id) > 0 || myVTypeDistDict.count(id) > 0;
422 }
423 
424 
425 bool
426 MSVehicleControl::hasVTypeDistribution(const std::string& id) const {
427  return myVTypeDistDict.count(id) > 0;
428 }
429 
430 
432 MSVehicleControl::getVType(const std::string& id, SumoRNG* rng, bool readOnly) {
433  VTypeDictType::iterator it = myVTypeDict.find(id);
434  if (it == myVTypeDict.end()) {
435  VTypeDistDictType::iterator it2 = myVTypeDistDict.find(id);
436  if (it2 == myVTypeDistDict.end()) {
437  return nullptr;
438  }
439  return it2->second->get(rng);
440  }
441  if (!readOnly && myReplaceableDefaultVTypes.erase(id) > 0) {
442  it->second->check();
443  }
444  return it->second;
445 }
446 
447 
448 void
449 MSVehicleControl::insertVTypeIDs(std::vector<std::string>& into) const {
450  into.reserve(into.size() + myVTypeDict.size() + myVTypeDistDict.size());
451  for (VTypeDictType::const_iterator i = myVTypeDict.begin(); i != myVTypeDict.end(); ++i) {
452  into.push_back((*i).first);
453  }
454  for (VTypeDistDictType::const_iterator i = myVTypeDistDict.begin(); i != myVTypeDistDict.end(); ++i) {
455  into.push_back((*i).first);
456  }
457 }
458 
459 
460 const std::set<std::string>
462  std::map<std::string, std::set<std::string>>::const_iterator it = myVTypeToDist.find(id);
463  if (it == myVTypeToDist.end()) {
464  return std::set<std::string>();
465  }
466  return it->second;
467 }
468 
469 
471 MSVehicleControl::getVTypeDistribution(const std::string& typeDistID) const {
472  const auto it = myVTypeDistDict.find(typeDistID);
473  if (it != myVTypeDistDict.end()) {
474  return it->second;
475  }
476  return nullptr;
477 }
478 
479 
480 const std::vector<MSVehicleType*>
482  std::vector<MSVehicleType*> pedestrianTypes;
483  for (auto const& e : myVTypeDict)
484  if (e.second->getVehicleClass() == SUMOVehicleClass::SVC_PEDESTRIAN) {
485  pedestrianTypes.push_back(e.second);
486  }
487  return pedestrianTypes;
488 }
489 
490 
491 void
493  for (VehicleDictType::iterator i = myVehicleDict.begin(); i != myVehicleDict.end(); ++i) {
494  SUMOVehicle* veh = i->second;
495  std::string waitReason;
496  if (veh->isStoppedTriggered()) {
497  const MSStop& stop = veh->getNextStop();
498  if (stop.triggered) {
499  waitReason = "for a person that will never come";
500  } else if (stop.containerTriggered) {
501  waitReason = "for a container that will never come";
502  } else if (stop.joinTriggered) {
503  if (stop.pars.join != "") {
504  waitReason = "to be joined to vehicle '" + stop.pars.join + "'";
505  } else {
506  waitReason = "for a joining vehicle that will never come";
507  }
508  } else {
509  waitReason = "for an unknown trigger";
510  }
511  } else if (!veh->hasDeparted()) {
513  waitReason = "for a train from which to split";
515  waitReason = "at insertion for a person that will never come";
517  waitReason = "at insertion for a container that will never come";
518  } else {
519  waitReason = "for an unknown departure trigger";
520  }
521  } else {
522  waitReason = "for an unknown reason";
523  }
524  WRITE_WARNINGF(TL("Vehicle '%' aborted waiting %."), i->first, waitReason);
525  }
526 }
527 
528 
529 int
531  int result = 0;
532  for (MSVehicleControl::constVehIt it = loadedVehBegin(); it != loadedVehEnd(); ++it) {
533  const SUMOVehicle* veh = it->second;
534  if ((veh->isOnRoad() || veh->isRemoteControlled()) && veh->getSpeed() < SUMO_const_haltingSpeed) {
535  result++;
536  }
537  }
538  return result;
539 }
540 
541 
542 std::pair<double, double>
544  double speedSum = 0;
545  double relSpeedSum = 0;
546  int count = 0;
547  for (MSVehicleControl::constVehIt it = loadedVehBegin(); it != loadedVehEnd(); ++it) {
548  const SUMOVehicle* veh = it->second;
549  if ((veh->isOnRoad() || veh->isRemoteControlled()) && !veh->isStopped()) {
550  count++;
551  speedSum += veh->getSpeed();
552  relSpeedSum += veh->getEdge()->getSpeedLimit() > 0 ? veh->getSpeed() / veh->getEdge()->getSpeedLimit() : 0;
553  }
554  }
555  if (count > 0) {
556  return std::make_pair(speedSum / count, relSpeedSum / count);
557  } else {
558  return std::make_pair(-1, -1);
559  }
560 }
561 
562 
563 int
564 MSVehicleControl::getQuota(double frac, int loaded) const {
565  frac = frac < 0 ? myScale : frac;
566  const int origLoaded = (loaded < 1
567  // the vehicle in question has already been loaded, hence the '-1'
568  ? frac > 1. ? (int)(myLoadedVehNo / frac) : myLoadedVehNo - 1
569  // given transportable number reflects only previously loaded
570  : frac > 1. ? (int)(loaded / frac) : loaded);
571  return getScalingQuota(frac, origLoaded);
572 }
573 
574 
575 int
578 }
579 
580 
581 void
583  for (const SUMOVehicle* const veh : myPTVehicles) {
584  // add single vehicles with line attribute which are not part of a flow
585  ConstMSRoutePtr const route = MSRoute::dictionary(veh->getParameter().routeid);
586  router.getNetwork()->addSchedule(veh->getParameter(), route == nullptr ? nullptr : &route->getStops());
587  }
588 }
589 
590 // ===========================================================================
591 // MSVehicleControl::DeleteKeptVehicle method definitions
592 // ===========================================================================
593 
594 SUMOTime
597  return 0;
598 }
599 
600 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
#define WRITE_WARNINGF(...)
Definition: MsgHandler.h:296
#define TL(string)
Definition: MsgHandler.h:315
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition: Route.h:31
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition: SUMOTime.cpp:46
#define STEPS2TIME(x)
Definition: SUMOTime.h:55
#define STEPFLOOR(x)
Definition: SUMOTime.h:58
#define SIMSTEP
Definition: SUMOTime.h:61
const long long int VTYPEPARS_VEHICLECLASS_SET
const std::string DEFAULT_TAXITYPE_ID
const std::string DEFAULT_RAILTYPE_ID
const std::string DEFAULT_PEDTYPE_ID
const std::set< std::string > DEFAULT_VTYPES
const std::string DEFAULT_VTYPE_ID
const std::string DEFAULT_CONTAINERTYPE_ID
@ SVC_IGNORING
vehicles ignoring classes
@ SVC_RAIL
vehicle is a not electrified rail
@ SVC_RAIL_CLASSES
classes which drive on tracks
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_NON_ROAD
classes which (normally) do not drive on normal roads
@ SVC_TAXI
vehicle is a taxi
@ SVC_PEDESTRIAN
pedestrian
const std::string DEFAULT_BIKETYPE_ID
@ SPLIT
The departure is triggered by a train split.
@ CONTAINER_TRIGGERED
The departure is container triggered.
@ TRIGGERED
The departure is person triggered.
@ SUMO_TAG_DELAY
@ SUMO_TAG_VTYPE_DISTRIBUTION
distribution of a vehicle type
@ SUMO_ATTR_NUMBER
@ SUMO_ATTR_DEPART
@ SUMO_ATTR_PROBS
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_VTYPES
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ID
@ SUMO_ATTR_TIME
trigger: the time of the step
int getScalingQuota(double frac, int loaded)
Returns the number of instances of the current object that shall be emitted given the number of loade...
Definition: StdDefs.cpp:61
T MIN2(T a, T b)
Definition: StdDefs.h:76
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
Definition: StdDefs.h:58
T MAX2(T a, T b)
Definition: StdDefs.h:82
void addSchedule(const SUMOVehicleParameter &pars, const std::vector< SUMOVehicleParameter::Stop > *addStops=nullptr)
Network * getNetwork() const
The base class for microscopic and mesoscopic vehicles.
Definition: MSBaseVehicle.h:55
virtual void initDevices()
void addStops(const bool ignoreStopErrors, MSRouteIterator *searchStart=nullptr, bool addRouteStops=true)
Adds stops to the built vehicle.
double getMaxDecel() const
Get the vehicle type's maximal comfortable deceleration [m/s^2].
Definition: MSCFModel.h:264
A device which collects info on the vehicle trip (mainly on departure and arrival)
A road/street connecting two junctions.
Definition: MSEdge.h:77
double getSpeedLimit() const
Returns the speed limit of the edge @caution The speed limit of the first lane is retured; should pro...
Definition: MSEdge.cpp:1094
bool isTazConnector() const
Definition: MSEdge.h:288
void addWaiting(SUMOVehicle *vehicle) const
Adds a vehicle to the list of waiting vehicles.
Definition: MSEdge.cpp:1373
void removeWaiting(const SUMOVehicle *vehicle) const
Removes a vehicle from the list of waiting vehicles.
Definition: MSEdge.cpp:1382
const MSEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
Definition: MSEdge.cpp:1194
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
static bool gUseMesoSim
Definition: MSGlobals.h:103
@ BUILT
The vehicle was built, but has not yet departed.
@ ARRIVED
The vehicle arrived at his destination (is deleted)
@ DEPARTED
The vehicle has departed (was inserted into the network)
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
MSEventControl * getEndOfTimestepEvents()
Returns the event control for events executed at the end of a time step.
Definition: MSNet.h:481
void informVehicleStateListener(const SUMOVehicle *const vehicle, VehicleState to, const std::string &info="")
Informs all added listeners about a vehicle's state change.
Definition: MSNet.cpp:1258
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
const ConstMSEdgeVector & getEdges() const
Definition: MSRoute.h:124
Definition: MSStop.h:44
bool triggered
whether an arriving person lets the vehicle continue
Definition: MSStop.h:69
bool containerTriggered
whether an arriving container lets the vehicle continue
Definition: MSStop.h:71
bool joinTriggered
whether coupling another vehicle (train) the vehicle continue
Definition: MSStop.h:73
const SUMOVehicleParameter::Stop pars
The stop parameter.
Definition: MSStop.h:65
SUMOTime execute(SUMOTime currentTime)
Executes the command.
void adaptIntermodalRouter(MSTransportableRouter &router) const
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.
int myTeleportsCollision
The number of teleports due to collision.
double myScale
The scaling factor (especially for inc-dua)
bool hasVType(const std::string &id) const
Asks for existence of a vehicle type.
std::map< std::string, SUMOVehicle * >::const_iterator constVehIt
Definition of the internal vehicles map iterator.
const std::vector< MSVehicleType * > getPedestrianTypes(void) const
Return all pedestrian vehicle types.
bool addVType(MSVehicleType *vehType)
Adds a vehicle type.
void initVehicle(MSBaseVehicle *built, const bool ignoreStopErrors, bool addRouteStops)
void setState(int runningVehNo, int loadedVehNo, int endedVehNo, double totalDepartureDelay, double totalTravelTime)
Sets the current state variables as loaded from the stream.
void removePending()
Removes a vehicle after it has ended.
std::set< std::string > myReplaceableDefaultVTypes
the default vehicle types which may still be replaced
std::vector< SUMOVehicle * > myPendingRemovals
List of vehicles which are going to be removed.
int myLoadedVehNo
The number of build vehicles.
bool hasVTypeDistribution(const std::string &id) const
Asks for a vehicle type distribution.
void vehicleDeparted(const SUMOVehicle &v)
Informs this control about a vehicle's departure.
virtual bool addVehicle(const std::string &id, SUMOVehicle *v)
Tries to insert the vehicle into the internal vehicle container.
void initDefaultTypes()
create default types
int myTeleportsYield
The number of teleports due to vehicles stuck on a minor road.
int myTeleportsWrongLane
The number of teleports due to vehicles stuck on the wrong lane.
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
void clearState(const bool reinit)
Remove all vehicles before quick-loading state.
std::map< std::string, std::set< std::string > > myVTypeToDist
Inverse lookup from vehicle type to distributions it is a member of.
double myMinDeceleration
The minimum deceleration capability for all road vehicles in the network.
bool isPendingRemoval(SUMOVehicle *veh)
whether the given vehicle is scheduled for removal
double myMinDecelerationRail
The minimum deceleration capability for all rail vehicles in the network.
virtual ~MSVehicleControl()
Destructor.
void removeVType(const MSVehicleType *vehType)
int myEmergencyBrakingCount
The number of emergency stops.
int myStoppedVehicles
The number of stopped vehicles.
void deleteKeptVehicle(SUMOVehicle *veh)
when a vehicle is kept after arrival, schedule later deletion
void registerOneWaiting()
increases the count of vehicles waiting for a transport to allow recognition of person / container re...
void unregisterOneWaiting()
decreases the count of vehicles waiting for a transport to allow recognition of person / container re...
virtual std::pair< double, double > getVehicleMeanSpeeds() const
get current absolute and relative mean vehicle speed in the network
bool checkVType(const std::string &id)
Checks whether the vehicle type (distribution) may be added.
int myCollisions
The number of collisions.
int myEmergencyStops
The number of emergency stops.
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" ...
MSVehicleControl()
Constructor.
double myMaxSpeedFactor
The maximum speed factor for all vehicles in the network.
int myDiscarded
The number of vehicles which were discarded while loading.
int myEndedVehNo
The number of removed vehicles.
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.
bool addVTypeDistribution(const std::string &id, RandomDistributor< MSVehicleType * > *vehTypeDistribution)
Adds a vehicle type distribution.
int myTeleportsJam
The number of teleports due to jam.
void insertVTypeIDs(std::vector< std::string > &into) const
Inserts ids of all known vehicle types and vehicle type distributions to the given vector.
double myTotalDepartureDelay
The aggregated time vehicles had to wait for departure (in seconds)
VTypeDictType myVTypeDict
Dictionary of vehicle types.
const RandomDistributor< MSVehicleType * > * getVTypeDistribution(const std::string &typeDistID) const
return the vehicle type distribution with the given id
virtual int getHaltingVehicleNo() const
Returns the number of halting vehicles.
void scheduleVehicleRemoval(SUMOVehicle *veh, bool checkDuplicate=false)
Removes a vehicle after it has ended.
virtual void deleteVehicle(SUMOVehicle *v, bool discard=false, bool wasKept=false)
Deletes the vehicle.
constVehIt loadedVehBegin() const
Returns the begin of the internal vehicle map.
double myTotalTravelTime
The aggregated time vehicles needed to aacomplish their route (in seconds)
std::vector< SUMOVehicle * > myPTVehicles
List of vehicles which belong to public transport.
int getTeleportCount() const
return the number of teleports (including collisions)
VTypeDistDictType myVTypeDistDict
A distribution of vehicle types (probability->vehicle type)
void handleTriggeredDepart(SUMOVehicle *v, bool add)
register / unregister depart-triggered vehicles with edges
void abortWaiting()
informes about all waiting vehicles (deletion in destructor)
void saveState(OutputDevice &out)
Saves the current state into the given stream.
constVehIt loadedVehEnd() const
Returns the end of the internal vehicle map.
const std::set< std::string > getVTypeDistributionMembership(const std::string &id) const
Return the distribution IDs the vehicle type is a member of.
int myRunningVehNo
The number of vehicles within the network (build and inserted but not removed)
VehicleDictType myVehicleDict
Dictionary of vehicles.
Abstract in-vehicle device.
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:77
The car-following model and parameter.
Definition: MSVehicleType.h:63
static MSVehicleType * build(SUMOVTypeParameter &from)
Builds the microsim vehicle type described by the given parameter.
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:91
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
double computeChosenSpeedDeviation(SumoRNG *rng, const double minDev=-1.) const
Computes and returns the speed deviation.
const std::string & getID() const
Returns the id.
Definition: Named.h:74
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
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 & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:254
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
const std::vector< T > & getVals() const
Returns the members of the distribution.
virtual double getChosenSpeedFactor() const =0
virtual double getSpeed() const =0
Returns the object's current speed.
virtual bool isStopped() const =0
Returns whether the object is at a stop.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
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.
Structure representing possible vehicle parameter.
double width
This class' width.
double height
This class' height.
double length
The physical vehicle length.
long long int parametersSet
Information for the router which parameter were set.
Representation of a vehicle.
Definition: SUMOVehicle.h:60
virtual const MSRoute & getRoute() const =0
Returns the current route.
virtual SUMOTime getDeparture() const =0
Returns this vehicle's real departure time.
virtual MSStop & getNextStop()=0
virtual bool hasDeparted() const =0
Returns whether this vehicle has departed.
virtual bool isStoppedTriggered() const =0
Returns whether the vehicle is at a stop and waiting for a person or container to continue.
virtual bool isOnRoad() const =0
Returns the information whether the vehicle is on a road (is simulated)
virtual bool isRemoteControlled() const =0
Returns the information whether the vehicle is fully controlled via TraCI.
std::string join
the id of the vehicle (train portion) to which this vehicle shall be joined
Structure representing possible vehicle parameter.
double departPos
(optional) The position the vehicle shall depart from
int departEdge
(optional) The initial edge within the route of the vehicle
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
std::string line
The vehicle's line (mainly for public transport)
Function-object for stable sorting of objects with numerical ids.
Definition: Named.h:39