49#define DEBUG_COND(obj) (obj->isSelected())
77FXMutex MSRoutingEngine::myRouteCacheMutex;
97 if (myAdaptationWeight < 1. && myAdaptationInterval > 0) {
100 }
else if (period > 0) {
101 WRITE_WARNING(
TL(
"Rerouting is useless if the edge weights do not get updated!"));
115 if (lastAdaption >= 0) {
127 if (edgeSpeeds.empty()) {
132 const bool useLoaded = oc.
getBool(
"device.rerouting.init-with-loaded-weights");
133 const double currentSecond =
SIMTIME;
134 double maxEdgePriority = -std::numeric_limits<double>::max();
136 while (edge->getNumericalID() >= (int)edgeSpeeds.size()) {
137 edgeSpeeds.push_back(0);
139 pastEdgeSpeeds.push_back(std::vector<double>());
146 edgeSpeeds[edge->getNumericalID()] = edge->getLength() /
MSNet::getTravelTime(edge,
nullptr, currentSecond);
148 edgeSpeeds[edge->getNumericalID()] = edge->getMeanSpeed();
151 pastEdgeSpeeds[edge->getNumericalID()] = std::vector<double>(
myAdaptationSteps, edgeSpeeds[edge->getNumericalID()]);
153 maxEdgePriority =
MAX2(maxEdgePriority, (
double)edge->getPriority());
160 throw ProcessError(
TL(
"weights.priority-factor cannot be negative."));
164 WRITE_WARNING(
TL(
"Option weights.priority-factor does not take effect because all edges have the same priority"));
194 auto it =
myThreadRNGs.find(std::this_thread::get_id());
242 for (
const MSEdge*
const e : edges) {
243 if (e->isDelayed()) {
244 const int id = e->getNumericalID();
245 double currSpeed = e->getMeanSpeed();
249#ifdef DEBUG_SEPARATE_TURNS
251 std::cout <<
SIMTIME <<
" edge=" << e->getID()
252 <<
" meanSpeed=" << e->getMeanSpeed()
253 <<
" currSpeed=" << currSpeed
264 const double currBikeSpeed = e->getMeanSpeedBike();
274 const double currBikeSpeed = e->getMeanSpeedBike();
292 for (
const MSEdge* e : edges) {
313 if (pair.second ==
nullptr) {
318 const double avgSpeed = length /
STEPS2TIME(tc.first / tc.second);
319 maxSpeed =
MAX2(avgSpeed, maxSpeed);
326 if (pair.second ==
nullptr) {
329 const int iid = pair.second->getNumericalID();
332 const double avgSpeed = length /
STEPS2TIME(tc.first / tc.second);
333 if (avgSpeed < correctedSpeed) {
334 double internalTT = pair.second->getLength() / pair.second->getSpeedLimit();
337 const double newInternalSpeed = pair.second->getLength() / internalTT;
349#ifdef DEBUG_SEPARATE_TURNS
351 std::cout <<
SIMTIME <<
" edge=" << edge->
getID() <<
" to=" << pair.first->getID() <<
" via=" << pair.second->getID()
352 <<
" origSpeed=" << currSpeed
353 <<
" maxSpeed=" << maxSpeed
354 <<
" correctedSpeed=" << correctedSpeed
355 <<
" avgSpeed=" << avgSpeed
356 <<
" internalTT=" << internalTT
357 <<
" internalSpeed=" << origInternalSpeed
358 <<
" newInternalSpeed=" << newInternalSpeed
359 <<
" virtualSpeed=" << virtualSpeed
370 return correctedSpeed;
380 return routeIt->second;
389 const std::string routingAlgorithm = oc.
getString(
"routing-algorithm");
395 if (routingAlgorithm ==
"dijkstra") {
397 }
else if (routingAlgorithm ==
"astar") {
399 std::shared_ptr<const AStar::LookupTable> lookup =
nullptr;
400 if (oc.
isSet(
"astar.all-distances")) {
402 }
else if (oc.
isSet(
"astar.landmark-distances") && vehicle !=
nullptr) {
414 }
else if (routingAlgorithm ==
"CH" && !hasPermissions) {
418 }
else if (routingAlgorithm ==
"CHWrapper" || routingAlgorithm ==
"CH") {
425 throw ProcessError(
TLF(
"Unknown routing algorithm '%'!", routingAlgorithm));
439 if (threadPool.
size() > 0) {
440 const std::vector<MFXWorkerThread*>& threads = threadPool.
getWorkers();
441 if (
static_cast<MSEdgeControl::WorkerThread*
>(threads.front())->setRouterProvider(
myRouterProvider)) {
442 for (std::vector<MFXWorkerThread*>::const_iterator t = threads.begin() + 1; t != threads.end(); ++t) {
447 for (
int i = 0; i < threadPool.
size(); i++) {
448 threadPool.
add(
new InitTask(), i);
464 if (threadPool.
size() > 0) {
465 FXMutexLock lock(myRouteCacheMutex);
476 const bool onInit,
const bool silent,
const Prohibitions& prohibited) {
484 if (threadPool.
size() > 0) {
485 threadPool.
add(
new RoutingTask(vehicle, currentTime, info, onInit, silent, prohibited));
490 if (!prohibited.empty()) {
491 router.prohibit(prohibited);
497 if (!prohibited.empty()) {
503 if (!prohibited.empty()) {
511 const bool onInit,
const bool silent,
const Prohibitions& prohibited) {
516 if (threadPool.
size() > 0) {
522 if (!prohibited.empty()) {
529 if (!prohibited.empty()) {
535 if (!prohibited.empty()) {
549 tc.first += travelTime;
564 if (threadPool.
size() > 0) {
566 router.prohibit(prohibited);
588 if (threadPool.
size() > 0) {
590 router.prohibit(prohibited);
637 for (
const MSEdge*
const e : edges) {
638 if (e->isDelayed()) {
639 const int id = e->getNumericalID();
664 bool checkedSteps =
false;
665 bool checkedBikeSpeeds =
false;
672 }
else if (!checkedBikeSpeeds) {
673 checkedBikeSpeeds =
true;
684 }
else if (!checkedSteps) {
686 WRITE_WARNING(
"Number of adaptation speeds in loaded state doesn't match option --device.rerouting.adaptation-steps");
695MSRoutingEngine::waitForAll() {
698 if (threadPool.
size() > 0) {
711 if (!myProhibited.empty()) {
715 myVehicle.reroute(myTime, myInfo, router, myOnInit, myWithTaz, mySilent);
718 if (!myProhibited.empty()) {
724 if (!myProhibited.empty()) {
727 const MSEdge* source = *myVehicle.getRoute().begin();
728 const MSEdge* dest = myVehicle.getRoute().getLastEdge();
730 const std::pair<const MSEdge*, const MSEdge*>
key = std::make_pair(source, dest);
731 FXMutexLock lock(myRouteCacheMutex);
743 FXMutexLock lock(myRouteCacheMutex);
745 myThreadRNGs[std::this_thread::get_id()] = rng;
std::vector< MSEdge * > MSEdgeVector
RouterProvider< MSEdge, MSLane, MSJunction, SUMOVehicle > MSRouterProvider
IntermodalRouter< MSEdge, MSLane, MSJunction, SUMOVehicle > MSTransportableRouter
#define WRITE_WARNING(msg)
std::shared_ptr< const MSRoute > ConstMSRoutePtr
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_PASSENGER
vehicle is a passenger car (a "normal" car)
@ SVC_BICYCLE
vehicle is a bicycle
@ SVC_PEDESTRIAN
pedestrian
@ SUMO_TAG_INTERVAL
an aggreagated-output interval
@ SUMO_TAG_ROUTINGENGINE
the internal state for MSRoutingEngine
@ SUMO_TAG_EDGE
begin/end of the description of an edge
@ SUMO_ATTR_BEGIN
weights: time range begin
@ SUMO_ATTR_PASTBIKESPEED
@ SUMO_ATTR_END
weights: time range end
double gWeightsRandomFactor
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Computes the shortest path through a network using the A* algorithm.
Computes the shortest path through a contracted network.
Computes the shortest path through a contracted network.
Base (microsim) event class.
Computes the shortest path through a network using the Dijkstra algorithm.
void prohibit(const std::map< const E *, double > &toProhibit)
A pool of worker threads which distributes the tasks and collects the results.
void waitAll(const bool deleteFinished=true)
waits for all tasks to be finished
void add(Task *const t, int index=-1)
Gives a number to the given task and assigns it to the worker with the given index....
const std::vector< MFXWorkerThread * > & getWorkers()
int size() const
Returns the number of threads in the pool.
A thread repeatingly calculating incoming tasks.
static bool hasFleet()
returns whether taxis have been loaded
const MSEdgeVector & getEdges() const
Returns loaded edges.
A road/street connecting two junctions.
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
int getPriority() const
Returns the priority of the edge.
const MSConstEdgePairVector & getViaSuccessors(SUMOVehicleClass vClass=SVC_IGNORING, bool ignoreTransientPermissions=false) const
Returns the following edges with internal vias, restricted by vClass.
double getLength() const
return the length of the edge
bool isTazConnector() const
const std::string & getRoutingType() const
Returns the type of the edge.
double getMinimumTravelTime(const SUMOVehicle *const veh) const
returns the minimum travel time for the given vehicle
int getNumericalID() const
Returns the numerical id of the edge.
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....
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
static double gWeightsSeparateTurns
Whether turning specific weights are estimated (and how much)
static int gNumThreads
how many threads to use
MSMapMatcher * getMapMatcher() const
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSEventControl * getEndOfTimestepEvents()
Returns the event control for events executed at the end of a time step.
double getPreference(const std::string &routingType, const SUMOVTypeParameter &pars) const
retriefe edge type specific routing preference
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
static double getTravelTime(const MSEdge *const e, const SUMOVehicle *const v, double t)
Returns the travel time to pass an edge.
bool hasPermissions() const
Returns whether the network has specific vehicle class permissions.
MSEdgeControl & getEdgeControl()
Returns the edge control.
static void adaptIntermodalRouter(MSTransportableRouter &router)
static void saveState(OutputDevice &out)
Saves the state (i.e. recorded speeds)
static SUMOTime myAdaptationInterval
At which time interval the edge weights get updated.
static void initEdgeWeights(SUMOVehicleClass svc, SUMOTime lastAdaption=-1, int index=-1)
initialize the edge weights if not done before
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.
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 double myEdgePriorityRange
the difference between maximum and minimum priority for all edges
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 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 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 bool myHaveRoutingThreads
static SUMOTime myLastAdaptation
Information when the last edge weight adaptation occurred.
static void cleanup()
deletes the router instance
static void initRouter(SUMOVehicle *vehicle=nullptr)
static SUMOAbstractRouter< MSEdge, SUMOVehicle >::Operation myEffortFunc
static void initGUIThreadRNG()
initialize RNG for the gui thread
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.
std::map< const MSEdge *, double > Prohibitions
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 void reroute(SUMOVehicle &vehicle, const SUMOTime currentTime, const std::string &info, const bool onInit=false, const bool silent=false, const Prohibitions &prohibited={})
initiate the rerouting, create router / thread pool on first use
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 void loadState(const SUMOSAXAttributes &attrs)
Loads the state.
static double patchSpeedForTurns(const MSEdge *edge, double currSpeed)
static MSVehicleRouter & getRouterTT(const int rngIndex, SUMOVehicleClass svc, const Prohibitions &prohibited={})
return the vehicle router instance
static double getEffortExtra(const MSEdge *const e, const SUMOVehicle *const v, double t)
static MSTransportableRouter & getIntermodalRouterTT(const int rngIndex, const Prohibitions &prohibited={})
return the person router instance
static std::vector< double > myEdgeBikeSpeeds
int getRNGIndex() const
returns the index of the associated RNG
bool reroute(SUMOTime t, const std::string &info, MSTransportableRouter &router, const bool onInit=false, const bool withTaz=false, const bool silent=false, const MSEdge *sink=nullptr)
const std::string & getID() const
Returns the id.
A storage for options typed value containers)
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 isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
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 & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
static bool createDeviceByOption(const std::string &optionName, const std::string &rootElement="", const std::string &schemaFile="")
Creates the device using the output definition stored in the named option.
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 double rand(SumoRNG *rng=nullptr)
Returns a random real number in [0, 1)
SUMOAbstractRouter< E, V > & getVehicleRouter(SUMOVehicleClass svc) const
IntermodalRouter< E, L, N, V > & getIntermodalRouter() const
virtual void prohibit(const Prohibitions &toProhibit)
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 getOpt(int attr, const char *objectid, bool &ok, T defaultValue=T(), bool report=true) const
Tries to read given attribute assuming it is an int.
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.
virtual const SUMOVTypeParameter & getVTypeParameter() const =0
Returns the object's "vehicle" type parameter.
virtual double getChosenSpeedFactor() const =0
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
Representation of a vehicle.
virtual bool reroute(SUMOTime t, const std::string &info, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, const bool onInit=false, const bool withTaz=false, const bool silent=false, const MSEdge *sink=nullptr)=0
Performs a rerouting using the given router.
virtual void setChosenSpeedFactor(const double factor)=0
static int parseCarWalkTransfer(const OptionsCont &oc, const bool hasTaxi)
A wrapper for a Command function.
#define UNUSED_PARAMETER(x)
@ key
the parser read a key of a value in an object