Eclipse SUMO - Simulation of Urban MObility
RONet.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2002-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 // The router's network representation
22 /****************************************************************************/
23 #pragma once
24 #include <config.h>
25 
26 #include <vector>
32 #include "ROLane.h"
33 #include "RORoutable.h"
34 #include "RORouteDef.h"
35 
36 #ifdef HAVE_FOX
38 #endif
39 
40 
41 // ===========================================================================
42 // class declarations
43 // ===========================================================================
44 class ROEdge;
45 class RONode;
46 class ROPerson;
47 class ROVehicle;
49 class OptionsCont;
50 class OutputDevice;
51 
52 
53 // ===========================================================================
54 // class definitions
55 // ===========================================================================
62 class RONet {
63 public:
64 
65  typedef std::map<const SUMOTime, std::vector<RORoutable*> > RoutablesMap;
66 
68  RONet();
69 
70 
74  static RONet* getInstance();
75 
76 
78  virtual ~RONet();
79 
80 
86  void addRestriction(const std::string& id, const SUMOVehicleClass svc, const double speed);
87 
88 
94  const std::map<SUMOVehicleClass, double>* getRestrictions(const std::string& id) const;
95 
96 
98 
99 
100  /* @brief Adds a read edge to the network
101  *
102  * If the edge is already known (another one with the same id exists),
103  * an error is generated and given to msg-error-handler. The edge
104  * is deleted in this case and false is returned.
105  *
106  * @param[in] edge The edge to add
107  * @return Whether the edge was added (if not, it was deleted, too)
108  */
109  virtual bool addEdge(ROEdge* edge);
110 
111 
112  /* @brief Adds a district and connecting edges to the network
113  *
114  * If the district is already known (another one with the same id exists),
115  * an error is generated and given to msg-error-handler. The edges
116  * are deleted in this case and false is returned.
117  *
118  * @param[in] id The district to add
119  * @return Whether the district was added
120  */
121  bool addDistrict(const std::string id, ROEdge* source, ROEdge* sink);
122 
123 
124  /* @brief Adds a district and connecting edges to the network
125  *
126  * If the district is already known (another one with the same id exists),
127  * an error is generated and given to msg-error-handler. The edges
128  * are deleted in this case and false is returned.
129  *
130  * @param[in] id The district to add
131  * @return Whether the district was added
132  */
133  bool addDistrictEdge(const std::string tazID, const std::string edgeID, const bool isSource);
134 
137 
139  void setBidiEdges(const std::map<ROEdge*, std::string>& bidiMap);
140 
145  const std::map<std::string, std::pair<std::vector<std::string>, std::vector<std::string> > >& getDistricts() const {
146  return myDistricts;
147  }
148 
157  ROEdge* getEdge(const std::string& name) const {
158  return myEdges.get(name);
159  }
160 
161 
167  ROEdge* getEdgeForLaneID(const std::string& laneID) const;
168 
174  ROLane* getLane(const std::string& laneID) const;
175 
176  /* @brief Adds a read node to the network
177  *
178  * If the node is already known (another one with the same id exists),
179  * an error is generated and given to msg-error-handler. The node
180  * is deleted in this case
181  *
182  * @param[in] node The node to add
183  */
184  void addNode(RONode* node);
185 
186 
193  RONode* getNode(const std::string& id) const {
194  return myNodes.get(id);
195  }
196 
197 
198  /* @brief Adds a read stopping place (bus, train, container, parking) to the network
199  *
200  * If the place is already known (another one with the same id and category exists),
201  * an error is generated and given to msg-error-handler. The stop
202  * is deleted in this case
203  *
204  * @param[in] id The name of the stop to add
205  * @param[in] category The type of stop
206  * @param[in] stop The detailed stop description
207  */
208  void addStoppingPlace(const std::string& id, const SumoXMLTag category, SUMOVehicleParameter::Stop* stop);
209 
216  const SUMOVehicleParameter::Stop* getStoppingPlace(const std::string& id, const SumoXMLTag category) const {
217  if (myStoppingPlaces.count(category) > 0) {
218  return myStoppingPlaces.find(category)->second.get(id);
219  }
220  return 0;
221  }
222 
224  const std::string getStoppingPlaceName(const std::string& id) const;
225 
227  const std::string getStoppingPlaceElement(const std::string& id) const;
229 
230 
231 
233 
234 
241  bool checkVType(const std::string& id);
242 
243 
253  virtual bool addVehicleType(SUMOVTypeParameter* type);
254 
255 
269  bool addVTypeDistribution(const std::string& id, RandomDistributor<SUMOVTypeParameter*>* vehTypeDistribution);
270 
271 
281  const auto it = myVTypeDistDict.find(id);
282  return it != myVTypeDistDict.end() ? it ->second : nullptr;
283  }
284 
285 
295  SUMOVTypeParameter* getVehicleTypeSecure(const std::string& id);
296 
297 
298  /* @brief Adds a route definition to the network
299  *
300  * If the route definition is already known (another one with
301  * the same id exists), false is returned, but the route definition
302  * is not deleted.
303  *
304  * @param[in] def The route definition to add
305  * @return Whether the route definition could be added
306  * @todo Rename myRoutes to myRouteDefinitions
307  */
308  bool addRouteDef(RORouteDef* def);
309 
310 
318  RORouteDef* getRouteDef(const std::string& name) const {
319  return myRoutes.get(name);
320  }
321 
322 
323  /* @brief Adds a vehicle to the network
324  *
325  * If the vehicle is already known (another one with the same id
326  * exists), false is returned, but the vehicle is not deleted.
327  *
328  * Otherwise, the number of loaded routes ("myReadRouteNo") is increased.
329  *
330  * @param[in] id The id of the vehicle to add
331  * @param[in] veh The vehicle to add
332  * @return Whether the vehicle could be added
333  */
334  virtual bool addVehicle(const std::string& id, ROVehicle* veh);
335 
337  bool knowsVehicle(const std::string& id) const;
338 
340  SUMOTime getDeparture(const std::string& vehID) const;
341 
342  /* @brief Adds a flow of vehicles to the network
343  *
344  * If the flow is already known (another one with the same id
345  * exists), false is returned, but the vehicle parameter are not deleted.
346  *
347  * Otherwise, the number of loaded routes ("myReadRouteNo") is increased.
348  *
349  * @param[in] flow The parameter of the flow to add
350  * @return Whether the flow could be added
351  */
352  bool addFlow(SUMOVehicleParameter* flow, const bool randomize);
353 
354 
355  /* @brief Adds a person to the network
356  *
357  * @param[in] person The person to add
358  */
359  bool addPerson(ROPerson* person);
360 
361 
362  /* @brief Adds a container to the network
363  *
364  * @param[in] depart The departure time of the container
365  * @param[in] desc The xml description of the container
366  */
367  void addContainer(const SUMOTime depart, const std::string desc);
368  // @}
369 
370 
372 
373 
386  const RORouterProvider& provider, SUMOTime time);
387 
388 
390  bool furtherStored();
392 
393 
400  void openOutput(const OptionsCont& options);
401 
402 
409  void writeIntermodal(const OptionsCont& options, ROIntermodalRouter& router) const;
410 
411 
413  void cleanup();
414 
415 
417  int getEdgeNumber() const;
418 
420  int getInternalEdgeNumber() const;
421 
423  return myEdges;
424  }
425 
426  static void adaptIntermodalRouter(ROIntermodalRouter& router);
427 
428  bool hasPermissions() const;
429 
430  void setPermissionsFound();
431 
433  bool hasBidiEdges() const {
434  return myHasBidiEdges;
435  }
436 
438  bool hasLoadedEffort() const;
439 
440  OutputDevice* getRouteOutput(const bool alternative = false) {
441  if (alternative) {
443  }
444  return myRoutesOutput;
445  }
446 
447 #ifdef HAVE_FOX
448  MFXWorkerThread::Pool& getThreadPool() {
449  return myThreadPool;
450  }
451 
452  class WorkerThread : public MFXWorkerThread, public RORouterProvider {
453  public:
454  WorkerThread(MFXWorkerThread::Pool& pool,
455  const RORouterProvider& original)
456  : MFXWorkerThread(pool), RORouterProvider(original) {}
457  virtual ~WorkerThread() {
458  stop();
459  }
460  };
461 
462  class BulkmodeTask : public MFXWorkerThread::Task {
463  public:
464  BulkmodeTask(const bool value) : myValue(value) {}
465  void run(MFXWorkerThread* context) {
466  static_cast<WorkerThread*>(context)->setBulkMode(myValue);
467  }
468  private:
469  const bool myValue;
470  private:
472  BulkmodeTask& operator=(const BulkmodeTask&);
473  };
474 #endif
475 
476 
477 private:
478  void checkFlows(SUMOTime time, MsgHandler* errorHandler);
479 
480  void createBulkRouteRequests(const RORouterProvider& provider, const SUMOTime time, const bool removeLoops);
481 
482 private:
484  static RONet* myInstance;
485 
487  std::map<std::string, SUMOTime> myVehIDs;
488 
490  std::set<std::string> myPersonIDs;
491 
494 
497 
499  std::map<SumoXMLTag, NamedObjectCont<SUMOVehicleParameter::Stop*> > myStoppingPlaces;
500 
503 
505  typedef std::map< std::string, RandomDistributor<SUMOVTypeParameter*>* > VTypeDistDictType;
508 
511 
514 
517 
520 
523 
526 
529 
532 
535 
537  typedef std::multimap<const SUMOTime, const std::string> ContainerMap;
539 
541  std::vector<const RORoutable*> myPTVehicles;
542 
544  std::map<std::string, std::vector<SUMOTime> > myDepartures;
545 
547  std::map<std::string, std::pair<std::vector<std::string>, std::vector<std::string> > > myDistricts;
548 
551 
554 
557 
560 
563 
566 
569 
571  std::map<std::string, std::map<SUMOVehicleClass, double> > myRestrictions;
572 
575 
578 
580  const bool myKeepVTypeDist;
581 
583  const bool myDoPTRouting;
584 
587 
588 #ifdef HAVE_FOX
589 private:
590  class RoutingTask : public MFXWorkerThread::Task {
591  public:
592  RoutingTask(RORoutable* v, const bool removeLoops, MsgHandler* errorHandler)
593  : myRoutable(v), myRemoveLoops(removeLoops), myErrorHandler(errorHandler) {}
594  void run(MFXWorkerThread* context);
595  private:
596  RORoutable* const myRoutable;
597  const bool myRemoveLoops;
598  MsgHandler* const myErrorHandler;
599  private:
601  RoutingTask& operator=(const RoutingTask&);
602  };
603 
604 
605 private:
607  MFXWorkerThread::Pool myThreadPool;
608 #endif
609 
610 private:
612  RONet(const RONet& src);
613 
615  RONet& operator=(const RONet& src);
616 
617 };
long long int SUMOTime
Definition: GUI.h:35
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
SumoXMLTag
Numbers representing SUMO-XML - element names.
A pool of worker threads which distributes the tasks and collects the results.
Abstract superclass of a task to be run with an index to keep track of pending tasks.
A thread repeatingly calculating incoming tasks.
T get(const std::string &id) const
Retrieves an item.
A storage for options typed value containers)
Definition: OptionsCont.h:89
Static storage of an output device and its base (abstract) implementation.
Definition: OutputDevice.h:61
Interface for building instances of router-edges.
A basic edge for routing applications.
Definition: ROEdge.h:70
A single lane the router may use.
Definition: ROLane.h:48
The router's network representation.
Definition: RONet.h:62
void createBulkRouteRequests(const RORouterProvider &provider, const SUMOTime time, const bool removeLoops)
Definition: RONet.cpp:626
SUMOVTypeParameter * getVehicleTypeSecure(const std::string &id)
Retrieves the named vehicle type.
Definition: RONet.cpp:364
static RONet * getInstance()
Returns the pointer to the unique instance of RONet (singleton).
Definition: RONet.cpp:56
const RandomDistributor< SUMOVTypeParameter * > * getVTypeDistribution(const std::string &id)
Retrieves the named vehicle type distribution.
Definition: RONet.h:280
int myNumInternalEdges
The number of internal edges in the dictionary.
Definition: RONet.h:574
bool myDefaultPedTypeMayBeDeleted
Whether the default pedestrian type was already used or can still be replaced.
Definition: RONet.h:513
bool hasBidiEdges() const
return whether the network contains bidirectional rail edges
Definition: RONet.h:433
void setPermissionsFound()
Definition: RONet.cpp:869
const SUMOVehicleParameter::Stop * getStoppingPlace(const std::string &id, const SumoXMLTag category) const
Retrieves a stopping place from the network.
Definition: RONet.h:216
bool myDefaultRailTypeMayBeDeleted
Whether the default rail type was already used or can still be replaced.
Definition: RONet.h:522
std::map< const SUMOTime, std::vector< RORoutable * > > RoutablesMap
Definition: RONet.h:65
bool myDefaultVTypeMayBeDeleted
Whether the default vehicle type was already used or can still be replaced.
Definition: RONet.h:510
void checkFlows(SUMOTime time, MsgHandler *errorHandler)
Definition: RONet.cpp:540
RONet & operator=(const RONet &src)
Invalidated assignment operator.
ROEdge * getEdge(const std::string &name) const
Retrieves an edge from the network.
Definition: RONet.h:157
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:150
std::map< std::string, RandomDistributor< SUMOVTypeParameter * > * > VTypeDistDictType
Vehicle type distribution dictionary type.
Definition: RONet.h:505
ContainerMap myContainers
Definition: RONet.h:538
std::set< std::string > myPersonIDs
Known person ids.
Definition: RONet.h:490
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:547
bool addRouteDef(RORouteDef *def)
Definition: RONet.cpp:286
int myReadRouteNo
The number of read routes.
Definition: RONet.h:559
void addStoppingPlace(const std::string &id, const SumoXMLTag category, SUMOVehicleParameter::Stop *stop)
Definition: RONet.cpp:277
bool knowsVehicle(const std::string &id) const
returns whether a vehicle with the given id was already loaded
Definition: RONet.cpp:488
void cleanup()
closes the file output for computed routes and deletes associated threads if necessary
Definition: RONet.cpp:340
bool myHaveActiveFlows
whether any flows are still active
Definition: RONet.h:534
RONet(const RONet &src)
Invalidated copy constructor.
std::map< std::string, SUMOTime > myVehIDs
Known vehicle ids and their departure.
Definition: RONet.h:487
void openOutput(const OptionsCont &options)
Opens the output for computed routes.
Definition: RONet.cpp:292
NamedObjectCont< SUMOVehicleParameter * > myFlows
Known flows.
Definition: RONet.h:531
OutputDevice * myRouteAlternativesOutput
The file to write the computed route alternatives into.
Definition: RONet.h:553
bool myDefaultBikeTypeMayBeDeleted
Whether the default bicycle type was already used or can still be replaced.
Definition: RONet.h:516
RoutablesMap myRoutables
Known routables.
Definition: RONet.h:528
int getInternalEdgeNumber() const
Returns the number of internal edges the network contains.
Definition: RONet.cpp:799
virtual bool addVehicle(const std::string &id, ROVehicle *veh)
Definition: RONet.cpp:466
SUMOTime getDeparture(const std::string &vehID) const
returns departure time for the given vehicle id
Definition: RONet.cpp:493
bool myHasBidiEdges
whether the network contains bidirectional railway edges
Definition: RONet.h:586
bool addDistrictEdge(const std::string tazID, const std::string edgeID, const bool isSource)
Definition: RONet.cpp:197
MsgHandler * myErrorHandler
handler for ignorable error messages
Definition: RONet.h:577
void writeIntermodal(const OptionsCont &options, ROIntermodalRouter &router) const
Writes the intermodal network and weights if requested.
Definition: RONet.cpp:321
RONet()
Constructor.
Definition: RONet.cpp:64
NamedObjectCont< RONode * > myNodes
Known nodes.
Definition: RONet.h:493
const std::string getStoppingPlaceElement(const std::string &id) const
return the element name for the given stopping place id
Definition: RONet.cpp:896
void addContainer(const SUMOTime depart, const std::string desc)
Definition: RONet.cpp:534
static void adaptIntermodalRouter(ROIntermodalRouter &router)
Definition: RONet.cpp:818
void addRestriction(const std::string &id, const SUMOVehicleClass svc, const double speed)
Adds a restriction for an edge type.
Definition: RONet.cpp:144
NamedObjectCont< RORouteDef * > myRoutes
Known routes.
Definition: RONet.h:525
bool furtherStored()
Returns the information whether further vehicles, persons or containers are stored.
Definition: RONet.cpp:787
bool checkVType(const std::string &id)
Checks whether the vehicle type (distribution) may be added.
Definition: RONet.cpp:396
OutputDevice * myRoutesOutput
The file to write the computed routes into.
Definition: RONet.h:550
bool addPerson(ROPerson *person)
Definition: RONet.cpp:522
int myWrittenRouteNo
The number of written routes.
Definition: RONet.h:565
static RONet * myInstance
Unique instance of RONet.
Definition: RONet.h:484
SUMOTime saveAndRemoveRoutesUntil(OptionsCont &options, const RORouterProvider &provider, SUMOTime time)
Computes routes described by their definitions and saves them.
Definition: RONet.cpp:676
virtual bool addEdge(ROEdge *edge)
Definition: RONet.cpp:160
bool myDefaultTaxiTypeMayBeDeleted
Whether the default taxi type was already used or can still be replaced.
Definition: RONet.h:519
std::map< std::string, std::map< SUMOVehicleClass, double > > myRestrictions
The vehicle class specific speed restrictions.
Definition: RONet.h:571
std::map< SumoXMLTag, NamedObjectCont< SUMOVehicleParameter::Stop * > > myStoppingPlaces
Known bus / train / container stops and parking areas.
Definition: RONet.h:499
virtual bool addVehicleType(SUMOVTypeParameter *type)
Adds a read vehicle type definition to the network.
Definition: RONet.cpp:442
bool myHavePermissions
Whether the network contains edges which not all vehicles may pass.
Definition: RONet.h:568
RONode * getNode(const std::string &id) const
Retrieves an node from the network.
Definition: RONet.h:193
bool hasPermissions() const
Definition: RONet.cpp:863
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:255
ROLane * getLane(const std::string &laneID) const
Retrieves a lane rom the network given its id.
Definition: RONet.cpp:811
std::multimap< const SUMOTime, const std::string > ContainerMap
Known containers.
Definition: RONet.h:537
int myDiscardedRouteNo
The number of discarded routes.
Definition: RONet.h:562
RORouteDef * getRouteDef(const std::string &name) const
Returns the named route definition.
Definition: RONet.h:318
VTypeDistDictType myVTypeDistDict
A distribution of vehicle types (probability->vehicle type)
Definition: RONet.h:507
std::vector< const RORoutable * > myPTVehicles
vehicles to keep for public transport routing
Definition: RONet.h:541
NamedObjectCont< ROEdge * > myEdges
Known edges.
Definition: RONet.h:496
void addNode(RONode *node)
Definition: RONet.cpp:268
bool addVTypeDistribution(const std::string &id, RandomDistributor< SUMOVTypeParameter * > *vehTypeDistribution)
Adds a vehicle type distribution.
Definition: RONet.cpp:455
void addJunctionTaz(ROAbstractEdgeBuilder &eb)
add a taz for every junction unless a taz with the same id already exists
Definition: RONet.cpp:219
OutputDevice * myTypesOutput
The file to write the vehicle types into.
Definition: RONet.h:556
OutputDevice * getRouteOutput(const bool alternative=false)
Definition: RONet.h:440
const bool myDoPTRouting
whether to calculate routes for public transport
Definition: RONet.h:583
const bool myKeepVTypeDist
whether to keep the the vtype distribution in output
Definition: RONet.h:580
virtual ~RONet()
Destructor.
Definition: RONet.cpp:113
const std::string getStoppingPlaceName(const std::string &id) const
return the name for the given stopping place id
Definition: RONet.cpp:884
const std::map< std::string, std::pair< std::vector< std::string >, std::vector< std::string > > > & getDistricts() const
Retrieves all TAZ (districts) from the network.
Definition: RONet.h:145
std::map< std::string, std::vector< SUMOTime > > myDepartures
Departure times for randomized flows.
Definition: RONet.h:544
int getEdgeNumber() const
Returns the total number of edges the network contains including internal edges.
Definition: RONet.cpp:793
ROEdge * getEdgeForLaneID(const std::string &laneID) const
Retrieves an edge from the network when the lane id is given.
Definition: RONet.cpp:805
bool addFlow(SUMOVehicleParameter *flow, const bool randomize)
Definition: RONet.cpp:504
const NamedObjectCont< ROEdge * > & getEdgeMap() const
Definition: RONet.h:422
bool hasLoadedEffort() const
whether efforts were loaded from file
Definition: RONet.cpp:874
NamedObjectCont< SUMOVTypeParameter * > myVehicleTypes
Known vehicle types.
Definition: RONet.h:502
bool addDistrict(const std::string id, ROEdge *source, ROEdge *sink)
Definition: RONet.cpp:174
Base class for nodes used by the router.
Definition: RONode.h:43
A person as used by router.
Definition: ROPerson.h:50
A routable thing such as a vehicle or person.
Definition: RORoutable.h:52
Base class for a vehicle's route definition.
Definition: RORouteDef.h:53
A vehicle as used by router.
Definition: ROVehicle.h:50
Structure representing possible vehicle parameter.
Definition of vehicle stop (position and duration)
Structure representing possible vehicle parameter.
@ value
the parser finished reading a JSON value