Eclipse SUMO - Simulation of Urban MObility
NBAlgorithms_Railway.h
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2012-2020 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 /****************************************************************************/
19 // Algorithms for railways
20 /****************************************************************************/
21 #pragma once
22 #include <config.h>
23 
24 #include <vector>
25 #include "NBEdge.h"
26 
27 
28 // ===========================================================================
29 // class declarations
30 // ===========================================================================
31 class NBNetBuilder;
32 class OptionsCont;
33 class NBVehicle;
34 
35 
36 // ===========================================================================
37 // class definitions
38 // ===========================================================================
39 // ---------------------------------------------------------------------------
40 // NBAlgorithms_Railway
41 // ---------------------------------------------------------------------------
42 /* @class NBRampsComputer
43  * @brief Computes highway on-/off-ramps (if wished)
44  */
46 public:
51  static void analyzeTopology(NBNetBuilder& nb);
52  static void repairTopology(NBNetBuilder& nb);
53  static void makeAllBidi(NBNetBuilder& nb);
54  static void assignDirectionPriority(NBNetBuilder& nb);
55 
57  class Track {
58  public:
59  Track(NBEdge* e, int i = -1, const std::string& _id = "") :
60  edge(e),
61  index(i < 0 ? edge->getNumericalID() : i),
62  id(_id == "" ? edge->getID() : _id),
63  minPermissions(edge->getPermissions()) {
64  }
65 
66  void addSuccessor(Track* track);
67  const std::vector<Track*>& getSuccessors(SUMOVehicleClass svc = SVC_IGNORING) const;
68  const std::vector<std::pair<const Track*, const Track*> >& getViaSuccessors(SUMOVehicleClass svc = SVC_IGNORING) const;
69 
70  const std::string& getID() const {
71  return id;
72  }
73  int getNumericalID() const {
74  return index;
75  }
76  double getLength() const {
77  return 0.;
78  }
79  const Track* getBidiEdge() const {
80  return this;
81  }
82  bool isInternal() const {
83  return false;
84  }
85  inline bool prohibits(const NBVehicle* const /*veh*/) const {
86  return false;
87  }
88  inline bool restricts(const NBVehicle* const /*veh*/) const {
89  return false;
90  }
91 
93 
94  private:
95  const int index;
96  const std::string id;
97  std::vector<Track*> successors;
98  std::vector<std::pair<const Track*, const Track*> > viaSuccessors;
100  mutable std::map<SUMOVehicleClass, std::vector<Track*> > svcSuccessors;
101  mutable std::map<SUMOVehicleClass, std::vector<std::pair<const Track*, const Track*> > > svcViaSuccessors;
102 
103  Track& operator=(const Track&) = delete;
104  };
105  static double getTravelTimeStatic(const Track* const track, const NBVehicle* const veh, double time);
106 
107 private:
108  static std::set<NBNode*> getRailNodes(NBNetBuilder& nb, bool verbose = false);
109  static std::set<NBNode*> getBrokenRailNodes(NBNetBuilder& nb, bool verbose = false);
110 
112  static void getRailEdges(const NBNode* node, EdgeVector& inEdges, EdgeVector& outEdges);
113 
114  static bool isStraight(const NBNode* node, const NBEdge* e1, const NBEdge* e2);
115  static bool hasStraightPair(const NBNode* node, const EdgeVector& edges, const EdgeVector& edges2);
116  static bool allBroken(const NBNode* node, NBEdge* candOut, const EdgeVector& in, const EdgeVector& out);
117  static bool allSharp(const NBNode* node, const EdgeVector& in, const EdgeVector& out, bool countBidiAsSharp = false);
118  static bool allBidi(const EdgeVector& edges);
119  static NBEdge* isBidiSwitch(const NBNode* n);
120 
122  static NBEdge* addBidiEdge(NBNetBuilder& nb, NBEdge* edge, bool update = true);
123 
125  static int extendBidiEdges(NBNetBuilder& nb);
126  static int extendBidiEdges(NBNetBuilder& nb, NBNode* node, NBEdge* bidiIn);
127 
129  static void reverseEdges(NBNetBuilder& nb);
130 
132  static void addBidiEdgesForBufferStops(NBNetBuilder& nb);
133 
135  static void addBidiEdgesBetweenSwitches(NBNetBuilder& nb);
136 
138  static void addBidiEdgesForStops(NBNetBuilder& nb);
139 
141  static void addBidiEdgesForStraightConnectivity(NBNetBuilder& nb, bool geometryLike);
142 
144  static void updateTurns(NBEdge* edge);
145 
146 };
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition: NBCont.h:34
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_IGNORING
vehicles ignoring classes
int SVCPermissions
bitset where each bit declares whether a certain SVC may use this edge/lane
The representation of a single edge during network building.
Definition: NBEdge.h:91
Instance responsible for building networks.
Definition: NBNetBuilder.h:107
Represents a single node (junction) during network building.
Definition: NBNode.h:66
const std::vector< std::pair< const Track *, const Track * > > & getViaSuccessors(SUMOVehicleClass svc=SVC_IGNORING) const
const std::vector< Track * > & getSuccessors(SUMOVehicleClass svc=SVC_IGNORING) const
std::vector< std::pair< const Track *, const Track * > > viaSuccessors
std::map< SUMOVehicleClass, std::vector< std::pair< const Track *, const Track * > > > svcViaSuccessors
bool restricts(const NBVehicle *const) const
Track & operator=(const Track &)=delete
std::map< SUMOVehicleClass, std::vector< Track * > > svcSuccessors
bool prohibits(const NBVehicle *const) const
Track(NBEdge *e, int i=-1, const std::string &_id="")
const std::string & getID() const
static NBEdge * isBidiSwitch(const NBNode *n)
static void getRailEdges(const NBNode *node, EdgeVector &inEdges, EdgeVector &outEdges)
filter out rail edges among all edges of a the given node
static void updateTurns(NBEdge *edge)
recompute turning directions for both nodes of the given edge
static void addBidiEdgesForStops(NBNetBuilder &nb)
add bidi-edges to connect successive public transport stops
static bool isStraight(const NBNode *node, const NBEdge *e1, const NBEdge *e2)
static void addBidiEdgesForStraightConnectivity(NBNetBuilder &nb, bool geometryLike)
add bidi-edges to connect straight tracks
static NBEdge * addBidiEdge(NBNetBuilder &nb, NBEdge *edge, bool update=true)
add bidi-edge for the given edge
static std::set< NBNode * > getBrokenRailNodes(NBNetBuilder &nb, bool verbose=false)
static void analyzeTopology(NBNetBuilder &nb)
Computes highway on-/off-ramps (if wished)
static int extendBidiEdges(NBNetBuilder &nb)
add further bidi-edges near existing bidi-edges
static bool allSharp(const NBNode *node, const EdgeVector &in, const EdgeVector &out, bool countBidiAsSharp=false)
static void addBidiEdgesForBufferStops(NBNetBuilder &nb)
add bidi-edges to connect buffers stops in both directions
static bool allBroken(const NBNode *node, NBEdge *candOut, const EdgeVector &in, const EdgeVector &out)
static bool allBidi(const EdgeVector &edges)
static void reverseEdges(NBNetBuilder &nb)
reverse edges sequences that are to broken nodes on both sides
static void repairTopology(NBNetBuilder &nb)
static double getTravelTimeStatic(const Track *const track, const NBVehicle *const veh, double time)
static std::set< NBNode * > getRailNodes(NBNetBuilder &nb, bool verbose=false)
static bool hasStraightPair(const NBNode *node, const EdgeVector &edges, const EdgeVector &edges2)
static void addBidiEdgesBetweenSwitches(NBNetBuilder &nb)
add bidi-edges to connect switches that are approached in both directions
static void assignDirectionPriority(NBNetBuilder &nb)
static void makeAllBidi(NBNetBuilder &nb)
A vehicle as used by router.
Definition: NBVehicle.h:42
A storage for options typed value containers)
Definition: OptionsCont.h:89