Eclipse SUMO - Simulation of Urban MObility
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
MSStateHandler.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2012-2025 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// Parser and output filter for routes and vehicles state saving and loading
21/****************************************************************************/
22#include <config.h>
23
24#ifdef HAVE_VERSION_H
25#include <version.h>
26#endif
27
28#include <sstream>
34#include <utils/xml/XMLSubSys.h>
45#include <microsim/MSEdge.h>
46#include <microsim/MSLane.h>
47#include <microsim/MSLink.h>
48#include <microsim/MSGlobals.h>
49#include <microsim/MSNet.h>
53#include <microsim/MSRoute.h>
56#include <netload/NLHandler.h>
57#include "MSStateHandler.h"
58
59#include <mesosim/MESegment.h>
60#include <mesosim/MELoop.h>
61
62
63// ===========================================================================
64// MSStateTimeHandler method definitions
65// ===========================================================================
66
68MSStateHandler::MSStateTimeHandler::getTime(const std::string& fileName) {
69 // build handler and parser
70 MSStateTimeHandler handler;
71 handler.setFileName(fileName);
72 handler.myTime = -1;
73 SUMOSAXReader* parser = XMLSubSys::getSAXReader(handler);
74 try {
75 if (!parser->parseFirst(fileName)) {
76 delete parser;
77 throw ProcessError(TLF("Can not read XML-file '%'.", fileName));
78 }
79 } catch (ProcessError&) {
80 delete parser;
81 throw;
82 }
83 // parse
84 while (parser->parseNext() && handler.myTime != -1);
85 // clean up
86 if (handler.myTime == -1) {
87 delete parser;
88 throw ProcessError(TLF("Could not parse time from state file '%'", fileName));
89 }
90 delete parser;
91 return handler.myTime;
92}
93
94void
100
101// ===========================================================================
102// method definitions
103// ===========================================================================
104MSStateHandler::MSStateHandler(const std::string& file, const SUMOTime offset) :
105 MSRouteHandler(file, true),
106 myOffset(offset),
107 mySegment(nullptr),
108 myCurrentLane(nullptr),
109 myCurrentLink(nullptr),
110 myAttrs(nullptr),
111 myVCAttrs(nullptr),
112 myLastParameterised(nullptr),
113 myRemoved(0),
114 myFlowIndex(-1),
115 myConstrainedSignal(nullptr) {
116 myAmLoadingState = true;
117 const std::vector<std::string> vehIDs = OptionsCont::getOptions().getStringVector("load-state.remove-vehicles");
118 myVehiclesToRemove.insert(vehIDs.begin(), vehIDs.end());
120}
121
122
126
127
128void
129MSStateHandler::saveState(const std::string& file, SUMOTime step, bool usePrefix) {
130 OutputDevice& out = OutputDevice::getDevice(file, usePrefix);
131 out.setPrecision(OptionsCont::getOptions().getInt("save-state.precision"));
133 out.writeAttr("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance").writeAttr("xsi:noNamespaceSchemaLocation", "http://sumo.dlr.de/xsd/state_file.xsd");
134 out.writeAttr(SUMO_ATTR_VERSION, VERSION_STRING);
136 out.writeAttr(SUMO_ATTR_TYPE, MSGlobals::gUseMesoSim ? "meso" : "micro");
137 if (OptionsCont::getOptions().getBool("save-state.constraints")) {
139 }
141 out.writeAttr(SUMO_ATTR_RAIL, true);
142 }
143 if (OptionsCont::getOptions().getBool("save-state.rng")) {
144 saveRNGs(out);
147 }
148 }
152 if (OptionsCont::getOptions().getBool("save-state.transportables")) {
153 if (MSNet::getInstance()->hasPersons()) {
156 out.closeTag();
157 }
158 if (MSNet::getInstance()->hasContainers()) {
161 out.closeTag();
162 }
163 }
165 for (MSEdge* const edge : MSEdge::getAllEdges()) {
167 for (MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(*edge); s != nullptr; s = s->getNextSegment()) {
168 s->saveState(out);
169 }
170 } else {
171 for (MSLane* const lane : edge->getLanes()) {
172 lane->saveState(out);
173 }
174 }
175 }
177 out.close();
178}
179
180
181void
183 MSRouteHandler::myStartElement(element, attrs);
185 switch (element) {
186 case SUMO_TAG_SNAPSHOT: {
188 const std::string& version = attrs.getString(SUMO_ATTR_VERSION);
189 if (version != VERSION_STRING) {
190 WRITE_WARNINGF(TL("State was written with sumo version % (present: %)!"), version, VERSION_STRING);
191 }
192 bool ok;
193 if (attrs.getOpt<bool>(SUMO_ATTR_CONSTRAINTS, nullptr, ok, false)) {
195 }
196 if (attrs.getOpt<bool>(SUMO_ATTR_RAIL, nullptr, ok, false)) {
197 // init before loading any vehicles to ensure that driveways are built early
199 }
200 break;
201 }
202 case SUMO_TAG_RNGSTATE: {
203 if (attrs.hasAttribute(SUMO_ATTR_DEFAULT)) {
205 }
208 }
211 }
214 }
217 }
220 }
223 }
224 break;
225 }
226 case SUMO_TAG_RNGLANE: {
227 const int index = attrs.getInt(SUMO_ATTR_INDEX);
228 const std::string state = attrs.getString(SUMO_ATTR_STATE);
229 MSLane::loadRNGState(index, state);
230 break;
231 }
233 bool ok;
234 std::list<MSLane*> activeLanes;
235 const std::vector<std::string>& laneIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_LANES, nullptr, ok, false);
236 for (const std::string& laneID : laneIDs) {
237 MSLane* lane = MSLane::dictionary(laneID);
238 if (lane == nullptr) {
239 throw ProcessError(TLF("Unknown lane '%' in loaded state.", laneID));
240 }
241 activeLanes.push_back(lane);
242 }
244 break;
245 }
246 case SUMO_TAG_DELAY: {
247 if (myVCAttrs != nullptr) {
248 delete myVCAttrs;
249 }
250 myVCAttrs = attrs.clone();
251 break;
252 }
253 case SUMO_TAG_FLOWSTATE: {
254 bool ok;
256 pars->repetitionsDone = attrs.get<int>(SUMO_ATTR_DONE, pars->id.c_str(), ok);
257 pars->repetitionTotalOffset = attrs.getOptSUMOTimeReporting(SUMO_ATTR_NEXT, pars->id.c_str(), ok, 0);
259 myVehicleParameter = pars;
260 break;
261 }
262 case SUMO_TAG_VTYPE: {
264 break;
265 }
266 case SUMO_TAG_VEHICLE: {
268 myAttrs = attrs.clone();
269 break;
270 }
271 case SUMO_TAG_DEVICE: {
272 myDeviceAttrs.push_back(attrs.clone());
273 break;
274 }
277 break;
278 }
279 case SUMO_TAG_SEGMENT: {
280 const std::string& segmentID = attrs.getString(SUMO_ATTR_ID);
281 const MSEdge* const edge = MSEdge::dictionary(segmentID.substr(0, segmentID.rfind(":")));
282 int idx = StringUtils::toInt(segmentID.substr(segmentID.rfind(":") + 1));
284 while (idx-- > 0 && mySegment != nullptr) {
286 }
287 if (mySegment == nullptr) {
288 throw ProcessError(TLF("Unknown segment '%' in loaded state.", segmentID));
289 }
290 myQueIndex = 0;
291 break;
292 }
293 case SUMO_TAG_LANE: {
294 bool ok;
295 const std::string laneID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
297 if (myCurrentLane == nullptr) {
298 throw ProcessError(TLF("Unknown lane '%' in loaded state.", laneID));
299 }
300 break;
301 }
303 bool ok;
304 const std::vector<std::string>& vehIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_VALUE, nullptr, ok, false);
305 std::vector<SUMOVehicle*> vehs;
306 for (const std::string& id : vehIDs) {
307 SUMOVehicle* v = vc.getVehicle(id);
308 // vehicle could be removed due to options
309 if (v != nullptr) {
310 vehs.push_back(v);
311 myArrived.erase(v);
312 }
313 }
315 if (myQueIndex >= mySegment->numQueues()) {
316 throw ProcessError(TLF("Invalid queue index '%' on segment '%'. Check for consistency of lane numbers and queue options.", myQueIndex, mySegment->getID()));
317 }
319 myQueIndex++;
320 } else {
322 }
323 break;
324 }
325 case SUMO_TAG_LINK: {
326 bool ok;
327 myCurrentLink = nullptr;
328 const std::string toLaneID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
329 for (MSLink* link : myCurrentLane->getLinkCont()) {
330 if (link->getViaLaneOrLane()->getID() == toLaneID) {
331 myCurrentLink = link;
332 }
333 }
334 if (myCurrentLink == nullptr) {
335 throw ProcessError("Unknown link from lane '" + myCurrentLane->getID() + "' to lane '" + toLaneID + "' in loaded state");
336 }
337 break;
338 }
340 bool ok;
341 const std::string vehID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
342 const SUMOTime arrivalTime = attrs.get<SUMOTime>(SUMO_ATTR_ARRIVALTIME, nullptr, ok);
343 const double arrivalSpeed = attrs.get<double>(SUMO_ATTR_ARRIVALSPEED, nullptr, ok);
344 const double leaveSpeed = attrs.get<double>(SUMO_ATTR_DEPARTSPEED, nullptr, ok);
345 const bool setRequest = attrs.get<bool>(SUMO_ATTR_REQUEST, nullptr, ok);
346 const double arrivalSpeedBraking = attrs.get<double>(SUMO_ATTR_ARRIVALSPEEDBRAKING, nullptr, ok);
347 const SUMOTime waitingTime = attrs.get<SUMOTime>(SUMO_ATTR_WAITINGTIME, nullptr, ok);
348 const double dist = attrs.get<double>(SUMO_ATTR_DISTANCE, nullptr, ok);
349 const double latOffset = attrs.getOpt<double>(SUMO_ATTR_POSITION_LAT, nullptr, ok, 0);
350 SUMOVehicle* veh = vc.getVehicle(vehID);
351 myCurrentLink->setApproaching(veh, arrivalTime, arrivalSpeed, leaveSpeed, setRequest, arrivalSpeedBraking, waitingTime, dist, latOffset);
353 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
354 microVeh->loadPreviousApproaching(myCurrentLink, setRequest, arrivalTime, arrivalSpeed, arrivalSpeedBraking, dist, leaveSpeed);
355 }
356 break;
357 }
360 break;
361 }
364 MSDriveWay::loadState(attrs, element);
365 break;
366 }
367 case SUMO_TAG_PARAM: {
368 bool ok;
369 const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
370 // circumventing empty string test
371 const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
372 assert(myLastParameterised != 0);
373 if (myLastParameterised != nullptr) {
375 }
376 break;
377 }
379 if (attrs.getString(SUMO_ATTR_TYPE) == "person") {
381 }
382 if (attrs.getString(SUMO_ATTR_TYPE) == "container") {
384 }
385 break;
386 case SUMO_TAG_PERSON:
388 myAttrs = attrs.clone();
389 break;
391 bool ok = true;
392 const std::string signalID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
393 if (!MSNet::getInstance()->getTLSControl().knows(signalID)) {
394 throw InvalidArgument("Rail signal '" + signalID + "' in railSignalConstraints loaded from state is not known");
395 }
397 if (myConstrainedSignal == nullptr) {
398 throw InvalidArgument("Traffic light '" + signalID + "' is not a rail signal");
399 }
400 break;
401 }
402 case SUMO_TAG_PREDECESSOR: // intended fall-through
403 case SUMO_TAG_INSERTION_PREDECESSOR: // intended fall-through
404 case SUMO_TAG_FOE_INSERTION: // intended fall-through
405 case SUMO_TAG_INSERTION_ORDER: // intended fall-through
408 break;
409 case SUMO_TAG_TLLOGIC: {
410 bool ok;
411 const std::string tlID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
412 const std::string programID = attrs.get<std::string>(SUMO_ATTR_PROGRAMID, tlID.c_str(), ok);
413 const int phase = attrs.get<int>(SUMO_ATTR_PHASE, tlID.c_str(), ok);
414 const SUMOTime spentDuration = attrs.get<SUMOTime>(SUMO_ATTR_DURATION, tlID.c_str(), ok);
416 MSTrafficLightLogic* tl = tlc.get(tlID, programID);
417 if (tl == nullptr) {
418 if (programID == "online") {
419 WRITE_WARNINGF(TL("Ignoring program '%' for traffic light '%' in loaded state"), programID, tlID);
420 return;
421 } else {
422 throw ProcessError("Unknown program '" + programID + "' for traffic light '" + tlID + "'");
423 }
424 }
425 if (phase >= tl->getPhaseNumber()) {
426 throw ProcessError("Invalid phase '" + toString(phase) + "' for traffic light '" + tlID + "'");
427 }
428 // might not be set if the phase happens to match and there are multiple programs
429 tl->loadState(tlc, myTime, phase, spentDuration);
430 break;
431 }
432 default:
433 break;
434 }
435}
436
437
438void
441 switch (element) {
442 case SUMO_TAG_PERSON:
443 case SUMO_TAG_CONTAINER: {
445 MSTransportable* transportable = tc.get(myAttrs->getString(SUMO_ATTR_ID));
446 transportable->loadState(myAttrs->getString(SUMO_ATTR_STATE));
447 tc.fixLoadCount(transportable);
448 delete myAttrs;
449 myAttrs = nullptr;
450 break;
451 }
452 case SUMO_TAG_FLOWSTATE: {
454 myVehicleParameter = nullptr;
455 break;
456 }
457 case SUMO_TAG_SNAPSHOT: {
458 if (myVCAttrs == nullptr) {
459 throw ProcessError(TL("Could not load vehicle control state"));
460 }
467 if (myRemoved > 0) {
468 WRITE_MESSAGEF(TL("Removed % vehicles while loading state."), toString(myRemoved));
470 }
471 for (SUMOVehicle* v : myArrived) {
472 // state was created with active option --keep-after-arrival
473 vc.deleteKeptVehicle(v);
474 }
475 break;
476 }
477 default:
478 break;
479 }
480 if (element != SUMO_TAG_PARAM && myVehicleParameter == nullptr && myCurrentVType == nullptr) {
481 myLastParameterised = nullptr;
482 }
483}
484
485
486void
488 assert(myVehicleParameter != nullptr);
490 // the vehicle was already counted in MSVehicleControl::setState
492 // make a copy because myVehicleParameter is reset in closeVehicle()
493 const std::string vehID = myVehicleParameter->id;
494 if (myVehiclesToRemove.count(vehID) == 0) {
496 SUMOVehicle* v = vc.getVehicle(vehID);
497 if (v == nullptr) {
498 throw ProcessError(TLF("Could not load vehicle '%' from state", vehID));
499 }
502
503 if (v->hasDeparted()) {
504 // vehicle already departed: disable pre-insertion rerouting and enable regular routing behavior
505 MSDevice_Routing* routingDevice = static_cast<MSDevice_Routing*>(v->getDevice(typeid(MSDevice_Routing)));
506 if (routingDevice != nullptr) {
508 }
511 // register route for deadlock prevention (vehicleStateChanged would not be called otherwise)
513 }
514 vc.handleTriggeredDepart(v, false);
515 if (v->hasArrived()) {
516 myArrived.insert(v);
517 }
518 }
519 while (!myDeviceAttrs.empty()) {
520 const std::string attrID = myDeviceAttrs.back()->getString(SUMO_ATTR_ID);
521 for (MSVehicleDevice* const dev : v->getDevices()) {
522 if (dev->getID() == attrID) {
523 dev->loadState(*myDeviceAttrs.back());
524 }
525 }
526 delete myDeviceAttrs.back();
527 myDeviceAttrs.pop_back();
528 }
529 } else {
530 delete myVehicleParameter;
531 myVehicleParameter = nullptr;
532 myRemoved++;
533 }
534 delete myAttrs;
535}
536
537
538void
552
553
554/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:288
#define WRITE_MESSAGEF(...)
Definition MsgHandler.h:290
#define TL(string)
Definition MsgHandler.h:305
#define TLF(string,...)
Definition MsgHandler.h:307
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:46
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
@ SUMO_TAG_RAILSIGNAL_CONSTRAINTS
Constraints on switching a rail signal.
@ SUMO_TAG_BIDI_PREDECESSOR
Predecessor constraint for rail signal before bidirectional section.
@ SUMO_TAG_LINK
Link information for state-saving.
@ SUMO_TAG_TRANSPORTABLES
@ SUMO_TAG_APPROACHING
Link-approaching vehicle information for state-saving.
@ SUMO_TAG_INSERTION_PREDECESSOR
Predecessor constraint on insertion before rail signal.
@ SUMO_TAG_DEVICE
@ SUMO_TAG_VTYPE
description of a vehicle/person/container type
@ SUMO_TAG_SUBDRIVEWAY
@ SUMO_TAG_RNGLANE
@ SUMO_TAG_EDGECONTROL
the internal state for edge control
@ SUMO_TAG_FLOWSTATE
a flow state definition (used when saving and loading simulatino state)
@ SUMO_TAG_VEHICLE
description of a vehicle
@ SUMO_TAG_RAILSIGNAL_CONSTRAINT_TRACKER
Saved state for constraint tracker.
@ SUMO_TAG_RNGSTATE
@ SUMO_TAG_DELAY
@ SUMO_TAG_TLLOGIC
a traffic light logic
@ SUMO_TAG_FOE_INSERTION
Predecessor constraint on switching a rail signal.
@ SUMO_TAG_CONTAINER
@ SUMO_TAG_VIEWSETTINGS_VEHICLES
@ SUMO_TAG_SNAPSHOT
@ SUMO_TAG_LANE
begin/end of the description of a single lane
@ SUMO_TAG_SEGMENT
segment of a lane
@ SUMO_TAG_PARAM
parameter associated to a certain key
@ SUMO_TAG_INSERTION_ORDER
Predecessor constraint on insertion before rail signal.
@ SUMO_TAG_PERSON
@ SUMO_TAG_VEHICLETRANSFER
@ SUMO_TAG_DRIVEWAY
Saved driveway information.
@ SUMO_TAG_PREDECESSOR
Predecessor constraint on switching a rail signal.
@ SUMO_ATTR_DONE
@ SUMO_ATTR_NUMBER
@ SUMO_ATTR_ARRIVALSPEED
@ SUMO_ATTR_CONSTRAINTS
@ SUMO_ATTR_DEPART
@ SUMO_ATTR_RNG_INSERTIONCONTROL
@ SUMO_ATTR_ARRIVALTIME
@ SUMO_ATTR_WAITINGTIME
@ SUMO_ATTR_VALUE
@ SUMO_ATTR_RNG_DRIVERSTATE
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_POSITION_LAT
@ SUMO_ATTR_PHASE
@ SUMO_ATTR_LANES
@ SUMO_ATTR_DEFAULT
@ SUMO_ATTR_ARRIVALSPEEDBRAKING
@ SUMO_ATTR_NEXT
succesor phase index
@ SUMO_ATTR_RNG_DEVICE_TOC
@ SUMO_ATTR_INDEX
@ SUMO_ATTR_DEPARTSPEED
@ SUMO_ATTR_TO
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_RNG_DEVICE_BT
@ SUMO_ATTR_DISTANCE
@ SUMO_ATTR_SPEEDFACTOR
@ SUMO_ATTR_TYPE
@ SUMO_ATTR_VERSION
@ SUMO_ATTR_ID
@ SUMO_ATTR_RAIL
@ SUMO_ATTR_PROGRAMID
@ SUMO_ATTR_RNG_ROUTEHANDLER
@ SUMO_ATTR_DURATION
@ SUMO_ATTR_RNG_DEVICE
@ SUMO_ATTR_REQUEST
@ SUMO_ATTR_KEY
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_TIME
trigger: the time of the step
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
void setFileName(const std::string &name)
Sets the current file name.
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
Definition MELoop.cpp:340
A single mesoscopic segment (cell)
Definition MESegment.h:50
void loadState(const std::vector< SUMOVehicle * > &vehs, const SUMOTime blockTime, const int queIdx)
Loads the state of this segment with the given parameters.
int numQueues() const
return the number of queues
Definition MESegment.h:213
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Definition MESegment.h:236
static SumoRNG * getRNG()
A device that performs vehicle rerouting based on current edge speeds.
bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Computes a new route on vehicle insertion.
static SumoRNG * getResponseTimeRNG()
static SumoRNG * getEquipmentRNG()
Definition MSDevice.h:89
static bool haveDriveWays()
Definition MSDriveWay.h:72
static void loadState(const SUMOSAXAttributes &attrs, int tag)
void setActiveLanes(std::list< MSLane * > lanes)
Reconstruct the current state.
void saveState(OutputDevice &out)
Saves the current state into the given stream.
A road/street connecting two junctions.
Definition MSEdge.h:77
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
Definition MSEdge.cpp:1086
static bool dictionary(const std::string &id, MSEdge *edge)
Inserts edge into the static dictionary Returns true if the key id isn't already in the dictionary....
Definition MSEdge.cpp:1047
static bool gUseMesoSim
Definition MSGlobals.h:106
static MELoop * gMesoNet
mesoscopic simulation infrastructure
Definition MSGlobals.h:112
bool addFlow(SUMOVehicleParameter *const pars, int index=-1)
Adds parameter for a vehicle flow for departure.
void alreadyDeparted(SUMOVehicle *veh)
stops trying to emit the given vehicle (because it already departed)
SumoRNG * getFlowRNG()
retrieve internal RNG
void saveState(OutputDevice &out)
Saves the current state into the given stream.
Representation of a lane in the micro simulation.
Definition MSLane.h:84
void loadState(const std::vector< SUMOVehicle * > &vehs)
Loads the state of this segment with the given parameters.
Definition MSLane.cpp:3737
static void saveRNGStates(OutputDevice &out)
save random number generator states to the given output device
Definition MSLane.cpp:4628
static void loadRNGState(int index, const std::string &state)
load random number generator state for the given rng index
Definition MSLane.cpp:4638
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition MSLane.cpp:2463
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
Definition MSLane.h:724
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NEWROUTE
The vehicle got a new route.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:186
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition MSNet.h:456
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1210
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition MSNet.h:436
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:383
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1201
MSEdgeControl & getEdgeControl()
Returns the edge control.
Definition MSNet.h:426
static void loadState(const SUMOSAXAttributes &attrs)
loads the constraint state from the given attrs
static void clearAll()
Remove all constraints before quick-loading state.
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
static MSRailSignalControl & getInstance()
A signal for rails.
Parser and container for routes during their loading.
bool myAmLoadingState
whether a state file is being loaded
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs) override
Called on the opening of a tag;.
static SumoRNG * getParsingRNG()
get parsing RNG
virtual void closeVehicle() override
Ends the processing of a vehicle (note: is virtual because is reimplemented in MSStateHandler)
static void dict_saveState(OutputDevice &out)
Saves all known routes into the given stream.
Definition MSRoute.cpp:261
handler to read only the simulation time from a state
static SUMOTime getTime(const std::string &fileName)
parse time from state file
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Callback method for an opening tag to implement by derived classes.
MSRailSignal * myConstrainedSignal
rail signal for which constraints are being loaded
SUMOSAXAttributes * myAttrs
cached attrs (used when loading vehicles or transportables)
MSStateHandler(const std::string &file, const SUMOTime offset)
standard constructor
static void saveState(const std::string &file, SUMOTime step, bool usePrefix=true)
Saves the current state.
int myQueIndex
que index
SUMOTime myTime
time
std::set< std::string > myVehiclesToRemove
vehicles that shall be removed when loading state
int myRemoved
vehicles that were removed when loading state
MSLink * myCurrentLink
current link being loaded
MESegment * mySegment
segment
MSLane * myCurrentLane
current lane being loaded
static void saveRNGs(OutputDevice &out)
save the state of random number generators
const SUMOTime myOffset
offset
Parameterised * myLastParameterised
the last object that potentially carries parameters
void closeVehicle()
Ends the processing of a vehicle.
void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
std::vector< SUMOSAXAttributes * > myDeviceAttrs
cached device attrs (used when loading vehicles)
SUMOSAXAttributes * myVCAttrs
cached attrs for delayed loading of MSVehicleControl state
std::set< SUMOVehicle * > myArrived
vehicles that have arrived
void myEndElement(int element)
Called when a closing tag occurs.
int myFlowIndex
index of the currently parse flowState
virtual ~MSStateHandler()
standard destructor
MSTrafficLightLogic * getDefault() const
return the default program (that last used program except TRACI_PROGRAM)
A class that stores and controls tls and switching of their programs.
bool knows(const std::string &id) const
Returns the information whether the named tls is stored.
void saveState(OutputDevice &out)
Saves the current tls states into the given stream.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
The parent class for traffic light logics.
virtual int getPhaseNumber() const =0
Returns the number of phases.
virtual void loadState(MSTLLogicControl &tlcontrol, SUMOTime t, int step, SUMOTime spentDuration)
restores the tls state
void loadState(const std::string &state)
Reconstruct the current state.
void fixLoadCount(const MSTransportable *transportable)
decrement counter to avoid double counting transportables loaded from state
void saveState(OutputDevice &out)
Saves the current state into the given stream.
MSTransportable * get(const std::string &id) const
Returns the named transportable, if existing.
void loadState(const std::string &state)
Reconstructs the current state.
The class responsible for building and deletion of vehicles.
void setState(int runningVehNo, int loadedVehNo, int endedVehNo, double totalDepartureDelay, double totalTravelTime)
Sets the current state variables as loaded from the stream.
void discountStateRemoved(int n)
discount vehicles that were removed during state loading
SUMOVehicle * getVehicle(const std::string &id) const
Returns the vehicle with the given id.
void deleteKeptVehicle(SUMOVehicle *veh)
when a vehicle is kept after arrival, schedule later deletion
void handleTriggeredDepart(SUMOVehicle *v, bool add)
register / unregister depart-triggered vehicles with edges
void saveState(OutputDevice &out)
Saves the current state into the given stream.
Abstract in-vehicle device.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
void loadPreviousApproaching(MSLink *link, bool setRequest, SUMOTime arrivalTime, double arrivalSpeed, double arrivalSpeedBraking, double dist, double leaveSpeed)
static MSVehicleTransfer * getInstance()
Returns the instance of this object.
void saveState(OutputDevice &out)
Saves the current state into the given stream.
void loadState(const SUMOSAXAttributes &attrs, const SUMOTime offset, MSVehicleControl &vc)
Loads one transfer vehicle state from the given descriptionn.
static Parameterised * addPredecessorConstraint(int element, const SUMOSAXAttributes &attrs, MSRailSignal *rs)
const std::string & getID() const
Returns the id.
Definition Named.h:74
static SumoRNG * getRNG()
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
static OptionsCont & getOptions()
Retrieves the options.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
void close()
Closes the device and removes it from the dictionary.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
bool writeHeader(const SumoXMLTag &rootElement)
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
virtual void setParameter(const std::string &key, const std::string &value)
Sets a parameter.
static void loadState(const std::string &state, SumoRNG *rng=nullptr)
load rng state from string
Definition RandHelper.h:226
static std::string saveState(SumoRNG *rng=nullptr)
save rng state to string
Definition RandHelper.h:212
bool myAllowInternalRoutes
whether references to internal routes are allowed in this context
SUMOVehicleParameter * myVehicleParameter
Parameter of the current vehicle, trip, person, container or flow.
SUMOVTypeParameter * myCurrentVType
The currently parsed vehicle type.
virtual void myEndElement(int element)
Called when a closing tag occurs.
Encapsulated SAX-Attributes.
virtual std::string getString(int id, bool *isPresent=nullptr) const =0
Returns the string-value of the named (by its enum-value) attribute.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
T get(int attr, const char *objectid, bool &ok, bool report=true) const
Tries to read given attribute assuming it is an int.
virtual SUMOSAXAttributes * clone() const =0
return a new deep-copy attributes object
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list.
int getInt(int id) const
Returns the int-value of the named (by its enum-value) attribute.
double getFloat(int id) const
Returns the double-value of the named (by its enum-value) attribute.
SAX-reader encapsulation containing binary reader.
bool parseFirst(std::string systemID)
Start parsing the given file using parseFirst of myXMLReader.
bool parseNext()
Continue a progressive parse started by parseFirst.
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 bool hasArrived() const =0
Returns whether this object has arrived.
Representation of a vehicle.
Definition SUMOVehicle.h:62
virtual void setChosenSpeedFactor(const double factor)=0
virtual const std::vector< MSVehicleDevice * > & getDevices() const =0
Returns this vehicle's devices.
virtual bool hasDeparted() const =0
Returns whether this vehicle has departed.
virtual void loadState(const SUMOSAXAttributes &attrs, const SUMOTime offset)=0
Loads the state of this vehicle from the given description.
Structure representing possible vehicle parameter.
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.
std::string id
The vehicle's id.
static SUMOVehicleParameter * parseFlowAttributes(SumoXMLTag tag, const SUMOSAXAttributes &attrs, const bool hardFail, const bool needID, const SUMOTime beginDefault, const SUMOTime endDefault, const bool allowInternalRoutes=false)
Parses a flow's attributes.
static long long int toLong(const std::string &sData)
converts a string into the long value described by it by calling the char-type converter,...
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter,...
static SUMOSAXReader * getSAXReader(SUMOSAXHandler &handler, const bool isNet=false, const bool isRoute=false)
Builds a reader and assigns the handler to it.