SUMO - Simulation of Urban MObility
NBTrafficLightDefinition.h
Go to the documentation of this file.
1 /****************************************************************************/
9 // The base class for traffic light logic definitions
10 /****************************************************************************/
11 // SUMO, Simulation of Urban MObility; see http://sumo.dlr.de/
12 // Copyright (C) 2002-2017 DLR (http://www.dlr.de/) and contributors
13 /****************************************************************************/
14 //
15 // This file is part of SUMO.
16 // SUMO is free software: you can redistribute it and/or modify
17 // it under the terms of the GNU General Public License as published by
18 // the Free Software Foundation, either version 3 of the License, or
19 // (at your option) any later version.
20 //
21 /****************************************************************************/
22 #ifndef NBTrafficLightDefinition_h
23 #define NBTrafficLightDefinition_h
24 
25 
26 // ===========================================================================
27 // included modules
28 // ===========================================================================
29 #ifdef _MSC_VER
30 #include <windows_config.h>
31 #else
32 #include <config.h>
33 #endif
34 
35 #include <vector>
36 #include <string>
37 #include <bitset>
38 #include <utility>
39 #include <set>
40 #include <utils/common/StdDefs.h>
41 #include <utils/common/Named.h>
43 #include <utils/common/SUMOTime.h>
46 #include "NBCont.h"
47 #include "NBConnection.h"
48 #include "NBConnectionDefs.h"
50 
51 
52 // ===========================================================================
53 // class declarations
54 // ===========================================================================
55 class NBNode;
56 class OptionsCont;
58 
59 
60 // ===========================================================================
61 // class definitions
62 // ===========================================================================
76 public:
77 
78  static const std::string DefaultProgramID;
79 
84  enum TLColor {
95  };
96 
97 
105  NBTrafficLightDefinition(const std::string& id,
106  const std::vector<NBNode*>& junctions,
107  const std::string& programID,
108  SUMOTime offset,
109  TrafficLightType type);
110 
111 
119  NBTrafficLightDefinition(const std::string& id,
120  NBNode* junction,
121  const std::string& programID,
122  SUMOTime offset,
123  TrafficLightType type);
124 
125 
132  NBTrafficLightDefinition(const std::string& id, const std::string& programID,
133  SUMOTime offset,
134  TrafficLightType type);
135 
136 
138  virtual ~NBTrafficLightDefinition();
139 
140 
150 
151 
152 
155 
159  virtual void addNode(NBNode* node);
160 
161 
165  virtual void removeNode(NBNode* node);
166 
171  virtual void removeConnection(const NBConnection& conn, bool reconstruct = true) {
172  UNUSED_PARAMETER(conn);
173  UNUSED_PARAMETER(reconstruct);
174  }
175 
179  const std::vector<NBNode*>& getNodes() const {
180  return myControlledNodes;
181  }
183 
184 
195  bool mustBrake(const NBEdge* const from, const NBEdge* const to) const;
196 
197 
205  bool mustBrake(const NBConnection& possProhibited,
206  const NBConnection& possProhibitor,
207  bool regardNonSignalisedLowerPriority) const;
208 
218  bool mustBrake(const NBEdge* const possProhibitedFrom, const NBEdge* const possProhibitedTo,
219  const NBEdge* const possProhibitorFrom, const NBEdge* const possProhibitorTo,
220  bool regardNonSignalisedLowerPriority) const;
221 
222 
233  bool forbids(const NBEdge* const possProhibitorFrom, const NBEdge* const possProhibitorTo,
234  const NBEdge* const possProhibitedFrom, const NBEdge* const possProhibitedTo,
235  bool regardNonSignalisedLowerPriority,
236  bool sameNodeOnly = false) const;
237 
238 
246  bool foes(const NBEdge* const from1, const NBEdge* const to1,
247  const NBEdge* const from2, const NBEdge* const to2) const;
248 
249 
252  virtual void setTLControllingInformation() const = 0;
253 
254 
257  virtual void setParticipantsInformation();
258 
259 
263  void addControlledInnerEdges(const std::vector<std::string>& edges);
264 
267  std::vector<std::string> getControlledInnerEdges() const;
268 
274  virtual void remapRemoved(NBEdge* removed,
275  const EdgeVector& incoming, const EdgeVector& outgoing) = 0;
276 
277 
284  virtual void replaceRemoved(NBEdge* removed, int removedLane,
285  NBEdge* by, int byLane) = 0;
286 
288  virtual void shiftTLConnectionLaneIndex(NBEdge* edge, int offset) {
289  UNUSED_PARAMETER(edge);
290  UNUSED_PARAMETER(offset);
291  }
292 
296  const EdgeVector& getIncomingEdges() const;
297 
298 
301  return myControlledLinks;
302  }
303 
304 
307  return myControlledLinks;
308  }
309 
310 
314  const std::string& getProgramID() const {
315  return mySubID;
316  };
317 
318 
322  void setProgramID(const std::string& programID) {
323  mySubID = programID;
324  }
325 
326 
331  return myOffset;
332  }
333 
334 
337  return myType;
338  }
339 
341  virtual void setType(TrafficLightType type) {
342  myType = type;
343  }
344 
345  /* @brief computes whether the given stream may have green minor while the
346  * other stream has green major in the same phase
347  */
348  bool needsCont(const NBEdge* fromE, const NBEdge* toE, const NBEdge* otherFromE, const NBEdge* otherToE) const;
349 
351  virtual bool rightOnRedConflict(int index, int foeIndex) const;
352 
353  /* initialize myNeedsContRelation and set myNeedsContRelationReady to true
354  * This information is a byproduct of NBOwnTLDef::myCompute. All other
355  * subclasses instantiate a private instance of NBOwnTLDef to answer this query */
356  virtual void initNeedsContRelation() const;
357 
358 protected:
360  static const std::string DummyID;
361 
366  virtual NBTrafficLightLogic* myCompute(int brakingTime) = 0;
367 
368 
372  virtual void collectLinks() = 0;
373 
374 
377  virtual void collectEdges();
378 
379 
385  int computeBrakingTime(double minDecel) const;
386 
387 
388  // @return whether this traffic light is invalid and should be computed
389  virtual bool amInvalid() const;
390 
392  void collectAllLinks();
393 
394 protected:
396  std::vector<NBNode*> myControlledNodes;
397 
400 
403 
406 
408  std::set<std::string> myControlledInnerEdges;
409 
411  std::string mySubID;
412 
415 
418 
420  struct StreamPair {
421  StreamPair(const NBEdge* _from1, const NBEdge* _to1, const NBEdge* _from2, const NBEdge* _to2):
422  from1(_from1),
423  to1(_to1),
424  from2(_from2),
425  to2(_to2) {}
426 
427  bool operator==(const StreamPair& o) const {
428  return (from1 == o.from1 && to1 == o.to1
429  && from2 == o.from2 && to2 == o.to2);
430  }
431 
432  bool operator<(const StreamPair& o) const {
433  if (from1 != o.from1) {
434  return from1 < o.from1;
435  }
436  if (to1 != o.to1) {
437  return to1 < o.to1;
438  }
439  if (from2 != o.from2) {
440  return from2 < o.from2;
441  }
442  return to2 < o.to2;
443  }
444 
445  const NBEdge* from1;
446  const NBEdge* to1;
447  const NBEdge* from2;
448  const NBEdge* to2;
449  };
450  typedef std::set<StreamPair> NeedsContRelation;
451  mutable NeedsContRelation myNeedsContRelation;
453 
454  typedef std::set<std::pair<int, int> > RightOnRedConflicts;
455  mutable RightOnRedConflicts myRightOnRedConflicts;
457 
458 private:
459  static std::set<NBEdge*> collectReachable(EdgeVector outer, const EdgeVector& within, bool checkControlled);
460 
461 
462 };
463 
464 
465 #endif
466 
467 /****************************************************************************/
468 
virtual void setParticipantsInformation()
Builds the list of participating nodes/edges/links.
StreamPair(const NBEdge *_from1, const NBEdge *_to1, const NBEdge *_from2, const NBEdge *_to2)
TrafficLightType myType
The algorithm type for the traffic light.
virtual void addNode(NBNode *node)
Adds a node to the traffic light logic.
virtual void removeConnection(const NBConnection &conn, bool reconstruct=true)
removes the given connection from the traffic light if recontruct=true, reconstructs the logic and in...
void collectAllLinks()
helper method for use in NBOwnTLDef and NBLoadedSUMOTLDef
static const std::string DummyID
id for temporary definitions
RightOnRedConflicts myRightOnRedConflicts
std::vector< std::string > getControlledInnerEdges() const
Retrieve the ids of edges explicitly controlled by the tls.
A SUMO-compliant built logic for a traffic light.
TrafficLightType getType() const
get the algorithm type (static etc..)
virtual void setTLControllingInformation() const =0
Informs edges about being controlled by a tls.
EdgeVector myIncomingEdges
The list of incoming edges.
virtual ~NBTrafficLightDefinition()
Destructor.
const std::string & getProgramID() const
Returns the ProgramID.
The representation of a single edge during network building.
Definition: NBEdge.h:71
NBTrafficLightLogic * compute(OptionsCont &oc)
Computes the traffic light logic.
The base class for traffic light logic definitions.
virtual void replaceRemoved(NBEdge *removed, int removedLane, NBEdge *by, int byLane)=0
Replaces a removed edge/lane.
std::set< std::pair< int, int > > RightOnRedConflicts
const EdgeVector & getIncomingEdges() const
Returns the list of incoming edges (must be build first)
TLColor
An enumeration of possible tl-signal states.
SUMOTime myOffset
The offset in the program.
#define UNUSED_PARAMETER(x)
Definition: StdDefs.h:38
NBConnectionVector & getControlledLinks()
returns the controlled links (non const version)
virtual void collectLinks()=0
Collects the links participating in this traffic light If a link could not be found.
std::set< StreamPair > NeedsContRelation
bool operator==(const StreamPair &o) const
SUMOTime getOffset()
Returns the offset.
virtual void collectEdges()
Build the list of participating edges.
int computeBrakingTime(double minDecel) const
Computes the time vehicles may need to brake.
std::set< std::string > myControlledInnerEdges
Set of inner edges that shall be controlled, though.
virtual void remapRemoved(NBEdge *removed, const EdgeVector &incoming, const EdgeVector &outgoing)=0
Replaces occurences of the removed edge in incoming/outgoing edges of all definitions.
const NBConnectionVector & getControlledLinks() const
returns the controlled links (depends on previous call to collectLinks)
virtual void shiftTLConnectionLaneIndex(NBEdge *edge, int offset)
patches (loaded) signal plans by modifying lane indices
virtual NBTrafficLightLogic * myCompute(int brakingTime)=0
Computes the traffic light logic finally in dependence to the type.
static const std::string DefaultProgramID
void setProgramID(const std::string &programID)
Sets the programID.
void addControlledInnerEdges(const std::vector< std::string > &edges)
Adds the given ids into the list of inner edges controlled by the tls.
bool mustBrake(const NBEdge *const from, const NBEdge *const to) const
Returns the information whether the described flow must let any other flow pass.
An upper class for objects with additional parameters.
Definition: Parameterised.h:51
const std::vector< NBNode * > & getNodes() const
Returns the list of controlled nodes.
virtual void removeNode(NBNode *node)
Removes the given node from the list of controlled nodes.
Base class for objects which have an id.
Definition: Named.h:46
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
bool forbids(const NBEdge *const possProhibitorFrom, const NBEdge *const possProhibitorTo, const NBEdge *const possProhibitedFrom, const NBEdge *const possProhibitedTo, bool regardNonSignalisedLowerPriority, bool sameNodeOnly=false) const
Returns the information whether "prohibited" flow must let "prohibitor" flow pass.
bool needsCont(const NBEdge *fromE, const NBEdge *toE, const NBEdge *otherFromE, const NBEdge *otherToE) const
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition: NBCont.h:41
A storage for options typed value containers)
Definition: OptionsCont.h:99
Represents a single node (junction) during network building.
Definition: NBNode.h:75
bool operator<(const StreamPair &o) const
long long int SUMOTime
Definition: TraCIDefs.h:52
data structure for caching needsCont information
std::vector< NBNode * > myControlledNodes
The container with participating nodes.
NBTrafficLightDefinition(const std::string &id, const std::vector< NBNode * > &junctions, const std::string &programID, SUMOTime offset, TrafficLightType type)
Constructor.
static std::set< NBEdge * > collectReachable(EdgeVector outer, const EdgeVector &within, bool checkControlled)
NBConnectionVector myControlledLinks
The list of controlled links.
EdgeVector myEdgesWithin
The list of edges within the area controlled by the tls.
virtual void setType(TrafficLightType type)
set the algorithm type (static etc..)
std::string mySubID
The tls program&#39;s subid.
virtual bool rightOnRedConflict(int index, int foeIndex) const
whether the given index must yield to the foeIndex while turing right on a red light ...
TrafficLightType
bool foes(const NBEdge *const from1, const NBEdge *const to1, const NBEdge *const from2, const NBEdge *const to2) const
Returns the information whether the given flows cross.
virtual void initNeedsContRelation() const