Eclipse SUMO - Simulation of Urban MObility
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-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
20 // 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>
44 #include <microsim/MSEdge.h>
45 #include <microsim/MSLane.h>
46 #include <microsim/MSLink.h>
47 #include <microsim/MSGlobals.h>
48 #include <microsim/MSNet.h>
51 #include <microsim/MSEdgeControl.h>
52 #include <microsim/MSRoute.h>
54 #include <microsim/MSDriverState.h>
55 #include <netload/NLHandler.h>
56 #include "MSStateHandler.h"
57 
58 #include <mesosim/MESegment.h>
59 #include <mesosim/MELoop.h>
60 
61 
62 // ===========================================================================
63 // MSStateTimeHandler method definitions
64 // ===========================================================================
65 
67 MSStateHandler::MSStateTimeHandler::getTime(const std::string& fileName) {
68  // build handler and parser
69  MSStateTimeHandler handler;
70  handler.setFileName(fileName);
71  handler.myTime = -1;
72  SUMOSAXReader* parser = XMLSubSys::getSAXReader(handler);
73  try {
74  if (!parser->parseFirst(fileName)) {
75  delete parser;
76  throw ProcessError(TLF("Can not read XML-file '%'.", fileName));
77  }
78  } catch (ProcessError&) {
79  delete parser;
80  throw;
81  }
82  // parse
83  while (parser->parseNext() && handler.myTime != -1);
84  // clean up
85  if (handler.myTime == -1) {
86  delete parser;
87  throw ProcessError(TLF("Could not parse time from state file '%'", fileName));
88  }
89  delete parser;
90  return handler.myTime;
91 }
92 
93 void
95  if (element == SUMO_TAG_SNAPSHOT) {
97  }
98 }
99 
100 // ===========================================================================
101 // method definitions
102 // ===========================================================================
103 MSStateHandler::MSStateHandler(const std::string& file, const SUMOTime offset) :
104  MSRouteHandler(file, true),
105  myOffset(offset),
106  mySegment(nullptr),
107  myCurrentLane(nullptr),
108  myCurrentLink(nullptr),
109  myAttrs(nullptr),
110  myVCAttrs(nullptr),
111  myLastParameterised(nullptr),
112  myRemoved(0),
113  myConstrainedSignal(nullptr) {
114  myAmLoadingState = true;
115  const std::vector<std::string> vehIDs = OptionsCont::getOptions().getStringVector("load-state.remove-vehicles");
116  myVehiclesToRemove.insert(vehIDs.begin(), vehIDs.end());
117  myAllowInternalRoutes = true;
118 }
119 
120 
122  delete myVCAttrs;
123 }
124 
125 
126 void
127 MSStateHandler::saveState(const std::string& file, SUMOTime step, bool usePrefix) {
128  OutputDevice& out = OutputDevice::getDevice(file, usePrefix);
129  out.setPrecision(OptionsCont::getOptions().getInt("save-state.precision"));
131  out.writeAttr("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance").writeAttr("xsi:noNamespaceSchemaLocation", "http://sumo.dlr.de/xsd/state_file.xsd");
132  out.writeAttr(SUMO_ATTR_VERSION, VERSION_STRING);
134  out.writeAttr(SUMO_ATTR_TYPE, MSGlobals::gUseMesoSim ? "meso" : "micro");
135  if (OptionsCont::getOptions().getBool("save-state.constraints")) {
136  out.writeAttr(SUMO_ATTR_CONSTRAINTS, true);
137  }
138  if (OptionsCont::getOptions().getBool("save-state.rng")) {
139  saveRNGs(out);
140  if (!MSGlobals::gUseMesoSim) {
142  }
143  }
147  if (OptionsCont::getOptions().getBool("save-state.transportables")) {
148  if (MSNet::getInstance()->hasPersons()) {
151  out.closeTag();
152  }
153  if (MSNet::getInstance()->hasContainers()) {
156  out.closeTag();
157  }
158  }
160  for (MSEdge* const edge : MSEdge::getAllEdges()) {
162  for (MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(*edge); s != nullptr; s = s->getNextSegment()) {
163  s->saveState(out);
164  }
165  } else {
166  for (MSLane* const lane : edge->getLanes()) {
167  lane->saveState(out);
168  }
169  }
170  }
172  out.close();
173 }
174 
175 
176 void
178  MSRouteHandler::myStartElement(element, attrs);
180  switch (element) {
181  case SUMO_TAG_SNAPSHOT: {
183  const std::string& version = attrs.getString(SUMO_ATTR_VERSION);
184  if (version != VERSION_STRING) {
185  WRITE_WARNINGF(TL("State was written with sumo version % (present: %)!"), version, VERSION_STRING);
186  }
187  bool ok;
188  if (attrs.getOpt<bool>(SUMO_ATTR_CONSTRAINTS, nullptr, ok, false)) {
190  }
191  break;
192  }
193  case SUMO_TAG_RNGSTATE: {
194  if (attrs.hasAttribute(SUMO_ATTR_DEFAULT)) {
196  }
199  }
202  }
203  if (attrs.hasAttribute(SUMO_ATTR_RNG_DEVICE)) {
205  }
208  }
211  }
214  }
215  break;
216  }
217  case SUMO_TAG_RNGLANE: {
218  const int index = attrs.getInt(SUMO_ATTR_INDEX);
219  const std::string state = attrs.getString(SUMO_ATTR_STATE);
220  MSLane::loadRNGState(index, state);
221  break;
222  }
223  case SUMO_TAG_EDGECONTROL: {
224  bool ok;
225  std::list<MSLane*> activeLanes;
226  const std::vector<std::string>& laneIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_LANES, nullptr, ok, false);
227  for (const std::string& laneID : laneIDs) {
228  MSLane* lane = MSLane::dictionary(laneID);
229  if (lane == nullptr) {
230  throw ProcessError(TLF("Unknown lane '%' in loaded state.", laneID));
231  }
232  activeLanes.push_back(lane);
233  }
235  break;
236  }
237  case SUMO_TAG_DELAY: {
238  if (myVCAttrs != nullptr) {
239  delete myVCAttrs;
240  }
241  myVCAttrs = attrs.clone();
242  break;
243  }
244  case SUMO_TAG_FLOWSTATE: {
245  bool ok;
247  pars->repetitionsDone = attrs.get<int>(SUMO_ATTR_DONE, pars->id.c_str(), ok);
248  pars->repetitionTotalOffset = attrs.getOptSUMOTimeReporting(SUMO_ATTR_NEXT, pars->id.c_str(), ok, 0);
249  int index = attrs.getInt(SUMO_ATTR_INDEX);
251  break;
252  }
253  case SUMO_TAG_VTYPE: {
255  break;
256  }
257  case SUMO_TAG_VEHICLE: {
259  myAttrs = attrs.clone();
260  break;
261  }
262  case SUMO_TAG_DEVICE: {
263  myDeviceAttrs.push_back(attrs.clone());
264  break;
265  }
268  break;
269  }
270  case SUMO_TAG_SEGMENT: {
271  const std::string& segmentID = attrs.getString(SUMO_ATTR_ID);
272  const MSEdge* const edge = MSEdge::dictionary(segmentID.substr(0, segmentID.rfind(":")));
273  int idx = StringUtils::toInt(segmentID.substr(segmentID.rfind(":") + 1));
275  while (idx-- > 0) {
277  }
278  myQueIndex = 0;
279  break;
280  }
281  case SUMO_TAG_LANE: {
282  bool ok;
283  const std::string laneID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
285  if (myCurrentLane == nullptr) {
286  throw ProcessError(TLF("Unknown lane '%' in loaded state.", laneID));
287  }
288  break;
289  }
291  bool ok;
292  const std::vector<std::string>& vehIDs = attrs.get<std::vector<std::string> >(SUMO_ATTR_VALUE, nullptr, ok, false);
295  } else {
297  }
298  myQueIndex++;
299  break;
300  }
301  case SUMO_TAG_LINK: {
302  bool ok;
303  myCurrentLink = nullptr;
304  const std::string toLaneID = attrs.get<std::string>(SUMO_ATTR_TO, nullptr, ok);
305  for (MSLink* link : myCurrentLane->getLinkCont()) {
306  if (link->getViaLaneOrLane()->getID() == toLaneID) {
307  myCurrentLink = link;
308  }
309  }
310  if (myCurrentLink == nullptr) {
311  throw ProcessError("Unknown link from lane '" + myCurrentLane->getID() + "' to lane '" + toLaneID + "' in loaded state");
312  }
313  break;
314  }
315  case SUMO_TAG_APPROACHING: {
316  bool ok;
317  const std::string vehID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
318  const SUMOTime arrivalTime = attrs.get<SUMOTime>(SUMO_ATTR_ARRIVALTIME, nullptr, ok);
319  const double arrivalSpeed = attrs.get<double>(SUMO_ATTR_ARRIVALSPEED, nullptr, ok);
320  const double leaveSpeed = attrs.get<double>(SUMO_ATTR_DEPARTSPEED, nullptr, ok);
321  const bool setRequest = attrs.get<bool>(SUMO_ATTR_REQUEST, nullptr, ok);
322  const double arrivalSpeedBraking = attrs.get<double>(SUMO_ATTR_ARRIVALSPEEDBRAKING, nullptr, ok);
323  const SUMOTime waitingTime = attrs.get<SUMOTime>(SUMO_ATTR_WAITINGTIME, nullptr, ok);
324  const double dist = attrs.get<double>(SUMO_ATTR_DISTANCE, nullptr, ok);
325  const double latOffset = attrs.getOpt<double>(SUMO_ATTR_POSITION_LAT, nullptr, ok, 0);
326  SUMOVehicle* veh = vc.getVehicle(vehID);
327  myCurrentLink->setApproaching(veh, arrivalTime, arrivalSpeed, leaveSpeed, setRequest, arrivalSpeedBraking, waitingTime, dist, latOffset);
328  if (!MSGlobals::gUseMesoSim) {
329  MSVehicle* microVeh = dynamic_cast<MSVehicle*>(veh);
330  microVeh->loadPreviousApproaching(myCurrentLink, setRequest, arrivalTime, arrivalSpeed, arrivalSpeedBraking, dist, leaveSpeed);
331  }
332  break;
333  }
336  break;
337  }
338  case SUMO_TAG_PARAM: {
339  bool ok;
340  const std::string key = attrs.get<std::string>(SUMO_ATTR_KEY, nullptr, ok);
341  // circumventing empty string test
342  const std::string val = attrs.hasAttribute(SUMO_ATTR_VALUE) ? attrs.getString(SUMO_ATTR_VALUE) : "";
343  assert(myLastParameterised != 0);
344  if (myLastParameterised != nullptr) {
346  }
347  break;
348  }
350  if (attrs.getString(SUMO_ATTR_TYPE) == "person") {
352  }
353  if (attrs.getString(SUMO_ATTR_TYPE) == "container") {
355  }
356  break;
357  case SUMO_TAG_PERSON:
358  case SUMO_TAG_CONTAINER:
359  myAttrs = attrs.clone();
360  break;
362  bool ok = true;
363  const std::string signalID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
364  if (!MSNet::getInstance()->getTLSControl().knows(signalID)) {
365  throw InvalidArgument("Rail signal '" + signalID + "' in railSignalConstraints loaded from state is not known");
366  }
368  if (myConstrainedSignal == nullptr) {
369  throw InvalidArgument("Traffic light '" + signalID + "' is not a rail signal");
370  }
371  break;
372  }
373  case SUMO_TAG_PREDECESSOR: // intended fall-through
374  case SUMO_TAG_INSERTION_PREDECESSOR: // intended fall-through
375  case SUMO_TAG_FOE_INSERTION: // intended fall-through
376  case SUMO_TAG_INSERTION_ORDER: // intended fall-through
379  break;
380  case SUMO_TAG_TLLOGIC: {
381  bool ok;
382  const std::string tlID = attrs.get<std::string>(SUMO_ATTR_ID, nullptr, ok);
383  const std::string programID = attrs.get<std::string>(SUMO_ATTR_PROGRAMID, tlID.c_str(), ok);
384  const int phase = attrs.get<int>(SUMO_ATTR_PHASE, tlID.c_str(), ok);
385  const SUMOTime spentDuration = attrs.get<SUMOTime>(SUMO_ATTR_DURATION, tlID.c_str(), ok);
387  MSTrafficLightLogic* tl = tlc.get(tlID, programID);
388  if (tl == nullptr) {
389  if (programID == "online") {
390  WRITE_WARNINGF(TL("Ignoring program '%' for traffic light '%' in loaded state"), programID, tlID);
391  return;
392  } else {
393  throw ProcessError("Unknown program '" + programID + "' for traffic light '" + tlID + "'");
394  }
395  }
396  if (phase >= tl->getPhaseNumber()) {
397  throw ProcessError("Invalid phase '" + toString(phase) + "' for traffic light '" + tlID + "'");
398  }
399  // might not be set if the phase happens to match and there are multiple programs
400  tl->loadState(tlc, myTime, phase, spentDuration);
401  break;
402  }
403  default:
404  break;
405  }
406 }
407 
408 
409 void
412  switch (element) {
413  case SUMO_TAG_PERSON:
414  case SUMO_TAG_CONTAINER: {
416  MSTransportable* transportable = tc.get(myAttrs->getString(SUMO_ATTR_ID));
417  transportable->loadState(myAttrs->getString(SUMO_ATTR_STATE));
418  tc.fixLoadCount(transportable);
419  delete myAttrs;
420  myAttrs = nullptr;
421  break;
422  }
423  case SUMO_TAG_SNAPSHOT: {
424  if (myVCAttrs == nullptr) {
425  throw ProcessError(TL("Could not load vehicle control state"));
426  }
433  if (myRemoved > 0) {
434  WRITE_MESSAGEF(TL("Removed % vehicles while loading state."), toString(myRemoved));
436  }
437  break;
438  }
439  default:
440  break;
441  }
442  if (element != SUMO_TAG_PARAM && myVehicleParameter == nullptr && myCurrentVType == nullptr) {
443  myLastParameterised = nullptr;
444  }
445 }
446 
447 
448 void
450  assert(myVehicleParameter != nullptr);
452  // the vehicle was already counted in MSVehicleControl::setState
454  // make a copy because myVehicleParameter is reset in closeVehicle()
455  const std::string vehID = myVehicleParameter->id;
456  if (myVehiclesToRemove.count(vehID) == 0) {
458  SUMOVehicle* v = vc.getVehicle(vehID);
459  if (v == nullptr) {
460  throw ProcessError(TLF("Could not load vehicle '%' from state", vehID));
461  }
463  v->loadState(*myAttrs, myOffset);
464  if (v->hasDeparted()) {
465  // vehicle already departed: disable pre-insertion rerouting and enable regular routing behavior
466  MSDevice_Routing* routingDevice = static_cast<MSDevice_Routing*>(v->getDevice(typeid(MSDevice_Routing)));
467  if (routingDevice != nullptr) {
469  }
472  // register route for deadlock prevention (vehicleStateChanged would not be called otherwise)
474  }
475  vc.handleTriggeredDepart(v, false);
476  }
477  while (!myDeviceAttrs.empty()) {
478  const std::string attrID = myDeviceAttrs.back()->getString(SUMO_ATTR_ID);
479  for (MSVehicleDevice* const dev : v->getDevices()) {
480  if (dev->getID() == attrID) {
481  dev->loadState(*myDeviceAttrs.back());
482  }
483  }
484  delete myDeviceAttrs.back();
485  myDeviceAttrs.pop_back();
486  }
487  } else {
488  delete myVehicleParameter;
489  myVehicleParameter = nullptr;
490  myRemoved++;
491  }
492  delete myAttrs;
493 }
494 
495 
496 void
501  out.writeAttr(SUMO_ATTR_RNG_INSERTIONCONTROL, RandHelper::saveState(MSNet::getInstance()->getInsertionControl().getFlowRNG()));
507  out.closeTag();
508 
509 }
510 
511 
512 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
#define WRITE_WARNINGF(...)
Definition: MsgHandler.h:296
#define WRITE_MESSAGEF(...)
Definition: MsgHandler.h:298
#define TL(string)
Definition: MsgHandler.h:315
#define TLF(string,...)
Definition: MsgHandler.h:317
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:69
@ 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_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_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_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:325
A single mesoscopic segment (cell)
Definition: MESegment.h:49
MESegment * getNextSegment() const
Returns the following segment on the same edge (0 if it is the last).
Definition: MESegment.h:234
void loadState(const std::vector< std::string > &vehIDs, MSVehicleControl &vc, const SUMOTime blockTime, const int queIdx)
Loads the state of this segment with the given parameters.
Definition: MESegment.cpp:787
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()
Definition: MSDevice_ToC.h:176
static SumoRNG * getEquipmentRNG()
Definition: MSDevice.h:89
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:1022
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:983
static bool gUseMesoSim
Definition: MSGlobals.h:103
static MELoop * gMesoNet
mesoscopic simulation infrastructure
Definition: MSGlobals.h:109
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
const std::vector< MSLink * > & getLinkCont() const
returns the container with all links !!!
Definition: MSLane.h:716
static void saveRNGStates(OutputDevice &out)
save random number generator states to the given output device
Definition: MSLane.cpp:4495
static void loadRNGState(int index, const std::string &state)
load random number generator state for the given rng index
Definition: MSLane.cpp:4505
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
Definition: MSLane.cpp:2375
void loadState(const std::vector< std::string > &vehIDs, MSVehicleControl &vc)
Loads the state of this segment with the given parameters.
Definition: MSLane.cpp:3632
@ 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:182
MSTLLogicControl & getTLSControl()
Returns the tls logics control.
Definition: MSNet.h:451
virtual MSTransportableControl & getContainerControl()
Returns the container control.
Definition: MSNet.cpp:1182
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
Definition: MSNet.h:378
MSEdgeControl & getEdgeControl()
Returns the edge control.
Definition: MSNet.h:421
MSInsertionControl & getInsertionControl()
Returns the insertion control.
Definition: MSNet.h:431
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition: MSNet.cpp:1173
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.
Definition: MSRailSignal.h:46
Parser and container for routes during their loading.
static SumoRNG * getParsingRNG()
get parsing RNG
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;.
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
void myEndElement(int element)
Called when a closing tag occurs.
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 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)
Definition: MSVehicle.cpp:7592
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)
Definition: NLHandler.cpp:1773
const std::string & getID() const
Returns the id.
Definition: Named.h:74
static SumoRNG * getRNG()
Definition: MSDriverState.h:78
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.
Definition: OptionsCont.cpp:60
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
void close()
Closes the device and removes it from the dictionary.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:254
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)
Definition: OutputDevice.h:199
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.
virtual SUMOSAXAttributes * clone() const =0
return a new deep-copy attributes object
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 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.
Definition: SUMOSAXReader.h:53
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.
Representation of a vehicle.
Definition: SUMOVehicle.h:60
virtual void setChosenSpeedFactor(const double factor)=0
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.
virtual const std::vector< MSVehicleDevice * > & getDevices() const =0
Returns this vehicle's devices.
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.
Definition: XMLSubSys.cpp:141