Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
MELoop.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/****************************************************************************/
18// The main mesocopic simulation loop
19/****************************************************************************/
20#include <config.h>
21
22#include <queue>
23#include <vector>
24#include <map>
25#include <cmath>
26
27#include <microsim/MSNet.h>
28#include <microsim/MSEdge.h>
29#include <microsim/MSGlobals.h>
30#include <microsim/MSLane.h>
31#include <microsim/MSVehicle.h>
38#include "MELoop.h"
39#include "MESegment.h"
40#include "MELSegment.h"
41#include "MEVehicle.h"
42
44
45// ===========================================================================
46// method definitions
47// ===========================================================================
48MELoop::MELoop(const SUMOTime recheckInterval) : myFullRecheckInterval(recheckInterval), myLinkRecheckInterval(TIME2STEPS(1)) {
49}
50
52 for (std::vector<MESegment*>::const_iterator j = myEdges2FirstSegments.begin(); j != myEdges2FirstSegments.end(); ++j) {
53 for (MESegment* s = *j; s != nullptr;) {
54 MESegment* n = s->getNextSegment();
55 delete s;
56 s = n;
57 }
58 }
59}
60
61
62void
64 while (!myLeaderCars.empty()) {
65 LeaderEvent e = myLeaderCars.top();
66 assert(e.time > tMax - DELTA_T);
67 if (e.time > tMax) {
68 return;
69 }
70 myLeaderCars.pop();
71 while (!myInvalidatedLeaderCars.empty() && e.time > myInvalidatedLeaderCars.top().time) {
73 }
74 if (!myInvalidatedLeaderCars.empty()) {
75 if (e == myInvalidatedLeaderCars.top()) {
77 continue;
78 }
79 }
80 //std::cout << SIMTIME << " checkChar " << e.veh->getID() << " on=" << e.veh->getSegment()->getID() << " t=" << e.time << " nid=" << e.veh->getNumericalID() << "\n";
81 checkCar(e.veh);
82 assert(myLeaderCars.empty() || myLeaderCars.top().time >= e.time);
83 }
84}
85
86
88MELoop::changeSegment(MEVehicle* veh, SUMOTime leaveTime, MESegment* const toSegment, MSMoveReminder::Notification reason, const bool ignoreLink) const {
89 int qIdx = 0;
90 MESegment* const onSegment = veh->getSegment();
91 if (MESegment::isInvalid(toSegment)) {
92 if (veh->isStoppedTriggered()) {
93 return leaveTime + MAX2(SUMOTime(1), myLinkRecheckInterval);
94 }
95 if (onSegment != nullptr) {
96 onSegment->send(veh, toSegment, qIdx, leaveTime, reason);
97 } else {
98 WRITE_WARNINGF(TL("Vehicle '%' teleports beyond arrival edge '%', time=%."),
99 veh->getID(), veh->getEdge()->getID(), time2string(leaveTime));
100 }
101 veh->setSegment(toSegment); // signal arrival
103 return leaveTime;
104 } else if (!MSGlobals::gCheckRoutes && !ignoreLink && !MESegment::isInvalid(onSegment) && &onSegment->getEdge() != &toSegment->getEdge() &&
105 veh->getEdge()->allowedLanes(*veh->succEdge(1), veh->getVClass()) == nullptr) {
106 if (veh->isStopped()) {
107 veh->processStop();
108 }
109 return SUMOTime_MAX;
110 }
111 toSegment->updateEntryBlockTime(leaveTime);
112 const SUMOTime entry = toSegment->hasSpaceFor(veh, leaveTime, qIdx);
113 if (entry == leaveTime && (ignoreLink || veh->mayProceed())) {
114 if (onSegment != nullptr) {
115 if (veh->getQueIndex() == MESegment::PARKING_QUEUE) { // parking or just aborted parking
116 if (veh->isParking()) {
117 veh->processStop();
118 }
119 veh->getEdge()->getLanes()[0]->removeParking(veh); // TODO for GUI only
120 } else {
121 onSegment->send(veh, toSegment, qIdx, leaveTime, onSegment->getNextSegment() == nullptr ? MSMoveReminder::NOTIFICATION_JUNCTION : MSMoveReminder::NOTIFICATION_SEGMENT);
122 }
123 toSegment->receive(veh, qIdx, leaveTime, false, ignoreLink, &onSegment->getEdge() != &toSegment->getEdge());
124 } else {
125 WRITE_WARNINGF(TL("Vehicle '%' ends teleporting on edge '%':%, time=%."),
126 veh->getID(), toSegment->getEdge().getID(), toSegment->getIndex(), time2string(leaveTime));
127 // this is not quite correct but suffices for interrogation by
128 // subsequent methods (veh->getSpeed() needs segment != 0)
130 // clean up detectors (do not add traffic data)
131 // note: updateDatector is not called if leaveTime == getLastEntryTime()
133 toSegment->receive(veh, qIdx, leaveTime, false, true, true);
134 }
135 return entry;
136 }
137 if (entry == leaveTime && !ignoreLink) { // this is a long way of saying !veh->mayProceed() (which is a costly call)
138 return entry + MAX2(SUMOTime(1), myLinkRecheckInterval);
139 }
140 return entry;
141}
142
143
144void
146 const SUMOTime leaveTime = veh->getEventTime();
147 MESegment* const onSegment = veh->getSegment();
148 MESegment* const toSegment = veh->getQueIndex() == MESegment::PARKING_QUEUE ? onSegment : nextSegment(onSegment, veh);
149 const bool teleporting = (onSegment == nullptr); // is the vehicle currently teleporting?
150 // @note reason is only evaluated if toSegment == nullptr
151 const SUMOTime nextEntry = changeSegment(veh, leaveTime, toSegment, MSMoveReminder::NOTIFICATION_ARRIVED, teleporting);
152 if (nextEntry == leaveTime) {
153 return;
154 }
157 if (!veh->isStopped() && (r1 || r3)) {
158 const bool disconnected = (MSGlobals::gTimeToTeleportDisconnected >= 0
159 && veh->succEdge(1) != nullptr
160 && veh->getEdge()->allowedLanes(*veh->succEdge(1), veh->getVClass()) == nullptr);
161 if ((r1 && !disconnected) || (r3 && disconnected)) {
162 teleportVehicle(veh, toSegment, disconnected);
163 return;
164 }
165 }
166 if (veh->getBlockTime() == SUMOTime_MAX && (!veh->isStopped()
167 || (!veh->isStoppedTriggered() && veh->isStoppedParking()))) {
168 veh->setBlockTime(leaveTime);
169 }
170 if (nextEntry == SUMOTime_MAX) {
171 // all usable queues on the next segment are full
172 SUMOTime newEventTime = MAX3(toSegment->getEventTime() + 1, leaveTime + 1, leaveTime + myFullRecheckInterval);
174 // if teleporting is enabled, make sure we look at the vehicle when the gridlock-time is up
176 newEventTime = MAX2(MIN2(newEventTime, veh->getBlockTime() + recheck + 1), leaveTime + DELTA_T);
177 }
178 veh->setEventTime(newEventTime);
179 } else {
180 // receiving segment has recently received another vehicle or the junction is blocked
181 veh->setEventTime(nextEntry);
182 }
183 addLeaderCar(veh, teleporting ? nullptr : onSegment->getLink(veh));
184}
185
186
187void
188MELoop::teleportVehicle(MEVehicle* veh, MESegment* const toSegment, bool disconnected) {
189 const SUMOTime leaveTime = veh->getEventTime();
190 MESegment* const onSegment = veh->getSegment();
192 WRITE_WARNINGF(TL("Teleporting vehicle '%'; waited too long, from edge '%':%, time=%."),
193 veh->getID(), onSegment->getEdge().getID(), onSegment->getIndex(),
194 time2string(leaveTime));
196 int qIdx = 0;
197 onSegment->send(veh, nullptr, qIdx, leaveTime, MSMoveReminder::NOTIFICATION_TELEPORT_ARRIVED);
198 veh->setSegment(nullptr);
200 return;
201 }
202 const bool teleporting = (onSegment == nullptr); // is the vehicle already teleporting?
203 // try to find a place on the current edge
204 MESegment* teleSegment = disconnected ? toSegment : toSegment->getNextSegment();
205 while (teleSegment != nullptr && changeSegment(veh, leaveTime, teleSegment, MSMoveReminder::NOTIFICATION_TELEPORT, true) != leaveTime) {
206 // @caution the time to get to the next segment here is ignored XXX
207 teleSegment = teleSegment->getNextSegment();
208 }
209 if (teleSegment != nullptr) {
210 if (!teleporting) {
211 // we managed to teleport in a single jump
212 const std::string reason = disconnected ? " (disconnected)" : "";
213 WRITE_WARNINGF(TL("Teleporting vehicle '%'; waited too long%, from edge '%':% to edge '%':%, time=%."),
214 veh->getID(), reason, onSegment->getEdge().getID(), onSegment->getIndex(),
215 teleSegment->getEdge().getID(), teleSegment->getIndex(), time2string(leaveTime));
217 }
218 } else {
219 // teleport across the current edge and try insertion later
220 if (!teleporting) {
221 int qIdx = 0;
222 // announce start of multi-step teleport, arrival will be announced in changeSegment()
223 WRITE_WARNINGF(TL("Teleporting vehicle '%'; waited too long, from edge '%':%, time=%."),
224 veh->getID(), onSegment->getEdge().getID(), onSegment->getIndex(), time2string(leaveTime));
226 // remove from current segment
227 onSegment->send(veh, nullptr, qIdx, leaveTime, MSMoveReminder::NOTIFICATION_TELEPORT);
228 // mark veh as teleporting
229 veh->setSegment(nullptr);
230 } else {
232 }
233 // @caution microsim uses current travel time teleport duration
234 const SUMOTime teleArrival = leaveTime + TIME2STEPS(veh->getEdge()->getLength() / MAX2(veh->getEdge()->getSpeedLimit(), NUMERICAL_EPS));
235 const bool atDest = veh->moveRoutePointer();
236 if (atDest) {
237 // teleporting to end of route
238 changeSegment(veh, teleArrival, nullptr, MSMoveReminder::NOTIFICATION_TELEPORT_ARRIVED, true);
239 } else {
240 veh->setEventTime(teleArrival);
241 addLeaderCar(veh, nullptr);
242 // teleporting vehicles must react to rerouters
245 }
246 }
247}
248
249
250void
252 myLeaderCars.push(LeaderEvent(veh));
253 veh->setApproaching(link);
254}
255
256
257void
262
263
264void
268
269
270void
272 int qIdx = 0;
273 v->getSegment()->send(v, nullptr, qIdx, MSNet::getInstance()->getCurrentTimeStep(), reason);
275}
276
277
280 if (s != nullptr) { // vehicle is not teleporting
281 MESegment* next = s->getNextSegment();
282 if (next != nullptr) {
283 // ok, the street continues
284 return next;
285 }
286 }
287 // we have to check the next edge in the vehicle's route
288 const MSEdge* nextEdge = v->succEdge(1);
289 if (nextEdge == nullptr) {
290 // end of route
291 return nullptr;
292 }
293 if (MSGlobals::gUsingInternalLanes && s != nullptr && s->getEdge().isNormal()) {
294 const MSEdge* internal = s->getEdge().getInternalFollowingEdge(nextEdge, v->getVClass());
295 if (internal) {
296 nextEdge = internal;
297 }
298 }
299 return myEdges2FirstSegments[nextEdge->getNumericalID()];
300}
301
302
303int
304MELoop::numSegmentsFor(const double length, const double sLength) {
305 int no = (int)floor(length / sLength + 0.5);
306 if (no == 0) { // assure there is at least one segment
307 return 1;
308 } else {
309 return no;
310 }
311}
312
313
314void
317 const double length = e.getLength();
318 const int numSegments = numSegmentsFor(length, edgeType.edgeLength);
319 const double slength = length / (double)numSegments;
320 MESegment* newSegment = nullptr;
321 MESegment* nextSegment = nullptr;
322 const bool laneQueue = oc.getBool("meso-lane-queue");
323 const bool lift = oc.getBool("meso-ltm");
324 bool multiQueue = laneQueue || (oc.getBool("meso-multi-queue") && e.getLanes().size() > 1 && e.getNumSuccessors() > 1);
325 for (int s = numSegments - 1; s >= 0; s--) {
326 std::string id = e.getID() + ":" + toString(s);
327 newSegment = lift
328 ? new MELSegment(id, e, nextSegment, slength, e.getLanes()[0]->getSpeedLimit(), s, multiQueue, edgeType)
329 : new MESegment(id, e, nextSegment, slength, e.getLanes()[0]->getSpeedLimit(), s, multiQueue, edgeType);
330 multiQueue = laneQueue;
331 nextSegment = newSegment;
332 }
333 while (e.getNumericalID() >= static_cast<int>(myEdges2FirstSegments.size())) {
334 myEdges2FirstSegments.push_back(0);
335 }
336 myEdges2FirstSegments[e.getNumericalID()] = newSegment;
337 for (MSLane* lane : e.getLanes()) {
338 lane->updateMesoGUISegments();
339 }
340}
341
342
344MELoop::getSegmentForEdge(const MSEdge& e, double pos) {
345 if (e.getNumericalID() >= (int)myEdges2FirstSegments.size()) {
346 return nullptr;
347 }
349 if (pos > 0) {
350 double cpos = 0;
351 while (s->getNextSegment() != nullptr && cpos + s->getLength() < pos) {
352 cpos += s->getLength();
353 s = s->getNextSegment();
354 }
355 }
356 return s;
357}
358
359
360bool
362 for (const MSEdge* succ : e.getSuccessors()) {
363 if (succ->isRoundabout()) {
364 return true;
365 }
366 }
367 return false;
368}
369
370
372 time(v->getEventTime()),
373 eventIndex(myEventCounter++),
374 nid(v->getNumericalID()),
375 veh(v) { }
376
377/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define TL(string)
Definition MsgHandler.h:304
SUMOTime DELTA_T
Definition SUMOTime.cpp:38
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define TIME2STEPS(x)
Definition SUMOTime.h:60
T MIN2(T a, T b)
Definition StdDefs.h:80
T MAX2(T a, T b)
Definition StdDefs.h:86
T MAX3(T a, T b, T c)
Definition StdDefs.h:100
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:49
A single mesoscopic segment (cell)
Definition MELSegment.h:38
MESegment * nextSegment(MESegment *s, MEVehicle *v)
Retrieve next segment.
Definition MELoop.cpp:279
static bool isEnteringRoundabout(const MSEdge &e)
whether the given edge is entering a roundabout
Definition MELoop.cpp:361
LeaderEventQeue myInvalidatedLeaderCars
Definition MELoop.h:167
MELoop(const SUMOTime recheckInterval)
SUMO constructor.
Definition MELoop.cpp:48
SUMOTime changeSegment(MEVehicle *veh, SUMOTime leaveTime, MESegment *const toSegment, MSMoveReminder::Notification reason, const bool ignoreLink=false) const
change to the next segment this handles combinations of the following cases: (ending / continuing rou...
Definition MELoop.cpp:88
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
Definition MELoop.cpp:344
const SUMOTime myLinkRecheckInterval
the interval at which to recheck at blocked junctions (<=0 means asap)
Definition MELoop.h:176
void simulate(SUMOTime tMax)
Perform simulation up to the given time.
Definition MELoop.cpp:63
const SUMOTime myFullRecheckInterval
the interval at which to recheck at full segments (<=0 means asap)
Definition MELoop.h:173
void vaporizeCar(MEVehicle *v, MSMoveReminder::Notification reason)
remove the given car and clean up the relevant data structures
Definition MELoop.cpp:271
void addLeaderCar(MEVehicle *veh, MSLink *link)
Adds the given car to the leading vehicles.
Definition MELoop.cpp:251
void clearState()
Remove all vehicles before quick-loading state.
Definition MELoop.cpp:258
void removeLeaderCar(MEVehicle *v)
Removes the given car from the leading vehicles.
Definition MELoop.cpp:265
LeaderEventQeue myLeaderCars
Definition MELoop.h:166
std::vector< MESegment * > myEdges2FirstSegments
mapping from internal edge ids to their initial segments
Definition MELoop.h:170
~MELoop()
Definition MELoop.cpp:51
std::priority_queue< LeaderEvent > LeaderEventQeue
leader cars in the segments sorted by exit time
Definition MELoop.h:165
void checkCar(MEVehicle *veh)
Check whether the vehicle may move.
Definition MELoop.cpp:145
void teleportVehicle(MEVehicle *veh, MESegment *const toSegment, bool disconnected)
teleports a vehicle or continues a teleport
Definition MELoop.cpp:188
static int numSegmentsFor(const double length, const double slength)
Compute number of segments per edge (best value stay close to the configured segment length)
Definition MELoop.cpp:304
void buildSegmentsFor(const MSEdge &e, const OptionsCont &oc)
Build the segments for a given edge.
Definition MELoop.cpp:315
A single mesoscopic segment (cell)
Definition MESegment.h:50
void addReminders(MEVehicle *veh) const
add this lanes MoveReminders to the given vehicle
static const int PARKING_QUEUE
Definition MESegment.h:53
void receive(MEVehicle *veh, const int qIdx, SUMOTime time, const bool isDepart=false, const bool isTeleport=false, const bool newEdge=false)
Adds the vehicle to the segment, adapting its parameters.
MSLink * getLink(const MEVehicle *veh, bool tlsPenalty=false) const
Returns the link the given car will use when passing the next junction.
double getLength() const
Returns the length of the segment in meters.
Definition MESegment.h:254
SUMOTime hasSpaceFor(const MEVehicle *const veh, const SUMOTime entryTime, int &qIdx, const bool init=false) const
Returns whether the given vehicle would still fit into the segment.
const MSEdge & getEdge() const
Returns the edge this segment belongs to.
Definition MESegment.h:374
virtual void updateEntryBlockTime(SUMOTime)
update entry blockTime for all queues
Definition MESegment.h:199
virtual void send(MEVehicle *veh, MESegment *const next, const int nextQIdx, SUMOTime time, const MSMoveReminder::Notification reason)
Removes the vehicle from the segment, adapting its parameters.
SUMOTime getEventTime() const
Returns the (planned) time at which the next vehicle leaves this segment.
int getIndex() const
Returns the running index of the segment in the edge (0 is the most upstream).
Definition MESegment.h:238
static bool isInvalid(const MESegment *segment)
whether the given segment is 0 or encodes vaporization
Definition MESegment.h:457
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Definition MESegment.h:246
A vehicle from the mesoscopic point of view.
Definition MEVehicle.h:42
bool mayProceed()
Returns whether the vehicle is allowed to pass the next junction, checks also for triggered stops.
void processStop()
ends the current stop and performs loading/unloading
SUMOTime getWaitingTime(const bool accumulated=false) const
Returns the duration for which the vehicle was blocked.
Definition MEVehicle.h:306
bool moveRoutePointer()
Update when the vehicle enters a new edge in the move step.
void updateDetectors(const SUMOTime currentTime, const SUMOTime exitTime, const bool isLeave, const MSMoveReminder::Notification reason=MSMoveReminder::NOTIFICATION_JUNCTION)
Updates all vehicle detectors.
SUMOTime getLastEntryTime() const
Returns the time the vehicle entered the current segment.
Definition MEVehicle.h:277
void setEventTime(SUMOTime t, bool hasDelay=true)
Sets the (planned) time at which the vehicle leaves its current segment.
Definition MEVehicle.h:203
void setApproaching(MSLink *link)
registers vehicle with the given link
MESegment * getSegment() const
Returns the current segment the vehicle is on.
Definition MEVehicle.h:246
int getQueIndex() const
Returns the index of the que the vehicle is in.
Definition MEVehicle.h:255
virtual void setSegment(MESegment *s, int idx=0)
Sets the current segment the vehicle is at together with its que.
Definition MEVehicle.h:237
SUMOTime getEventTime() const
Returns the (planned) time at which the vehicle leaves its current segment.
Definition MEVehicle.h:215
void setBlockTime(const SUMOTime t)
Sets the time at which the vehicle was blocked.
Definition MEVehicle.h:291
SUMOTime getBlockTime() const
Returns the time at which the vehicle was blocked.
Definition MEVehicle.h:300
const MSEdge * succEdge(int nSuccs) const
Returns the nSuccs'th successor of edge the vehicle is currently at.
bool isStoppedParking() const
Returns whether the vehicle is on a parking stop.
bool isParking() const
Returns whether the vehicle is parking.
const MSEdge * getEdge() const
Returns the edge the vehicle is currently at.
virtual void activateReminders(const MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
"Activates" all current move reminder
SUMOVehicleClass getVClass() const
Returns the vehicle's access class.
bool isStoppedTriggered() const
Returns whether the vehicle is on a triggered stop.
bool isStopped() const
Returns whether the vehicle is at a stop.
A road/street connecting two junctions.
Definition MSEdge.h:77
int getNumSuccessors() const
Returns the number of edges that may be reached from this edge.
Definition MSEdge.h:388
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
Definition MSEdge.h:168
const std::vector< MSLane * > * allowedLanes(const MSEdge &destination, SUMOVehicleClass vclass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Get the allowed lanes to reach the destination-edge.
Definition MSEdge.cpp:488
bool isNormal() const
return whether this edge is an internal edge
Definition MSEdge.h:264
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:1200
double getLength() const
return the length of the edge
Definition MSEdge.h:694
int getNumericalID() const
Returns the numerical id of the edge.
Definition MSEdge.h:307
const std::string & getEdgeType() const
Returns the type of the edge.
Definition MSEdge.h:320
const MSEdge * getInternalFollowingEdge(const MSEdge *followerAfterInternal, SUMOVehicleClass vClass) const
Definition MSEdge.cpp:942
const MSEdgeVector & getSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Returns the following edges, restricted by vClass.
Definition MSEdge.cpp:1307
static SUMOTime gTimeToTeleportDisconnected
Definition MSGlobals.h:66
static bool gCheckRoutes
Definition MSGlobals.h:91
static bool gRemoveGridlocked
Definition MSGlobals.h:75
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
Definition MSGlobals.h:81
static SUMOTime gTimeToGridlock
Definition MSGlobals.h:57
Representation of a lane in the micro simulation.
Definition MSLane.h:84
Notification
Definition of a vehicle state.
@ NOTIFICATION_ARRIVED
The vehicle arrived at its destination (is deleted)
@ NOTIFICATION_TELEPORT_ARRIVED
The vehicle was teleported out of the net.
@ NOTIFICATION_SEGMENT
The vehicle changes the segment (meso only)
@ NOTIFICATION_JUNCTION
The vehicle arrived at a junction.
@ NOTIFICATION_TELEPORT
The vehicle is being teleported.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:199
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:402
const MESegment::MesoEdgeType & getMesoType(const std::string &typeID)
Returns edge type specific meso parameters if no type specific parameters have been loaded,...
Definition MSNet.cpp:432
void registerTeleportJam()
register one non-collision-related teleport
void scheduleVehicleRemoval(SUMOVehicle *veh, bool checkDuplicate=false)
Removes a vehicle after it has ended.
const std::string & getID() const
Returns the id.
Definition Named.h:73
A storage for options typed value containers)
Definition OptionsCont.h:89
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
MEVehicle * veh
Definition MELoop.h:148
static long long int myEventCounter
Definition MELoop.h:161
LeaderEvent(MEVehicle *v)
Definition MELoop.cpp:371
edge type specific meso parameters
Definition MESegment.h:58