Eclipse SUMO - Simulation of Urban MObility
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-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 /****************************************************************************/
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>
28 #include <utils/common/SUMOTime.h>
29 #include <utils/common/ToString.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 // ===========================================================================
44 template<class E, class L, class N, class V>
45 class PedestrianRouter : public SUMOAbstractRouter<E, IntermodalTrip<E, N, V> > {
46 private:
51 
52 public:
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 
71  virtual ~PedestrianRouter() {
72  delete myInternalRouter;
73  if (!myAmClone) {
74  delete myPedNet;
75  }
76  }
77 
80  }
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) {
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 private:
139  const bool myAmClone;
142 
143 
144 private:
147 
148 };
long long int SUMOTime
Definition: GUI.h:35
#define WRITE_WARNINGF(...)
Definition: MsgHandler.h:296
#define TL(string)
Definition: MsgHandler.h:315
#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
_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.
const std::vector< _IntermodalEdge * > & getAllEdges()
_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)
DijkstraRouter< _IntermodalEdge, _IntermodalTrip > _InternalRouter
_IntermodalNetwork * myPedNet
PedestrianRouter & operator=(const PedestrianRouter &s)
Invalidated assignment operator.
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...
PedestrianRouter()
Constructor.
virtual SUMOAbstractRouter< E, _IntermodalTrip > * clone()
IntermodalEdge< E, L, N, V > _IntermodalEdge
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)
Builds the route between the given edges using the minimum effort at the given time The definition of...
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