61#define DEBUG_COND(obj) (obj->isSelected())
89FXMutex MSRoutingEngine::myRouteCacheMutex;
109 if (myAdaptationWeight < 1. && myAdaptationInterval > 0) {
111 if (lastAdaptation >= 0) {
116 }
else if (period > 0) {
117 WRITE_WARNING(
TL(
"Rerouting is useless if the edge weights do not get updated!"));
135 if (lastAdaption >= 0) {
147 if (oc.
getFloat(
"weights.priority-factor") != 0) {
150 throw ProcessError(
TL(
"weights.priority-factor cannot be negative."));
153 double maxEdgePriority = -std::numeric_limits<double>::max();
155 maxEdgePriority =
MAX2(maxEdgePriority, (
double)edge->getPriority());
160 WRITE_WARNING(
TL(
"Option weights.priority-factor does not take effect because all edges have the same priority"));
171 if (edgeSpeeds.empty()) {
173 const bool useLoaded = oc.
getBool(
"device.rerouting.init-with-loaded-weights");
174 const double currentSecond =
SIMTIME;
176 while (edge->getNumericalID() >= (int)edgeSpeeds.size()) {
177 edgeSpeeds.push_back(0);
179 pastEdgeSpeeds.push_back(std::vector<double>());
186 edgeSpeeds[edge->getNumericalID()] = edge->getLength() /
MSNet::getTravelTime(edge,
nullptr, currentSecond);
188 edgeSpeeds[edge->getNumericalID()] = edge->getMeanSpeed();
191 pastEdgeSpeeds[edge->getNumericalID()] = std::vector<double>(
myAdaptationSteps, edgeSpeeds[edge->getNumericalID()]);
246 FXMutexLock lock(myRouteCacheMutex);
252 bool cchEdgeMoved =
false;
253 for (
const MSEdge*
const e : edges) {
254 if (e->isDelayed()) {
255 const int id = e->getNumericalID();
256 double currSpeed = e->getMeanSpeed();
260#ifdef DEBUG_SEPARATE_TURNS
262 std::cout <<
SIMTIME <<
" edge=" << e->getID()
263 <<
" meanSpeed=" << e->getMeanSpeed()
264 <<
" currSpeed=" << currSpeed
276 const double currBikeSpeed = e->getMeanSpeedBike();
286 const double currBikeSpeed = e->getMeanSpeedBike();
320 for (
const MSEdge* e : edges) {
360 oc.
getFloat(
"device.rerouting.cch-update-threshold.factor"),
363 oc.
getInt(
"device.rerouting.cch-ensemble"));
364 std::vector<std::string> vtypeIDs;
366 for (
const std::string&
id : vtypeIDs) {
394 pars->
id =
"cchRef:" + type->
getID() + (slot == 0 ?
"" :
":" +
toString(slot));
395 const MSEdge* refEdge =
nullptr;
397 if (!e->isInternal() && !e->isTazConnector()) {
439 if (veh ==
nullptr ||
myCCHLive ==
nullptr) {
455 if (veh ==
nullptr) {
493 if (pair.second ==
nullptr) {
498 const double avgSpeed = length /
STEPS2TIME(tc.first / tc.second);
499 maxSpeed =
MAX2(avgSpeed, maxSpeed);
506 if (pair.second ==
nullptr) {
509 const int iid = pair.second->getNumericalID();
512 const double avgSpeed = length /
STEPS2TIME(tc.first / tc.second);
513 if (avgSpeed < correctedSpeed) {
514 double internalTT = pair.second->getLength() / pair.second->getSpeedLimit();
517 const double newInternalSpeed = pair.second->getLength() / internalTT;
529#ifdef DEBUG_SEPARATE_TURNS
531 std::cout <<
SIMTIME <<
" edge=" << edge->
getID() <<
" to=" << pair.first->getID() <<
" via=" << pair.second->getID()
532 <<
" origSpeed=" << currSpeed
533 <<
" maxSpeed=" << maxSpeed
534 <<
" correctedSpeed=" << correctedSpeed
535 <<
" avgSpeed=" << avgSpeed
536 <<
" internalTT=" << internalTT
537 <<
" internalSpeed=" << origInternalSpeed
538 <<
" newInternalSpeed=" << newInternalSpeed
539 <<
" virtualSpeed=" << virtualSpeed
550 return correctedSpeed;
560 FXMutexLock lock(myRouteCacheMutex);
564 return routeIt->second;
573 const std::string routingAlgorithm = oc.
getString(
"routing-algorithm");
579 if (routingAlgorithm ==
"dijkstra") {
581 }
else if (routingAlgorithm ==
"astar") {
583 std::shared_ptr<const AStar::LookupTable> lookup =
nullptr;
584 if (oc.
isSet(
"astar.all-distances")) {
586 }
else if (oc.
isSet(
"astar.landmark-distances") && vehicle !=
nullptr) {
598 }
else if (routingAlgorithm ==
"CH" && !hasPermissions) {
602 }
else if (routingAlgorithm ==
"CHWrapper" || routingAlgorithm ==
"CH") {
608 }
else if (routingAlgorithm ==
"CCH") {
625 throw ProcessError(
TLF(
"Unknown routing algorithm '%'!", routingAlgorithm));
631 oc.
getFloat(
"railway.max-train-length"),
632 oc.
getFloat(
"weights.reversal-penalty"));
641 if (threadPool.
size() > 0) {
642 const std::vector<MFXWorkerThread*>& threads = threadPool.
getWorkers();
643 if (
static_cast<MSEdgeControl::WorkerThread*
>(threads.front())->setRouterProvider(
myRouterProvider)) {
644 for (std::vector<MFXWorkerThread*>::const_iterator t = threads.begin() + 1; t != threads.end(); ++t) {
656 const bool onInit,
const bool silent,
const Prohibitions& prohibited) {
664 if (threadPool.
size() > 0) {
665 threadPool.
add(
new RoutingTask(vehicle, currentTime, info, onInit, silent, prohibited));
670 if (!prohibited.empty()) {
671 router.prohibit(prohibited);
677 if (!prohibited.empty()) {
683 if (!prohibited.empty()) {
691 const bool onInit,
const bool silent,
const Prohibitions& prohibited) {
696 if (threadPool.
size() > 0) {
702 if (!prohibited.empty()) {
709 if (!prohibited.empty()) {
715 if (!prohibited.empty()) {
729 tc.first += travelTime;
744 if (threadPool.
size() > 0) {
746 router.prohibit(prohibited);
768 if (threadPool.
size() > 0) {
770 router.prohibit(prohibited);
814 FXMutexLock lock(myRouteCacheMutex);
841 for (
const MSEdge*
const e : edges) {
842 if (e->isDelayed()) {
843 const int id = e->getNumericalID();
868 bool checkedSteps =
false;
869 bool checkedBikeSpeeds =
false;
876 }
else if (!checkedBikeSpeeds) {
877 checkedBikeSpeeds =
true;
888 }
else if (!checkedSteps) {
890 WRITE_WARNING(
"Number of adaptation speeds in loaded state doesn't match option --device.rerouting.adaptation-steps");
899MSRoutingEngine::waitForAll() {
902 if (threadPool.
size() > 0) {
915 if (!myProhibited.empty()) {
919 myVehicle.reroute(myTime, myInfo, router, myOnInit, myWithTaz, mySilent);
922 if (!myProhibited.empty()) {
928 if (!myProhibited.empty()) {
931 const MSEdge* source = *myVehicle.getRoute().begin();
932 const MSEdge* dest = myVehicle.getRoute().getLastEdge();
934 const std::pair<const MSEdge*, const MSEdge*>
key = std::make_pair(source, dest);
935 FXMutexLock lock(myRouteCacheMutex);
std::vector< const MSEdge * > ConstMSEdgeVector
std::vector< MSEdge * > MSEdgeVector
CCHMetricFamily< MSEdge, SUMOVehicle, MSVehicleType > MSCCHMetricFamily
the per-vehicle-type CCH metric store (utils/router/CCHMetricFamily.h)
RouterProvider< MSEdge, MSLane, MSJunction, SUMOVehicle > MSRouterProvider
IntermodalRouter< MSEdge, MSLane, MSJunction, SUMOVehicle > MSTransportableRouter
CCHGraph< MSEdge, SUMOVehicle > MSCCHGraph
the MSEdge instantiation of the CCH graph mapping (utils/router/CCHGraph.h)
#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
std::vector< SUMOVehicleParameter::Stop > StopParVector
@ 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.
Metric-independent RoutingKit CCH topology over the PURE road graph.
void invalidateClassMasks() const
Drop every primed connection mask so the next fill re-primes from the CURRENT successor lists.
per-vehicle-type CCH metric store over a shared CCHGraph
MetricPtr get(const K *key, SUMOVehicleClass vClass, SUMOTime time, const V *veh)
the metric for (type key, period of time), built on the first query of the pair; nullptr before init....
void seedKey(const K *key)
allocate the metric state (all ensemble slots) for one type; call only while no query is in flight (s...
void atBarrier(double now, bool effortsMoved)
the owner's customization barrier: bump the speed epoch when an effort moved and re-customize when it...
void customize(double now)
refill + customize + publish every type's metric from the live efforts and permissions....
void invalidateEdge(const E *e)
a runtime permission change (closure / re-opening) hit this edge: queue it bypassing the deadband and...
MetricPtr published(const K *key, const std::string &vehID)
the published metric for a type key and querying vehicle id (the id picks the ensemble slot – see the...
void flagPermissionsStale()
flagStale() under the simulation's name for the permission case
void markDirty(const E *e)
queue an edge whose gate effort changed (both buffers; the deadband applies later,...
Contraction-hierarchy router over the edge graph mapped by GRAPH.
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.
double getParameter(const int index) const
Returns the nth parameter of this distribution.
void prohibit(const _Prohibitions &toProhibit)
A vehicle from the mesoscopic point of view.
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.
const MSEdgeWeightsStorage & getWeightsStorage() const
Returns the vehicle's internal edge travel times/efforts container.
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.
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
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....
bool empty() const
Returns whether neither travel times nor efforts are stored.
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.
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.
MSEdgeWeightsStorage & getWeightsStorage()
Returns the net's internal edge travel times/efforts container.
bool hasPermissions() const
Returns whether the network has specific vehicle class permissions.
MSVehicleControl & getVehicleControl()
Returns the vehicle control.
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 SUMOVehicle * buildCCHRefVehicle(const MSVehicleType *type, int slot)
construct the unregistered effort-reference vehicle for a type: never counted, inserted or given devi...
static MSCCHGraph * myCCHGraph
the immutable shared CCH topology (built once), or nullptr if inactive
static MSCCHGraph * ensureCCHGraph()
the shared CCH topology, built on first demand (used by MSNet::getRouterTT to construct its CCH route...
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 void cleanupCCH()
tears down the CCH state (myCCHLive/myCCHFreeflow/myCCHGraph) only – the ref vehicles owned by the CC...
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 MSCCHMetricFamily * myCCHLive
the rerouting device's LIVE metric family over the adaptive speed tables (see utils/router/CCHMetricF...
static void _initEdgeWeights(std::vector< double > &edgeSpeeds, std::vector< std::vector< double > > &pastEdgeSpeeds)
initialized edge speed storage into the given containers
static void initCCH()
build the shared CCH + the live family with one metric per loaded type, publish initial metrics
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 const RoutingKit::CustomizableContractionHierarchyMetric * getPublishedCCHMetric(SUMOVehicleClass vClass, SUMOTime time, const SUMOVehicle *veh)
the currently published (customized) CCH metric FOR A GIVEN vehicle class, or nullptr if that class h...
static bool myHaveExtras
whether extra routing cost modifications are configured
SUMOAbstractRouter< MSEdge, SUMOVehicle >::Prohibitions Prohibitions
static void addEdgeTravelTime(const MSEdge &edge, const SUMOTime travelTime)
record actual travel time for an edge
static void applyExtras(const MSEdge *const e, const SUMOVehicle *const v, SUMOTime step, double &effort)
apply cost modifications from randomness, priorityFactor and preferences
static bool myDynamicRandomness
whether randomness varies over time
static SUMOTime myLastAdaptation
Information when the last edge weight adaptation occurred.
static void cleanup()
deletes the router instance
static MSCCHMetricFamily * myCCHFreeflow
the STATIC free-flow metric family behind MSNet's routers (TraCI / triggers / GUI,...
static void initRouter(SUMOVehicle *vehicle=nullptr)
static SUMOAbstractRouter< MSEdge, SUMOVehicle >::Operation myEffortFunc
static void invalidateCCHEdge(const MSEdge *e)
a runtime permission change (closure / re-opening) hit this edge: invalidate the graph's primed conne...
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 void initWeightUpdate(SUMOTime lastAdaption=- 1)
intialize period edge weight update
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 const RoutingKit::CustomizableContractionHierarchyMetric * getFreeflowCCHMetric(SUMOVehicleClass vClass, SUMOTime time, const SUMOVehicle *veh)
the free-flow CCH metric for MSNet's routers (TraCI / triggers / GUI), keyed by vehicle type and fill...
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
static void initWeightConstants(const OptionsCont &oc)
initialize constants for using myPriorityFactor
int getRNGIndex() const override
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)
bool hasVTypeDistribution(const std::string &id) const
Asks for a vehicle type distribution.
MSVehicleType * getVType(const std::string &id=DEFAULT_VTYPE_ID, SumoRNG *rng=nullptr, bool readOnly=false)
Returns the named vehicle type or a sample from the named distribution.
void insertVTypeIDs(std::vector< std::string > &into) const
Inserts ids of all known vehicle types and vehicle type distributions to the given vector.
Representation of a vehicle in the micro simulation.
The car-following model and parameter.
SUMOVehicleClass getVehicleClass() const
Get this vehicle type's vehicle class.
const std::string & getID() const
Returns the name of the vehicle type.
const Distribution_Parameterized & getSpeedFactor() const
Returns this type's speed factor.
bool isVehicleSpecific() const
Returns whether this type belongs to a single vehicle only (was modified)
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 & 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
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 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.
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 MSVehicleType & getVehicleType() const =0
Returns the object's "vehicle" type.
virtual double getChosenSpeedFactor() const =0
virtual SUMOVehicleClass getVClass() const =0
Returns the object's access class.
virtual int getRoutingMode() const =0
return routing mode (configures router choice but also handling of transient permission changes)
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
Structure representing possible vehicle parameter.
std::string id
The vehicle's id.
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
TRACI_CONST int ROUTING_MODE_DEFAULT