46 double end = std::numeric_limits<double>::max();
54template<
class E,
class V>
99 effort = std::numeric_limits<double>::max();
107 typedef double(*
Operation)(
const E*
const,
const V*
const, double);
113 const bool havePermissions,
const bool haveRestrictions) :
162 for (
auto& edgeInfo :
myFound) {
169 fromInfo.effort = 0.;
170 fromInfo.heuristicEffort = 0.;
171 fromInfo.prev =
nullptr;
180 virtual void reset(
const V*
const vehicle) {
198 virtual bool compute(
const E* from,
const E* to,
const V*
const vehicle,
199 SUMOTime msTime, std::vector<const E*>& into,
bool silent =
false) = 0;
207 const E* from,
double fromPos,
208 const E* to,
double toPos,
209 const V*
const vehicle,
210 SUMOTime msTime, std::vector<const E*>& into,
bool silent =
false) {
211 if (from != to || fromPos <= toPos) {
212 return compute(from, to, vehicle, msTime, into, silent);
214 return computeLooped(from, to, vehicle, msTime, into, silent);
221 inline bool computeLooped(
const E* from,
const E* to,
const V*
const vehicle,
222 SUMOTime msTime, std::vector<const E*>& into,
bool silent =
false) {
224 return compute(from, to, vehicle, msTime, into, silent);
226 double minEffort = std::numeric_limits<double>::max();
227 std::vector<const E*> best;
229 for (
const std::pair<const E*, const E*>& follower : from->getViaSuccessors(vClass)) {
230 std::vector<const E*> tmp;
231 compute(follower.first, to, vehicle, msTime, tmp,
true);
232 if (tmp.size() > 0) {
234 if (effort < minEffort) {
240 if (minEffort != std::numeric_limits<double>::max()) {
241 into.push_back(from);
242 std::copy(best.begin(), best.end(), std::back_inserter(into));
250 inline bool isProhibited(
const E*
const edge,
const V*
const vehicle,
double t)
const {
252 && (
myEdgeInfos[edge->getNumericalID()].prohibitedPermissions & vehicle->getVClass()) != vehicle->getVClass()
253 &&
myEdgeInfos[edge->getNumericalID()].prohibitionBegin <= t
254 &&
myEdgeInfos[edge->getNumericalID()].prohibitionEnd == std::numeric_limits<double>::max())
258 inline double getTravelTime(
const E*
const e,
const V*
const v,
const double t,
const double effort)
const {
259 return myTTOperation ==
nullptr ? effort : (*myTTOperation)(e, v, t);
262 inline void updateViaEdgeCost(
const E* viaEdge,
const V*
const v,
double& time,
double& effort,
double& length)
const {
263 while (viaEdge !=
nullptr && viaEdge->isInternal()) {
264 const double viaEffortDelta = this->
getEffort(viaEdge, v, time);
266 effort += viaEffortDelta;
267 length += viaEdge->getLength();
268 viaEdge = viaEdge->getViaSuccessors().front().second;
272 inline void updateViaCost(
const E*
const prev,
const E*
const e,
const V*
const v,
double& time,
double& effort,
double& length)
const {
273 if (prev !=
nullptr) {
274 for (
const std::pair<const E*, const E*>& follower : prev->getViaSuccessors()) {
275 if (follower.first == e) {
281 const double effortDelta = this->
getEffort(e, v, time);
282 effort += effortDelta;
284 length += e->getLength();
287 bool isValid(
const std::vector<const E*>& edges,
const V*
const v,
double t)
const {
288 for (
const E*
const e : edges) {
296 virtual double recomputeCosts(
const std::vector<const E*>& edges,
const V*
const v,
SUMOTime msTime,
double* lengthp =
nullptr)
const {
300 if (lengthp ==
nullptr) {
305 const E* prev =
nullptr;
306 for (
const E*
const e : edges) {
314 inline double recomputeCostsPos(
const std::vector<const E*>& edges,
const V*
const v,
double fromPos,
double toPos,
SUMOTime msTime,
double* lengthp =
nullptr)
const {
316 if (!edges.empty()) {
319 effort -= firstEffort * fromPos / edges.front()->getLength();
320 effort -= lastEffort * (edges.back()->getLength() - toPos) / edges.back()->getLength();
321 if (lengthp !=
nullptr) {
322 (*lengthp) -= fromPos + edges.back()->getLength() - toPos;
329 inline double setHint(
const typename std::vector<const E*>::const_iterator routeBegin,
const typename std::vector<const E*>::const_iterator routeEnd,
const V*
const v,
SUMOTime msTime) {
334 init((*routeBegin)->getNumericalID(), msTime);
335 for (
auto e = routeBegin + 1; e != routeEnd; ++e) {
339 auto& edgeInfo =
myEdgeInfos[(*e)->getNumericalID()];
340 edgeInfo.heuristicEffort = effort;
341 edgeInfo.prev = prev;
343 edgeInfo.effort = effort;
344 edgeInfo.leaveTime = time;
347#ifdef ROUTER_DEBUG_HINT
348 if (ROUTER_DEBUG_COND) {
349 std::cout <<
"DEBUG: hit=" << (*e)->getID()
350 <<
" TT=" << edgeInfo.
effort
351 <<
" EF=" << this->
getEffort(*e, v, edgeInfo.leaveTime)
352 <<
" HT=" << edgeInfo.heuristicEffort <<
"\n";
360 inline double getEffort(
const E*
const e,
const V*
const v,
double t)
const {
362 &&
myEdgeInfos[e->getNumericalID()].prohibitionEnd > t
363 &&
myEdgeInfos[e->getNumericalID()].prohibitionBegin <= t
364 && (
myEdgeInfos[e->getNumericalID()].prohibitedPermissions & v->getVClass()) != v->getVClass()) {
366 return (
myEdgeInfos[e->getNumericalID()].prohibitionEnd - t) + (*myOperation)(e, v,
myEdgeInfos[e->getNumericalID()].prohibitionEnd);
393 myEdgeInfos[item.first->getNumericalID()].prohibitionBegin = -1;
394 myEdgeInfos[item.first->getNumericalID()].prohibitionEnd = -1;
396 for (
auto item : toProhibit) {
397 myEdgeInfos[item.first->getNumericalID()].prohibitionBegin = item.second.begin;
398 myEdgeInfos[item.first->getNumericalID()].prohibitionEnd = item.second.end;
399 myEdgeInfos[item.first->getNumericalID()].prohibitedPermissions = item.second.permissions;
411 std::vector<const E*> tmp;
412 while (rbegin !=
nullptr) {
413 tmp.push_back(rbegin->
edge);
414 rbegin = rbegin->
prev;
416 std::copy(tmp.rbegin(), tmp.rend(), std::back_inserter(edges));
448 std::vector<typename SUMOAbstractRouter<E, V>::EdgeInfo>
myEdgeInfos;
453 std::vector<typename SUMOAbstractRouter<E, V>::EdgeInfo*>
myFound;
#define WRITE_MESSAGE(msg)
std::string elapsedMs2string(long long int t)
convert ms to string for log output
const SVCPermissions SVCAll
all VClasses are allowed
long long int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_IGNORING
vehicles ignoring classes
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
void informf(const std::string &format, T value, Targs... Fargs)
adds a new formatted message
double prohibitionBegin
the time at which a temporary prohibitione begins
bool visited
whether the edge was already evaluated
EdgeInfo(const E *const e)
Constructor.
const E *const edge
The current edge.
double leaveTime
The time the vehicle leaves the edge.
double effort
Effort to reach the edge.
const EdgeInfo * prev
The previous edge.
double heuristicEffort
Estimated effort to reach the edge (effort + lower bound on remaining effort)
double prohibitionEnd
the time at which a temporary prohibitione ends
SVCPermissions prohibitedPermissions
temporary permission change
Operation myTTOperation
The object's operation to perform for travel times.
long long int myNumQueries
void setMsgHandler(MsgHandler *const errorMsgHandler)
const bool myHavePermissions
whether edge permissions need to be considered
bool myBulkMode
whether we are currently operating several route queries in a bulk
long long int myQueryVisits
counters for performance logging
bool computeLooped(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)
Builds the route between the given edges using the minimum effort at the given time if from == to,...
virtual SUMOAbstractRouter * clone()=0
long long int myQueryStartTime
the time spent querying in milliseconds
virtual void setBulkMode(const bool mode)
SUMOAbstractRouter & operator=(const SUMOAbstractRouter &s)=delete
Invalidated assignment operator.
std::map< const E *, RouterProhibition > Prohibitions
std::vector< typename SUMOAbstractRouter< E, V >::EdgeInfo > myEdgeInfos
The container of edge information.
bool compute(const E *from, double fromPos, const E *to, double toPos, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)
Builds the route between the given edges using the minimum effort at the given time,...
SUMOAbstractRouter(SUMOAbstractRouter *other)
Copy Constructor.
double(* Operation)(const E *const, const V *const, double)
Type of the function that is used to retrieve the edge effort.
Operation myOperation
The object's operation to perform.
double getTravelTime(const E *const e, const V *const v, const double t, const double effort) const
long long int myQueryTimeSum
void updateViaCost(const E *const prev, const E *const e, const V *const v, double &time, double &effort, double &length) const
virtual void reset(const V *const vehicle)
reset internal caches, used by CHRouter
bool hasProhibitions() const
const std::string & getType() const
double getEffort(const E *const e, const V *const v, double t) const
bool isProhibited(const E *const edge, const V *const vehicle, double t) const
SUMOAbstractRouter(const std::string &type, bool unbuildIsWarning, Operation operation, Operation ttOperation, const bool havePermissions, const bool haveRestrictions)
Constructor.
virtual void prohibit(const Prohibitions &toProhibit)
Prohibitions myProhibited
The list of explicitly prohibited edges and estimated end time of prohibition.
void updateViaEdgeCost(const E *viaEdge, const V *const v, double &time, double &effort, double &length) const
double setHint(const typename std::vector< const E * >::const_iterator routeBegin, const typename std::vector< const E * >::const_iterator routeEnd, const V *const v, SUMOTime msTime)
void init(const int edgeID, const SUMOTime msTime)
void setAutoBulkMode(const bool mode)
bool myAmClean
whether we are already initialized
const bool myHaveRestrictions
whether edge restrictions need to be considered
const SUMOAbstractRouter< E, V >::EdgeInfo & getEdgeInfo(int index) const
void buildPathFrom(const typename SUMOAbstractRouter< E, V >::EdgeInfo *rbegin, std::vector< const E * > &edges)
Builds the path from marked edges.
bool myAutoBulkMode
whether we are currently trying to detect bulk mode automatically
virtual bool compute(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)=0
Builds the route between the given edges using the minimum effort at the given time The definition of...
bool isValid(const std::vector< const E * > &edges, const V *const v, double t) const
virtual double recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime, double *lengthp=nullptr) const
void endQuery(int visits)
virtual ~SUMOAbstractRouter()
Destructor.
MsgHandler * myErrorMsgHandler
the handler for routing errors
std::vector< typename SUMOAbstractRouter< E, V >::EdgeInfo * > myFrontierList
A container for reusage of the min edge heap.
double recomputeCostsPos(const std::vector< const E * > &edges, const V *const v, double fromPos, double toPos, SUMOTime msTime, double *lengthp=nullptr) const
std::vector< typename SUMOAbstractRouter< E, V >::EdgeInfo * > myFound
list of visited Edges (for resetting)
const std::string myType
the type of this router
static long getCurrentMillis()
Returns the current time in milliseconds.
#define UNUSED_PARAMETER(x)
Prohibitions and their estimated end time.
SVCPermissions permissions