Eclipse SUMO - Simulation of Urban MObility
MSRoutingEngine.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2007-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
20 // A device that performs vehicle rerouting based on current edge speeds
21 /****************************************************************************/
22 #pragma once
23 #include <config.h>
24 
25 #include <set>
26 #include <vector>
27 #include <map>
28 #include <thread>
29 #include <utils/common/SUMOTime.h>
32 #include <microsim/MSRouterDefs.h>
33 
34 #ifdef HAVE_FOX
36 #endif
37 
38 
39 // ===========================================================================
40 // class declarations
41 // ===========================================================================
42 class MSTransportable;
43 
44 
45 // ===========================================================================
46 // class definitions
47 // ===========================================================================
67 public:
69  static void initWeightUpdate();
70 
72  static void initEdgeWeights(SUMOVehicleClass svc);
73 
75  static bool hasEdgeUpdates() {
76  return myEdgeWeightSettingCommand != nullptr;
77  }
78 
81  return myLastAdaptation;
82  }
83 
85  static ConstMSRoutePtr getCachedRoute(const std::pair<const MSEdge*, const MSEdge*>& key);
86 
87  static void initRouter(SUMOVehicle* vehicle = nullptr);
88 
90  static void reroute(SUMOVehicle& vehicle, const SUMOTime currentTime, const std::string& info,
91  const bool onInit = false, const bool silent = false, const MSEdgeVector& prohibited = MSEdgeVector());
92 
94  static void reroute(MSTransportable& t, const SUMOTime currentTime, const std::string& info,
95  const bool onInit = false, const bool silent = false, const MSEdgeVector& prohibited = MSEdgeVector());
96 
98  static void setEdgeTravelTime(const MSEdge* const edge, const double travelTime);
99 
101  static void cleanup();
102 
104  static bool isEnabled() {
105  return !myWithTaz && myAdaptationInterval >= 0;
106  }
107 
109  static MSVehicleRouter& getRouterTT(const int rngIndex,
110  SUMOVehicleClass svc,
111  const MSEdgeVector& prohibited = MSEdgeVector());
112 
114  static MSTransportableRouter& getIntermodalRouterTT(const int rngIndex,
115  const MSEdgeVector& prohibited = MSEdgeVector());
116 
131  static double getEffort(const MSEdge* const e, const SUMOVehicle* const v, double t);
132  static double getEffortBike(const MSEdge* const e, const SUMOVehicle* const v, double t);
133  static double getEffortExtra(const MSEdge* const e, const SUMOVehicle* const v, double t);
135 
137  static double getAssumedSpeed(const MSEdge* edge, const SUMOVehicle* veh);
138 
140  static bool withTaz() {
141  return myWithTaz;
142  }
143 
145  static void addEdgeTravelTime(const MSEdge& edge, const SUMOTime travelTime);
146 
147 #ifdef HAVE_FOX
148  static void waitForAll();
149 #endif
150 
151 
152 private:
153 #ifdef HAVE_FOX
158  class RoutingTask : public MFXWorkerThread::Task {
159  public:
160  RoutingTask(SUMOVehicle& v, const SUMOTime time, const std::string& info,
161  const bool onInit, const bool silent, const MSEdgeVector& prohibited)
162  : myVehicle(v), myTime(time), myInfo(info), myOnInit(onInit), mySilent(silent), myProhibited(prohibited) {}
163  void run(MFXWorkerThread* context);
164  private:
165  SUMOVehicle& myVehicle;
166  const SUMOTime myTime;
167  const std::string myInfo;
168  const bool myOnInit;
169  const bool mySilent;
170  const MSEdgeVector myProhibited;
171  private:
173  RoutingTask& operator=(const RoutingTask&) = delete;
174  };
175 #endif
176 
179 
191  static SUMOTime adaptEdgeEfforts(SUMOTime currentTime);
192 
193  static double patchSpeedForTurns(const MSEdge* edge, double currSpeed);
195 
197  static void _initEdgeWeights(std::vector<double>& edgeSpeeds, std::vector<std::vector<double> >& pastEdgeSpeeds);
198 
200  static SumoRNG* getThreadRNG();
201 
202 private:
205 
207  static double myAdaptationWeight;
208 
211 
214 
216  static int myAdaptationSteps;
217 
220 
221  typedef std::pair<SUMOTime, int> TimeAndCount;
222 
224  static std::vector<double> myEdgeSpeeds;
225  static std::vector<double> myEdgeBikeSpeeds;
226 
228  static std::vector<TimeAndCount> myEdgeTravelTimes;
229 
231  static std::vector<std::vector<double> > myPastEdgeSpeeds;
232  static std::vector<std::vector<double> > myPastEdgeBikeSpeeds;
233 
235  static bool myWithTaz;
236 
238  static bool myBikeSpeeds;
239 
242 
243  static std::map<std::thread::id, SumoRNG*> myThreadRNGs;
244  static bool myHaveRoutingThreads;
245 
247  static std::map<std::pair<const MSEdge*, const MSEdge*>, ConstMSRoutePtr> myCachedRoutes;
248 
250  static double myPriorityFactor;
251 
253  static double myMinEdgePriority;
255  static double myEdgePriorityRange;
256 
257 #ifdef HAVE_FOX
259  static FXMutex myRouteCacheMutex;
260 #endif
261 
262 private:
265 
268 
269 
270 };
long long int SUMOTime
Definition: GUI.h:35
std::vector< MSEdge * > MSEdgeVector
Definition: MSEdge.h:73
std::shared_ptr< const MSRoute > ConstMSRoutePtr
Definition: Route.h:31
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
Base (microsim) event class.
Definition: Command.h:50
Abstract superclass of a task to be run with an index to keep track of pending tasks.
A thread repeatingly calculating incoming tasks.
A road/street connecting two junctions.
Definition: MSEdge.h:77
A device that performs vehicle rerouting based on current edge speeds.
static SUMOTime myAdaptationInterval
At which time interval the edge weights get updated.
static double myAdaptationWeight
Information which weight prior edge efforts have.
static int myAdaptationStepsIndex
The current index in the pastEdgeSpeed ring-buffer.
static double myMinEdgePriority
Minimum priority for all edges.
static std::vector< TimeAndCount > myEdgeTravelTimes
Sum of travel times experienced by equipped vehicles for each edge.
MSRoutingEngine(const MSRoutingEngine &)
Invalidated copy constructor.
static double getEffortBike(const MSEdge *const e, const SUMOVehicle *const v, double t)
static void setEdgeTravelTime(const MSEdge *const edge, const double travelTime)
adapt the known travel time for an edge
static void reroute(SUMOVehicle &vehicle, const SUMOTime currentTime, const std::string &info, const bool onInit=false, const bool silent=false, const MSEdgeVector &prohibited=MSEdgeVector())
initiate the rerouting, create router / thread pool on first use
static SUMOTime getLastAdaptation()
Information when the last edge weight adaptation occurred.
static double myEdgePriorityRange
the difference between maximum and minimum priority for all edges
static bool withTaz()
whether taz-routing is enabled
static double myPriorityFactor
Coefficient for factoring edge priority into routing weight.
static std::map< std::pair< const MSEdge *, const MSEdge * >, ConstMSRoutePtr > myCachedRoutes
The container of pre-calculated routes.
static SUMOTime adaptEdgeEfforts(SUMOTime currentTime)
Adapt edge efforts by the current edge states.
static bool myBikeSpeeds
whether separate speeds for bicycles shall be tracked
static void _initEdgeWeights(std::vector< double > &edgeSpeeds, std::vector< std::vector< double > > &pastEdgeSpeeds)
initialized edge speed storage into the given containers
static SumoRNG * getThreadRNG()
returns RNG associated with the current thread
static bool isEnabled()
returns whether any routing actions take place
static bool myWithTaz
whether taz shall be used at initial rerouting
static std::vector< std::vector< double > > myPastEdgeBikeSpeeds
static std::vector< double > myEdgeSpeeds
The container of edge speeds.
std::pair< SUMOTime, int > TimeAndCount
static bool hasEdgeUpdates()
returns whether any edge weight updates will take place
static std::map< std::thread::id, SumoRNG * > myThreadRNGs
static void addEdgeTravelTime(const MSEdge &edge, const SUMOTime travelTime)
record actual travel time for an edge
static void initWeightUpdate()
intialize period edge weight update
static void initEdgeWeights(SUMOVehicleClass svc)
initialize the edge weights if not done before
static MSVehicleRouter & getRouterTT(const int rngIndex, SUMOVehicleClass svc, const MSEdgeVector &prohibited=MSEdgeVector())
return the vehicle router instance
static bool myHaveRoutingThreads
static SUMOTime myLastAdaptation
Information when the last edge weight adaptation occurred.
static void cleanup()
deletes the router instance
MSRoutingEngine & operator=(const MSRoutingEngine &)
Invalidated assignment operator.
static void initRouter(SUMOVehicle *vehicle=nullptr)
static SUMOAbstractRouter< MSEdge, SUMOVehicle >::Operation myEffortFunc
static ConstMSRoutePtr getCachedRoute(const std::pair< const MSEdge *, const MSEdge * > &key)
return the cached route or nullptr on miss
static int myAdaptationSteps
The number of steps for averaging edge speeds (ring-buffer)
static MSRouterProvider * myRouterProvider
The router to use.
static Command * myEdgeWeightSettingCommand
The weights adaptation/overwriting command.
static std::vector< std::vector< double > > myPastEdgeSpeeds
The container of past edge speeds (when using a simple moving average)
static double getEffort(const MSEdge *const e, const SUMOVehicle *const v, double t)
Returns the effort to pass an edge.
static double getAssumedSpeed(const MSEdge *edge, const SUMOVehicle *veh)
return current travel speed assumption
static MSTransportableRouter & getIntermodalRouterTT(const int rngIndex, const MSEdgeVector &prohibited=MSEdgeVector())
return the person router instance
static double patchSpeedForTurns(const MSEdge *edge, double currSpeed)
static double getEffortExtra(const MSEdge *const e, const SUMOVehicle *const v, double t)
static std::vector< double > myEdgeBikeSpeeds
Representation of a vehicle.
Definition: SUMOVehicle.h:62