Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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>
47#include <microsim/MSEdge.h>
48#include <microsim/MSLane.h>
49#include <microsim/MSLink.h>
50#include <microsim/MSGlobals.h>
51#include <microsim/MSNet.h>
55#include <microsim/MSRoute.h>
58#include <netload/NLHandler.h>
59#include "MSStateHandler.h"
60
61#include <mesosim/MESegment.h>
62#include <mesosim/MELoop.h>
63
64// ===========================================================================
65// MSStateTimeHandler method definitions
66// ===========================================================================
67
69MSStateHandler::MSStateTimeHandler::getTime(const std::string& fileName) {
70 // build handler and parser
71 MSStateTimeHandler handler;
72 handler.setFileName(fileName);
73 handler.myTime = -1;
74 SUMOSAXReader* parser = XMLSubSys::getSAXReader(handler);
75 try {
76 if (!parser->parseFirst(fileName)) {
77 delete parser;
78 throw ProcessError(TLF("Can not read XML-file '%'.", fileName));
79 }
80 } catch (ProcessError&) {
81 delete parser;
82 throw;
83 }
84 // parse
85 while (parser->parseNext() && handler.myTime != -1);
86 // clean up
87 if (handler.myTime == -1) {
88 delete parser;
89 throw ProcessError(TLF("Could not parse time from state file '%'", fileName));
90 }
91 delete parser;
92 return handler.myTime;
93}
94
95void
101
102// ===========================================================================
103// method definitions
104// ===========================================================================
105MSStateHandler::MSStateHandler(const std::string& file, const SUMOTime offset) :
106 MSRouteHandler(file, true),
107 myOffset(offset),
108 mySegment(nullptr),
109 myCurrentLane(nullptr),
110 myCurrentLink(nullptr),
111 myAttrs(nullptr),
112 myVCAttrs(nullptr),
113 myLastParameterised(nullptr),
114 myRemoved(0),
115 myFlowIndex(-1),
116 myConstrainedSignal(nullptr) {
117 myAmLoadingState = true;
118 const std::vector<std::string> vehIDs = OptionsCont::getOptions().getStringVector("load-state.remove-vehicles");
119 myVehiclesToRemove.insert(vehIDs.begin(), vehIDs.end());
121}
122
123
127
128
129void
130MSStateHandler::saveState(const std::string& file, SUMOTime step, bool usePrefix) {
131 OutputDevice& out = OutputDevice::getDevice(file, usePrefix);
132 const int statePrecision = OptionsCont::getOptions().getInt("save-state.precision");
133 out.setPrecision(statePrecision);
134 const int defaultPrecision = gPrecision;
135 gPrecision = statePrecision;
136 std::map<SumoXMLAttr, std::string> attrs;
137 attrs[SUMO_ATTR_VERSION] = VERSION_STRING;
138 attrs[SUMO_ATTR_TIME] = time2string(step);
139 attrs[SUMO_ATTR_TYPE] = MSGlobals::gUseMesoSim ? "meso" : "micro";
140 if (OptionsCont::getOptions().getBool("save-state.constraints")) {
141 attrs[SUMO_ATTR_CONSTRAINTS] = "1";
142 }
144 attrs[SUMO_ATTR_RAIL] = "1";
145 }
146 out.writeXMLHeader("snapshot", "state_file.xsd", attrs);
147 if (OptionsCont::getOptions().getBool("save-state.rng")) {
148 saveRNGs(out);
151 }
152 }
156 if (OptionsCont::getOptions().getBool("save-state.transportables")) {
157 if (MSNet::getInstance()->hasPersons()) {
160 out.closeTag();
161 }
162 if (MSNet::getInstance()->hasContainers()) {
165 out.closeTag();
166 }
167 }
169 for (MSEdge* const edge : MSEdge::getAllEdges()) {
171 for (MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(*edge); s != nullptr; s = s->getNextSegment()) {
172 s->saveState(out);
173 }
174 } else {
175 for (MSLane* const lane : edge->getLanes()) {
176 lane->saveState(out);
177 }
178 }
179 }
182 out.close();
183 gPrecision = defaultPrecision;
184}
185
186
187void
189 MSRouteHandler::myStartElement(element, attrs);
191 switch (element) {
192 case SUMO_TAG_SNAPSHOT: {
194 const std::string& version = attrs.getString(SUMO_ATTR_VERSION);
195 if (version != VERSION_STRING) {
196 WRITE_WARNINGF(TL("State was written with sumo version % (present: %)!"), version, VERSION_STRING);
197 }
198 bool ok;
199 if (attrs.getOpt<bool>(SUMO_ATTR_CONSTRAINTS, nullptr, ok, false)) {
201 }
202 if (attrs.getOpt<bool>(SUMO_ATTR_RAIL, nullptr, ok, false)) {
203 // init before loading any vehicles to ensure that driveways are built early
205 }
206 break;
207 }
208 case SUMO_TAG_RNGSTATE: {
209 if (attrs.hasAttribute(SUMO_ATTR_DEFAULT)) {
211 }
214 }
217 }
220 }
223 }
226 }
229 }
230 break;
231 }
232 case SUMO_TAG_RNGLANE: {
233 const int index = attrs.getInt(SUMO_ATTR_INDEX);
234 const std::string state = attrs.getString(SUMO_ATTR_STATE);
235 MSLane::loadRNGState(index, state);
236 break;
237 }
239 bool ok;
240 std::list<MSLane*> activeLanes;
241 const std::vector<std::string>& laneIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_LANES, nullptr, ok, false);
242 for (const std::string& laneID : laneIDs) {
243 MSLane* lane = MSLane::dictionary(laneID);
244 if (lane == nullptr) {
245 throw ProcessError(TLF("Unknown lane '%' in loaded state.", laneID));
246 }
247 activeLanes.push_back(lane);
248 }
250 break;
251 }
253 bool ok = true;
254 const SUMOTime lastAdaptation = attrs.get<SUMOTime>(SUMO_ATTR_LAST, nullptr, ok);
255 const int index = attrs.get<int>(SUMO_ATTR_INDEX, nullptr, ok);
256 MSRoutingEngine::initEdgeWeights(SVC_PASSENGER, lastAdaptation, index);
257 if (OptionsCont::getOptions().getBool("device.rerouting.bike-speeds")) {
259 }
261 for (const MSEdge* e : MSEdge::getAllEdges()) {
262 for (MESegment* segment = MSGlobals::gMesoNet->getSegmentForEdge(*e); segment != nullptr; segment = segment->getNextSegment()) {
263 segment->resetCachedSpeeds();
264 }
265 }
266 }
267 break;
268 }
269 case SUMO_TAG_EDGE: {
270#ifdef HAVE_FOX
272#endif
273 break;
274 }
275 case SUMO_TAG_DELAY: {
276 if (myVCAttrs != nullptr) {
277 delete myVCAttrs;
278 }
279 myVCAttrs = attrs.clone();
280 break;
281 }
282 case SUMO_TAG_FLOWSTATE: {
283 bool ok;
285 pars->repetitionsDone = attrs.get<int>(SUMO_ATTR_DONE, pars->id.c_str(), ok);
286 pars->repetitionTotalOffset = attrs.getOptSUMOTimeReporting(SUMO_ATTR_NEXT, pars->id.c_str(), ok, 0);
288 myVehicleParameter = pars;
289 break;
290 }
291 case SUMO_TAG_VTYPE: {
293 break;
294 }
295 case SUMO_TAG_VEHICLE: {
297 myAttrs = attrs.clone();
298 break;
299 }
300 case SUMO_TAG_DEVICE: {
301 myDeviceAttrs.push_back(attrs.clone());
302 break;
303 }
304 case SUMO_TAG_REMINDER: {
305 myReminderAttrs.push_back(attrs.clone());
306 break;
307 }
310 break;
311 }
312 case SUMO_TAG_SEGMENT: {
313 const std::string& segmentID = attrs.getString(SUMO_ATTR_ID);
314 const MSEdge* const edge = MSEdge::dictionary(segmentID.substr(0, segmentID.rfind(":")));
315 int idx = StringUtils::toInt(segmentID.substr(segmentID.rfind(":") + 1));
317 while (idx-- > 0 && mySegment != nullptr) {
319 }
320 if (mySegment == nullptr) {
321 throw ProcessError(TLF("Unknown segment '%' in loaded state.", segmentID));
322 }
323 myQueIndex = 0;
324 break;
325 }
326 case SUMO_TAG_LANE: {
327 bool ok;
328 const std::string laneID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
330 if (myCurrentLane == nullptr) {
331 throw ProcessError(TLF("Unknown lane '%' in loaded state.", laneID));
332 }
333 break;
334 }
336 bool ok;
337 const std::vector<std::string>& vehIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_VALUE, nullptr, ok, false);
338 std::vector<SUMOVehicle*> vehs;
339 for (const std::string& id : vehIDs) {
340 SUMOVehicle* v = vc.getVehicle(id);
341 // vehicle could be removed due to options
342 if (v != nullptr) {
343 vehs.push_back(v);
344 myArrived.erase(v);
345 }
346 }
348 if (myQueIndex >= mySegment->numQueues()) {
349 throw ProcessError(TLF("Invalid queue index '%' on segment '%'. Check for consistency of lane numbers and queue options.", myQueIndex, mySegment->getID()));
350 }
351 const SUMOTime blockTime = StringUtils::toLong(attrs.getString(SUMO_ATTR_TIME));
352 const SUMOTime entryBlockTime = StringUtils::toLong(attrs.getString(SUMO_ATTR_BLOCKTIME));
353 mySegment->loadState(vehs, blockTime - myOffset, entryBlockTime - myOffset, myQueIndex);
354 myQueIndex++;
355 } else {
357 }
358 break;
359 }
360 case SUMO_TAG_LINK: {
361 bool ok;
362 myCurrentLink = nullptr;
363 const std::string toLaneID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
364 for (MSLink* link : myCurrentLane->getLinkCont()) {
365 if (link->getViaLaneOrLane()->getID() == toLaneID) {
366 myCurrentLink = link;
367 }
368 }
369 if (myCurrentLink == nullptr) {
370 throw ProcessError("Unknown link from lane '" + myCurrentLane->getID() + "' to lane '" + toLaneID + "' in loaded state");
371 }
372 break;
373 }
375 bool ok;
376 const std::string vehID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
377 const SUMOTime arrivalTime = attrs.get<SUMOTime>(SUMO_ATTR_ARRIVALTIME, nullptr, ok);
378 const double arrivalSpeed = attrs.get<double>(SUMO_ATTR_ARRIVALSPEED, nullptr, ok);
379 const double leaveSpeed = attrs.get<double>(SUMO_ATTR_DEPARTSPEED, nullptr, ok);
380 const bool setRequest = attrs.get<bool>(SUMO_ATTR_REQUEST, nullptr, ok);
381 const double arrivalSpeedBraking = attrs.get<double>(SUMO_ATTR_ARRIVALSPEEDBRAKING, nullptr, ok);
382 const SUMOTime waitingTime = attrs.get<SUMOTime>(SUMO_ATTR_WAITINGTIME, nullptr, ok);
383 const double dist = attrs.get<double>(SUMO_ATTR_DISTANCE, nullptr, ok);
384 const double latOffset = attrs.getOpt<double>(SUMO_ATTR_POSITION_LAT, nullptr, ok, 0);
385 SUMOVehicle* veh = vc.getVehicle(vehID);
386 myCurrentLink->setApproaching(veh, arrivalTime, arrivalSpeed, leaveSpeed, setRequest, arrivalSpeedBraking, waitingTime, dist, latOffset);
388 MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
389 microVeh->loadPreviousApproaching(myCurrentLink, setRequest, arrivalTime, arrivalSpeed, arrivalSpeedBraking, dist, leaveSpeed);
390 }
391 break;
392 }
395 break;
396 }
399 MSDriveWay::loadState(attrs, element);
400 break;
401 }
402 case SUMO_TAG_PARAM: {
403 bool ok;
404 const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
405 // circumventing empty string test
406 const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
407 assert(myLastParameterised != 0);
408 if (myLastParameterised != nullptr) {
410 }
411 break;
412 }
414 if (attrs.getString(SUMO_ATTR_TYPE) == "person") {
416 }
417 if (attrs.getString(SUMO_ATTR_TYPE) == "container") {
419 }
420 break;
421 case SUMO_TAG_PERSON:
423 myAttrs = attrs.clone();
424 break;
426 bool ok = true;
427 const std::string signalID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
428 if (!MSNet::getInstance()->getTLSControl().knows(signalID)) {
429 throw InvalidArgument("Rail signal '" + signalID + "' in railSignalConstraints loaded from state is not known");
430 }
432 if (myConstrainedSignal == nullptr) {
433 throw InvalidArgument("Traffic light '" + signalID + "' is not a rail signal");
434 }
435 break;
436 }
437 case SUMO_TAG_PREDECESSOR: // intended fall-through
438 case SUMO_TAG_INSERTION_PREDECESSOR: // intended fall-through
439 case SUMO_TAG_FOE_INSERTION: // intended fall-through
440 case SUMO_TAG_INSERTION_ORDER: // intended fall-through
443 break;
444 case SUMO_TAG_TLLOGIC: {
445 bool ok;
446 const std::string tlID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
447 const std::string programID = attrs.get<std::string>(SUMO_ATTR_PROGRAMID, tlID.c_str(), ok);
448 const int phase = attrs.get<int>(SUMO_ATTR_PHASE, tlID.c_str(), ok);
449 const SUMOTime spentDuration = attrs.get<SUMOTime>(SUMO_ATTR_DURATION, tlID.c_str(), ok);
451 MSTrafficLightLogic* tl = tlc.get(tlID, programID);
452 if (tl == nullptr) {
453 if (programID == "online") {
454 WRITE_WARNINGF(TL("Ignoring program '%' for traffic light '%' in loaded state"), programID, tlID);
455 return;
456 } else {
457 throw ProcessError("Unknown program '" + programID + "' for traffic light '" + tlID + "'");
458 }
459 }
460 if (phase >= tl->getPhaseNumber()) {
461 throw ProcessError("Invalid phase '" + toString(phase) + "' for traffic light '" + tlID + "'");
462 }
463 // might not be set if the phase happens to match and there are multiple programs
464 tl->loadState(tlc, myTime, phase, spentDuration);
465 break;
466 }
467 default:
468 break;
469 }
470}
471
472
473void
476 switch (element) {
477 case SUMO_TAG_PERSON:
478 case SUMO_TAG_CONTAINER: {
480 MSTransportable* transportable = tc.get(myAttrs->getString(SUMO_ATTR_ID));
481 transportable->loadState(myAttrs->getString(SUMO_ATTR_STATE));
482 tc.fixLoadCount(transportable);
483 delete myAttrs;
484 myAttrs = nullptr;
485 break;
486 }
487 case SUMO_TAG_FLOWSTATE: {
489 myVehicleParameter = nullptr;
490 break;
491 }
492 case SUMO_TAG_SNAPSHOT: {
493 if (myVCAttrs == nullptr) {
494 throw ProcessError(TL("Could not load vehicle control state"));
495 }
502 if (myRemoved > 0) {
503 WRITE_MESSAGEF(TL("Removed % vehicles while loading state."), toString(myRemoved));
505 }
506 for (SUMOVehicle* v : myArrived) {
507 // state was created with active option --keep-after-arrival
508 vc.deleteKeptVehicle(v);
509 }
510 break;
511 }
512 default:
513 break;
514 }
515 if (element != SUMO_TAG_PARAM && myVehicleParameter == nullptr && myCurrentVType == nullptr) {
516 myLastParameterised = nullptr;
517 }
518}
519
520
521void
523 assert(myVehicleParameter != nullptr);
525 // the vehicle was already counted in MSVehicleControl::setState
527 // make a copy because myVehicleParameter is reset in closeVehicle()
528 const std::string vehID = myVehicleParameter->id;
529 if (myVehiclesToRemove.count(vehID) == 0) {
530
531 // devices that influence simulation behavior must replicate stochastic assignment
532 // also, setting the parameter avoids extra calls to MSDevice::myEquipmentRNG (which would pollute replication)
533 std::vector<std::string> deviceNames;
534 for (auto attrs : myDeviceAttrs) {
535 deviceNames.push_back(MSDevice::getDeviceName(attrs->getString(SUMO_ATTR_ID)));
536 }
539 SUMOVehicle* v = vc.getVehicle(vehID);
540 // clean up added param after initializing devices in closeVehicle
542 if (v == nullptr) {
543 throw ProcessError(TLF("Could not load vehicle '%' from state", vehID));
544 }
547
548 if (v->hasDeparted()) {
549 // vehicle already departed: disable pre-insertion rerouting and enable regular routing behavior
550 MSDevice_Routing* routingDevice = static_cast<MSDevice_Routing*>(v->getDevice(typeid(MSDevice_Routing)));
551 if (routingDevice != nullptr) {
553 }
556 // register route for deadlock prevention (vehicleStateChanged would not be called otherwise)
558 }
559 vc.handleTriggeredDepart(v, false);
560 if (v->hasArrived()) {
561 myArrived.insert(v);
562 }
563 }
564 while (!myDeviceAttrs.empty()) {
565 const std::string attrID = myDeviceAttrs.back()->getString(SUMO_ATTR_ID);
566 for (MSVehicleDevice* const dev : v->getDevices()) {
567 if (dev->getID() == attrID) {
568 dev->loadState(*myDeviceAttrs.back());
569 }
570 }
571 delete myDeviceAttrs.back();
572 myDeviceAttrs.pop_back();
573 }
574 bool ok = true;
575 while (!myReminderAttrs.empty()) {
576 const std::string attrID = myReminderAttrs.back()->getString(SUMO_ATTR_ID);
577 const SUMOTime time = myReminderAttrs.back()->get<SUMOTime>(SUMO_ATTR_TIME, nullptr, ok, false);
578 const double pos = myReminderAttrs.back()->get<double>(SUMO_ATTR_POSITION, nullptr, ok, false);
579 const auto& remDict = MSNet::getInstance()->getDetectorControl().getAllReminders();
580 auto it = remDict.find(attrID);
581 if (it != remDict.end()) {
582 it->second->loadReminderState(v->getNumericalID(), time, pos);
583 }
584 delete myReminderAttrs.back();
585 myReminderAttrs.pop_back();
586 }
587 } else {
588 delete myVehicleParameter;
589 myVehicleParameter = nullptr;
590 myRemoved++;
591 }
592 delete myAttrs;
593}
594
595
596void
610
611
612/****************************************************************************/
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
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ 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_REMINDER
@ 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_ROUTINGENGINE
the internal state for MSRoutingEngine
@ 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_TAG_EDGE
begin/end of the description of an edge
@ SUMO_ATTR_DONE
@ SUMO_ATTR_LAST
@ 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_BLOCKTIME
@ 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_POSITION
@ SUMO_ATTR_STATE
The state of a link.
@ SUMO_ATTR_TIME
trigger: the time of the step
int gPrecision
the precision for floating point outputs
Definition StdDefs.cpp:26
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
int numQueues() const
return the number of queues
Definition MESegment.h:213
void loadState(const std::vector< SUMOVehicle * > &vehs, const SUMOTime blockTime, const SUMOTime entryBlockTime, const int queIdx)
Loads the state of this segment with the given parameters.
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Definition MESegment.h:236
const std::map< std::string, MSMoveReminder * > & getAllReminders()
retrieve reminders of all detectors (for loading state)
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 const std::string LOADSTATE_DEVICENAMES
Definition MSDevice.h:102
static SumoRNG * getEquipmentRNG()
Definition MSDevice.h:92
static std::string getDeviceName(const std::string &id)
extracts the deviceName from the id (which includes holder id) and is subject to special cases
Definition MSDevice.cpp:173
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:1092
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:1053
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:3752
static void saveRNGStates(OutputDevice &out)
save random number generator states to the given output device
Definition MSLane.cpp:4649
static void loadRNGState(int index, const std::string &state)
load random number generator state for the given rng index
Definition MSLane.cpp:4659
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition MSLane.cpp:2478
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
Definition MSLane.h:729
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NEWROUTE
The vehicle got a new route.
MSDetectorControl & getDetectorControl()
Returns the detector control.
Definition MSNet.h:447
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:457
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition MSNet.cpp:1209
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition MSNet.h:437
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition MSNet.h:384
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1200
MSEdgeControl & getEdgeControl()
Returns the edge control.
Definition MSNet.h:427
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
static void saveState(OutputDevice &out)
Saves the state (i.e. recorded speeds)
static void initEdgeWeights(SUMOVehicleClass svc, SUMOTime lastAdaption=-1, int index=-1)
initialize the edge weights if not done before
static void loadState(const SUMOSAXAttributes &attrs)
Loads the state.
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 and reminder attrs (used when loading vehicles)
std::vector< SUMOSAXAttributes * > myReminderAttrs
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 description.
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()
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
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.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >(), bool includeConfig=true)
Writes an XML header with optional configuration.
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:227
static std::string saveState(SumoRNG *rng=nullptr)
save rng state to string
Definition RandHelper.h:214
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 NumericalID getNumericalID() const =0
return the numerical ID which is only for internal usage
virtual MSDevice * getDevice(const std::type_info &type) const =0
Returns a device of the given type if it exists or nullptr if not.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual 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.