Eclipse SUMO - Simulation of Urban MObility
MSDevice_Vehroutes.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2009-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 /****************************************************************************/
21 // A device which collects info on the vehicle trip
22 /****************************************************************************/
23 #include <config.h>
24 
25 #include <microsim/MSGlobals.h>
26 #include <microsim/MSNet.h>
27 #include <microsim/MSLane.h>
28 #include <microsim/MSEdge.h>
29 #include <microsim/MSRoute.h>
30 #include <microsim/MSStop.h>
31 #include <microsim/MSVehicle.h>
32 #include <microsim/MSVehicleType.h>
38 #include "MSDevice_Vehroutes.h"
39 
40 
41 // ===========================================================================
42 // static member variables
43 // ===========================================================================
48 bool MSDevice_Vehroutes::mySorted = false;
57 
58 
59 // ===========================================================================
60 // method definitions
61 // ===========================================================================
62 // ---------------------------------------------------------------------------
63 // static initialisation methods
64 // ---------------------------------------------------------------------------
65 void
68  if (oc.isSet("vehroute-output")) {
69  OutputDevice::createDeviceByOption("vehroute-output", "routes", "routes_file.xsd");
70  mySaveExits = oc.getBool("vehroute-output.exit-times");
71  myLastRouteOnly = oc.getBool("vehroute-output.last-route");
72  myDUAStyle = oc.getBool("vehroute-output.dua");
73  myWriteCosts = oc.getBool("vehroute-output.cost");
74  mySorted = myDUAStyle || oc.getBool("vehroute-output.sorted");
75  myIntendedDepart = oc.getBool("vehroute-output.intended-depart");
76  myRouteLength = oc.getBool("vehroute-output.route-length");
77  mySkipPTLines = oc.getBool("vehroute-output.skip-ptlines");
78  myIncludeIncomplete = oc.getBool("vehroute-output.incomplete");
79  myWriteStopPriorEdges = oc.getBool("vehroute-output.stop-edges");
80  myWriteInternal = oc.getBool("vehroute-output.internal");
83  }
84 }
85 
86 
87 void
89  oc.addOptionSubTopic("Vehroutes Device");
90  insertDefaultAssignmentOptions("vehroute", "Vehroutes Device", oc);
91 }
92 
93 
95 MSDevice_Vehroutes::buildVehicleDevices(SUMOVehicle& v, std::vector<MSVehicleDevice*>& into, int maxRoutes) {
96  if (maxRoutes < std::numeric_limits<int>::max()) {
97  return new MSDevice_Vehroutes(v, "vehroute_" + v.getID(), maxRoutes);
98  }
99  if (mySkipPTLines && v.getParameter().line != "") {
100  return nullptr;
101  }
103  if (equippedByDefaultAssignmentOptions(oc, "vehroute", v, oc.isSet("vehroute-output"))) {
104  if (myLastRouteOnly) {
105  maxRoutes = 0;
106  }
107  myStateListener.myDevices[&v] = new MSDevice_Vehroutes(v, "vehroute_" + v.getID(), maxRoutes);
108  into.push_back(myStateListener.myDevices[&v]);
109  return myStateListener.myDevices[&v];
110  }
111  return nullptr;
112 }
113 
114 
115 // ---------------------------------------------------------------------------
116 // MSDevice_Vehroutes::StateListener-methods
117 // ---------------------------------------------------------------------------
118 void
120  if (to == MSNet::VehicleState::NEWROUTE) {
121  const auto& deviceEntry = myDevices.find(vehicle);
122  if (deviceEntry != myDevices.end()) {
123  deviceEntry->second->addRoute(info);
124  }
125  }
126 }
127 
128 
129 // ---------------------------------------------------------------------------
130 // MSDevice_Vehroutes-methods
131 // ---------------------------------------------------------------------------
132 MSDevice_Vehroutes::MSDevice_Vehroutes(SUMOVehicle& holder, const std::string& id, int maxRoutes) :
133  MSVehicleDevice(holder, id),
134  myCurrentRoute(holder.getRoutePtr()),
135  myMaxRoutes(maxRoutes),
136  myLastSavedAt(nullptr),
137  myLastRouteIndex(-1),
138  myDepartLane(-1),
139  myDepartPos(-1),
140  myDepartSpeed(-1),
141  myDepartPosLat(0),
142  myStopOut(2) {
143 }
144 
145 
148 }
149 
150 
151 bool
154  if (mySorted && myStateListener.myDevices[static_cast<SUMOVehicle*>(&veh)] == this) {
156  myRouteInfos.departureCounts[departure]++;
157  }
158  if (!MSGlobals::gUseMesoSim) {
159  const MSVehicle& vehicle = static_cast<MSVehicle&>(veh);
160  myDepartLane = vehicle.getLane()->getIndex();
162  }
163  myDepartSpeed = veh.getSpeed();
165  }
166  if (myWriteStopPriorEdges) {
168  const MSEdge* e = veh.getEdge();
169  if (myPriorEdges.empty() || myPriorEdges.back() != e) {
170  myPriorEdges.push_back(e);
171  }
172  } else {
173  myPriorEdges.push_back(&enteredLane->getEdge());
174  }
175  }
177  return true;
178 }
179 
180 
181 bool
182 MSDevice_Vehroutes::notifyLeave(SUMOTrafficObject& veh, double /*lastPos*/, MSMoveReminder::Notification reason, const MSLane* /* enteredLane */) {
183  if (mySaveExits && reason != NOTIFICATION_LANE_CHANGE && reason != NOTIFICATION_PARKING && reason != NOTIFICATION_SEGMENT) {
184  const MSEdge* edge = myWriteInternal ? dynamic_cast<MSBaseVehicle&>(veh).getCurrentEdge() : veh.getEdge();
185  if (myLastSavedAt != edge) {
186  myExits.push_back(MSNet::getInstance()->getCurrentTimeStep());
187  myLastSavedAt = edge;
188  }
189  }
190  return true;
191 }
192 
193 
194 void
196  SUMOVehicleParameter::Stop stop = myHolder.getStops().front().pars;
197  const bool closeLater = myWriteStopPriorEdges || mySaveExits;
198  if (mySaveExits) {
199  // prevent duplicate output
201  }
202  stop.write(myStopOut, !closeLater);
203  if (myWriteStopPriorEdges) {
204  // calculate length
205  double priorEdgesLength = 0;
206  for (int i = 0; i < (int)myPriorEdges.size(); i++) {
207  if (i == 0) {
208  priorEdgesLength += myPriorEdges.at(i)->getLength();
209  } else if (myPriorEdges.at(i)->getID() != myPriorEdges.at(i - 1)->getID()) {
210  priorEdgesLength += myPriorEdges.at(i)->getLength();
211  }
212  }
213  myStopOut.writeAttr("priorEdges", myPriorEdges);
214  myPriorEdges.clear();
215  myStopOut.writeAttr("priorEdgesLength", priorEdgesLength);
216  }
217  if (mySaveExits) {
219  myStopOut.writeAttr(SUMO_ATTR_ENDED, stop.ended < 0 ? "-1" : time2string(stop.ended));
220  }
221  if (closeLater) {
223  }
224 }
225 
226 
227 void
229  if (index == 0 && !myIncludeIncomplete && myReplacedRoutes[index].route->size() == 2 &&
230  myReplacedRoutes[index].route->getEdges().front()->isTazConnector() &&
231  myReplacedRoutes[index].route->getEdges().back()->isTazConnector()) {
232  return;
233  }
234  // check if a previous route shall be written
235  //std::cout << " writeXMLRoute index=" << index << " numReroutes=" << myHolder.getNumberReroutes() << "\n";
236  const int routesToSkip = myHolder.getParameter().wasSet(VEHPARS_FORCE_REROUTE) ? 1 : 0;
238  if (index >= 0) {
239  assert((int)myReplacedRoutes.size() > index);
240  if (myDUAStyle || myWriteCosts) {
241  os.writeAttr(SUMO_ATTR_COST, myReplacedRoutes[index].route->getCosts());
242  }
243  if (myWriteCosts) {
244  os.writeAttr(SUMO_ATTR_SAVINGS, myReplacedRoutes[index].route->getSavings());
245  }
246  // write edge on which the vehicle was when the route was valid
247  os.writeAttr("replacedOnEdge", (myReplacedRoutes[index].edge ?
248  myReplacedRoutes[index].edge->getID() : ""));
249  if (myReplacedRoutes[index].lastRouteIndex > 0) {
250  // do not write the default
251  os.writeAttr(SUMO_ATTR_REPLACED_ON_INDEX, myReplacedRoutes[index].lastRouteIndex);
252  }
253  // write the reason for replacement
254  os.writeAttr("reason", myReplacedRoutes[index].info);
255 
256  // write the time at which the route was replaced
258  os.writeAttr(SUMO_ATTR_PROB, "0");
259  OutputDevice_String edgesD;
260  // always write the part that was actually driven and the rest of the current route that wasn't yet driven
261  int start = 0;
262  for (int i = routesToSkip; i < index; i++) {
263  if (myReplacedRoutes[i].edge != nullptr) {
264  int end = myReplacedRoutes[i].lastRouteIndex;
265  myReplacedRoutes[i].route->writeEdgeIDs(edgesD, start, end, myWriteInternal, myHolder.getVClass());
266  }
267  start = myReplacedRoutes[i].newRouteIndex;
268  }
269  myReplacedRoutes[index].route->writeEdgeIDs(edgesD, start, -1, myWriteInternal, myHolder.getVClass());
270  std::string edgesS = edgesD.getString();
271  edgesS.pop_back(); // remove last ' '
272  os.writeAttr(SUMO_ATTR_EDGES, edgesS);
273  if (myRouteLength) {
274  const bool includeInternalLengths = MSGlobals::gUsingInternalLanes && MSNet::getInstance()->hasInternalLinks();
275  ConstMSRoutePtr route = myReplacedRoutes[index].route;
276  const double routeLength = route->getDistanceBetween(myHolder.getDepartPos(), route->getEdges().back()->getLength(),
277  route->begin(), route->end(), includeInternalLengths);
278  os.writeAttr("routeLength", routeLength);
279  }
280  } else {
281  if (myDUAStyle || myWriteCosts) {
283  }
284  if (myWriteCosts) {
286  }
287  OutputDevice_String edgesD;
288  int numWritten = 0;
289  int start = 0;
290  if (myHolder.getNumberReroutes() > 0) {
291  assert((int)myReplacedRoutes.size() <= myHolder.getNumberReroutes());
292  for (int i = routesToSkip; i < (int)myReplacedRoutes.size(); i++) {
293  if (myReplacedRoutes[i].edge != nullptr) {
294  int end = myReplacedRoutes[i].lastRouteIndex;
295  numWritten += myReplacedRoutes[i].route->writeEdgeIDs(edgesD, start, end, myWriteInternal, myHolder.getVClass());
296  }
297  start = myReplacedRoutes[i].newRouteIndex;
298  }
299  }
300  numWritten += myCurrentRoute->writeEdgeIDs(edgesD, start, -1, myWriteInternal, myHolder.getVClass());
301  std::string edgesS = edgesD.getString();
302  edgesS.pop_back(); // remove last ' '
303  os.writeAttr(SUMO_ATTR_EDGES, edgesS);
304 
305  if (mySaveExits) {
306  std::vector<std::string> exits;
307  for (SUMOTime t : myExits) {
308  exits.push_back(time2string(t));
309  }
310  assert(numWritten >= (int)myExits.size());
311  std::vector<std::string> missing(numWritten - (int)myExits.size(), "-1");
312  exits.insert(exits.end(), missing.begin(), missing.end());
313  os.writeAttr(SUMO_ATTR_EXITTIMES, exits);
314  }
315  }
316  os.closeTag();
317 }
318 
319 
320 void
322  writeOutput(true);
323 }
324 
325 
326 void
327 MSDevice_Vehroutes::writeOutput(const bool hasArrived) const {
328  const OptionsCont& oc = OptionsCont::getOptions();
329  OutputDevice& routeOut = OutputDevice::getDeviceByOption("vehroute-output");
330  OutputDevice_String od(1);
333  if (!MSGlobals::gUseMesoSim) {
334  if (tmp.wasSet(VEHPARS_DEPARTLANE_SET)) {
336  tmp.departLane = myDepartLane;
337  }
338  if (tmp.wasSet(VEHPARS_DEPARTPOSLAT_SET)) {
343  }
344  }
345  if (tmp.wasSet(VEHPARS_DEPARTPOS_SET)) {
350  tmp.departPos = myDepartPos;
351  }
352  if (tmp.wasSet(VEHPARS_DEPARTSPEED_SET)) {
358  }
359  if (oc.getBool("vehroute-output.speedfactor") ||
360  (oc.isDefault("vehroute-output.speedfactor") && tmp.wasSet(VEHPARS_DEPARTSPEED_SET))) {
363  }
364 
365  const std::string typeID = myHolder.getVehicleType().getID() != DEFAULT_VTYPE_ID ? myHolder.getVehicleType().getID() : "";
366  tmp.write(od, oc, SUMO_TAG_VEHICLE, typeID);
367  if (hasArrived) {
369  }
370  if (myRouteLength) {
371  const bool includeInternalLengths = MSGlobals::gUsingInternalLanes && MSNet::getInstance()->hasInternalLinks();
372  const double finalPos = hasArrived ? myHolder.getArrivalPos() : myHolder.getPositionOnLane();
373  const double routeLength = myHolder.getRoute().getDistanceBetween(myHolder.getDepartPos(), finalPos,
374  myHolder.getRoute().begin(), myHolder.getCurrentRouteEdge(), includeInternalLengths);
375  od.writeAttr("routeLength", routeLength);
376  }
377  if (myDUAStyle) {
379  if (routeDist != nullptr) {
380  const std::vector<ConstMSRoutePtr>& routes = routeDist->getVals();
381  unsigned index = 0;
382  while (index < routes.size() && routes[index] != myCurrentRoute) {
383  ++index;
384  }
386  const std::vector<double>& probs = routeDist->getProbs();
387  for (int i = 0; i < (int)routes.size(); ++i) {
388  od.setPrecision();
390  od.writeAttr(SUMO_ATTR_COST, routes[i]->getCosts());
391  if (myWriteCosts) {
392  od.writeAttr(SUMO_ATTR_SAVINGS, routes[i]->getSavings());
393  }
394  od.setPrecision(8);
395  od.writeAttr(SUMO_ATTR_PROB, probs[i]);
396  od.setPrecision();
397  OutputDevice_String edgesD;
398  routes[i]->writeEdgeIDs(edgesD, 0, -1, myWriteInternal, myHolder.getVClass());
399  std::string edgesS = edgesD.getString();
400  edgesS.pop_back(); // remove last ' '
401  od.writeAttr(SUMO_ATTR_EDGES, edgesS);
402  od.closeTag();
403  }
404  od.closeTag();
405  } else {
406  writeXMLRoute(od);
407  }
408  } else {
409  std::string dummyMsg;
410  const int routesToSkip = (myHolder.getParameter().wasSet(VEHPARS_FORCE_REROUTE)
412  && myReplacedRoutes.size() > 0
413  && !myHolder.hasValidRoute(dummyMsg, myReplacedRoutes[0].route) ? 1 : 0);
414  if ((int)myReplacedRoutes.size() > routesToSkip) {
416  for (int i = routesToSkip; i < (int)myReplacedRoutes.size(); ++i) {
417  writeXMLRoute(od, i);
418  }
419  writeXMLRoute(od);
420  od.closeTag();
421  } else {
422  writeXMLRoute(od);
423  }
424  }
425  od << myStopOut.getString();
427  od.closeTag();
428  od.lf();
429  if (mySorted) {
430  // numerical id reflects loading order
432  } else {
433  routeOut << od.getString();
434  }
435 }
436 
437 
440  if (index < (int)myReplacedRoutes.size()) {
441  return myReplacedRoutes[index].route;
442  } else {
443  return nullptr;
444  }
445 }
446 
447 
448 void
449 MSDevice_Vehroutes::addRoute(const std::string& info) {
450  if (myMaxRoutes > 0) {
451  //std::cout << SIMTIME << " " << getID() << " departed=" << myHolder.hasDeparted() << " lastIndex=" << myLastRouteIndex << " start=" << myHolder.getRoutePosition() << "\n";
453  myHolder.hasDeparted() ? myHolder.getEdge() : nullptr,
457  if ((int)myReplacedRoutes.size() > myMaxRoutes) {
458  myReplacedRoutes.erase(myReplacedRoutes.begin());
459  }
460  }
462 }
463 
464 
465 void
466 MSDevice_Vehroutes::writePendingOutput(const bool includeUnfinished) {
467  MSNet* const net = MSNet::getInstance();
468 
469  if (!includeUnfinished) {
470  if (mySorted) {
471  for (const auto& routeInfo : myRouteInfos.routeXML) {
472  for (const auto& rouXML : routeInfo.second) {
473  (*myRouteInfos.routeOut) << rouXML.second;
474  }
475  }
476  if (net->hasPersons()) {
477  const SortedRouteInfo& personRouteInfos = net->getPersonControl().getRouteInfo();
478  if (personRouteInfos.routeOut != myRouteInfos.routeOut) {
479  for (const auto& routeInfo : personRouteInfos.routeXML) {
480  for (const auto& rouXML : routeInfo.second) {
481  (*personRouteInfos.routeOut) << rouXML.second;
482  }
483  }
484  }
485  }
486  }
487  return;
488  }
489  for (const auto& it : myStateListener.myDevices) {
490  if (it.first->hasDeparted()) {
491  if (it.first->isStopped()) {
492  it.second->notifyStopEnded();
493  }
494  it.second->writeOutput(false);
495  }
496  }
497  // unfinished persons
498  if (net->hasPersons()) {
500  while (pc.loadedBegin() != pc.loadedEnd()) {
501  pc.erase(pc.loadedBegin()->second);
502  }
503  }
504 }
505 
506 
507 void
509  myRouteInfos.departureCounts[depart]++;
510 }
511 
512 
513 void
514 MSDevice_Vehroutes::writeSortedOutput(MSDevice_Vehroutes::SortedRouteInfo* routeInfo, SUMOTime depart, const std::string& id, const std::string& xmlOutput) {
515  if (routeInfo->routeOut == myRouteInfos.routeOut) {
516  routeInfo = &myRouteInfos;
517  }
518  routeInfo->routeXML[depart][id] = xmlOutput;
519  routeInfo->departureCounts[depart]--;
520  std::map<const SUMOTime, int>::iterator it = routeInfo->departureCounts.begin();
521  while (it != routeInfo->departureCounts.end() && it->second == 0) {
522  for (const auto& rouXML : routeInfo->routeXML[it->first]) {
523  (*routeInfo->routeOut) << rouXML.second;
524  }
525  routeInfo->routeXML.erase(it->first);
526  it = routeInfo->departureCounts.erase(it);
527  }
528 }
529 
530 
531 void
534  out.writeAttr(SUMO_ATTR_ID, getID());
535  std::vector<std::string> internals;
536  if (!MSGlobals::gUseMesoSim) {
537  internals.push_back(toString(myDepartLane));
538  internals.push_back(toString(myDepartPosLat));
539  }
540  internals.push_back(toString(myDepartSpeed));
541  internals.push_back(toString(myDepartPos));
542  internals.push_back(toString(myReplacedRoutes.size()));
543  for (int i = 0; i < (int)myReplacedRoutes.size(); ++i) {
544  const std::string replacedOnEdge = myReplacedRoutes[i].edge == nullptr ? "!NULL" : myReplacedRoutes[i].edge->getID();
545  internals.push_back(replacedOnEdge);
546  internals.push_back(toString(myReplacedRoutes[i].time));
547  internals.push_back(myReplacedRoutes[i].route->getID());
548  internals.push_back(myReplacedRoutes[i].info);
549  internals.push_back(toString(myReplacedRoutes[i].lastRouteIndex));
550  internals.push_back(toString(myReplacedRoutes[i].newRouteIndex));
551  }
552  out.writeAttr(SUMO_ATTR_STATE, toString(internals));
553  if (mySaveExits && myExits.size() > 0) {
556  }
557  out.closeTag();
558 }
559 
560 
561 void
563  std::istringstream bis(attrs.getString(SUMO_ATTR_STATE));
564  if (!MSGlobals::gUseMesoSim) {
565  bis >> myDepartLane;
566  bis >> myDepartPosLat;
567  }
568  bis >> myDepartSpeed;
569  bis >> myDepartPos;
570  int size;
571  bis >> size;
572  for (int i = 0; i < size; ++i) {
573  std::string edgeID;
574  SUMOTime time;
575  std::string routeID;
576  std::string info;
577  int lastIndex;
578  int newIndex;
579  bis >> edgeID;
580  bis >> time;
581  bis >> routeID;
582  bis >> info;
583  bis >> lastIndex;
584  bis >> newIndex;
585 
586  ConstMSRoutePtr route = MSRoute::dictionary(routeID);
587  if (route != nullptr) {
588  myReplacedRoutes.push_back(RouteReplaceInfo(MSEdge::dictionary(edgeID), time, route, info, lastIndex, newIndex));
589  }
590  }
592  bool ok = true;
593  for (const std::string& t : attrs.get<std::vector<std::string> >(SUMO_ATTR_EXITTIMES, nullptr, ok)) {
594  myExits.push_back(StringUtils::toLong(t));
595  }
596  if (attrs.hasAttribute(SUMO_ATTR_EDGE)) {
598  }
599  }
600 }
601 
602 
603 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition: Route.h:31
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition: SUMOTime.cpp:69
const std::string DEFAULT_VTYPE_ID
@ GIVEN
The lane is given.
@ RANDOM
The lateral position is chosen randomly.
@ GIVEN
The position is given.
@ GIVEN_VEHROUTE
The position is set by the vehroute device.
@ GIVEN
The position is given.
@ GIVEN_VEHROUTE
The position is set by the vehroute device.
@ STOP
depart position is endPos of first stop
const int VEHPARS_SPEEDFACTOR_SET
const int VEHPARS_DEPARTPOS_SET
@ GIVEN
The speed is given.
@ GIVEN_VEHROUTE
The speed is set by the vehroute device.
@ LIMIT
The maximum lane speed is used (speedLimit)
const int VEHPARS_DEPARTLANE_SET
const int VEHPARS_FORCE_REROUTE
const int STOP_ENDED_SET
const int STOP_STARTED_SET
const int VEHPARS_DEPARTSPEED_SET
const int VEHPARS_DEPARTPOSLAT_SET
@ SUMO_TAG_DEVICE
@ SUMO_TAG_VEHICLE
description of a vehicle
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ SUMO_TAG_ROUTE
begin/end of the description of a route
@ SUMO_ATTR_LAST
@ SUMO_ATTR_STARTED
@ SUMO_ATTR_REPLACED_AT_TIME
@ SUMO_ATTR_EDGE
@ SUMO_ATTR_EDGES
the edges of a route
@ SUMO_ATTR_EXITTIMES
@ SUMO_ATTR_ENDED
@ SUMO_ATTR_COST
@ SUMO_ATTR_REPLACED_ON_INDEX
@ SUMO_ATTR_PROB
@ SUMO_ATTR_SAVINGS
@ SUMO_ATTR_ID
@ SUMO_ATTR_STATE
The state of a link.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
The base class for microscopic and mesoscopic vehicles.
Definition: MSBaseVehicle.h:57
Information about a replaced route.
A class that is notified about reroutings.
std::map< const SUMOVehicle *, MSDevice_Vehroutes *, ComparatorNumericalIdLess > myDevices
A map for internal notification.
void vehicleStateChanged(const SUMOVehicle *const vehicle, MSNet::VehicleState to, const std::string &info="")
Called if a vehicle changes its state.
A device which collects info on the vehicle trip (mainly on departure and arrival)
static bool myWriteCosts
A shortcut for the Option "vehroute-output.costs".
static void writeSortedOutput(SortedRouteInfo *routeInfo, SUMOTime depart, const std::string &id, const std::string &xmlOutput)
static void init()
Static intialization.
std::vector< SUMOTime > myExits
The times at which the vehicle exits an edge.
static bool mySorted
A shortcut for the Option "vehroute-output.sorted".
static bool myIntendedDepart
A shortcut for the Option "vehroute-output.intended-depart".
void addRoute(const std::string &info)
Called on route change.
int myLastRouteIndex
The route index of the last edge that the vehicle left.
static bool myIncludeIncomplete
A shortcut for the Option "vehroute-output.incomplete".
MSDevice_Vehroutes(SUMOVehicle &holder, const std::string &id, int maxRoutes)
Constructor.
static bool myRouteLength
A shortcut for the Option "vehroute-output.route-length".
static void insertOptions(OptionsCont &oc)
Inserts MSDevice_FCD-options.
void writeXMLRoute(OutputDevice &os, int index=-1) const
Called on route output.
ConstMSRoutePtr getRoute(int index) const
Called on route retrieval.
static MSDevice_Vehroutes * buildVehicleDevices(SUMOVehicle &v, std::vector< MSVehicleDevice * > &into, int maxRoutes=std::numeric_limits< int >::max())
Build devices for the given vehicle, if needed.
std::vector< RouteReplaceInfo > myReplacedRoutes
Prior routes.
std::vector< const MSEdge * > myPriorEdges
the edges that were passed before the current stop
const int myMaxRoutes
The maximum number of routes to report.
static bool myWriteStopPriorEdges
A shortcut for the Option "vehroute-output.stop-edges".
double myDepartPosLat
The lateral depart position.
const MSEdge * myLastSavedAt
The last edge the exit time was saved for.
void loadState(const SUMOSAXAttributes &attrs)
Loads the state of the device from the given description.
OutputDevice_String myStopOut
double myDepartPos
The lane the vehicle departed at.
static void writePendingOutput(const bool includeUnfinished)
generate vehroute output for pending vehicles at sim end, either due to sorting or because they are s...
static bool myLastRouteOnly
A shortcut for the Option "vehroute-output.last-route".
ConstMSRoutePtr myCurrentRoute
The currently used route.
double myDepartSpeed
The speed on departure.
int myDepartLane
The lane the vehicle departed at.
static SortedRouteInfo myRouteInfos
Information needed to sort vehicles by departure time.
void writeOutput(const bool hasArrived) const
Called on writing vehroutes output.
~MSDevice_Vehroutes()
Destructor.
bool notifyLeave(SUMOTrafficObject &veh, double lastPos, Notification reason, const MSLane *enteredLane=0)
Saves exit times if needed.
bool notifyEnter(SUMOTrafficObject &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Does nothing, returns true only if exit times should be collected.
static bool myWriteInternal
A shortcut for the Option "vehroute-output.internal".
static bool mySkipPTLines
A shortcut for the Option "vehroute-output.skip-ptlines".
void generateOutput(OutputDevice *tripinfoOut) const
Called on writing vehroutes output.
void notifyStopEnded()
called to update state for stopped vehicles
static bool myDUAStyle
A shortcut for the Option "vehroute-output.dua".
static bool mySaveExits
A shortcut for the Option "vehroute-output.exit-times".
static void registerTransportableDepart(SUMOTime depart)
void saveState(OutputDevice &out) const
Saves the state of the device.
static StateListener myStateListener
A class that is notified about reroutings.
static void insertDefaultAssignmentOptions(const std::string &deviceName, const std::string &optionsTopic, OptionsCont &oc, const bool isPerson=false)
Adds common command options that allow to assign devices to vehicles.
Definition: MSDevice.cpp:155
static bool equippedByDefaultAssignmentOptions(const OptionsCont &oc, const std::string &deviceName, DEVICEHOLDER &v, bool outputOptionSet, const bool isPerson=false)
Determines whether a vehicle should get a certain device.
Definition: MSDevice.h:195
A road/street connecting two junctions.
Definition: MSEdge.h:77
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:995
static bool gUseMesoSim
Definition: MSGlobals.h:103
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
Definition: MSGlobals.h:78
Representation of a lane in the micro simulation.
Definition: MSLane.h:84
int getIndex() const
Returns the lane's index.
Definition: MSLane.h:634
MSEdge & getEdge() const
Returns the lane's edge.
Definition: MSLane.h:756
Notification
Definition of a vehicle state.
@ NOTIFICATION_DEPARTED
The vehicle has departed (was inserted into the network)
@ NOTIFICATION_SEGMENT
The vehicle changes the segment (meso only)
@ NOTIFICATION_LANE_CHANGE
The vehicle changes lanes (micro only)
@ NOTIFICATION_PARKING
The vehicle starts or ends parking.
The simulated network and simulation perfomer.
Definition: MSNet.h:89
VehicleState
Definition of a vehicle state.
Definition: MSNet.h:608
@ NEWROUTE
The vehicle got a new route.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:184
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition: MSNet.h:320
void addVehicleStateListener(VehicleStateListener *listener)
Adds a vehicle states listener.
Definition: MSNet.cpp:1250
bool hasPersons() const
Returns whether persons are simulated.
Definition: MSNet.h:395
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition: MSNet.cpp:1182
bool hasInternalLinks() const
return whether the network contains internal links
Definition: MSNet.h:780
double getSavings() const
Returns the estimated savings due to using this route (compare to the route before rerouting)
Definition: MSRoute.h:182
static bool dictionary(const std::string &id, ConstMSRoutePtr route)
Adds a route to the dictionary.
Definition: MSRoute.cpp:109
static RandomDistributor< ConstMSRoutePtr > * distDictionary(const std::string &id)
Returns the named route distribution.
Definition: MSRoute.cpp:161
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
Definition: MSRoute.cpp:73
double getDistanceBetween(double fromPos, double toPos, const MSLane *fromLane, const MSLane *toLane, int routePosition=0) const
Compute the distance between 2 given edges on this route, optionally including the length of internal...
Definition: MSRoute.cpp:311
double getCosts() const
Returns the costs of the route.
Definition: MSRoute.h:174
constVehIt loadedBegin() const
Returns the begin of the internal transportables map.
constVehIt loadedEnd() const
Returns the end of the internal transportables map.
virtual void erase(MSTransportable *transportable)
removes a single transportable
const MSDevice_Vehroutes::SortedRouteInfo & getRouteInfo()
Abstract in-vehicle device.
SUMOVehicle & myHolder
The vehicle that stores the device.
Representation of a vehicle in the micro simulation.
Definition: MSVehicle.h:77
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
Definition: MSVehicle.h:416
const MSLane * getLane() const
Returns the lane the vehicle is on.
Definition: MSVehicle.h:584
const std::string & getID() const
Returns the name of the vehicle type.
Definition: MSVehicleType.h:91
const std::string & getID() const
Returns the id.
Definition: Named.h:74
A storage for options typed value containers)
Definition: OptionsCont.h:89
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:60
An output device that encapsulates an ofstream.
std::string getString() const
Returns the current content as a string.
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
void lf()
writes a line feed if applicable
Definition: OutputDevice.h:242
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
static bool createDeviceByOption(const std::string &optionName, const std::string &rootElement="", const std::string &schemaFile="")
Creates the device using the output definition stored in the named option.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
Definition: OutputDevice.h:254
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
void setPrecision(int precision=gPrecision)
Sets the precision or resets it to default.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
const std::vector< double > & getProbs() const
Returns the probabilities assigned to the members of the distribution.
const std::vector< T > & getVals() const
Returns the members of the distribution.
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 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.
Representation of a vehicle, person, or container.
virtual NumericalID getNumericalID() const =0
return the numerical ID which is only for internal usage
virtual double getChosenSpeedFactor() const =0
virtual double getSpeed() const =0
Returns the object's current speed.
virtual const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual int getRoutePosition() const =0
return index of edge within route
virtual const MSEdge * getEdge() const =0
Returns the edge the object is currently at.
virtual double getPositionOnLane() const =0
Get the object's position along the lane.
Representation of a vehicle.
Definition: SUMOVehicle.h:62
virtual const MSRoute & getRoute() const =0
Returns the current route.
virtual const std::list< MSStop > & getStops() const =0
virtual SUMOTime getDeparture() const =0
Returns this vehicle's real departure time.
virtual bool hasDeparted() const =0
Returns whether this vehicle has departed.
virtual int getNumberReroutes() const =0
Returns the number of new routes this vehicle got.
virtual const ConstMSEdgeVector::const_iterator & getCurrentRouteEdge() const =0
Returns an iterator pointing to the current edge in this vehicles route.
virtual double getArrivalPos() const =0
Returns this vehicle's desired arrivalPos for its current route (may change on reroute)
virtual ConstMSRoutePtr getRoutePtr() const =0
Returns the current route.
virtual bool hasValidRoute(std::string &msg, ConstMSRoutePtr route=0) const =0
Validates the current or given route.
virtual double getDepartPos() const =0
Returns this vehicle's real departure position.
Definition of vehicle stop (position and duration)
SUMOTime started
the time at which this stop was reached
int parametersSet
Information for the output which parameter were set.
void write(OutputDevice &dev, const bool close=true, const bool writeTagAndParents=true) const
Writes the stop as XML.
SUMOTime ended
the time at which this stop was ended
Structure representing possible vehicle parameter.
double departPosLat
(optional) The lateral position the vehicle shall depart from
int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
int departLane
(optional) The lane the vehicle shall depart from (index in edge)
double departSpeed
(optional) The initial speed of the vehicle
double speedFactor
individual speedFactor (overriding distribution from vType)
void write(OutputDevice &dev, const OptionsCont &oc, const SumoXMLTag altTag=SUMO_TAG_VEHICLE, const std::string &typeID="") const
Writes the parameters as a beginning element.
DepartLaneDefinition departLaneProcedure
Information how the vehicle shall choose the lane to depart from.
DepartPosLatDefinition departPosLatProcedure
Information how the vehicle shall choose the lateral departure position.
double departPos
(optional) The position the vehicle shall depart from
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
bool wasSet(int what) const
Returns whether the given parameter was set.
DepartPosDefinition departPosProcedure
Information how the vehicle shall choose the departure position.
std::string line
The vehicle's line (mainly for public transport)
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,...
Information needed to sort vehicle / transportable output by departure time.
std::map< const SUMOTime, int > departureCounts
Map needed to sort vehicles by departure time.
std::map< const SUMOTime, std::map< const std::string, std::string > > routeXML
pregenerated route output sorted by time
OutputDevice * routeOut
route output device