Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
RONet.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-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/****************************************************************************/
20// The router's network representation
21/****************************************************************************/
22#include <config.h>
23
24#include <algorithm>
35#include "ROEdge.h"
36#include "ROLane.h"
37#include "RONode.h"
38#include "ROPerson.h"
39#include "RORoute.h"
40#include "RORouteDef.h"
41#include "ROVehicle.h"
43#include "RONet.h"
44
45
46// ===========================================================================
47// static member definitions
48// ===========================================================================
49RONet* RONet::myInstance = nullptr;
50
51
52// ===========================================================================
53// method definitions
54// ===========================================================================
55RONet*
57 if (myInstance != nullptr) {
58 return myInstance;
59 }
60 throw ProcessError(TL("A network was not yet constructed."));
61}
62
63
65 myVehicleTypes(), myDefaultVTypeMayBeDeleted(true),
66 myDefaultPedTypeMayBeDeleted(true),
67 myDefaultBikeTypeMayBeDeleted(true),
68 myDefaultTaxiTypeMayBeDeleted(true),
69 myDefaultRailTypeMayBeDeleted(true),
70 myHaveActiveFlows(true),
71 myRoutesOutput(nullptr), myRouteAlternativesOutput(nullptr), myTypesOutput(nullptr),
72 myReadRouteNo(0), myDiscardedRouteNo(0), myWrittenRouteNo(0),
73 myHavePermissions(false),
74 myHaveParamRestrictions(false),
75 myNumInternalEdges(0),
76 myErrorHandler(OptionsCont::getOptions().exists("ignore-errors")
77 && OptionsCont::getOptions().getBool("ignore-errors") ? MsgHandler::getWarningInstance() : MsgHandler::getErrorInstance()),
78 myKeepVTypeDist(OptionsCont::getOptions().exists("keep-vtype-distributions")
79 && OptionsCont::getOptions().getBool("keep-vtype-distributions")),
80 myDoPTRouting(!OptionsCont::getOptions().exists("ptline-routing")
81 || OptionsCont::getOptions().getBool("ptline-routing")),
82 myKeepFlows(OptionsCont::getOptions().exists("keep-flows")
83 && OptionsCont::getOptions().getBool("keep-flows")),
84 myHasBidiEdges(false),
85 myMaxTraveltime(OptionsCont::getOptions().exists("max-traveltime") ? STEPS2TIME(string2time(OptionsCont::getOptions().getString("max-traveltime"))) : -1) {
86 if (myInstance != nullptr) {
87 throw ProcessError(TL("A network was already constructed."));
88 }
90 type->onlyReferenced = true;
91 myVehicleTypes.add(type->id, type);
92
94 defPedType->onlyReferenced = true;
96 myVehicleTypes.add(defPedType->id, defPedType);
97
99 defBikeType->onlyReferenced = true;
101 myVehicleTypes.add(defBikeType->id, defBikeType);
102
104 defTaxiType->onlyReferenced = true;
106 myVehicleTypes.add(defTaxiType->id, defTaxiType);
107
109 defRailType->onlyReferenced = true;
111 myVehicleTypes.add(defRailType->id, defRailType);
112
113 myInstance = this;
114}
115
116
118 for (const auto& routables : myRoutables) {
119 for (RORoutable* const r : routables.second) {
120 const ROVehicle* const veh = dynamic_cast<const ROVehicle*>(r);
121 // delete routes and the vehicle
122 if (veh != nullptr && veh->getRouteDefinition()->getID()[0] == '!') {
123 if (!myRoutes.remove(veh->getRouteDefinition()->getID())) {
124 delete veh->getRouteDefinition();
125 }
126 }
127 delete r;
128 }
129 }
130 for (const RORoutable* const r : myPTVehicles) {
131 const ROVehicle* const veh = dynamic_cast<const ROVehicle*>(r);
132 // delete routes and the vehicle
133 if (veh != nullptr && veh->getRouteDefinition()->getID()[0] == '!') {
134 if (!myRoutes.remove(veh->getRouteDefinition()->getID())) {
135 delete veh->getRouteDefinition();
136 }
137 }
138 delete r;
139 }
140 myRoutables.clear();
141 for (const auto& vTypeDist : myVTypeDistDict) {
142 delete vTypeDist.second;
143 }
144}
145
146
147void
148RONet::addSpeedRestriction(const std::string& id, const SUMOVehicleClass svc, const double speed) {
149 mySpeedRestrictions[id][svc] = speed;
150}
151
152
153double
154RONet::getPreference(const std::string& routingType, const SUMOVTypeParameter& pars) const {
156 auto it = myVTypePreferences.find(pars.id);
157 if (it != myVTypePreferences.end()) {
158 auto it2 = it->second.find(routingType);
159 if (it2 != it->second.end()) {
160 return it2->second;
161 }
162 }
163 auto it3 = myVClassPreferences.find(pars.vehicleClass);
164 if (it3 != myVClassPreferences.end()) {
165 auto it4 = it3->second.find(routingType);
166 if (it4 != it3->second.end()) {
167 return it4->second;
168 }
169 }
170 // fallback to generel preferences
171 it = myVTypePreferences.find("");
172 if (it != myVTypePreferences.end()) {
173 auto it2 = it->second.find(routingType);
174 if (it2 != it->second.end()) {
175 return it2->second;
176 }
177 }
178 }
179 return 1;
180}
181
182
183void
184RONet::addPreference(const std::string& routingType, SUMOVehicleClass svc, double prio) {
185 myVClassPreferences[svc][routingType] = prio;
186 gRoutingPreferences = true;
187}
188
189
190void
191RONet::addPreference(const std::string& routingType, std::string vType, double prio) {
192 myVTypePreferences[vType][routingType] = prio;
193 gRoutingPreferences = true;
194}
195
196
197
198const std::map<SUMOVehicleClass, double>*
199RONet::getRestrictions(const std::string& id) const {
200 std::map<std::string, std::map<SUMOVehicleClass, double> >::const_iterator i = mySpeedRestrictions.find(id);
201 if (i == mySpeedRestrictions.end()) {
202 return nullptr;
203 }
204 return &i->second;
205}
206
207
208bool
210 if (!myEdges.add(edge->getID(), edge)) {
211 WRITE_ERRORF(TL("The edge '%' occurs at least twice."), edge->getID());
212 delete edge;
213 return false;
214 }
215 if (edge->isInternal()) {
217 }
218 return true;
219}
220
221
222bool
223RONet::addDistrict(const std::string id, ROEdge* source, ROEdge* sink) {
224 if (myDistricts.count(id) > 0) {
225 WRITE_ERRORF(TL("The TAZ '%' occurs at least twice."), id);
226 delete source;
227 delete sink;
228 return false;
229 }
231 if (!addEdge(sink)) {
232 return false;
233 }
235 if (!addEdge(source)) {
236 return false;
237 }
238 sink->setOtherTazConnector(source);
239 source->setOtherTazConnector(sink);
240 myDistricts[id] = std::make_pair(std::vector<std::string>(), std::vector<std::string>());
241 return true;
242}
243
244
245bool
246RONet::addDistrictEdge(const std::string tazID, const std::string edgeID, const bool isSource) {
247 if (myDistricts.count(tazID) == 0) {
248 WRITE_ERRORF(TL("The TAZ '%' is unknown."), tazID);
249 return false;
250 }
251 ROEdge* edge = getEdge(edgeID);
252 if (edge == nullptr) {
253 WRITE_ERRORF(TL("The edge '%' for TAZ '%' is unknown."), edgeID, tazID);
254 return false;
255 }
256 if (isSource) {
257 getEdge(tazID + "-source")->addSuccessor(edge);
258 myDistricts[tazID].first.push_back(edgeID);
259 } else {
260 edge->addSuccessor(getEdge(tazID + "-sink"));
261 myDistricts[tazID].second.push_back(edgeID);
262 }
263 return true;
264}
265
266
267void
269 for (auto item : myNodes) {
270 const std::string tazID = item.first;
271 if (myDistricts.count(tazID) != 0) {
272 WRITE_WARNINGF(TL("A TAZ with id '%' already exists. Not building junction TAZ."), tazID);
273 continue;
274 }
275 const std::string sourceID = tazID + "-source";
276 const std::string sinkID = tazID + "-sink";
277 // sink must be added before source
278 ROEdge* sink = eb.buildEdge(sinkID, nullptr, nullptr, 0, "", "");
279 ROEdge* source = eb.buildEdge(sourceID, nullptr, nullptr, 0, "", "");
280 sink->setOtherTazConnector(source);
281 source->setOtherTazConnector(sink);
282 if (!addDistrict(tazID, source, sink)) {
283 continue;
284 }
285 auto& district = myDistricts[tazID];
286 const RONode* junction = item.second;
287 for (const ROEdge* edge : junction->getIncoming()) {
288 if (!edge->isInternal()) {
289 const_cast<ROEdge*>(edge)->addSuccessor(sink);
290 district.second.push_back(edge->getID());
291 }
292 }
293 for (const ROEdge* edge : junction->getOutgoing()) {
294 if (!edge->isInternal()) {
295 source->addSuccessor(const_cast<ROEdge*>(edge));
296 district.first.push_back(edge->getID());
297 }
298 }
299 }
300}
301
302
303void
304RONet::setBidiEdges(const std::map<ROEdge*, std::string>& bidiMap) {
305 for (const auto& item : bidiMap) {
306 ROEdge* bidi = myEdges.get(item.second);
307 if (bidi == nullptr) {
308 WRITE_ERRORF(TL("The bidi edge '%' is not known."), item.second);
309 }
310 item.first->setBidiEdge(bidi);
311 myHasBidiEdges = true;
312 }
313}
314
315
316void
318 if (!myNodes.add(node->getID(), node)) {
319 WRITE_ERRORF(TL("The node '%' occurs at least twice."), node->getID());
320 delete node;
321 }
322}
323
324
325void
326RONet::addStoppingPlace(const std::string& id, const SumoXMLTag category, SUMOVehicleParameter::Stop* stop) {
327 if (!myStoppingPlaces[category == SUMO_TAG_TRAIN_STOP ? SUMO_TAG_BUS_STOP : category].add(id, stop)) {
328 WRITE_ERRORF(TL("The % '%' occurs at least twice."), toString(category), id);
329 delete stop;
330 }
331}
332
333
334bool
336 return myRoutes.add(def->getID(), def);
337}
338
339
340void
342 if (options.isSet("output-file") && options.getString("output-file") != "") {
343 myRoutesOutput = &OutputDevice::getDevice(options.getString("output-file"));
344 if (myRoutesOutput->isNull()) {
345 myRoutesOutput = nullptr;
346 } else {
347 myRoutesOutput->writeXMLHeader("routes", "routes_file.xsd");
348 }
349 }
350 if (options.exists("alternatives-output") && options.isSet("alternatives-output")
351 && !(options.exists("write-trips") && options.getBool("write-trips"))) {
352 myRouteAlternativesOutput = &OutputDevice::getDevice(options.getString("alternatives-output"));
355 } else {
356 myRouteAlternativesOutput->writeXMLHeader("routes", "routes_file.xsd");
357 }
358 }
359 if (options.isSet("vtype-output")) {
360 myTypesOutput = &OutputDevice::getDevice(options.getString("vtype-output"));
361 myTypesOutput->writeXMLHeader("routes", "routes_file.xsd");
362 }
363}
364
365
366void
368 if (options.exists("intermodal-network-output") && options.isSet("intermodal-network-output")) {
369 OutputDevice::createDeviceByOption("intermodal-network-output", "intermodal");
370 router.writeNetwork(OutputDevice::getDevice(options.getString("intermodal-network-output")));
371 }
372 if (options.exists("intermodal-weight-output") && options.isSet("intermodal-weight-output")) {
373 OutputDevice::createDeviceByOption("intermodal-weight-output", "weights", "meandata_file.xsd");
374 OutputDevice& dev = OutputDevice::getDeviceByOption("intermodal-weight-output");
376 dev.writeAttr(SUMO_ATTR_ID, "intermodalweights");
379 router.writeWeights(dev);
380 dev.closeTag();
381 }
382}
383
384
385void
387 // end writing
388 if (myRoutesOutput != nullptr) {
390 }
391 // only if opened
392 if (myRouteAlternativesOutput != nullptr) {
394 }
395 // only if opened
396 if (myTypesOutput != nullptr) {
398 }
400#ifdef HAVE_FOX
401 if (myThreadPool.size() > 0) {
402 myThreadPool.clear();
403 }
404#endif
405}
406
407
408
410RONet::getVehicleTypeSecure(const std::string& id) {
411 // check whether the type was already known
413 if (id == DEFAULT_VTYPE_ID) {
415 } else if (id == DEFAULT_PEDTYPE_ID) {
417 } else if (id == DEFAULT_BIKETYPE_ID) {
419 } else if (id == DEFAULT_TAXITYPE_ID) {
421 } else if (id == DEFAULT_RAILTYPE_ID) {
423 }
424 if (type != nullptr) {
425 return type;
426 }
427 VTypeDistDictType::iterator it2 = myVTypeDistDict.find(id);
428 if (it2 != myVTypeDistDict.end()) {
429 return it2->second->get();
430 }
431 if (id == "") {
432 // ok, no vehicle type or an unknown type was given within the user input
433 // return the default type
436 }
437 return type;
438}
439
440
441bool
442RONet::checkVType(const std::string& id) {
443 if (id == DEFAULT_VTYPE_ID) {
447 } else {
448 return false;
449 }
450 } else if (id == DEFAULT_PEDTYPE_ID) {
454 } else {
455 return false;
456 }
457 } else if (id == DEFAULT_BIKETYPE_ID) {
461 } else {
462 return false;
463 }
464 } else if (id == DEFAULT_TAXITYPE_ID) {
468 } else {
469 return false;
470 }
471 } else if (id == DEFAULT_RAILTYPE_ID) {
475 } else {
476 return false;
477 }
478 } else {
479 if (myVehicleTypes.get(id) != 0 || myVTypeDistDict.find(id) != myVTypeDistDict.end()) {
480 return false;
481 }
482 }
483 return true;
484}
485
486
487bool
489 if (checkVType(type->id)) {
490 myVehicleTypes.add(type->id, type);
491 } else {
492 WRITE_ERRORF(TL("The vehicle type '%' occurs at least twice."), type->id);
493 delete type;
494 return false;
495 }
496 return true;
497}
498
499
500bool
501RONet::addVTypeDistribution(const std::string& id, RandomDistributor<SUMOVTypeParameter*>* vehTypeDistribution) {
502 if (checkVType(id)) {
503 myVTypeDistDict[id] = vehTypeDistribution;
504 return true;
505 }
506 delete vehTypeDistribution;
507 return false;
508}
509
510
511bool
512RONet::addVehicle(const std::string& id, ROVehicle* veh) {
513 if (myVehIDs.find(id) == myVehIDs.end()) {
515
516 if (veh->isPublicTransport()) {
517 if (!veh->isPartOfFlow()) {
518 myPTVehicles.push_back(veh);
519 }
520 if (!myDoPTRouting) {
521 return true;
522 }
523 }
524 myRoutables[veh->getDepart()].push_back(veh);
525 return true;
526 }
527 WRITE_ERRORF(TL("Another vehicle with the id '%' exists."), id);
528 delete veh;
529 return false;
530}
531
532
533bool
534RONet::knowsVehicle(const std::string& id) const {
535 return myVehIDs.find(id) != myVehIDs.end();
536}
537
538
539bool
540RONet::knowsVType(const std::string& id) const {
541 return myVehicleTypes.get(id) != nullptr || myVTypeDistDict.find(id) != myVTypeDistDict.end();
542}
543
544
546RONet::getDeparture(const std::string& vehID) const {
547 auto it = myVehIDs.find(vehID);
548 if (it != myVehIDs.end()) {
549 return it->second;
550 } else {
551 throw ProcessError(TLF("Requesting departure time for unknown vehicle '%'", vehID));
552 }
553}
554
555
556bool
557RONet::addFlow(SUMOVehicleParameter* flow, const bool randomize) {
558 if (randomize && flow->repetitionOffset >= 0) {
559 myDepartures[flow->id].reserve(flow->repetitionNumber);
560 for (int i = 0; i < flow->repetitionNumber; ++i) {
561 myDepartures[flow->id].push_back(flow->depart + RandHelper::rand(flow->repetitionNumber * flow->repetitionOffset));
562 }
563 std::sort(myDepartures[flow->id].begin(), myDepartures[flow->id].end());
564 std::reverse(myDepartures[flow->id].begin(), myDepartures[flow->id].end());
565 } else if (flow->repetitionOffset < 0) {
566 // init poisson flow (but only the timing)
567 flow->incrementFlow(1);
568 flow->repetitionsDone--;
569 }
570 const bool added = myFlows.add(flow->id, flow);
571 if (added) {
572 myHaveActiveFlows = true;
573 }
574 return added;
575}
576
577
578bool
580 if (myPersonIDs.count(person->getID()) == 0) {
581 myPersonIDs.insert(person->getID());
582 myRoutables[person->getDepart()].push_back(person);
583 return true;
584 }
585 WRITE_ERRORF(TL("Another person with the id '%' exists."), person->getID());
586 return false;
587}
588
589
590void
591RONet::addContainer(const SUMOTime depart, const std::string desc) {
592 myContainers.insert(std::pair<const SUMOTime, const std::string>(depart, desc));
593}
594
595
596void
598 myHaveActiveFlows = false;
599 for (const auto& i : myFlows) {
600 SUMOVehicleParameter* const pars = i.second;
601 if (pars->line != "" && !myDoPTRouting) {
602 continue;
603 }
604 if (myKeepFlows) {
605 if (pars->repetitionsDone < pars->repetitionNumber) {
606 // each each flow only once
607 pars->repetitionsDone = pars->repetitionNumber;
609 if (type == nullptr) {
611 } else {
612 auto dist = getVTypeDistribution(pars->vtypeid);
613 if (dist != nullptr) {
614 WRITE_WARNINGF("Keeping flow '%' with a vTypeDistribution can lead to invalid routes if the distribution contains different vClasses", pars->id);
615 }
616 }
617 RORouteDef* route = getRouteDef(pars->routeid)->copy(pars->routeid, pars->depart);
618 ROVehicle* veh = new ROVehicle(*pars, route, type, this, errorHandler);
619 addVehicle(pars->id, veh);
620 }
621 } else if (pars->repetitionProbability > 0) {
622 if (pars->repetitionEnd > pars->depart && pars->repetitionsDone < pars->repetitionNumber) {
623 myHaveActiveFlows = true;
624 }
625 const SUMOTime origDepart = pars->depart;
626 while (pars->depart < time && pars->repetitionsDone < pars->repetitionNumber) {
627 if (pars->repetitionEnd <= pars->depart) {
628 break;
629 }
630 // only call rand if all other conditions are met
631 if (RandHelper::rand() < (pars->repetitionProbability * TS)) {
632 SUMOVehicleParameter* newPars = new SUMOVehicleParameter(*pars);
633 newPars->id = pars->id + "." + toString(pars->repetitionsDone);
634 newPars->depart = pars->depart;
635 for (StopParVector::iterator stop = newPars->stops.begin(); stop != newPars->stops.end(); ++stop) {
636 if (stop->until >= 0) {
637 stop->until += pars->depart - origDepart;
638 }
639 if (stop->arrival >= 0) {
640 stop->arrival += pars->depart - origDepart;
641 }
642 }
643 pars->repetitionsDone++;
644 // try to build the vehicle
646 if (type == nullptr) {
648 } else if (!myKeepVTypeDist) {
649 // fix the type id in case we used a distribution
650 newPars->vtypeid = type->id;
651 }
652 const SUMOTime stopOffset = pars->routeid[0] == '!' ? pars->depart - origDepart : pars->depart;
653 RORouteDef* route = getRouteDef(pars->routeid)->copy("!" + newPars->id, stopOffset);
654 ROVehicle* veh = new ROVehicle(*newPars, route, type, this, errorHandler);
655 addVehicle(newPars->id, veh);
656 delete newPars;
657 }
658 pars->depart += DELTA_T;
659 }
660 } else {
661 SUMOTime depart = static_cast<SUMOTime>(pars->depart + pars->repetitionTotalOffset);
662 while (pars->repetitionsDone < pars->repetitionNumber && pars->repetitionEnd >= depart) {
663 myHaveActiveFlows = true;
664 depart = static_cast<SUMOTime>(pars->depart + pars->repetitionTotalOffset);
665 if (myDepartures.find(pars->id) != myDepartures.end()) {
666 depart = myDepartures[pars->id].back();
667 }
668 if (depart >= time + DELTA_T) {
669 break;
670 }
671 if (myDepartures.find(pars->id) != myDepartures.end()) {
672 myDepartures[pars->id].pop_back();
673 }
674 SUMOVehicleParameter* newPars = new SUMOVehicleParameter(*pars);
675 newPars->id = pars->id + "." + toString(pars->repetitionsDone);
676 newPars->depart = depart;
677 for (StopParVector::iterator stop = newPars->stops.begin(); stop != newPars->stops.end(); ++stop) {
678 if (stop->until >= 0) {
679 stop->until += depart - pars->depart;
680 }
681 if (stop->arrival >= 0) {
682 stop->arrival += depart - pars->depart;
683 }
684 }
685 pars->incrementFlow(1);
686 // try to build the vehicle
688 if (type == nullptr) {
690 } else if (!myKeepVTypeDist) {
691 // fix the type id in case we used a distribution
692 newPars->vtypeid = type->id;
693 }
694 const SUMOTime stopOffset = pars->routeid[0] == '!' ? depart - pars->depart : depart;
695 RORouteDef* route = getRouteDef(pars->routeid)->copy("!" + newPars->id, stopOffset);
696 ROVehicle* veh = new ROVehicle(*newPars, route, type, this, errorHandler);
697 addVehicle(newPars->id, veh);
698 delete newPars;
699 }
700 }
701 }
702}
703
704
705void
706RONet::createBulkRouteRequests(const RORouterProvider& provider, const SUMOTime time, const bool removeLoops) {
707 std::map<const int, std::vector<RORoutable*> > bulkVehs;
708 int numBulked = 0;
709 for (RoutablesMap::const_iterator i = myRoutables.begin(); i != myRoutables.end(); ++i) {
710 if (i->first >= time) {
711 break;
712 }
713 for (RORoutable* const routable : i->second) {
714 const ROEdge* const depEdge = routable->getDepartEdge();
715 bulkVehs[depEdge->getNumericalID()].push_back(routable);
716 RORoutable* const first = bulkVehs[depEdge->getNumericalID()].front();
717 numBulked++;
718 if (first->getMaxSpeed() != routable->getMaxSpeed()) {
719 WRITE_WARNINGF(TL("Bulking different maximum speeds ('%' and '%') may lead to suboptimal routes."), first->getID(), routable->getID());
720 }
721 if (first->getVClass() != routable->getVClass()) {
722 WRITE_WARNINGF(TL("Bulking different vehicle classes ('%' and '%') may lead to invalid routes."), first->getID(), routable->getID());
723 }
724 }
725 }
726#ifdef HAVE_FOX
727 int workerIndex = 0;
728#endif
729 if ((int)bulkVehs.size() < numBulked) {
730 WRITE_MESSAGE(TLF("Using bulk-mode for % entities from % origins", numBulked, bulkVehs.size()));
731 }
732 for (std::map<const int, std::vector<RORoutable*> >::const_iterator i = bulkVehs.begin(); i != bulkVehs.end(); ++i) {
733#ifdef HAVE_FOX
734 if (myThreadPool.size() > 0) {
735 bool bulk = true;
736 for (RORoutable* const r : i->second) {
737 myThreadPool.add(new RoutingTask(r, removeLoops, myErrorHandler), workerIndex);
738 if (bulk) {
739 myThreadPool.add(new BulkmodeTask(true), workerIndex);
740 bulk = false;
741 }
742 }
743 myThreadPool.add(new BulkmodeTask(false), workerIndex);
744 workerIndex++;
745 if (workerIndex == (int)myThreadPool.size()) {
746 workerIndex = 0;
747 }
748 continue;
749 }
750#endif
751 for (RORoutable* const r : i->second) {
752 r->computeRoute(provider, removeLoops, myErrorHandler);
753 provider.setBulkMode(true);
754 }
755 provider.setBulkMode(false);
756 }
757}
758
759
762 SUMOTime time) {
763 MsgHandler* mh = (options.getBool("ignore-errors") ?
765 if (myHaveActiveFlows) {
766 checkFlows(time, mh);
767 }
768 SUMOTime lastTime = -1;
769 const bool removeLoops = options.getBool("remove-loops");
770#ifdef HAVE_FOX
771 const int maxNumThreads = options.getInt("routing-threads");
772#endif
773 if (myRoutables.size() != 0) {
774 if (options.getBool("bulk-routing")) {
775#ifdef HAVE_FOX
776 while ((int)myThreadPool.size() < maxNumThreads) {
777 new WorkerThread(myThreadPool, provider);
778 }
779#endif
780 createBulkRouteRequests(provider, time, removeLoops);
781 } else {
782 for (RoutablesMap::const_iterator i = myRoutables.begin(); i != myRoutables.end(); ++i) {
783 if (i->first >= time) {
784 break;
785 }
786 for (RORoutable* const routable : i->second) {
787#ifdef HAVE_FOX
788 // add task
789 if (maxNumThreads > 0) {
790 const int numThreads = (int)myThreadPool.size();
791 if (numThreads == 0) {
792 // This is the very first routing. Since at least the CHRouter needs initialization
793 // before it gets cloned, we do not do this in parallel
794 routable->computeRoute(provider, removeLoops, myErrorHandler);
795 new WorkerThread(myThreadPool, provider);
796 } else {
797 // add thread if necessary
798 if (numThreads < maxNumThreads && myThreadPool.isFull()) {
799 new WorkerThread(myThreadPool, provider);
800 }
801 myThreadPool.add(new RoutingTask(routable, removeLoops, myErrorHandler));
802 }
803 continue;
804 }
805#endif
806 routable->computeRoute(provider, removeLoops, myErrorHandler);
807 }
808 }
809 }
810#ifdef HAVE_FOX
811 myThreadPool.waitAll();
812#endif
813 }
814 const double scale = options.exists("scale-suffix") ? options.getFloat("scale") : 1;
815 // write all vehicles (and additional structures)
816 while (myRoutables.size() != 0 || myContainers.size() != 0) {
817 // get the next vehicle, person or container
818 RoutablesMap::iterator routables = myRoutables.begin();
819 const SUMOTime routableTime = routables == myRoutables.end() ? SUMOTime_MAX : routables->first;
820 ContainerMap::iterator container = myContainers.begin();
821 const SUMOTime containerTime = container == myContainers.end() ? SUMOTime_MAX : container->first;
822 // check whether it shall not yet be computed
823 if (routableTime >= time && containerTime >= time) {
824 lastTime = MIN2(routableTime, containerTime);
825 break;
826 }
827 const SUMOTime minTime = MIN2(routableTime, containerTime);
829 if (routableTime == minTime) {
830 // check whether to print the output
831 if (lastTime != routableTime && lastTime != -1) {
832 // report writing progress
833 if (options.getInt("stats-period") >= 0 && ((int)routableTime % options.getInt("stats-period")) == 0) {
834 WRITE_MESSAGE("Read: " + toString(myVehIDs.size()) + ", Discarded: " + toString(myDiscardedRouteNo) + ", Written: " + toString(myWrittenRouteNo));
835 }
836 }
837 lastTime = routableTime;
838 for (const RORoutable* const r : routables->second) {
839 // ok, check whether it has been routed
840 if (r->getRoutingSuccess()) {
841 // write the route
842 int quota = getScalingQuota(scale, myWrittenRouteNo);
843 r->write(myRoutesOutput, myRouteAlternativesOutput, myTypesOutput, options, quota);
845 } else {
847 }
848 // we need to keep individual public transport vehicles but not the flows
849 if (!r->isPublicTransport() || r->isPartOfFlow()) {
850 // delete routes and the vehicle
851 const ROVehicle* const veh = dynamic_cast<const ROVehicle*>(r);
852 if (veh != nullptr && veh->getRouteDefinition()->getID()[0] == '!') {
853 if (r->isPartOfFlow() || !myRoutes.remove(veh->getRouteDefinition()->getID())) {
854 delete veh->getRouteDefinition();
855 }
856 }
857 delete r;
858 }
859 }
860 myRoutables.erase(routables);
861 }
862 if (containerTime == minTime) {
863 myRoutesOutput->writePreformattedTag(container->second);
864 if (myRouteAlternativesOutput != nullptr) {
866 }
867 myContainers.erase(container);
868 }
869 }
870 return lastTime;
871}
872
873
874bool
876 return myRoutables.size() > 0 || (myFlows.size() > 0 && myHaveActiveFlows) || myContainers.size() > 0;
877}
878
879
880int
882 return myEdges.size();
883}
884
885
886int
890
891
892ROEdge*
893RONet::getEdgeForLaneID(const std::string& laneID) const {
895}
896
897
898ROLane*
899RONet::getLane(const std::string& laneID) const {
900 int laneIndex = SUMOXMLDefinitions::getIndexFromLane(laneID);
901 return getEdgeForLaneID(laneID)->getLanes()[laneIndex];
902}
903
904
905void
907 double taxiWait = STEPS2TIME(string2time(OptionsCont::getOptions().getString("persontrip.taxi.waiting-time")));
908 for (const auto& stopType : myInstance->myStoppingPlaces) {
909 // add access to all stopping places
910 const SumoXMLTag element = stopType.first;
911 for (const auto& stop : stopType.second) {
912 router.getNetwork()->addAccess(stop.first, myInstance->getEdgeForLaneID(stop.second->lane),
913 stop.second->startPos, stop.second->endPos, 0., element, false, taxiWait);
914 // add access to all public transport stops
915 if (element == SUMO_TAG_BUS_STOP) {
916 for (const auto& a : stop.second->accessPos) {
917 router.getNetwork()->addAccess(stop.first, myInstance->getEdgeForLaneID(std::get<0>(a)),
918 std::get<1>(a), std::get<1>(a), std::get<2>(a), SUMO_TAG_BUS_STOP, true, taxiWait);
919 }
920 }
921 }
922 }
923 // fill the public transport router with pre-parsed public transport lines
924 for (const auto& i : myInstance->myFlows) {
925 if (i.second->line != "") {
926 const RORouteDef* const route = myInstance->getRouteDef(i.second->routeid);
927 const StopParVector* addStops = nullptr;
928 if (route != nullptr && route->getFirstRoute() != nullptr) {
929 addStops = &route->getFirstRoute()->getStops();
930 }
931 router.getNetwork()->addSchedule(*i.second, addStops);
932 }
933 }
934 for (const RORoutable* const veh : myInstance->myPTVehicles) {
935 // add single vehicles with line attribute which are not part of a flow
936 // no need to add route stops here, they have been added to the vehicle before
937 router.getNetwork()->addSchedule(veh->getParameter());
938 }
939 // add access to transfer from walking to taxi-use
941 for (const ROEdge* edge : ROEdge::getAllEdges()) {
942 if (!edge->isTazConnector() && (edge->getPermissions() & SVC_PEDESTRIAN) != 0 && (edge->getPermissions() & SVC_TAXI) != 0) {
943 router.getNetwork()->addCarAccess(edge, SVC_TAXI, taxiWait);
944 }
945 }
946 }
947}
948
949
950bool
952 return myHavePermissions;
953}
954
955
956void
960
961bool
963 for (const auto& item : myEdges) {
964 if (item.second->hasStoredEffort()) {
965 return true;
966 }
967 }
968 return false;
969}
970
971const std::string
972RONet::getStoppingPlaceName(const std::string& id) const {
973 for (const auto& mapItem : myStoppingPlaces) {
974 SUMOVehicleParameter::Stop* stop = mapItem.second.get(id);
975 if (stop != nullptr) {
976 // see RONetHandler::parseStoppingPlace
977 return stop->busstop;
978 }
979 }
980 return "";
981}
982
983const std::string
984RONet::getStoppingPlaceElement(const std::string& id) const {
985 for (const auto& mapItem : myStoppingPlaces) {
986 SUMOVehicleParameter::Stop* stop = mapItem.second.get(id);
987 if (stop != nullptr) {
988 // see RONetHandler::parseStoppingPlace
989 return stop->actType;
990 }
991 }
993}
994
995
996void
997RONet::addProhibition(const ROEdge* edge, const RouterProhibition& prohibition) {
998 if (myProhibitions.count(edge) != 0) {
999 throw ProcessError(TLF("Already loaded prohibition for edge '%'. (Only one prohibition per edge is supported)", edge->getID()));
1000 }
1001 myProhibitions[edge] = prohibition;
1002 myHavePermissions = true;
1003}
1004
1005
1006void
1007RONet::addLaneProhibition(const ROLane* lane, const RouterProhibition& prohibition) {
1008 if (myLaneProhibitions.count(lane) != 0) {
1009 throw ProcessError(TLF("Already loaded prohibition for lane '%'. (Only one prohibition per lane is supported)", lane->getID()));
1010 }
1011 assert(prohibition.end > prohibition.begin);
1012 myLaneProhibitions[lane] = prohibition;
1013 myLaneProhibitionTimes[prohibition.begin].insert(lane);
1014 myHavePermissions = true;
1015}
1016
1017
1018void
1020 const double beginS = STEPS2TIME(begin);
1021 while (myLaneProhibitionTimes.size() > 0 && myLaneProhibitionTimes.begin()->first <= beginS) {
1022 const double t = myLaneProhibitionTimes.begin()->first;
1023 for (const ROLane* const lane : myLaneProhibitionTimes.begin()->second) {
1024 const SVCPermissions orig = lane->getPermissions();
1025 assert(myLaneProhibitions.count(lane) != 0);
1027 const_cast<ROLane*>(lane)->setPermissions(rp.permissions);
1028 lane->getEdge().resetSuccessors();
1029 for (ROEdge* pred : lane->getEdge().getPredecessors()) {
1030 pred->resetSuccessors();
1031 }
1032 if (t == rp.begin) {
1033 // schedule restoration of original permissions. This works
1034 // without a stack because there is at most one prohibition per lane
1035 myLaneProhibitionTimes[rp.end].insert(lane);
1036 rp.permissions = orig;
1037 }
1038 }
1040 }
1041}
1042
1043
1044#ifdef HAVE_FOX
1045// ---------------------------------------------------------------------------
1046// RONet::RoutingTask-methods
1047// ---------------------------------------------------------------------------
1048void
1049RONet::RoutingTask::run(MFXWorkerThread* context) {
1050 myRoutable->computeRoute(*static_cast<WorkerThread*>(context), myRemoveLoops, myErrorHandler);
1051}
1052#endif
1053
1054
1055/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
@ TAXI_PICKUP_ANYWHERE
taxi customer may be picked up anywhere
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:287
#define WRITE_ERRORF(...)
Definition MsgHandler.h:296
#define WRITE_MESSAGE(msg)
Definition MsgHandler.h:288
#define TL(string)
Definition MsgHandler.h:304
#define TLF(string,...)
Definition MsgHandler.h:306
SUMOTime DELTA_T
Definition SUMOTime.cpp:39
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition SUMOTime.cpp:47
#define STEPS2TIME(x)
Definition SUMOTime.h:58
#define SUMOTime_MAX
Definition SUMOTime.h:34
#define TS
Definition SUMOTime.h:45
const long long int VTYPEPARS_VEHICLECLASS_SET
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
const std::string DEFAULT_TAXITYPE_ID
const std::string DEFAULT_RAILTYPE_ID
const std::string DEFAULT_PEDTYPE_ID
const std::string DEFAULT_VTYPE_ID
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_RAIL
vehicle is a not electrified rail
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_TAXI
vehicle is a taxi
@ SVC_PEDESTRIAN
pedestrian
const std::string DEFAULT_BIKETYPE_ID
std::vector< SUMOVehicleParameter::Stop > StopParVector
@ TRIGGERED
The departure is person triggered.
SumoXMLTag
Numbers representing SUMO-XML - element names.
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_BUS_STOP
A bus stop.
@ SUMO_TAG_TRAIN_STOP
A train stop (alias for bus stop)
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_END
weights: time range end
@ SUMO_ATTR_ID
bool gRoutingPreferences
Definition StdDefs.cpp:37
int getScalingQuota(double frac, long long int loaded)
Returns the number of instances of the current object that shall be emitted given the number of loade...
Definition StdDefs.cpp:73
T MIN2(T a, T b)
Definition StdDefs.h:80
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:57
void addCarAccess(const E *edge, SUMOVehicleClass svc, double traveltime)
Adds access edges for transfering from walking to vehicle use.
void addAccess(const std::string &stopId, const E *stopEdge, const double startPos, const double endPos, const double length, const SumoXMLTag category, bool isAccess, double taxiWait)
Adds access edges for stopping places to the intermodal network.
void addSchedule(const SUMOVehicleParameter &pars, const StopParVector *addStops=nullptr)
Network * getNetwork() const
void writeWeights(OutputDevice &dev)
int getCarWalkTransfer() const
void writeNetwork(OutputDevice &dev)
A thread repeatingly calculating incoming tasks.
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
const std::string & getID() const
Returns the id.
Definition Named.h:73
T get(const std::string &id) const
Retrieves an item.
int size() const
Returns the number of stored items within the container.
bool remove(const std::string &id, const bool del=true)
Removes an item.
bool add(const std::string &id, T item)
Adds an item.
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.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool exists(const std::string &name) const
Returns the information whether the named option is known.
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.
Static storage of an output device and its base (abstract) implementation.
OutputDevice & writePreformattedTag(const std::string &val)
writes a preformatted tag to the device but ensures that any pending tags are closed
void close()
Closes the device and removes it from the dictionary.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
OutputDevice & writeAttr(const ATTR_TYPE &attr, const T &val, const bool isNull=false, const bool escape=false)
writes a named attribute
virtual bool isNull()
returns the information whether the device will discard all output
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.
static OutputDevice & getDevice(const std::string &name, bool usePrefix=true)
Returns the described OutputDevice.
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.
bool writeXMLHeader(const std::string &rootElement, const std::string &schemaFile, std::map< SumoXMLAttr, std::string > attrs=std::map< SumoXMLAttr, std::string >(), bool includeConfig=true)
Writes an XML header with optional configuration.
Interface for building instances of router-edges.
virtual ROEdge * buildEdge(const std::string &name, RONode *from, RONode *to, const int priority, const std::string &type, const std::string &routingType)=0
Builds an edge with the given name.
A basic edge for routing applications.
Definition ROEdge.h:73
void resetSuccessors()
reset after lane permissions changes
Definition ROEdge.h:347
int getNumericalID() const
Returns the index (numeric id) of the edge.
Definition ROEdge.h:232
void setFunction(SumoXMLEdgeFunc func)
Sets the function of the edge.
Definition ROEdge.h:118
bool isInternal() const
return whether this edge is an internal edge
Definition ROEdge.h:160
void setOtherTazConnector(const ROEdge *edge)
Definition ROEdge.h:178
const std::vector< ROLane * > & getLanes() const
Returns this edge's lanes.
Definition ROEdge.h:569
virtual void addSuccessor(ROEdge *s, ROEdge *via=nullptr, std::string dir="")
Adds information about a connected edge.
Definition ROEdge.cpp:137
static const ROEdgeVector & getAllEdges()
Returns all ROEdges.
Definition ROEdge.cpp:377
A single lane the router may use.
Definition ROLane.h:48
ROEdge & getEdge() const
Returns the lane's edge.
Definition ROLane.h:97
The router's network representation.
Definition RONet.h:63
bool knowsVType(const std::string &id) const
returns whether a vehicle type or distribution with the given id was already loaded
Definition RONet.cpp:540
void createBulkRouteRequests(const RORouterProvider &provider, const SUMOTime time, const bool removeLoops)
Definition RONet.cpp:706
SUMOVTypeParameter * getVehicleTypeSecure(const std::string &id)
Retrieves the named vehicle type.
Definition RONet.cpp:410
static RONet * getInstance()
Returns the pointer to the unique instance of RONet (singleton).
Definition RONet.cpp:56
bool myHaveProcessedRoutes
Definition RONet.h:624
int myNumInternalEdges
The number of internal edges in the dictionary.
Definition RONet.h:640
bool myDefaultPedTypeMayBeDeleted
Whether the default pedestrian type was already used or can still be replaced.
Definition RONet.h:568
void setPermissionsFound()
Definition RONet.cpp:957
void updateLaneProhibitions(SUMOTime begin)
Definition RONet.cpp:1019
bool myDefaultRailTypeMayBeDeleted
Whether the default rail type was already used or can still be replaced.
Definition RONet.h:577
std::map< std::string, std::map< SUMOVehicleClass, double > > mySpeedRestrictions
The vehicle class specific speed restrictions.
Definition RONet.h:630
bool myDefaultVTypeMayBeDeleted
Whether the default vehicle type was already used or can still be replaced.
Definition RONet.h:565
void checkFlows(SUMOTime time, MsgHandler *errorHandler)
Definition RONet.cpp:597
std::map< SUMOVehicleClass, std::map< std::string, double > > myVClassPreferences
Preferences for routing.
Definition RONet.h:636
std::map< double, std::set< const ROLane * > > myLaneProhibitionTimes
Definition RONet.h:664
const std::map< SUMOVehicleClass, double > * getRestrictions(const std::string &id) const
Returns the restrictions for an edge type If no restrictions are present, 0 is returned.
Definition RONet.cpp:199
const RandomDistributor< SUMOVTypeParameter * > * getVTypeDistribution(const std::string &id)
Retrieves the named vehicle type distribution.
Definition RONet.h:302
double getPreference(const std::string &routingType, const SUMOVTypeParameter &pars) const
retriefe edge type specific routing preference
Definition RONet.cpp:154
ContainerMap myContainers
Definition RONet.h:593
std::set< std::string > myPersonIDs
Known person ids.
Definition RONet.h:545
std::map< std::string, std::pair< std::vector< std::string >, std::vector< std::string > > > myDistricts
traffic assignment zones with sources and sinks
Definition RONet.h:602
bool addRouteDef(RORouteDef *def)
Definition RONet.cpp:335
void addStoppingPlace(const std::string &id, const SumoXMLTag category, SUMOVehicleParameter::Stop *stop)
Definition RONet.cpp:326
bool knowsVehicle(const std::string &id) const
returns whether a vehicle with the given id was already loaded
Definition RONet.cpp:534
void cleanup()
closes the file output for computed routes and deletes associated threads if necessary
Definition RONet.cpp:386
bool myHaveActiveFlows
whether any flows are still active
Definition RONet.h:589
std::map< std::string, SUMOTime > myVehIDs
Known vehicle ids and their departure.
Definition RONet.h:542
void openOutput(const OptionsCont &options)
Opens the output for computed routes.
Definition RONet.cpp:341
NamedObjectCont< SUMOVehicleParameter * > myFlows
Known flows.
Definition RONet.h:586
OutputDevice * myRouteAlternativesOutput
The file to write the computed route alternatives into.
Definition RONet.h:608
bool myDefaultBikeTypeMayBeDeleted
Whether the default bicycle type was already used or can still be replaced.
Definition RONet.h:571
RoutablesMap myRoutables
Known routables.
Definition RONet.h:583
int getInternalEdgeNumber() const
Returns the number of internal edges the network contains.
Definition RONet.cpp:887
virtual bool addVehicle(const std::string &id, ROVehicle *veh)
Definition RONet.cpp:512
SUMOTime getDeparture(const std::string &vehID) const
returns departure time for the given vehicle id
Definition RONet.cpp:546
bool myHasBidiEdges
whether the network contains bidirectional railway edges
Definition RONet.h:655
bool addDistrictEdge(const std::string tazID, const std::string edgeID, const bool isSource)
Definition RONet.cpp:246
void addSpeedRestriction(const std::string &id, const SUMOVehicleClass svc, const double speed)
Adds a restriction for an edge type.
Definition RONet.cpp:148
MsgHandler * myErrorHandler
handler for ignorable error messages
Definition RONet.h:643
void writeIntermodal(const OptionsCont &options, ROIntermodalRouter &router) const
Writes the intermodal network and weights if requested.
Definition RONet.cpp:367
RONet()
Constructor.
Definition RONet.cpp:64
NamedObjectCont< RONode * > myNodes
Known nodes.
Definition RONet.h:548
const std::string getStoppingPlaceElement(const std::string &id) const
return the element name for the given stopping place id
Definition RONet.cpp:984
void addContainer(const SUMOTime depart, const std::string desc)
Definition RONet.cpp:591
void addProhibition(const ROEdge *edge, const RouterProhibition &prohibition)
Definition RONet.cpp:997
static void adaptIntermodalRouter(ROIntermodalRouter &router)
Definition RONet.cpp:906
ROEdge * getEdge(const std::string &name) const
Retrieves an edge from the network.
Definition RONet.h:179
NamedObjectCont< RORouteDef * > myRoutes
Known routes.
Definition RONet.h:580
bool furtherStored()
Returns the information whether further vehicles, persons or containers are stored.
Definition RONet.cpp:875
bool checkVType(const std::string &id)
Checks whether the vehicle type (distribution) may be added.
Definition RONet.cpp:442
OutputDevice * myRoutesOutput
The file to write the computed routes into.
Definition RONet.h:605
bool addPerson(ROPerson *person)
Definition RONet.cpp:579
int myWrittenRouteNo
The number of written routes.
Definition RONet.h:620
static RONet * myInstance
Unique instance of RONet.
Definition RONet.h:539
RORouteDef * getRouteDef(const std::string &name) const
Returns the named route definition.
Definition RONet.h:340
SUMOTime saveAndRemoveRoutesUntil(OptionsCont &options, const RORouterProvider &provider, SUMOTime time)
Computes routes described by their definitions and saves them.
Definition RONet.cpp:761
void addLaneProhibition(const ROLane *lane, const RouterProhibition &prohibition)
Definition RONet.cpp:1007
virtual bool addEdge(ROEdge *edge)
Definition RONet.cpp:209
bool myDefaultTaxiTypeMayBeDeleted
Whether the default taxi type was already used or can still be replaced.
Definition RONet.h:574
std::map< SumoXMLTag, NamedObjectCont< SUMOVehicleParameter::Stop * > > myStoppingPlaces
Known bus / train / container stops and parking areas.
Definition RONet.h:554
virtual bool addVehicleType(SUMOVTypeParameter *type)
Adds a read vehicle type definition to the network.
Definition RONet.cpp:488
bool myHavePermissions
Whether the network contains edges which not all vehicles may pass.
Definition RONet.h:627
bool hasPermissions() const
Definition RONet.cpp:951
void setBidiEdges(const std::map< ROEdge *, std::string > &bidiMap)
add a taz for every junction unless a taz with the same id already exists
Definition RONet.cpp:304
ROLane * getLane(const std::string &laneID) const
Retrieves a lane rom the network given its id.
Definition RONet.cpp:899
int myDiscardedRouteNo
The number of discarded routes.
Definition RONet.h:617
VTypeDistDictType myVTypeDistDict
A distribution of vehicle types (probability->vehicle type)
Definition RONet.h:562
std::vector< const RORoutable * > myPTVehicles
vehicles to keep for public transport routing
Definition RONet.h:596
NamedObjectCont< ROEdge * > myEdges
Known edges.
Definition RONet.h:551
LaneProhibitions myLaneProhibitions
temporary lane closing (rerouters)
Definition RONet.h:663
void addNode(RONode *node)
Definition RONet.cpp:317
bool addVTypeDistribution(const std::string &id, RandomDistributor< SUMOVTypeParameter * > *vehTypeDistribution)
Adds a vehicle type distribution.
Definition RONet.cpp:501
void addJunctionTaz(ROAbstractEdgeBuilder &eb)
add a taz for every junction unless a taz with the same id already exists
Definition RONet.cpp:268
OutputDevice * myTypesOutput
The file to write the vehicle types into.
Definition RONet.h:611
const bool myKeepFlows
whether to preserve flows
Definition RONet.h:652
const bool myDoPTRouting
whether to calculate routes for public transport
Definition RONet.h:649
Prohibitions myProhibitions
temporary edge closing (rerouters)
Definition RONet.h:661
const bool myKeepVTypeDist
whether to keep the vtype distribution in output
Definition RONet.h:646
virtual ~RONet()
Destructor.
Definition RONet.cpp:117
const std::string getStoppingPlaceName(const std::string &id) const
return the name for the given stopping place id
Definition RONet.cpp:972
std::map< std::string, std::vector< SUMOTime > > myDepartures
Departure times for randomized flows.
Definition RONet.h:599
int getEdgeNumber() const
Returns the total number of edges the network contains including internal edges.
Definition RONet.cpp:881
ROEdge * getEdgeForLaneID(const std::string &laneID) const
Retrieves an edge from the network when the lane id is given.
Definition RONet.cpp:893
std::map< std::string, std::map< std::string, double > > myVTypePreferences
Definition RONet.h:637
bool addFlow(SUMOVehicleParameter *flow, const bool randomize)
Definition RONet.cpp:557
bool hasLoadedEffort() const
whether efforts were loaded from file
Definition RONet.cpp:962
void addPreference(const std::string &routingType, SUMOVehicleClass svc, double prio)
add edge type specific routing preference
Definition RONet.cpp:184
NamedObjectCont< SUMOVTypeParameter * > myVehicleTypes
Known vehicle types.
Definition RONet.h:557
bool addDistrict(const std::string id, ROEdge *source, ROEdge *sink)
Definition RONet.cpp:223
Base class for nodes used by the router.
Definition RONode.h:46
const ConstROEdgeVector & getOutgoing() const
Definition RONode.h:76
const ConstROEdgeVector & getIncoming() const
Definition RONode.h:72
A person as used by router.
Definition ROPerson.h:50
A routable thing such as a vehicle or person.
Definition RORoutable.h:53
SUMOVehicleClass getVClass() const
Definition RORoutable.h:127
bool isPublicTransport() const
Definition RORoutable.h:147
bool isPartOfFlow() const
Definition RORoutable.h:151
SUMOTime getDepart() const
Returns the time the vehicle starts at, -1 for triggered vehicles.
Definition RORoutable.h:118
const std::string & getID() const
Returns the id of the routable.
Definition RORoutable.h:98
const SUMOVehicleParameter & getParameter() const
Returns the definition of the vehicle / person parameter.
Definition RORoutable.h:75
double getMaxSpeed() const
Returns the vehicle's maximum speed.
Definition RORoutable.h:139
Base class for a vehicle's route definition.
Definition RORouteDef.h:54
std::shared_ptr< const RORoute > getFirstRoute() const
Definition RORouteDef.h:108
RORouteDef * copy(const std::string &id, const SUMOTime stopOffset) const
Returns a deep copy of the route definition.
A vehicle as used by router.
Definition ROVehicle.h:51
SUMOTime getDepartureTime() const
Returns the time the vehicle starts at, 0 for triggered vehicles.
Definition ROVehicle.h:93
RORouteDef * getRouteDefinition() const
Returns the definition of the route the vehicle takes.
Definition ROVehicle.h:74
static double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
Represents a generic random distribution.
void setBulkMode(const bool mode) const
Structure representing possible vehicle parameter.
long long int parametersSet
Information for the router which parameter were set.
bool onlyReferenced
Information whether this is a type-stub, being only referenced but not defined (needed by routers)
SUMOVehicleClass vehicleClass
The vehicle's class.
std::string id
The vehicle type's id.
Definition of vehicle stop (position and duration)
std::string actType
act Type (only used by Persons) (used by netedit)
std::string busstop
(Optional) bus stop if one is assigned to the stop
Structure representing possible vehicle parameter.
double repetitionProbability
The probability for emitting a vehicle per second.
void incrementFlow(double scale, SumoRNG *rng=nullptr)
increment flow
std::string vtypeid
The vehicle's type id.
SUMOTime repetitionOffset
The time offset between vehicle reinsertions.
long long 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.
SUMOTime repetitionEnd
The time at which the flow ends (only needed when using repetitionProbability)
std::string routeid
The vehicle's route id.
std::string id
The vehicle's id.
std::vector< Stop > stops
List of the stops the vehicle will make, TraCI may add entries here.
DepartDefinition departProcedure
Information how the vehicle shall choose the depart time.
std::string line
The vehicle's line (mainly for public transport)
static std::string getEdgeIDFromLane(const std::string laneID)
return edge id when given the lane ID
static int getIndexFromLane(const std::string laneID)
return lane index when given the lane ID
unsigned node
Prohibitions and their estimated end time.
SVCPermissions permissions