41 #define DEBUGCOND true 54 const std::vector<NBNode*>& junctions,
const std::string& programID,
57 myControlledNodes(junctions),
58 mySubID(programID), myOffset(offset),
60 myNeedsContRelationReady(false),
61 myRightOnRedConflictsReady(false) {
74 for (std::vector<NBNode*>::const_iterator i = junctions.begin(); i != junctions.end(); i++) {
75 (*i)->addTrafficLight(
this);
112 for (std::vector<NBNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
113 (*it)->removeTrafficLight(
this);
115 WRITE_WARNING(
"The traffic light '" +
getID() +
"' does not control any links; it will not be build.");
123 brakingTime = oc.
getInt(
"tls.yellow.time");
144 if (vmax < 71 / 3.6) {
147 return 3 + (int)
MAX2(0.0, (floor((vmax - 50 / 3.6) * 0.37)));
152 return (
int)(1.8 + vmax / 2 / minDecel);
166 std::set<NBEdge*> reachable;
167 while (outer.size() > 0) {
168 NBEdge* from = outer.back();
171 for (std::vector<NBEdge::Connection>::iterator k = cons.begin(); k != cons.end(); k++) {
173 if (reachable.count(to) == 0 &&
174 (find(within.begin(), within.end(), to) != within.end()) &&
176 reachable.insert(to);
192 const EdgeVector& incoming = (*i)->getIncomingEdges();
193 copy(incoming.begin(), incoming.end(), back_inserter(
myIncomingEdges));
194 const EdgeVector& outgoing = (*i)->getOutgoingEdges();
195 copy(outgoing.begin(), outgoing.end(), back_inserter(myOutgoing));
203 EdgeVector::iterator k = find(myOutgoing.begin(), myOutgoing.end(), edge);
204 if (k != myOutgoing.end()) {
207 outer.push_back(edge);
220 if (reachable.count(edge) == 1) {
237 std::vector<NBNode*>::const_iterator i =
242 if (!node->hasOutgoing(to)) {
246 return node->
mustBrake(from, to, -1, -1,
true);
252 const NBEdge*
const possProhibitedTo,
253 const NBEdge*
const possProhibitorFrom,
254 const NBEdge*
const possProhibitorTo,
255 bool regardNonSignalisedLowerPriority)
const {
256 return forbids(possProhibitorFrom, possProhibitorTo,
257 possProhibitedFrom, possProhibitedTo,
258 regardNonSignalisedLowerPriority);
265 bool regardNonSignalisedLowerPriority)
const {
268 regardNonSignalisedLowerPriority);
274 const NBEdge*
const possProhibitorTo,
275 const NBEdge*
const possProhibitedFrom,
276 const NBEdge*
const possProhibitedTo,
277 bool regardNonSignalisedLowerPriority,
278 bool sameNodeOnly)
const {
279 if (possProhibitorFrom ==
nullptr || possProhibitorTo ==
nullptr || possProhibitedFrom ==
nullptr || possProhibitedTo ==
nullptr) {
283 std::vector<NBNode*>::const_iterator incoming =
285 std::vector<NBNode*>::const_iterator outgoing =
288 NBNode* incnode = *incoming;
289 NBNode* outnode = *outgoing;
290 EdgeVector::const_iterator i;
292 #ifdef DEBUG_RIGHT_OF_WAY 294 std::cout <<
"foribds tls=" <<
getID() <<
" from=" << possProhibitedFrom->
getID() <<
" to=" << possProhibitedTo->
getID() <<
" foeFrom=" << possProhibitorFrom->
getID() <<
" foeTo=" << possProhibitorTo->
getID() <<
" rnslp=" << regardNonSignalisedLowerPriority <<
" sameNodeOnly=" << sameNodeOnly;
297 if (incnode != outnode) {
299 #ifdef DEBUG_RIGHT_OF_WAY 301 std::cout <<
" differentNodes: allows (no check)\n";
310 for (i = ev1.begin(); i != ev1.end(); ++i) {
311 std::vector<NBNode*>::const_iterator outgoing2 =
316 NBNode* outnode2 = *outgoing2;
317 if (incnode != outnode2) {
323 bool ret1 = incnode->
foes(possProhibitorFrom, possProhibitorTo,
324 possProhibitedTo, *i);
325 bool ret2 = incnode->forbids(possProhibitorFrom, possProhibitorTo,
326 possProhibitedTo, *i,
327 regardNonSignalisedLowerPriority);
328 bool ret = ret1 || ret2;
330 #ifdef DEBUG_RIGHT_OF_WAY 332 std::cout <<
" differentNodes: forbids\n";
342 for (i = ev2.begin(); i != ev2.end(); ++i) {
343 std::vector<NBNode*>::const_iterator incoming2 =
348 NBNode* incnode2 = *incoming2;
349 if (incnode2 != outnode) {
355 bool ret1 = incnode2->
foes(possProhibitorTo, *i,
356 possProhibitedFrom, possProhibitedTo);
357 bool ret2 = incnode2->
forbids(possProhibitorTo, *i,
358 possProhibitedFrom, possProhibitedTo,
359 regardNonSignalisedLowerPriority);
360 bool ret = ret1 || ret2;
362 #ifdef DEBUG_RIGHT_OF_WAY 364 std::cout <<
" differentNodes: forbids (2)\n";
370 #ifdef DEBUG_RIGHT_OF_WAY 372 std::cout <<
" differentNodes: allows\n";
379 const bool result = incnode->forbids(possProhibitorFrom, possProhibitorTo,
380 possProhibitedFrom, possProhibitedTo,
381 regardNonSignalisedLowerPriority);
382 #ifdef DEBUG_RIGHT_OF_WAY 384 std::cout <<
" sameNodes: " << (result ?
"forbids" :
"allows") <<
"\n";
393 const NBEdge*
const from2,
const NBEdge*
const to2)
const {
394 if (to1 ==
nullptr || to2 ==
nullptr) {
398 std::vector<NBNode*>::const_iterator incoming =
401 std::vector<NBNode*>::const_iterator outgoing =
405 NBNode* incnode = *incoming;
406 NBNode* outnode = *outgoing;
407 if (incnode != outnode) {
410 return incnode->
foes(from1, to1, from2, to2);
440 std::vector<std::string>
460 for (
int j = 0; j < noLanes; j++) {
462 for (std::vector<NBEdge::Connection>::iterator k = connected.begin(); k != connected.end(); k++) {
501 (*i)->removeTrafficLight(&dummy);
517 (*i)->removeTrafficLight(&dummy);
bool mayBeTLSControlled(int fromLane, NBEdge *toEdge, int toLane) const
return true if certain connection must be controlled by TLS
virtual void setParticipantsInformation()
Builds the list of participating nodes/edges/links.
A structure which describes a connection between edges or lanes.
int toLane
The lane the connections yields in.
TrafficLightType myType
The algorithm type for the traffic light.
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.
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
static double maxSpeed(const EdgeVector &ev)
virtual bool rightOnRedConflict(int index, int foeIndex) const
whether the given index must yield to the foeIndex while turning right on a red light ...
virtual void addNode(NBNode *node)
Adds a node to the traffic light logic.
void collectAllLinks()
helper method for use in NBOwnTLDef and NBLoadedSUMOTLDef
NBEdge * toEdge
The edge the connections yields in.
static const std::string DummyID
id for temporary definitions
RightOnRedConflicts myRightOnRedConflicts
A SUMO-compliant built logic for a traffic light.
EdgeVector myIncomingEdges
The list of incoming edges.
bool mustBrake(const NBEdge *const from, const NBEdge *const to, int fromLane, int toLane, bool includePedCrossings) const
Returns the information whether the described flow must let any other flow pass.
virtual ~NBTrafficLightDefinition()
Destructor.
The representation of a single edge during network building.
NBTrafficLightLogic * compute(OptionsCont &oc)
Computes the traffic light logic.
Used for sorting the cells by the begin time they describe.
static const SUMOTime UNSPECIFIED_DURATION
int computeBrakingTime(double minDecel) const
Computes the time vehicles may need to brake.
NBEdge * getFrom() const
returns the from-edge (start of the connection)
bool needsCont(const NBEdge *fromE, const NBEdge *toE, const NBEdge *otherFromE, const NBEdge *otherToE) const
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const std::string & getID() const
Returns the id.
bool isRailway(SVCPermissions permissions)
Returns whether an edge with the given permission is a railway edge.
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
NBTrafficLightDefinition(const std::string &id, const std::vector< NBNode *> &junctions, const std::string &programID, SUMOTime offset, TrafficLightType type)
Constructor.
SUMOTime myOffset
The offset in the program.
void setInternal()
Marks this edge being within an intersection.
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
virtual void collectLinks()=0
Collects the links participating in this traffic light.
virtual void initNeedsContRelation() const
int getFirstNonPedestrianLaneIndex(int direction, bool exclusive=false) const
return the first lane with permissions other than SVC_PEDESTRIAN and 0
The link is a straight direction.
std::vector< Connection > getConnectionsFromLane(int lane) const
Returns connections from a given lane.
virtual void collectEdges()
Build the list of participating edges.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
std::string getDescription() const
get ID and programID together (for convenient debugging)
void updateParameter(const std::map< std::string, std::string > &mapArg)
Adds or updates all given parameters from the map.
static const int FORWARD
edge directions (for pedestrian related stuff)
std::set< std::string > myControlledInnerEdges
Set of inner edges that shall be controlled, though.
int getNumLanes() const
Returns the number of lanes.
int fromLane
The lane the connections starts at.
virtual NBTrafficLightLogic * myCompute(int brakingTime)=0
Computes the traffic light logic finally in dependence to the type.
static const std::string DefaultProgramID
void addControlledInnerEdges(const std::vector< std::string > &edges)
Adds the given ids into the list of inner edges controlled by the tls.
const std::string & getProgramID() const
Returns the ProgramID.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
SVCPermissions getPermissions(int lane=-1) const
get the union of allowed classes over all lanes or for a specific lane
virtual void removeNode(NBNode *node)
Removes the given node from the list of controlled nodes.
Base class for objects which have an id.
LinkDirection getDirection(const NBEdge *const incoming, const NBEdge *const outgoing, bool leftHand=false) const
Returns the representation of the described stream's direction.
const EdgeVector & getIncomingEdges() const
Returns the list of incoming edges (must be build first)
NBEdge * getTo() const
returns the to-edge (end of the connection)
bool myRightOnRedConflictsReady
void addTrafficLight(NBTrafficLightDefinition *tlDef)
Adds a traffic light to the list of traffic lights that control this node.
NBTrafficLightLogic * computeLogicAndConts(int brakingTimeSeconds, bool onlyConts=false)
helper function for myCompute
virtual bool amInvalid() const
const std::vector< Connection > & getConnections() const
Returns the connections.
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 myNeedsContRelationReady
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
bool forbids(const NBEdge *const possProhibitorFrom, const NBEdge *const possProhibitorTo, const NBEdge *const possProhibitedFrom, const NBEdge *const possProhibitedTo, bool regardNonSignalisedLowerPriority) const
Returns the information whether "prohibited" flow must let "prohibitor" flow pass.
A storage for options typed value containers)
SumoXMLNodeType getType() const
Returns the type of this node.
NeedsContRelation myNeedsContRelation
Represents a single node (junction) during network building.
const std::map< std::string, std::string > & getParametersMap() const
Returns the inner key/value map.
EdgeVector getConnectedEdges() const
Returns the list of outgoing edges unsorted.
data structure for caching needsCont information
std::vector< NBNode * > myControlledNodes
The container with participating nodes.
A traffic light logics which must be computed (only nodes/edges are given)
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.
void initNeedsContRelation() const
static std::set< NBEdge * > collectReachable(EdgeVector outer, const EdgeVector &within, bool checkControlled)
NBConnectionVector myControlledLinks
The list of controlled links.
bool mustBrake(const NBEdge *const from, const NBEdge *const to) const
Returns the information whether the described flow must let any other flow pass.
std::vector< std::string > getControlledInnerEdges() const
Retrieve the ids of edges explicitly controlled by the tls.
NBNode * getToNode() const
Returns the destination node of the edge.
EdgeVector myEdgesWithin
The list of edges within the area controlled by the tls.
std::string mySubID
The tls program's subid.