50 myReconstructAddedConnections(false),
51 myReconstructRemovedConnections(false),
52 myPhasesLoaded(false) {
61 myReconstructAddedConnections(false),
62 myReconstructRemovedConnections(false),
63 myPhasesLoaded(false) {
69 if (sumoDef !=
nullptr) {
104 NBConnection conn(from, fromLane, to, toLane, linkIndex, linkIndex2);
132 (*i)->removeTrafficLight(&dummy);
168 (*it).replaceFrom(removed, removedLane, by, byLane);
170 (*it).replaceTo(removed, removedLane, by, byLane);
197 if ((it->getFrom() == conn.
getFrom() &&
198 it->getTo() == conn.
getTo() &&
203 (it->getFrom() ==
nullptr || it->getTo() ==
nullptr))) {
240 const EdgeVector& incoming = (*i)->getIncomingEdges();
241 copy(incoming.begin(), incoming.end(), back_inserter(
myIncomingEdges));
242 const EdgeVector& outgoing = (*i)->getOutgoingEdges();
243 copy(outgoing.begin(), outgoing.end(), back_inserter(myOutgoing));
251 EdgeVector::iterator k = std::find(myOutgoing.begin(), myOutgoing.end(), edge);
252 if (k != myOutgoing.end()) {
254 bool controlled =
false;
256 if ((*it).getFrom() == edge) {
294 (*it).shiftLaneIndex(edge, offset, threshold);
309 const int numNormalLinks = noLinksAll;
310 int oldCrossings = 0;
312 bool customIndex =
false;
313 std::vector<NBNode::Crossing*> crossings;
315 const std::vector<NBNode::Crossing*>& c = (*i)->getCrossings();
317 customIndex |= (*i)->setCrossingTLIndices(
getID(), noLinksAll);
318 copy(c.begin(), c.end(), std::back_inserter(crossings));
319 noLinksAll += (int)c.size();
320 oldCrossings += (*i)->numCrossingsFromSumoNet();
322 if ((
int)crossings.size() != oldCrossings) {
325 if (phases.size() > 0 && (
326 (int)(phases.front().state.size()) < noLinksAll ||
327 ((
int)(phases.front().state.size()) > noLinksAll && !customIndex))) {
331 std::vector<int> fromLanes(size, 0);
333 const std::string crossingDefaultState(crossings.size(),
'r');
339 for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator it = phases.begin(); it != phases.end(); it++) {
340 const std::string state = it->state.substr(0, numNormalLinks) + crossingDefaultState;
347 }
else if (phases.size() == 0) {
356 assert(fromEdges.size() > 0);
357 assert(fromEdges.size() == toEdges.size());
358 const int size = (int)fromEdges.size();
365 "' with " +
toString(size) +
" links.");
381 const std::vector<NBTrafficLightLogic::PhaseDefinition> phases =
myTLLogic->
getPhases();
382 for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator it = phases.begin(); it != phases.end(); it++) {
383 const std::string state = (*it).state;
395 && (state[i2] ==
'G' || state[i2] ==
'g')
401 if (forbidden || rightTurnConflict) {
404 if (isFoes && state[i1] ==
's') {
441 #ifdef DEBUG_RECONSTRUCTION
449 std::cout <<
" " << *it <<
"\n";
466 (*i)->removeTrafficLight(&dummy);
470 if (newLogic !=
nullptr) {
506 bool exclusive =
true;
508 if (other != con && other.
getTLIndex() == removed) {
516 if (other.getTLIndex() > removed) {
517 other.setTLIndex(other.getTLIndex() - 1);
523 if (c->customTLIndex > removed) {
531 std::string newState = phase.state;
532 newState.erase(newState.begin() + removed);
533 newLogic->
addStep(phase.duration, newState);
543 #ifdef DEBUG_RECONSTRUCTION
544 if (debugPrintModified) {
545 std::cout <<
" newLinks:\n";
547 std::cout <<
" " << *it <<
"\n";
558 maxIndex =
MAX2(maxIndex, c.getTLIndex());
559 maxIndex =
MAX2(maxIndex, c.getTLIndex2());
563 maxIndex =
MAX2(maxIndex, c->tlLinkIndex);
564 maxIndex =
MAX2(maxIndex, c->tlLinkIndex2);
602 result += pd.state[index];
610 if (c.getTLIndex() == index || c.getTLIndex2() == index) {
616 if (c->tlLinkIndex == index || c->tlLinkIndex2 == index) {
624 std::set<const NBEdge*>
626 std::set<const NBEdge*> result;
628 if (c.getTLIndex() == index || c.getTLIndex2() == index) {
629 result.insert(c.getFrom());
638 if (oldIndex == newIndex) {
642 if (c.getTLIndex() == oldIndex) {
643 c.setTLIndex(newIndex);
645 if (c.getTLIndex2() == oldIndex) {
646 c.setTLIndex2(newIndex);
651 if (c->tlLinkIndex == oldIndex) {
652 c->tlLinkIndex = newIndex;
654 if (c->tlLinkIndex2 == oldIndex) {
655 c->tlLinkIndex2 = newIndex;
664 std::vector<int> unusedIndices;
665 for (
int i = 0; i <= maxIndex; i++) {
670 if (edges.size() == 0) {
675 for (
int j = i + 1; j <= maxIndex; j++) {
683 unusedIndices.push_back(i);
686 for (
int i = (
int)unusedIndices.size() - 1; i >= 0; i--) {
695 for (
int i = (
int)unusedIndices.size() - 1; i >= 0; i--) {
696 if (c->customTLIndex > i) {
699 if (c->customTLIndex2 > i) {
711 std::vector<std::string> states;
720 states.push_back(
getStates(c->tlLinkIndex));
721 c->customTLIndex = index++;
723 states.push_back(
getStates(c->tlLinkIndex2));
724 c->customTLIndex2 = index++;
729 for (
int i = 0; i < (int)states.size(); i++) {
730 for (
int p = 0; p < (int)states[i].size(); p++) {
740 std::map<int, std::string> oldStates;
741 std::map<int, std::string> newStates;
745 const int newIndex = c.getTLIndex();
746 std::string states =
getStates(oldIndex);
747 oldStates[oldIndex] = states;
748 if (newStates.count(newIndex) != 0 && newStates[newIndex] != states) {
750 +
"'. Possibly unsafe program.");
752 newStates[newIndex] = states;
758 for (
int i = 0; i < (int)newStates.size(); i++) {
759 for (
int p = 0; p < (int)newStates[i].size(); p++) {
770 std::vector<int> unusedIndices;
771 for (
int i = 0; i <= maxIndex; i++) {
773 if (unusedIndices.size() > 0) {
777 unusedIndices.push_back(i);
780 for (
int i = (
int)unusedIndices.size() - 1; i >= 0; i--) {
783 if (unusedIndices.size() > 0) {
805 std::map<int, int> indexUsage;
807 indexUsage[c.getTLIndex()]++;
811 indexUsage[c->tlLinkIndex]++;
812 indexUsage[c->tlLinkIndex2]++;
815 for (
auto it : indexUsage) {
816 if (it.first >= 0 && it.second > 1) {
825 bool hasMinMaxDur =
false;
835 std::set<int> yellowIndices;
837 for (
int i = 0; i < (int)phase.state.size(); i++) {
838 if (phase.state[i] ==
'y' || phase.state[i] ==
'Y') {
839 yellowIndices.insert(i);
844 bool needMinMaxDur =
false;
846 std::set<int> greenIndices;
847 if (phase.state.find_first_of(
"yY") != std::string::npos) {
850 for (
int i = 0; i < (int)phase.state.size(); i++) {
851 if (yellowIndices.count(i) != 0 && phase.state[i] ==
'G') {
852 needMinMaxDur =
true;
853 greenIndices.insert(i);
859 if (greenIndices.count(c.getTLIndex()) != 0) {
860 maxSpeed =
MAX2(maxSpeed, c.getFrom()->getLaneSpeed(c.getFromLane()));
864 const double minDurBySpeed = maxSpeed * 3.6 / 6 - 3.3;
#define WRITE_WARNING(msg)
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
#define UNUSED_PARAMETER(x)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
NBEdge * getFrom() const
returns the from-edge (start of the connection)
int getFromLane() const
returns the from-lane
int getTLIndex() const
returns the index within the controlling tls or InvalidTLIndex if this link is unontrolled
static const int InvalidTlIndex
void setTLIndex(int tlIndex)
int getToLane() const
returns the to-lane
NBEdge * getTo() const
returns the to-edge (end of the connection)
The representation of a single edge during network building.
void setInsideTLS(bool inside)
Marks this edge being within an intersection.
const std::string & getID() const
NBNode * getToNode() const
Returns the destination node of the edge.
bool setControllingTLInformation(const NBConnection &c, const std::string &tlID)
Returns if the link could be set as to be controlled.
bool isTurningDirectionAt(const NBEdge *const edge) const
Returns whether the given edge is the opposite direction to this edge.
int getNumLanes() const
Returns the number of lanes.
bool mayBeTLSControlled(int fromLane, NBEdge *toEdge, int toLane) const
return true if certain connection must be controlled by TLS
bool hasConnectionTo(NBEdge *destEdge, int destLane, int fromLane=-1) const
Retrieves info about a connection to a certain lane of a certain edge.
NBNode * getFromNode() const
Returns the origin node of the edge.
class for identifying connections
A loaded (complete) traffic light logic.
bool isUsed(int index)
return whether the given link index is used by any connectons
NBTrafficLightLogic * myCompute(int brakingTimeSeconds)
Computes the traffic light logic finally in dependence to the type.
int getMaxIndex()
return the highest known tls link index used by any controlled connection or crossing
bool myReconstructRemovedConnections
bool hasValidIndices() const
return whether all tls link indices are valid
bool usingSignalGroups() const
whether this definition uses signal group (multiple connections with the same link index)
std::string getStates(int index)
get all states for the given link index
void ungroupSignals()
let all connections use a distinct link index
NBLoadedSUMOTLDef(const std::string &id, const std::string &programID, SUMOTime offset, TrafficLightType type)
Constructor.
bool myReconstructAddedConnections
whether the logic must be reconstructed
bool rightOnRedConflict(int index, int foeIndex) const
whether the given index must yield to the foeIndex while turing right on a red light
void copyIndices(NBTrafficLightDefinition *def)
copy the assignment of link indices to connections from the given definition and rebuilt the states t...
void groupSignals()
let connections with the same state use the same link index
void remapRemoved(NBEdge *removed, const EdgeVector &incoming, const EdgeVector &outgoing)
Replaces occurences of the removed edge in incoming/outgoing edges of all definitions.
void collectEdges()
Build the list of participating edges.
void setProgramID(const std::string &programID)
Sets the programID.
void shiftTLConnectionLaneIndex(NBEdge *edge, int offset, int threshold=-1)
patches signal plans by modifying lane indices with the given offset, only indices with a value above...
NBTrafficLightLogic * myTLLogic
phases are added directly to myTLLogic which is then returned in myCompute()
std::set< NBEdge * > myShifted
set of edges with shifted lane indices (to avoid shifting twice)
void patchIfCrossingsAdded()
repair the plan if controlled nodes received pedestrian crossings
void removeConnection(const NBConnection &conn, bool reconstruct=true)
removes the given connection from the traffic light if recontruct=true, reconstructs the logic and in...
int getMaxValidIndex()
Returns the maximum index controlled by this traffic light.
void replaceIndex(int oldIndex, int newIndex)
replace the given link index in all connections
void collectLinks()
Collects the links participating in this traffic light (only if not previously loaded)
void registerModifications(bool addedConnections, bool removedConnections)
register changes that necessitate recomputation
void joinLogic(NBTrafficLightDefinition *def)
join nodes and states from the given logic (append red state)
void setTLControllingInformation() const
Informs edges about being controlled by a tls.
void setType(TrafficLightType type)
Sets the algorithm type of this tls.
void collectEdgeVectors(EdgeVector &fromEdges, EdgeVector &toEdges, std::vector< int > &fromLanes) const
Collects the edges for each tlIndex.
void reconstructLogic()
adapt to removal or addition of connections
void addConnection(NBEdge *from, NBEdge *to, int fromLane, int toLane, int linkIndex, int linkIndex2, bool reconstruct=true)
Adds a connection and immediately informs the edges.
void guessMinMaxDuration()
heuristically add minDur and maxDur when switching from tlType fixed to actuated
std::set< const NBEdge * > getEdgesUsingIndex(int index) const
brief retrieve all edges with connections that use the given traffic light index
void replaceRemoved(NBEdge *removed, int removedLane, NBEdge *by, int byLane, bool incoming)
Replaces a removed edge/lane.
void setOffset(SUMOTime offset)
Sets the offset of this tls.
void addPhase(SUMOTime duration, const std::string &state, SUMOTime minDur, SUMOTime maxDur, const std::vector< int > &next, const std::string &name)
Adds a phase to the logic the new phase is inserted at the end of the list of already added phases.
~NBLoadedSUMOTLDef()
Destructor.
void initNeedsContRelation() const
static bool runningNetedit()
whether netbuilding takes place in the context of NETEDIT
A definition of a pedestrian crossing.
Represents a single node (junction) during network building.
static bool rightTurnConflict(const NBEdge *from, const NBEdge *to, int fromLane, const NBEdge *prohibitorFrom, const NBEdge *prohibitorTo, int prohibitorFromLane)
return whether the given laneToLane connection is a right turn which must yield to a bicycle crossing...
A traffic light logics which must be computed (only nodes/edges are given)
static std::string addPedestrianPhases(NBTrafficLightLogic *logic, SUMOTime greenTime, SUMOTime minDur, SUMOTime maxDur, std::string state, const std::vector< NBNode::Crossing * > &crossings, const EdgeVector &fromEdges, const EdgeVector &toEdges)
add 1 or 2 phases depending on the presence of pedestrian crossings
static void addPedestrianScramble(NBTrafficLightLogic *logic, int noLinksAll, SUMOTime greenTime, SUMOTime yellowTime, const std::vector< NBNode::Crossing * > &crossings, const EdgeVector &fromEdges, const EdgeVector &toEdges)
add an additional pedestrian phase if there are crossings that did not get green yet
void setTLControllingInformation() const
Informs edges about being controlled by a tls.
The base class for traffic light logic definitions.
const NBConnectionVector & getControlledLinks() const
returns the controlled links (depends on previous call to collectLinks)
const std::string & getProgramID() const
Returns the ProgramID.
const EdgeVector & getIncomingEdges() const
Returns the list of incoming edges (must be build first)
std::vector< NBNode * > myControlledNodes
The container with participating nodes.
TrafficLightType getType() const
get the algorithm type (static etc..)
virtual void setProgramID(const std::string &programID)
Sets the programID.
EdgeVector myIncomingEdges
The list of incoming edges.
virtual void addNode(NBNode *node)
Adds a node to the traffic light logic.
const std::vector< NBNode * > & getNodes() const
Returns the list of controlled nodes.
SUMOTime getOffset()
Returns the offset.
RightOnRedConflicts myRightOnRedConflicts
TrafficLightType myType
The algorithm type for the traffic light.
EdgeVector myEdgesWithin
The list of edges within the area controlled by the tls.
static const std::string DummyID
id for temporary definitions
int computeBrakingTime(double minDecel) const
Computes the time vehicles may need to brake.
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.
NBTrafficLightLogic * compute(OptionsCont &oc)
Computes the traffic light logic.
NBConnectionVector myControlledLinks
The list of controlled links.
bool myNeedsContRelationReady
virtual void setParticipantsInformation()
Builds the list of participating nodes/edges/links.
virtual int getMaxIndex()=0
Returns the maximum index controlled by this traffic light and assigned to a connection.
void collectAllLinks(NBConnectionVector &into)
helper method for use in NBOwnTLDef and NBLoadedSUMOTLDef
SUMOTime myOffset
The offset in the program.
static const SUMOTime UNSPECIFIED_DURATION
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.
bool myRightOnRedConflictsReady
NeedsContRelation myNeedsContRelation
virtual void collectEdges()
Build the list of participating edges.
std::set< std::string > myControlledInnerEdges
Set of inner edges that shall be controlled, though.
The definition of a single phase of the logic.
A SUMO-compliant built logic for a traffic light.
void deleteStateIndex(int index)
remove the index from all phase states
void setPhaseMinDuration(int phaseIndex, SUMOTime duration)
void closeBuilding(bool checkVarDurations=true)
closes the building process
const std::vector< PhaseDefinition > & getPhases() const
Returns the phases.
void setPhaseState(int phaseIndex, int tlIndex, LinkState linkState)
Modifies the state for an existing phase (used by NETEDIT)
void setPhaseMaxDuration(int phaseIndex, SUMOTime duration)
int getNumLinks()
Returns the number of participating links.
void setType(TrafficLightType type)
set the algorithm type (static etc..)
void addStep(SUMOTime duration, const std::string &state, const std::vector< int > &next=std::vector< int >(), const std::string &name="", int index=-1)
Adds a phase to the logic.
void setStateLength(int numLinks, LinkState fill=LINKSTATE_TL_RED)
TrafficLightType getType() const
get the algorithm type (static etc..)
void setOffset(SUMOTime offset)
Sets the offset of this tls.
void setProgramID(const std::string &programID)
Sets the programID.
virtual void setID(const std::string &newID)
resets the id
const std::string & getID() const
Returns the id.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static OptionsCont & getOptions()
Retrieves the options.
void updateParameters(const std::map< std::string, std::string > &mapArg)
Adds or updates all given parameters from the map.
const std::map< std::string, std::string > & getParametersMap() const
Returns the inner key/value map.
data structure for caching needsCont information