Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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-2026 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
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>
38#include "MSDevice_Vehroutes.h"
39
40
41// ===========================================================================
42// static member variables
43// ===========================================================================
57
58
59// ===========================================================================
60// method definitions
61// ===========================================================================
62// ---------------------------------------------------------------------------
63// static initialisation methods
64// ---------------------------------------------------------------------------
65void
68 if (oc.isSet("vehroute-output")) {
69 OutputDevice::createDeviceByOption("vehroute-output", "routes", "routes_file.xsd");
70 OutputDevice& od = OutputDevice::getDeviceByOption("vehroute-output");
71 if (!od.isXML()) {
72 WRITE_WARNING("Vehroute output does not fully support tabular formats. Sorting and stop output will not work.");
73 }
74 mySaveExits = oc.getBool("vehroute-output.exit-times");
75 myLastRouteOnly = oc.getBool("vehroute-output.last-route");
76 myDUAStyle = oc.getBool("vehroute-output.dua");
77 myWriteCosts = oc.getBool("vehroute-output.cost");
78 mySorted = myDUAStyle || oc.getBool("vehroute-output.sorted");
79 myIntendedDepart = oc.getBool("vehroute-output.intended-depart");
80 myRouteLength = oc.getBool("vehroute-output.route-length");
81 mySkipPTLines = oc.getBool("vehroute-output.skip-ptlines");
82 myIncludeIncomplete = oc.getBool("vehroute-output.incomplete");
83 myWriteStopPriorEdges = oc.getBool("vehroute-output.stop-edges");
84 myWriteInternal = oc.getBool("vehroute-output.internal");
87 }
88}
89
90
91void
93 oc.addOptionSubTopic("Vehroutes Device");
94 insertDefaultAssignmentOptions("vehroute", "Vehroutes Device", oc);
95}
96
97
99MSDevice_Vehroutes::buildVehicleDevices(SUMOVehicle& v, std::vector<MSVehicleDevice*>& into, int maxRoutes) {
100 if (maxRoutes < std::numeric_limits<int>::max()) {
101 return new MSDevice_Vehroutes(v, "vehroute_" + v.getID(), maxRoutes);
102 }
103 if (mySkipPTLines && v.getParameter().line != "") {
104 return nullptr;
105 }
107 if (equippedByDefaultAssignmentOptions(oc, "vehroute", v, oc.isSet("vehroute-output"))) {
108 if (myLastRouteOnly) {
109 maxRoutes = 0;
110 }
111 myStateListener.myDevices[&v] = new MSDevice_Vehroutes(v, "vehroute_" + v.getID(), maxRoutes);
112 into.push_back(myStateListener.myDevices[&v]);
113 return myStateListener.myDevices[&v];
114 }
115 return nullptr;
116}
117
118
119// ---------------------------------------------------------------------------
120// MSDevice_Vehroutes::StateListener-methods
121// ---------------------------------------------------------------------------
122void
125 const auto& deviceEntry = myDevices.find(vehicle);
126 if (deviceEntry != myDevices.end()) {
127 deviceEntry->second->addRoute(info);
128 }
129 }
130}
131
132
133// ---------------------------------------------------------------------------
134// MSDevice_Vehroutes-methods
135// ---------------------------------------------------------------------------
136MSDevice_Vehroutes::MSDevice_Vehroutes(SUMOVehicle& holder, const std::string& id, int maxRoutes) :
137 MSVehicleDevice(holder, id),
138 myCurrentRoute(holder.getRoutePtr()),
139 myMaxRoutes(maxRoutes),
140 myLastSavedAt(nullptr),
142 myDepartLane(-1),
143 myDepartPos(-1),
144 myDepartSpeed(-1),
146 myStopOut(2) {
147}
148
149
153
154
155bool
158 if (mySorted && myStateListener.myDevices[static_cast<SUMOVehicle*>(&veh)] == this) {
160 myRouteInfos.departureCounts[departure]++;
161 }
163 const MSVehicle& vehicle = static_cast<MSVehicle&>(veh);
164 myDepartLane = vehicle.getLane()->getIndex();
166 }
167 myDepartSpeed = veh.getSpeed();
169 }
172 const MSEdge* e = veh.getEdge();
173 if (myPriorEdges.empty() || myPriorEdges.back() != e) {
174 myPriorEdges.push_back(e);
175 }
176 } else {
177 myPriorEdges.push_back(&enteredLane->getEdge());
178 }
179 }
181 return true;
182}
183
184
185bool
186MSDevice_Vehroutes::notifyLeave(SUMOTrafficObject& veh, double /*lastPos*/, MSMoveReminder::Notification reason, const MSLane* /* enteredLane */) {
187 if (mySaveExits && reason != NOTIFICATION_LANE_CHANGE && reason != NOTIFICATION_PARKING && reason != NOTIFICATION_SEGMENT) {
188 const MSEdge* edge = myWriteInternal ? dynamic_cast<MSBaseVehicle&>(veh).getCurrentEdge() : veh.getEdge();
189 if (myLastSavedAt != edge) {
190 myExits.push_back(MSNet::getInstance()->getCurrentTimeStep());
191 myLastSavedAt = edge;
192 }
193 }
194 return true;
195}
196
197
198void
200 SUMOVehicleParameter::Stop stop = myHolder.getStops().front().pars;
201 const bool closeLater = myWriteStopPriorEdges || mySaveExits;
202 if (mySaveExits) {
203 // prevent duplicate output
205 }
206 stop.write(myStopOut, !closeLater);
208 // calculate length
209 double priorEdgesLength = 0;
210 for (int i = 0; i < (int)myPriorEdges.size(); i++) {
211 if (i == 0) {
212 priorEdgesLength += myPriorEdges.at(i)->getLength();
213 } else if (myPriorEdges.at(i)->getID() != myPriorEdges.at(i - 1)->getID()) {
214 priorEdgesLength += myPriorEdges.at(i)->getLength();
215 }
216 }
217 myStopOut.writeAttr("priorEdges", myPriorEdges);
218 myPriorEdges.clear();
219 myStopOut.writeAttr("priorEdgesLength", priorEdgesLength);
220 }
221 if (mySaveExits) {
223 myStopOut.writeAttr(SUMO_ATTR_ENDED, stop.ended < 0 ? "-1" : time2string(stop.ended));
224 }
225 if (closeLater) {
227 }
228}
229
230
231void
233 if (index == 0 && !myIncludeIncomplete && myReplacedRoutes[index].route->size() == 2 &&
234 myReplacedRoutes[index].route->getEdges().front()->isTazConnector() &&
235 myReplacedRoutes[index].route->getEdges().back()->isTazConnector()) {
236 return;
237 }
238 // check if a previous route shall be written
239 //std::cout << " writeXMLRoute index=" << index << " numReroutes=" << myHolder.getNumberReroutes() << "\n";
240 const int routesToSkip = myHolder.getParameter().wasSet(VEHPARS_FORCE_REROUTE) ? 1 : 0;
242 if (index >= 0) {
243 assert((int)myReplacedRoutes.size() > index);
244 if (myDUAStyle || myWriteCosts) {
245 os.writeAttr(SUMO_ATTR_COST, myReplacedRoutes[index].route->getCosts());
246 }
247 if (myWriteCosts) {
248 os.writeAttr(SUMO_ATTR_SAVINGS, myReplacedRoutes[index].route->getSavings());
249 }
250 // write edge on which the vehicle was when the route was valid
251 os.writeAttr("replacedOnEdge", (myReplacedRoutes[index].edge ?
252 myReplacedRoutes[index].edge->getID() : ""));
253 if (myReplacedRoutes[index].lastRouteIndex > 0) {
254 // do not write the default
255 os.writeAttr(SUMO_ATTR_REPLACED_ON_INDEX, myReplacedRoutes[index].lastRouteIndex);
256 }
257 // write the reason for replacement
258 os.writeAttr("reason", myReplacedRoutes[index].info);
259
260 // write the time at which the route was replaced
262 os.writeAttr(SUMO_ATTR_PROB, "0");
263 OutputDevice_String edgesD;
264 // always write the part that was actually driven and the rest of the current route that wasn't yet driven
265 int start = 0;
266 for (int i = routesToSkip; i < index; i++) {
267 if (myReplacedRoutes[i].edge != nullptr) {
268 int end = myReplacedRoutes[i].lastRouteIndex;
269 myReplacedRoutes[i].route->writeEdgeIDs(edgesD, start, end, myWriteInternal, myHolder.getVClass());
270 }
271 start = myReplacedRoutes[i].newRouteIndex;
272 }
273 myReplacedRoutes[index].route->writeEdgeIDs(edgesD, start, -1, myWriteInternal, myHolder.getVClass());
274 std::string edgesS = edgesD.getString();
275 edgesS.pop_back(); // remove last ' '
276 os.writeAttr(SUMO_ATTR_EDGES, edgesS);
277 if (myRouteLength) {
278 const bool includeInternalLengths = MSGlobals::gUsingInternalLanes && MSNet::getInstance()->hasInternalLinks();
279 ConstMSRoutePtr route = myReplacedRoutes[index].route;
280 const double routeLength = route->getDistanceBetween(myHolder.getDepartPos(), route->getEdges().back()->getLength(),
281 route->begin(), route->end(), includeInternalLengths);
282 os.writeAttr("routeLength", routeLength);
283 }
284 } else {
285 if (myDUAStyle || myWriteCosts) {
287 }
288 if (myWriteCosts) {
290 }
291 OutputDevice_String edgesD;
292 int numWritten = 0;
293 int start = 0;
294 if (myHolder.getNumberReroutes() > 0) {
295 assert((int)myReplacedRoutes.size() <= myHolder.getNumberReroutes());
296 for (int i = routesToSkip; i < (int)myReplacedRoutes.size(); i++) {
297 if (myReplacedRoutes[i].edge != nullptr) {
298 int end = myReplacedRoutes[i].lastRouteIndex;
299 numWritten += myReplacedRoutes[i].route->writeEdgeIDs(edgesD, start, end, myWriteInternal, myHolder.getVClass());
300 }
301 start = myReplacedRoutes[i].newRouteIndex;
302 }
303 }
304 numWritten += myCurrentRoute->writeEdgeIDs(edgesD, start, -1, myWriteInternal, myHolder.getVClass());
305 std::string edgesS = edgesD.getString();
306 edgesS.pop_back(); // remove last ' '
307 os.writeAttr(SUMO_ATTR_EDGES, edgesS);
308
309 if (mySaveExits) {
310 std::vector<std::string> exits;
311 for (SUMOTime t : myExits) {
312 exits.push_back(time2string(t));
313 }
314 assert(numWritten >= (int)myExits.size());
315 std::vector<std::string> missing(numWritten - (int)myExits.size(), "-1");
316 exits.insert(exits.end(), missing.begin(), missing.end());
318 }
319 }
320 os.closeTag();
321}
322
323
324void
326 writeOutput(true);
327}
328
329
330void
331MSDevice_Vehroutes::writeOutput(const bool hasArrived) const {
333 OutputDevice& routeOut = OutputDevice::getDeviceByOption("vehroute-output");
334 OutputDevice_String stringOut(1);
335 OutputDevice& od = mySorted && routeOut.isXML() ? stringOut : routeOut;
342 }
348 }
349 }
350 if (tmp.wasSet(VEHPARS_DEPARTPOS_SET)) {
356 }
363 }
364 if (oc.getBool("vehroute-output.speedfactor") ||
365 (oc.isDefault("vehroute-output.speedfactor") && tmp.wasSet(VEHPARS_DEPARTSPEED_SET))) {
368 }
369
370 const std::string typeID = myHolder.getVehicleType().getID() != DEFAULT_VTYPE_ID ? myHolder.getVehicleType().getID() : "";
371 tmp.write(od, oc, SUMO_TAG_VEHICLE, typeID);
372 if (hasArrived) {
374 }
375 if (myRouteLength) {
376 const bool includeInternalLengths = MSGlobals::gUsingInternalLanes && MSNet::getInstance()->hasInternalLinks();
377 const double finalPos = hasArrived ? myHolder.getArrivalPos() : myHolder.getPositionOnLane();
378 const double routeLength = myHolder.getRoute().getDistanceBetween(myHolder.getDepartPos(), finalPos,
379 myHolder.getRoute().begin(), myHolder.getCurrentRouteEdge(), includeInternalLengths);
380 od.writeAttr("routeLength", routeLength);
381 }
382 if (myDUAStyle) {
384 if (routeDist != nullptr) {
385 const std::vector<ConstMSRoutePtr>& routes = routeDist->getVals();
386 unsigned index = 0;
387 while (index < routes.size() && routes[index] != myCurrentRoute) {
388 ++index;
389 }
391 const std::vector<double>& probs = routeDist->getProbs();
392 for (int i = 0; i < (int)routes.size(); ++i) {
393 od.setPrecision();
395 od.writeAttr(SUMO_ATTR_COST, routes[i]->getCosts());
396 if (myWriteCosts) {
397 od.writeAttr(SUMO_ATTR_SAVINGS, routes[i]->getSavings());
398 }
399 od.setPrecision(8);
400 od.writeAttr(SUMO_ATTR_PROB, probs[i]);
401 od.setPrecision();
402 OutputDevice_String edgesD;
403 routes[i]->writeEdgeIDs(edgesD, 0, -1, myWriteInternal, myHolder.getVClass());
404 std::string edgesS = edgesD.getString();
405 edgesS.pop_back(); // remove last ' '
406 od.writeAttr(SUMO_ATTR_EDGES, edgesS);
407 od.closeTag();
408 }
409 od.closeTag();
410 } else {
411 writeXMLRoute(od);
412 }
413 } else {
414 std::string dummyMsg;
415 const int routesToSkip = (myHolder.getParameter().wasSet(VEHPARS_FORCE_REROUTE)
417 && myReplacedRoutes.size() > 0
418 && !myHolder.hasValidRoute(dummyMsg, myReplacedRoutes[0].route) ? 1 : 0);
419 if ((int)myReplacedRoutes.size() > routesToSkip) {
421 for (int i = routesToSkip; i < (int)myReplacedRoutes.size(); ++i) {
422 writeXMLRoute(od, i);
423 }
424 writeXMLRoute(od);
425 od.closeTag();
426 } else {
427 writeXMLRoute(od);
428 }
429 }
430 if (routeOut.isXML()) {
431 od << myStopOut.getString();
432 }
434 od.closeTag();
435 od.lf();
436 if (mySorted && routeOut.isXML()) {
437 // numerical id reflects loading order
439 }
440}
441
442
445 if (index < (int)myReplacedRoutes.size()) {
446 return myReplacedRoutes[index].route;
447 } else {
448 return nullptr;
449 }
450}
451
452
453void
454MSDevice_Vehroutes::addRoute(const std::string& info) {
455 if (myMaxRoutes > 0) {
456 //std::cout << SIMTIME << " " << getID() << " departed=" << myHolder.hasDeparted() << " lastIndex=" << myLastRouteIndex << " start=" << myHolder.getRoutePosition() << "\n";
458 myHolder.hasDeparted() ? myHolder.getEdge() : nullptr,
462 if ((int)myReplacedRoutes.size() > myMaxRoutes) {
463 myReplacedRoutes.erase(myReplacedRoutes.begin());
464 }
465 }
467}
468
469
470void
471MSDevice_Vehroutes::writePendingOutput(const bool includeUnfinished) {
472 MSNet* const net = MSNet::getInstance();
473
474 if (!includeUnfinished) {
475 if (mySorted) {
476 for (const auto& routeInfo : myRouteInfos.routeXML) {
477 for (const auto& rouXML : routeInfo.second) {
478 (*myRouteInfos.routeOut) << rouXML.second;
479 }
480 }
481 if (net->hasPersons()) {
482 const SortedRouteInfo& personRouteInfos = net->getPersonControl().getRouteInfo();
483 if (personRouteInfos.routeOut != myRouteInfos.routeOut) {
484 for (const auto& routeInfo : personRouteInfos.routeXML) {
485 for (const auto& rouXML : routeInfo.second) {
486 (*personRouteInfos.routeOut) << rouXML.second;
487 }
488 }
489 }
490 }
491 }
492 return;
493 }
494 for (const auto& it : myStateListener.myDevices) {
495 if (it.first->hasDeparted()) {
496 if (it.first->isStopped()) {
497 it.second->notifyStopEnded();
498 }
499 it.second->writeOutput(false);
500 }
501 }
502 // unfinished persons
503 if (net->hasPersons()) {
505 while (pc.loadedBegin() != pc.loadedEnd()) {
506 pc.erase(pc.loadedBegin()->second);
507 }
508 }
509 // Flush any remaining sorted outputs that may still be buffered
510 if (mySorted) {
511 for (const auto& routeInfo : myRouteInfos.routeXML) {
512 for (const auto& rouXML : routeInfo.second) {
513 (*myRouteInfos.routeOut) << rouXML.second;
514 }
515 }
516 if (net->hasPersons()) {
517 const SortedRouteInfo& personRouteInfos = net->getPersonControl().getRouteInfo();
518 if (personRouteInfos.routeOut != myRouteInfos.routeOut) {
519 for (const auto& routeInfo : personRouteInfos.routeXML) {
520 for (const auto& rouXML : routeInfo.second) {
521 (*personRouteInfos.routeOut) << rouXML.second;
522 }
523 }
524 }
525 }
526 }
527}
528
529
530void
534
535
536void
538 if (routeInfo->routeOut == myRouteInfos.routeOut) {
539 routeInfo = &myRouteInfos;
540 }
541 routeInfo->routeXML[depart][id] = xmlOutput;
542 routeInfo->departureCounts[depart]--;
543 std::map<const SUMOTime, int>::iterator it = routeInfo->departureCounts.begin();
544 while (it != routeInfo->departureCounts.end() && it->second == 0) {
545 for (const auto& rouXML : routeInfo->routeXML[it->first]) {
546 (*routeInfo->routeOut) << rouXML.second;
547 }
548 routeInfo->routeXML.erase(it->first);
549 it = routeInfo->departureCounts.erase(it);
550 }
551}
552
553
554void
558 std::vector<std::string> internals;
560 internals.push_back(toString(myDepartLane));
561 internals.push_back(toString(myDepartPosLat));
562 }
563 internals.push_back(toString(myDepartSpeed));
564 internals.push_back(toString(myDepartPos));
565 internals.push_back(toString(myReplacedRoutes.size()));
566 for (int i = 0; i < (int)myReplacedRoutes.size(); ++i) {
567 const std::string replacedOnEdge = myReplacedRoutes[i].edge == nullptr ? "!NULL" : myReplacedRoutes[i].edge->getID();
568 internals.push_back(replacedOnEdge);
569 internals.push_back(toString(myReplacedRoutes[i].time));
570 internals.push_back(myReplacedRoutes[i].route->getID());
571 internals.push_back(myReplacedRoutes[i].info);
572 internals.push_back(toString(myReplacedRoutes[i].lastRouteIndex));
573 internals.push_back(toString(myReplacedRoutes[i].newRouteIndex));
574 }
575 out.writeAttr(SUMO_ATTR_STATE, toString(internals));
576 if (mySaveExits && myExits.size() > 0) {
579 }
580 out.closeTag();
581}
582
583
584void
586 std::istringstream bis(attrs.getString(SUMO_ATTR_STATE));
588 bis >> myDepartLane;
589 bis >> myDepartPosLat;
590 }
591 bis >> myDepartSpeed;
592 bis >> myDepartPos;
593 int size;
594 bis >> size;
595 for (int i = 0; i < size; ++i) {
596 std::string edgeID;
597 SUMOTime time;
598 std::string routeID;
599 std::string info;
600 int lastIndex;
601 int newIndex;
602 bis >> edgeID;
603 bis >> time;
604 bis >> routeID;
605 bis >> info;
606 bis >> lastIndex;
607 bis >> newIndex;
608
609 ConstMSRoutePtr route = MSRoute::dictionary(routeID);
610 if (route != nullptr) {
611 myReplacedRoutes.push_back(RouteReplaceInfo(MSEdge::dictionary(edgeID), time, route, info, lastIndex, newIndex));
612 }
613 }
615 bool ok = true;
616 for (const std::string& t : attrs.get<std::vector<std::string> >(SUMO_ATTR_EXITTIMES, nullptr, ok)) {
617 myExits.push_back(StringUtils::toLong(t));
618 }
619 if (attrs.hasAttribute(SUMO_ATTR_EDGE)) {
621 }
622 }
623 if (myHolder.hasDeparted()) {
625 }
626}
627
628
629/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNING(msg)
Definition MsgHandler.h:286
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition Route.h:32
std::string time2string(SUMOTime t, bool humanReadable)
convert SUMOTime to string (independently of global format setting)
Definition SUMOTime.cpp:91
const std::string DEFAULT_VTYPE_ID
const long long int VEHPARS_DEPARTPOSLAT_SET
const long long int VEHPARS_DEPARTSPEED_SET
const long long int VEHPARS_FORCE_REROUTE
@ 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
@ GIVEN
The speed is given.
@ GIVEN_VEHROUTE
The speed is set by the vehroute device.
@ LIMIT
The maximum lane speed is used (speedLimit)
const long long int VEHPARS_DEPARTLANE_SET
const long long int VEHPARS_DEPARTPOS_SET
const int STOP_ENDED_SET
const long long int VEHPARS_SPEEDFACTOR_SET
const int STOP_STARTED_SET
@ SUMO_TAG_DEVICE
@ SUMO_TAG_VEHICLE
description of a vehicle
@ SUMO_TAG_ROUTE_DISTRIBUTION
distribution of a route
@ SUMO_TAG_ROUTE
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.
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 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.
static void writeSortedOutput(SortedRouteInfo *routeInfo, SUMOTime depart, const SUMOTrafficObject::NumericalID id, const std::string &xmlOutput)
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.
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:157
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:200
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:1075
static bool gUseMesoSim
Definition MSGlobals.h:106
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
Definition MSGlobals.h:81
Representation of a lane in the micro simulation.
Definition MSLane.h:84
int getIndex() const
Returns the lane's index.
Definition MSLane.h:653
MSEdge & getEdge() const
Returns the lane's edge.
Definition MSLane.h:775
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:626
@ NEWROUTE
The vehicle got a new route.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition MSNet.cpp:187
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
Definition MSNet.h:334
void addVehicleStateListener(VehicleStateListener *listener)
Adds a vehicle states listener.
Definition MSNet.cpp:1329
bool hasPersons() const
Returns whether persons are simulated.
Definition MSNet.h:409
virtual MSTransportableControl & getPersonControl()
Returns the person control.
Definition MSNet.cpp:1261
bool hasInternalLinks() const
return whether the network contains internal links
Definition MSNet.h:798
double getSavings() const
Returns the estimated savings due to using this route (compare to the route before rerouting)
Definition MSRoute.h:186
static bool dictionary(const std::string &id, ConstMSRoutePtr route)
Adds a route to the dictionary.
Definition MSRoute.cpp:116
static RandomDistributor< ConstMSRoutePtr > * distDictionary(const std::string &id)
Returns the named route distribution.
Definition MSRoute.cpp:168
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:318
double getCosts() const
Returns the costs of the route.
Definition MSRoute.h:178
const MSDevice_Vehroutes::SortedRouteInfo & getRouteInfo()
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
Abstract in-vehicle device.
SUMOVehicle & myHolder
The vehicle that stores the device.
Representation of a vehicle in the micro simulation.
Definition MSVehicle.h:77
const MSLane * getLane() const
Returns the lane the vehicle is on.
Definition MSVehicle.h:581
double getLateralPositionOnLane() const
Get the vehicle's lateral position on the lane.
Definition MSVehicle.h:413
const std::string & getID() const
Returns the name of the vehicle type.
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.
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.
void lf()
writes a line feed if applicable
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
bool isXML() const
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
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.
static bool createDeviceByOption(const std::string &optionName, const std::string &rootElement="", const std::string &schemaFile="", const int maximumDepth=2)
Creates the device using the output definition stored in the named option.
void writeParams(OutputDevice &device) const
write Params in the given outputdevice
Represents a generic random distribution.
const std::vector< T > & getVals() const
Returns the members of the distribution.
const std::vector< double > & getProbs() const
Returns the probabilities assigned to 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 const MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual double getChosenSpeedFactor() const =0
long long int NumericalID
virtual double getSpeed() const =0
Returns the object's current speed.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
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:63
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 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.
virtual const ConstMSEdgeVector::const_iterator & getCurrentRouteEdge() const =0
Returns an iterator pointing to the current edge in this vehicles route.
virtual const MSRoute & getRoute() const =0
Returns the current route.
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 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)
long long int parametersSet
Information for the router which parameter were set, TraCI may modify this (when changing color)
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.
bool wasSet(long long int what) const
Returns whether the given parameter was set.
double departPos
(optional) The position the vehicle shall depart from
DepartSpeedDefinition departSpeedProcedure
Information how the vehicle's initial speed shall be chosen.
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 SUMOTrafficObject::NumericalID, std::string > > routeXML
pregenerated route output sorted by time and creation
OutputDevice * routeOut
route output device