Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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-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/****************************************************************************/
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>
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
76
77
78void
105
106
109 ConstMSRoutePtr route, MSVehicleType* type,
110 const bool ignoreStopErrors, const VehicleDefinitionSource source, bool addRouteStops) {
111 const double speedFactor = type->computeChosenSpeedDeviation(defs->speedFactor, source == VehicleDefinitionSource::ROUTEFILE ? MSRouteHandler::getParsingRNG() : nullptr);
112 MSVehicle* built = new MSVehicle(defs, route, type, speedFactor);
113 initVehicle(built, ignoreStopErrors, addRouteStops, source);
114 return built;
115}
116
117
118void
119MSVehicleControl::initVehicle(MSBaseVehicle* built, const bool ignoreStopErrors, bool addRouteStops, const VehicleDefinitionSource source) {
121 try {
122 built->initDevices();
123 if (source != VehicleDefinitionSource::STATE) {
124 built->addStops(ignoreStopErrors, nullptr, addRouteStops);
125 }
126 } catch (ProcessError&) {
127 delete built;
128 throw;
129 }
131}
132
133
134void
136 assert(myRunningVehNo > 0);
137 if (!checkDuplicate || !isPendingRemoval(veh)) {
138 myPendingRemovals.push_back(veh);
139 }
140}
141
142
143bool
145#ifdef HAVE_FOX
146 return myPendingRemovals.contains(veh);
147#else
148 return std::find(myPendingRemovals.begin(), myPendingRemovals.end(), veh) == myPendingRemovals.end();
149#endif
150}
151
152
153void
155 OutputDevice* const tripinfoOut = OptionsCont::getOptions().isSet("tripinfo-output") ? &OutputDevice::getDeviceByOption("tripinfo-output") : nullptr;
156#ifdef HAVE_FOX
157 std::vector<SUMOVehicle*>& vehs = myPendingRemovals.getContainer();
158#else
159 std::vector<SUMOVehicle*>& vehs = myPendingRemovals;
160#endif
161 std::sort(vehs.begin(), vehs.end(), ComparatorNumericalIdLess());
162 for (SUMOVehicle* const veh : vehs) {
163 myTotalTravelTime += STEPS2TIME(MSNet::getInstance()->getCurrentTimeStep() - veh->getDeparture());
166 // vehicle is equipped with tripinfo device (not all vehicles are)
167 const bool hasTripinfo = veh->getDevice(typeid(MSDevice_Tripinfo)) != nullptr;
168 for (MSVehicleDevice* const dev : veh->getDevices()) {
169 dev->generateOutput(hasTripinfo ? tripinfoOut : nullptr);
170 }
171 if (tripinfoOut != nullptr && hasTripinfo) {
172 // close tag after tripinfo (possibly including emissions from another device) have been written
173 tripinfoOut->closeTag();
174 }
175 if (myKeepTime == 0) {
176 deleteVehicle(veh);
177 } else {
179 }
180 }
181 vehs.clear();
182 if (tripinfoOut != nullptr) {
183 // there seem to be people who think reading an unfinished xml is a good idea ;-)
184 tripinfoOut->flush();
185 }
186#ifdef HAVE_FOX
187 myPendingRemovals.unlock();
188#endif
189}
190
191
192void
197
198void
211
212
213void
214MSVehicleControl::setState(int runningVehNo, int loadedVehNo, int endedVehNo, double totalDepartureDelay, double totalTravelTime, double maxSpeedFactor, double minDecel) {
215 myRunningVehNo = runningVehNo;
216 myLoadedVehNo = loadedVehNo;
217 myEndedVehNo = endedVehNo;
218 myTotalDepartureDelay = totalDepartureDelay;
219 myTotalTravelTime = totalTravelTime;
220 myMaxSpeedFactor = maxSpeedFactor;
221 myMinDeceleration = minDecel;
222}
223
224
225void
235 const SUMOTime loaderTime = MSNet::getInstance()->getLoaderTime();
236 if (loaderTime > 0 && loaderTime != SUMOTime_MAX) {
237 out.writeAttr(SUMO_ATTR_LOADERTIME, MSNet::getInstance()->getLoaderTime());
238 }
239 out.closeTag();
240 // save vehicle types
241 for (const auto& item : myVTypeDict) {
242 if (myReplaceableDefaultVTypes.count(item.first) == 0) {
243 item.second->getParameter().write(out);
244 }
245 }
246 for (const auto& item : myVTypeDistDict) {
248 out.writeAttr(SUMO_ATTR_VTYPES, item.second->getVals());
249 out.writeAttr(SUMO_ATTR_PROBS, item.second->getProbs());
250 out.closeTag();
251 }
252 std::vector<SUMOVehicle*> sortedVehs;
253 for (const auto& item : myVehicleDict) {
254 sortedVehs.push_back(item.second);
255 }
256 std::sort(sortedVehs.begin(), sortedVehs.end(), ComparatorNumericalIdLess());
257 for (SUMOVehicle* veh : sortedVehs) {
258 veh->saveState(out);
259 }
260}
261
262
263void
265 for (const auto& item : myVehicleDict) {
266 delete item.second;
267 }
268 myVehicleDict.clear();
269 // delete vehicle type distributions
270 for (const auto& item : myVTypeDistDict) {
271 delete item.second;
272 }
273 myVTypeDistDict.clear();
274 // delete vehicle types
275 for (const auto& item : myVTypeDict) {
276 delete item.second;
277 }
278 myVTypeDict.clear();
279 myPendingRemovals.clear(); // could be leftovers from MSVehicleTransfer::checkInsertions (teleport beyond arrival)
280 if (reinit) {
282 }
283 myLoadedVehNo = 0;
284 myRunningVehNo = 0;
285 myEndedVehNo = 0;
286 myDiscarded = 0;
287 myCollisions = 0;
289 myTeleportsJam = 0;
297}
298
299
300bool
301MSVehicleControl::addVehicle(const std::string& id, SUMOVehicle* v) {
302 VehicleDictType::iterator it = myVehicleDict.find(id);
303 if (it == myVehicleDict.end()) {
304 // id not in myVehicleDict.
305 myVehicleDict[id] = v;
306 handleTriggeredDepart(v, true);
307 const SUMOVehicleParameter& pars = v->getParameter();
308 if (v->getVClass() != SVC_TAXI && pars.line != "" && pars.repetitionNumber < 0) {
309 myPTVehicles.push_back(v);
310 }
311 return true;
312 }
313 return false;
314}
315
316
317void
319 const SUMOVehicleParameter& pars = v->getParameter();
321 const MSEdge* const firstEdge = v->getRoute().getEdges()[pars.departEdge];
322 if (add) {
324 // position will be checked against person position later
325 static_cast<MSVehicle*>(v)->setTentativeLaneAndPosition(nullptr, v->getParameter().departPos);
326 }
327 if (firstEdge->isTazConnector()) {
328 for (MSEdge* out : firstEdge->getSuccessors()) {
329 out->addWaiting(v);
330 }
331 } else {
332 firstEdge->addWaiting(v);
333 }
335 } else {
336 if (firstEdge->isTazConnector()) {
337 for (MSEdge* out : firstEdge->getSuccessors()) {
338 out->removeWaiting(v);
339 }
340 } else {
341 firstEdge->removeWaiting(v);
342 }
344 }
345 }
346}
347
348
350MSVehicleControl::getVehicle(const std::string& id) const {
351 VehicleDictType::const_iterator it = myVehicleDict.find(id);
352 if (it == myVehicleDict.end()) {
353 return nullptr;
354 }
355 return it->second;
356}
357
358
359void
360MSVehicleControl::deleteVehicle(SUMOVehicle* veh, bool discard, bool wasKept) {
361 if (!wasKept) {
362 myEndedVehNo++;
363 if (discard) {
364 myDiscarded++;
365 }
366 }
367 if (veh != nullptr) {
368 myVehicleDict.erase(veh->getID());
369 }
370 auto ptVehIt = std::find(myPTVehicles.begin(), myPTVehicles.end(), veh);
371 if (ptVehIt != myPTVehicles.end()) {
372 myPTVehicles.erase(ptVehIt);
373 }
374 delete veh;
375}
376
377
378bool
379MSVehicleControl::checkVType(const std::string& id) {
380 if (myReplaceableDefaultVTypes.erase(id) > 0) {
381 delete myVTypeDict[id];
382 myVTypeDict.erase(myVTypeDict.find(id));
383 } else {
384 if (myVTypeDict.find(id) != myVTypeDict.end() || myVTypeDistDict.find(id) != myVTypeDistDict.end()) {
385 return false;
386 }
387 }
388 return true;
389}
390
391
392bool
394 if (checkVType(vehType->getID())) {
395 myVTypeDict[vehType->getID()] = vehType;
396 return true;
397 }
398 return false;
399}
400
401
402void
404 assert(vehType != nullptr);
405 assert(myVTypeDict.find(vehType->getID()) != myVTypeDict.end());
406 myVTypeDict.erase(vehType->getID());
407 if (myVTypeToDist.find(vehType->getID()) != myVTypeToDist.end()) {
408 myVTypeToDist.erase(vehType->getID());
409 }
410 delete vehType;
411}
412
413
414bool
416 if (checkVType(id)) {
417 myVTypeDistDict[id] = vehTypeDistribution;
418 std::vector<MSVehicleType*> vehTypes = vehTypeDistribution->getVals();
419 for (auto vehType : vehTypes) {
420 if (myVTypeToDist.find(vehType->getID()) != myVTypeToDist.end()) {
421 myVTypeToDist[vehType->getID()].insert(id);
422 } else {
423 myVTypeToDist[vehType->getID()] = { id };
424 }
425 }
426 return true;
427 }
428 return false;
429}
430
431
432bool
433MSVehicleControl::hasVType(const std::string& id) const {
434 return myVTypeDict.count(id) > 0 || myVTypeDistDict.count(id) > 0;
435}
436
437
438bool
439MSVehicleControl::hasVTypeDistribution(const std::string& id) const {
440 return myVTypeDistDict.count(id) > 0;
441}
442
443
445MSVehicleControl::getVType(const std::string& id, SumoRNG* rng, bool readOnly) {
446 VTypeDictType::iterator it = myVTypeDict.find(id);
447 if (it == myVTypeDict.end()) {
448 VTypeDistDictType::iterator it2 = myVTypeDistDict.find(id);
449 if (it2 == myVTypeDistDict.end()) {
450 return nullptr;
451 }
452 return it2->second->get(rng);
453 }
454 if (!readOnly && myReplaceableDefaultVTypes.erase(id) > 0) {
455 it->second->check();
456 }
457 return it->second;
458}
459
460
461void
462MSVehicleControl::insertVTypeIDs(std::vector<std::string>& into) const {
463 into.reserve(into.size() + myVTypeDict.size() + myVTypeDistDict.size());
464 for (VTypeDictType::const_iterator i = myVTypeDict.begin(); i != myVTypeDict.end(); ++i) {
465 into.push_back((*i).first);
466 }
467 for (VTypeDistDictType::const_iterator i = myVTypeDistDict.begin(); i != myVTypeDistDict.end(); ++i) {
468 into.push_back((*i).first);
469 }
470}
471
472
473const std::set<std::string>
475 std::map<std::string, std::set<std::string>>::const_iterator it = myVTypeToDist.find(id);
476 if (it == myVTypeToDist.end()) {
477 return std::set<std::string>();
478 }
479 return it->second;
480}
481
482
484MSVehicleControl::getVTypeDistribution(const std::string& typeDistID) const {
485 const auto it = myVTypeDistDict.find(typeDistID);
486 if (it != myVTypeDistDict.end()) {
487 return it->second;
488 }
489 return nullptr;
490}
491
492
493const std::vector<MSVehicleType*>
495 std::vector<MSVehicleType*> pedestrianTypes;
496 for (auto const& e : myVTypeDict)
497 if (e.second->getVehicleClass() == SUMOVehicleClass::SVC_PEDESTRIAN) {
498 pedestrianTypes.push_back(e.second);
499 }
500 return pedestrianTypes;
501}
502
503
504void
506 for (VehicleDictType::iterator i = myVehicleDict.begin(); i != myVehicleDict.end(); ++i) {
507 SUMOVehicle* veh = i->second;
508 std::string waitReason;
509 if (veh->isStoppedTriggered()) {
510 const MSStop& stop = veh->getNextStop();
511 if (stop.triggered) {
512 waitReason = "for a person that will never come";
513 } else if (stop.containerTriggered) {
514 waitReason = "for a container that will never come";
515 } else if (stop.joinTriggered) {
516 if (stop.pars.join != "") {
517 waitReason = "to be joined to vehicle '" + stop.pars.join + "'";
518 } else {
519 waitReason = "for a joining vehicle that will never come";
520 }
521 } else {
522 waitReason = "for an unknown trigger";
523 }
524 } else if (!veh->hasDeparted()) {
526 waitReason = "for a train from which to split";
528 waitReason = "at insertion for a person that will never come";
530 waitReason = "at insertion for a container that will never come";
531 } else {
532 waitReason = "for an unknown departure trigger";
533 }
534 } else {
535 waitReason = "for an unknown reason";
536 }
537 WRITE_WARNINGF(TL("Vehicle '%' aborted waiting %."), i->first, waitReason);
538 }
539}
540
541
542int
544 int result = 0;
545 for (MSVehicleControl::constVehIt it = loadedVehBegin(); it != loadedVehEnd(); ++it) {
546 const SUMOVehicle* veh = it->second;
547 if ((veh->isOnRoad() || veh->isRemoteControlled()) && veh->getSpeed() < SUMO_const_haltingSpeed) {
548 result++;
549 }
550 }
551 return result;
552}
553
554
555std::pair<double, double>
557 double speedSum = 0;
558 double relSpeedSum = 0;
559 int count = 0;
560 for (MSVehicleControl::constVehIt it = loadedVehBegin(); it != loadedVehEnd(); ++it) {
561 const SUMOVehicle* veh = it->second;
562 if ((veh->isOnRoad() || veh->isRemoteControlled()) && !veh->isStopped()) {
563 count++;
564 speedSum += veh->getSpeed();
565 relSpeedSum += veh->getEdge()->getSpeedLimit() > 0 ? veh->getSpeed() / veh->getEdge()->getSpeedLimit() : 0;
566 }
567 }
568 if (count > 0) {
569 return std::make_pair(speedSum / count, relSpeedSum / count);
570 } else {
571 return std::make_pair(-1, -1);
572 }
573}
574
575
576int
577MSVehicleControl::getQuota(double frac, int loaded) const {
578 frac = frac < 0 ? myScale : frac;
579 const int origLoaded = (loaded < 1
580 // the vehicle in question has already been loaded, hence the '-1'
581 ? frac > 1. ? (int)(myLoadedVehNo / frac) : myLoadedVehNo - 1
582 // given transportable number reflects only previously loaded
583 : frac > 1. ? (int)(loaded / frac) : loaded);
584 return getScalingQuota(frac, origLoaded);
585}
586
587
588int
592
593
594void
596 for (const SUMOVehicle* const veh : myPTVehicles) {
597 // add single vehicles with line attribute which are not part of a flow
598 ConstMSRoutePtr const route = MSRoute::dictionary(veh->getParameter().routeid);
599 router.getNetwork()->addSchedule(veh->getParameter(), route == nullptr ? nullptr : &route->getStops());
600 }
601}
602
603// ===========================================================================
604// MSVehicleControl::DeleteKeptVehicle method definitions
605// ===========================================================================
606
612
613/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:304
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
#define STEPS2TIME(x)
Definition SUMOTime.h:58
#define STEPFLOOR(x)
Definition SUMOTime.h:61
#define SIMSTEP
Definition SUMOTime.h:64
#define SUMOTime_MAX
Definition SUMOTime.h:34
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_CONTAINER
@ SVC_NON_ROAD
@ 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_DECEL
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_SPEEDFACTOR
@ SUMO_ATTR_ID
@ SUMO_ATTR_LOADERTIME
@ SUMO_ATTR_TIME
trigger: the time of the step
int getScalingQuota(double frac, long long int loaded)
Returns the number of instances of the current object that shall be emitted given the number of loade...
Definition StdDefs.cpp:73
T MIN2(T a, T b)
Definition StdDefs.h:80
const double SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
Definition StdDefs.h:62
T MAX2(T a, T b)
Definition StdDefs.h:86
void addSchedule(const SUMOVehicleParameter &pars, const StopParVector *addStops=nullptr)
Network * getNetwork() const
The base class for microscopic and mesoscopic vehicles.
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:269
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:1192
bool isTazConnector() const
Definition MSEdge.h:292
void addWaiting(SUMOVehicle *vehicle) const
Adds a vehicle to the list of waiting vehicles.
Definition MSEdge.cpp:1485
void removeWaiting(const SUMOVehicle *vehicle) const
Removes a vehicle from the list of waiting vehicles.
Definition MSEdge.cpp:1494
const MSEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
Definition MSEdge.cpp:1292
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
static bool gUseMesoSim
Definition MSGlobals.h:106
@ 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:199
SUMOTime getLoaderTime() const
Definition MSNet.cpp:1122
MSEventControl * getEndOfTimestepEvents()
Returns the event control for events executed at the end of a time step.
Definition MSNet.h:505
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:1371
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
static SumoRNG * getParsingRNG()
get parsing RNG
const ConstMSEdgeVector & getEdges() const
Definition MSRoute.h:128
static bool dictionary(const std::string &id, ConstMSRoutePtr route)
Adds a route to the dictionary.
Definition MSRoute.cpp:116
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
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.
const std::vector< MSVehicleType * > getPedestrianTypes(void) const
Return all pedestrian vehicle types.
bool addVType(MSVehicleType *vehType)
Adds a vehicle type.
VehicleDefinitionSource
possible origins of a vehicle definition
void removePending()
Removes a vehicle after it has ended.
void initVehicle(MSBaseVehicle *built, const bool ignoreStopErrors, bool addRouteStops, const VehicleDefinitionSource source)
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.
std::map< std::string, SUMOVehicle * >::const_iterator constVehIt
Definition of the internal vehicles map iterator.
void insertVTypeIDs(std::vector< std::string > &into) const
Inserts ids of all known vehicle types and vehicle type distributions to the given vector.
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.
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 accomplish 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)
void setState(int runningVehNo, int loadedVehNo, int endedVehNo, double totalDepartureDelay, double totalTravelTime, double maxSpeedFactor, double minDecel)
Sets the current state variables as loaded from the stream.
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.
const std::string & getID() const
Returns the name of the vehicle type.
const MSCFModel & getCarFollowModel() const
Returns the vehicle type's car following model definition (const version)
static MSVehicleType * build(SUMOVTypeParameter &from, const std::string &fileName="")
Builds the microsim vehicle type described by the given parameter.
double computeChosenSpeedDeviation(double speedFactorOverride, SumoRNG *rng, const double minDev=-1.) const
Computes and returns the speed deviation.
void check()
Checks whether vehicle type parameters may be problematic (Currently, only the value for the action s...
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.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false)
writes a named attribute
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.
Represents a generic random distribution.
const std::vector< T > & getVals() const
Returns the members of the distribution.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual double getChosenSpeedFactor() const =0
virtual double getSpeed() const =0
Returns the object's current speed.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
virtual const MSEdge * getEdge() const =0
Returns the edge the object is currently at.
Structure representing possible vehicle parameter.
long long int parametersSet
Information for the router which parameter were set.
Representation of a vehicle.
Definition SUMOVehicle.h:63
virtual bool isStopped() const =0
Returns whether the vehicle is at a stop and waiting for a person or container to continue.
virtual SUMOTime getDeparture() const =0
Returns this vehicle's real departure time.
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.
virtual const MSStop & getNextStop() const =0
virtual const MSRoute & getRoute() const =0
Returns the current route.
std::string join
the id of the vehicle (train portion) to which this vehicle shall be joined
Structure representing possible vehicle parameter.
double speedFactor
individual speedFactor (overriding distribution from vType)
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