Skip to content

Commit

Permalink
fix #14491
Browse files Browse the repository at this point in the history
  • Loading branch information
namdre committed Mar 12, 2024
1 parent 9fb06cd commit e57b0e7
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 30 deletions.
61 changes: 33 additions & 28 deletions src/netbuild/NBLoadedSUMOTLDef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,35 +388,40 @@ NBLoadedSUMOTLDef::initNeedsContRelation() const {
if (!amInvalid() && !myNeedsContRelationReady) {
myNeedsContRelation.clear();
myRightOnRedConflicts.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' && state[i1] != 's') || c1.getFrom() == nullptr || c1.getTo() == nullptr) {
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() != nullptr && c2.getTo() != nullptr) {
const bool rightTurnConflict = NBNode::rightTurnConflict(
c1.getFrom(), c1.getTo(), c1.getFromLane(), c2.getFrom(), c2.getTo(), c2.getFromLane());
const bool forbidden = forbids(c2.getFrom(), c2.getTo(), c1.getFrom(), c1.getTo(), true, controlledWithin);
const bool isFoes = foes(c2.getFrom(), c2.getTo(), c1.getFrom(), c1.getTo()) && !c2.getFrom()->isTurningDirectionAt(c2.getTo());
if (forbidden || rightTurnConflict) {
myNeedsContRelation.insert(StreamPair(c1.getFrom(), c1.getTo(), c2.getFrom(), c2.getTo()));
}
if (isFoes && state[i1] == 's') {
myRightOnRedConflicts.insert(std::make_pair(i1, i2));
//std::cout << getID() << " prog=" << getProgramID() << " phase=" << (it - phases.begin()) << " rightOnRedConflict i1=" << i1 << " i2=" << i2 << "\n";
if (myType == TrafficLightType::NEMA) {
NBTrafficLightDefinition::initNeedsContRelation();
NBTrafficLightDefinition::initRightOnRedConflicts();
} else {
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' && state[i1] != 's') || c1.getFrom() == nullptr || c1.getTo() == nullptr) {
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() != nullptr && c2.getTo() != nullptr) {
const bool rightTurnConflict = NBNode::rightTurnConflict(
c1.getFrom(), c1.getTo(), c1.getFromLane(), c2.getFrom(), c2.getTo(), c2.getFromLane());
const bool forbidden = forbids(c2.getFrom(), c2.getTo(), c1.getFrom(), c1.getTo(), true, controlledWithin);
const bool isFoes = foes(c2.getFrom(), c2.getTo(), c1.getFrom(), c1.getTo()) && !c2.getFrom()->isTurningDirectionAt(c2.getTo());
if (forbidden || rightTurnConflict) {
myNeedsContRelation.insert(StreamPair(c1.getFrom(), c1.getTo(), c2.getFrom(), c2.getTo()));
}
if (isFoes && state[i1] == 's') {
myRightOnRedConflicts.insert(std::make_pair(i1, i2));
//std::cout << getID() << " prog=" << getProgramID() << " phase=" << (it - phases.begin()) << " rightOnRedConflict i1=" << i1 << " i2=" << i2 << "\n";
}
//std::cout << getID() << " i1=" << i1 << " i2=" << i2 << " rightTurnConflict=" << rightTurnConflict << " forbidden=" << forbidden << " isFoes=" << isFoes << "\n";
}
//std::cout << getID() << " i1=" << i1 << " i2=" << i2 << " rightTurnConflict=" << rightTurnConflict << " forbidden=" << forbidden << " isFoes=" << isFoes << "\n";
}
}
}
Expand Down
10 changes: 8 additions & 2 deletions src/netbuild/NBTrafficLightDefinition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -536,8 +536,8 @@ NBTrafficLightDefinition::initNeedsContRelation() const {
}


bool
NBTrafficLightDefinition::rightOnRedConflict(int index, int foeIndex) const {
void
NBTrafficLightDefinition::initRightOnRedConflicts() const {
if (!myRightOnRedConflictsReady) {
NBOwnTLDef dummy(DummyID, myControlledNodes, 0, TrafficLightType::STATIC);
dummy.setParticipantsInformation();
Expand All @@ -553,6 +553,12 @@ NBTrafficLightDefinition::rightOnRedConflict(int index, int foeIndex) const {
// std::cout << " " << it->first << ", " << it->second << "\n";
//}
}
}


bool
NBTrafficLightDefinition::rightOnRedConflict(int index, int foeIndex) const {
initRightOnRedConflicts();
return std::find(myRightOnRedConflicts.begin(), myRightOnRedConflicts.end(), std::make_pair(index, foeIndex)) != myRightOnRedConflicts.end();
}

Expand Down
2 changes: 2 additions & 0 deletions src/netbuild/NBTrafficLightDefinition.h
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,8 @@ class NBTrafficLightDefinition : public Named, public Parameterised {
* subclasses instantiate a private instance of NBOwnTLDef to answer this query */
virtual void initNeedsContRelation() const;

virtual void initRightOnRedConflicts() const;

///@brief Returns the maximum index controlled by this traffic light and assigned to a connection
virtual int getMaxIndex() = 0;

Expand Down

0 comments on commit e57b0e7

Please sign in to comment.