Eclipse SUMO - Simulation of Urban MObility
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PedestrianRouter.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2001-2025 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/****************************************************************************/
18// The Pedestrian Router builds a special network and delegates to a SUMOAbstractRouter.
19/****************************************************************************/
20#pragma once
21#include <config.h>
22
23#include <string>
24#include <vector>
25#include <algorithm>
26#include <assert.h>
30#include "SUMOAbstractRouter.h"
31#include "DijkstraRouter.h"
32#include "IntermodalNetwork.h"
33
34//#define PedestrianRouter_DEBUG_ROUTES
35
36
37// ===========================================================================
38// class definitions
39// ===========================================================================
44template<class E, class L, class N, class V>
45class PedestrianRouter : public SUMOAbstractRouter<E, IntermodalTrip<E, N, V> > {
46private:
51
52public:
55 SUMOAbstractRouter<E, _IntermodalTrip>("PedestrianRouter", true, nullptr, nullptr, false, false), myAmClone(false) {
56 myPedNet = new _IntermodalNetwork(E::getAllEdges(), true);
59 nullptr, false, nullptr, true);
60 }
61
63 SUMOAbstractRouter<E, _IntermodalTrip>("PedestrianRouterClone", true, nullptr, nullptr, false, false), myAmClone(true) {
64 myPedNet = net;
67 nullptr, false, nullptr, true);
68 }
69
72 delete myInternalRouter;
73 if (!myAmClone) {
74 delete myPedNet;
75 }
76 }
77
81
84 double compute(const E* from, const E* to, double departPos, double arrivalPos, double speed,
85 SUMOTime msTime, const N* onlyNode, std::vector<const E*>& into, bool allEdges = false) const {
86 if (getSidewalk<E, L>(from) == 0) {
87 WRITE_WARNINGF(TL("Departure edge '%' does not allow pedestrians."), from->getID());
88 return false;
89 }
90 if (getSidewalk<E, L>(to) == 0) {
91 WRITE_WARNINGF(TL("Destination edge '%' does not allow pedestrians."), to->getID());
92 return false;
93 }
94 _IntermodalTrip trip(from, to, departPos, arrivalPos, speed, msTime, onlyNode);
95 std::vector<const _IntermodalEdge*> intoPed;
96 const bool silent = allEdges; // no warning is needed when called from MSPModel_Striping
97 const bool success = myInternalRouter->compute(myPedNet->getDepartConnector(from),
99 &trip, msTime, intoPed, silent);
100 double time = 0.;
101 if (success) {
102 for (const _IntermodalEdge* pedEdge : intoPed) {
103 if (pedEdge->includeInRoute(allEdges)) {
104 into.push_back(pedEdge->getEdge());
105 }
106 time += myInternalRouter->getEffort(pedEdge, &trip, time);
107 }
108 }
109#ifdef PedestrianRouter_DEBUG_ROUTES
110 std::cout << TIME2STEPS(msTime) << " trip from " << from->getID() << " to " << to->getID()
111 << " departPos=" << departPos
112 << " arrivalPos=" << arrivalPos
113 << " onlyNode=" << (onlyNode == 0 ? "NULL" : onlyNode->getID())
114 << " edges=" << toString(intoPed)
115 << " resultEdges=" << toString(into)
116 << " time=" << time
117 << "\n";
118#endif
119 return success ? time : -1.;
120 }
121
124 bool compute(const E*, const E*, const _IntermodalTrip* const,
125 SUMOTime, std::vector<const E*>&, bool) {
126 throw ProcessError(TL("Do not use this method"));
127 }
128
129 void prohibit(const std::vector<E*>& toProhibit) {
130 std::vector<_IntermodalEdge*> toProhibitPE;
131 for (typename std::vector<E*>::const_iterator it = toProhibit.begin(); it != toProhibit.end(); ++it) {
132 toProhibitPE.push_back(myPedNet->getBothDirections(*it).first);
133 toProhibitPE.push_back(myPedNet->getBothDirections(*it).second);
134 }
135 myInternalRouter->prohibit(toProhibitPE);
136 }
137
138 double recomputeWalkCosts(const std::vector<const E*>& edges, double speed, double fromPos, double toPos, SUMOTime msTime, double& length) const {
139 // edges are normal edges so we need to reconstruct paths across intersection
140 if (edges.size() == 0) {
141 length = 0;
142 return 0;
143 } else if (edges.size() == 1) {
144 length = fabs(toPos - fromPos);
145 return length / speed;
146 } else {
147 double cost = 0;
148 int last = (int)edges.size() - 1;
149 for (int i = 0; i < last; i++) {
150 std::vector<const E*> into;
151 const E* from = edges[i];
152 const E* to = edges[i + 1];
153 const double fp = (i == 0 ? fromPos : from->getLength() / 2);
154 const double tp = (i == (last - 1) ? toPos : to->getLength() / 2);
155 const N* node = getCommonNode(from, to);
156 if (i == 0) {
157 if (node == from->getToJunction()) {
158 length += from->getLength() - fromPos;
159 } else {
160 length += fromPos;
161 }
162 } else {
163 length += from->getLength();
164 }
165 if (i == (last - 1)) {
166 if (node == to->getFromJunction()) {
167 length += toPos;
168 } else {
169 length += to->getLength() - toPos;
170 }
171 }
172 double time = this->compute(from, to, fp, tp, speed, msTime, node, into, true);
173 if (time >= 0) {
174 cost += time;
175 for (const E* edge : into) {
176 if (edge->isCrossing()) {
177 length += edge->getLength();
178 } else if (edge->isWalkingArea()) {
179 // this is wrong because the length is path-dependent
180 length += edge->getLength();
181 }
182 }
183 } else {
184 throw ProcessError("Could not compute cost between edge '" + from->getID() + "' and edge '" + to->getID() + "'.");
185 }
186 }
187 return cost;
188 }
189 }
190
191
192private:
193 const bool myAmClone;
196
197 const N* getCommonNode(const E* from, const E* to) const {
198 if (from->getToJunction() == to->getFromJunction() || from->getToJunction() == to->getToJunction()) {
199 return from->getToJunction();
200 } else if (from->getFromJunction() == to->getFromJunction() || from->getFromJunction() == to->getToJunction()) {
201 return from->getFromJunction();
202 } else {
203 return nullptr;
204 }
205 }
206
207private:
210
211};
long long int SUMOTime
Definition GUI.h:36
#define WRITE_WARNINGF(...)
Definition MsgHandler.h:288
#define TL(string)
Definition MsgHandler.h:305
#define TIME2STEPS(x)
Definition SUMOTime.h:57
double gWeightsRandomFactor
Definition StdDefs.cpp:32
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition ToString.h:46
Computes the shortest path through a network using the Dijkstra algorithm.
bool compute(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 The definition of...
the base edge type that is given to the internal router (SUMOAbstractRouter)
static double getTravelTimeStatic(const IntermodalEdge *const edge, const IntermodalTrip< E, N, V > *const trip, double time)
static double getTravelTimeStaticRandomized(const IntermodalEdge *const edge, const IntermodalTrip< E, N, V > *const trip, double time)
the intermodal network storing edges, connections and the mappings to the "real" edges
const std::vector< _IntermodalEdge * > & getAllEdges()
_IntermodalEdge * getArrivalConnector(const E *e, const int splitIndex=0) const
Returns the arriving intermodal connector at the given split offset.
const EdgePair & getBothDirections(const E *e) const
Returns the pair of forward and backward edge.
_IntermodalEdge * getDepartConnector(const E *e, const int splitIndex=0) const
Returns the departing intermodal connector at the given split offset.
the "vehicle" type that is given to the internal router (SUMOAbstractRouter)
void prohibit(const std::vector< E * > &toProhibit)
PedestrianRouter & operator=(const PedestrianRouter &s)
Invalidated assignment operator.
DijkstraRouter< _IntermodalEdge, _IntermodalTrip > _InternalRouter
_IntermodalNetwork * myPedNet
IntermodalTrip< E, N, V > _IntermodalTrip
PedestrianRouter(_IntermodalNetwork *net)
IntermodalNetwork< E, L, N, V > _IntermodalNetwork
bool compute(const E *, const E *, const _IntermodalTrip *const, SUMOTime, std::vector< const E * > &, bool)
Builds the route between the given edges using the minimum effort at the given time The definition of...
double recomputeWalkCosts(const std::vector< const E * > &edges, double speed, double fromPos, double toPos, SUMOTime msTime, double &length) const
PedestrianRouter()
Constructor.
double compute(const E *from, const E *to, double departPos, double arrivalPos, double speed, SUMOTime msTime, const N *onlyNode, std::vector< const E * > &into, bool allEdges=false) const
Builds the route between the given edges using the minimum effort at the given time The definition of...
IntermodalEdge< E, L, N, V > _IntermodalEdge
virtual SUMOAbstractRouter< E, _IntermodalTrip > * clone()
const N * getCommonNode(const E *from, const E *to) const
virtual ~PedestrianRouter()
Destructor.
_InternalRouter * myInternalRouter
virtual void prohibit(const std::vector< E * > &toProhibit)
double getEffort(const E *const e, const V *const v, double t) const