void NBLoadedSUMOTLDef::initNeedsContRelation() const { if (!amInvalid() && !myNeedsContRelationReady) { myNeedsContRelation.clear(); const bool controlledWithin = !OptionsCont::getOptions().getBool("tls.uncontrolled-within"); const std::vector<NBTrafficLightLogic::PhaseDefinition> phases = myTLLogic->getPhases(); for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator it = phases.begin(); it != phases.end(); it++) { const std::string state = (*it).state; for (NBConnectionVector::const_iterator it1 = myControlledLinks.begin(); it1 != myControlledLinks.end(); it1++) { const NBConnection& c1 = *it1; const int i1 = c1.getTLIndex(); if (i1 == NBConnection::InvalidTlIndex || state[i1] != 'g' || c1.getFrom() == 0 || c1.getTo() == 0) { continue; } for (NBConnectionVector::const_iterator it2 = myControlledLinks.begin(); it2 != myControlledLinks.end(); it2++) { const NBConnection& c2 = *it2; const int i2 = c2.getTLIndex(); if (i2 != NBConnection::InvalidTlIndex && i2 != i1 && (state[i2] == 'G' || state[i2] == 'g') && c2.getFrom() != 0 && c2.getTo() != 0) { const bool rightTurnConflict = NBNode::rightTurnConflict( c1.getFrom(), c1.getTo(), c1.getFromLane(), c2.getFrom(), c2.getTo(), c2.getFromLane()); if (forbids(c2.getFrom(), c2.getTo(), c1.getFrom(), c1.getTo(), true, controlledWithin) || rightTurnConflict) { myNeedsContRelation.insert(StreamPair(c1.getFrom(), c1.getTo(), c2.getFrom(), c2.getTo())); } } } } } } myNeedsContRelationReady = true; }
bool NBLoadedSUMOTLDef::rightOnRedConflict(int index, int foeIndex) const { if (amInvalid()) { return false; } if (!myRightOnRedConflictsReady) { initNeedsContRelation(); assert(myRightOnRedConflictsReady); } return std::find(myRightOnRedConflicts.begin(), myRightOnRedConflicts.end(), std::make_pair(index, foeIndex)) != myRightOnRedConflicts.end(); }
void NBTrafficLightDefinition::initNeedsContRelation() const { if (!amInvalid()) { NBOwnTLDef dummy(DummyID, myControlledNodes, 0, TLTYPE_STATIC); dummy.initNeedsContRelation(); myNeedsContRelation = dummy.myNeedsContRelation; for (std::vector<NBNode*>::const_iterator i = myControlledNodes.begin(); i != myControlledNodes.end(); i++) { (*i)->removeTrafficLight(&dummy); } } myNeedsContRelationReady = true; }
void NBLoadedSUMOTLDef::setTLControllingInformation() const { // if nodes have been removed our links may have been invalidated as well // since no logic will be built anyway there is no reason to inform any edges if (amInvalid()) { return; } // set the information about the link's positions within the tl into the // edges the links are starting at, respectively for (NBConnectionVector::const_iterator it = myControlledLinks.begin(); it != myControlledLinks.end(); it++) { const NBConnection& c = *it; assert(c.getTLIndex() < (int)myTLLogic->getNumLinks()); NBEdge* edge = c.getFrom(); edge->setControllingTLInformation(c, getID()); } }
void NBLoadedSUMOTLDef::setTLControllingInformation() const { // if nodes have been removed our links may have been invalidated as well // since no logic will be built anyway there is no reason to inform any edges if (amInvalid()) { return; } // set the information about the link's positions within the tl into the // edges the links are starting at, respectively for (NBConnectionVector::const_iterator it = myControlledLinks.begin(); it != myControlledLinks.end(); it++) { const NBConnection& c = *it; if (c.getTLIndex() >= (int)myTLLogic->getNumLinks()) { throw ProcessError("Invalid linkIndex " + toString(c.getTLIndex()) + " for traffic light '" + getID() + "' with " + toString(myTLLogic->getNumLinks()) + " links."); } NBEdge* edge = c.getFrom(); if (edge != 0) { edge->setControllingTLInformation(c, getID()); } } }
NBTrafficLightLogic* NBTrafficLightDefinition::compute(OptionsCont& oc) { // it is not really a traffic light if no incoming edge exists if (amInvalid()) { // make a copy of myControlledNodes because it will be modified; std::vector<NBNode*> nodes = myControlledNodes; for (std::vector<NBNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) { (*it)->removeTrafficLight(this); } WRITE_WARNING("The traffic light '" + getID() + "' does not control any links; it will not be build."); return 0; } // compute the time needed to brake unsigned int brakingTime = computeBrakingTime(oc.getFloat("tls.yellow.min-decel")); // perform the computation depending on whether the traffic light // definition was loaded or shall be computed new completely if (oc.isSet("tls.yellow.time")) { brakingTime = oc.getInt("tls.yellow.time"); } NBTrafficLightLogic* ret = myCompute(brakingTime); ret->addParameter(getMap()); return ret; }