69 if (sumoDef !=
nullptr) {
97 if (linkIndex >=
myTLLogic->getNumLinks()) {
99 "' to edge '" + to->
getID() +
"' for traffic light '" +
getID() +
102 if (linkIndex2 >=
myTLLogic->getNumLinks()) {
104 "' to edge '" + to->
getID() +
"' for traffic light '" +
getID() +
107 NBConnection conn(from, fromLane, to, toLane, linkIndex, linkIndex2);
142 n->removeTrafficLight(&dummy);
156 if (c.getTLIndex() >=
myTLLogic->getNumLinks()) {
160 NBEdge* edge = c.getFrom();
161 if (edge !=
nullptr && edge->
getNumLanes() > c.getFromLane()) {
180 (*it).replaceFrom(removed, removedLane, by, byLane);
182 (*it).replaceTo(removed, removedLane, by, byLane);
191 const SUMOTime red,
const std::vector<int>& next,
const std::string& name) {
192 myTLLogic->addStep(duration, state, minDur, maxDur, earliestEnd, latestEnd, vehExt, yellow, red, name, next);
221 if ((it->getFrom() == conn.
getFrom() &&
222 it->getTo() == conn.
getTo() &&
227 (it->getFrom() ==
nullptr || it->getTo() ==
nullptr))) {
264 const EdgeVector& incoming = (*i)->getIncomingEdges();
265 copy(incoming.begin(), incoming.end(), back_inserter(
myIncomingEdges));
266 const EdgeVector& outgoing = (*i)->getOutgoingEdges();
267 copy(outgoing.begin(), outgoing.end(), back_inserter(myOutgoing));
275 EdgeVector::iterator k = std::find(myOutgoing.begin(), myOutgoing.end(), edge);
276 if (k != myOutgoing.end()) {
278 bool controlled =
false;
280 if ((*it).getFrom() == edge) {
318 (*it).shiftLaneIndex(edge, offset, threshold);
325 const int size =
myTLLogic->getNumLinks();
333 const int numNormalLinks = noLinksAll;
334 int oldCrossings = 0;
336 bool customIndex =
false;
337 std::vector<NBNode::Crossing*> crossings;
339 const std::vector<NBNode::Crossing*>& c = (*i)->getCrossings();
341 customIndex |= (*i)->setCrossingTLIndices(
getID(), noLinksAll);
342 copy(c.begin(), c.end(), std::back_inserter(crossings));
343 noLinksAll += (int)c.size();
344 oldCrossings += (*i)->numCrossingsFromSumoNet();
346 if ((
int)crossings.size() != oldCrossings) {
347 std::vector<NBTrafficLightLogic::PhaseDefinition> phases =
myTLLogic->getPhases();
349 if (phases.size() > 0 && (
350 (
int)(phases.front().state.size()) < noLinksAll ||
351 ((
int)(phases.front().state.size()) > noLinksAll && !customIndex))) {
355 std::vector<int> fromLanes(size, 0);
357 const std::string crossingDefaultState(crossings.size(),
'r');
363 for (
const auto& phase : phases) {
364 const std::string state = phase.state.substr(0, numNormalLinks) + crossingDefaultState;
366 state, crossings, fromEdges, toEdges);
372 }
else if (phases.size() == 0) {
381 assert(fromEdges.size() > 0);
382 assert(fromEdges.size() == toEdges.size());
383 const int size = (int)fromEdges.size();
390 "' with " +
toString(size) +
" links.");
410 const std::vector<NBTrafficLightLogic::PhaseDefinition> phases =
myTLLogic->getPhases();
411 for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator it = phases.begin(); it != phases.end(); it++) {
412 const std::string state = (*it).state;
424 && (state[i2] ==
'G' || state[i2] ==
'g')
430 const bool hasContRel = (forbidden && state[i1] !=
's') || rightTurnConflict;
435 if (isFoes && (state[i1] ==
's' || (!hasContRel && state[i2] ==
'G' && !indirectLeft))) {
484#ifdef DEBUG_RECONSTRUCTION
492 std::cout <<
" " << *it <<
"\n";
509 (*i)->removeTrafficLight(&dummy);
513 if (newLogic !=
nullptr) {
544 bool exclusive =
true;
546 if (other != con && other.
getTLIndex() == removed) {
554 if (other.getTLIndex() > removed) {
555 other.setTLIndex(other.getTLIndex() - 1);
561 if (c->customTLIndex > removed) {
569 std::string newState = phase.state;
570 newState.erase(newState.begin() + removed);
571 newLogic->
addStep(phase.duration, newState);
581#ifdef DEBUG_RECONSTRUCTION
582 if (debugPrintModified) {
583 std::cout <<
" newLinks:\n";
585 std::cout <<
" " << *it <<
"\n";
596 maxIndex =
MAX2(maxIndex, c.getTLIndex());
597 maxIndex =
MAX2(maxIndex, c.getTLIndex2());
601 maxIndex =
MAX2(maxIndex, c->tlLinkIndex);
602 maxIndex =
MAX2(maxIndex, c->tlLinkIndex2);
639 for (
auto& pd :
myTLLogic->getPhases()) {
640 result += pd.state[index];
648 if (c.getTLIndex() == index || c.getTLIndex2() == index) {
654 if (c->tlLinkIndex == index || c->tlLinkIndex2 == index) {
662std::set<const NBEdge*>
664 std::set<const NBEdge*> result;
666 if (c.getTLIndex() == index || c.getTLIndex2() == index) {
667 result.insert(c.getFrom());
676 if (oldIndex == newIndex) {
680 if (c.getTLIndex() == oldIndex) {
681 c.setTLIndex(newIndex);
683 if (c.getTLIndex2() == oldIndex) {
684 c.setTLIndex2(newIndex);
689 if (c->tlLinkIndex == oldIndex) {
690 c->tlLinkIndex = newIndex;
692 if (c->tlLinkIndex2 == oldIndex) {
693 c->tlLinkIndex2 = newIndex;
702 std::vector<int> unusedIndices;
703 for (
int i = 0; i <= maxIndex; i++) {
708 if (edges.size() == 0) {
713 for (
int j = i + 1; j <= maxIndex; j++) {
721 unusedIndices.push_back(i);
724 for (
int i = (
int)unusedIndices.size() - 1; i >= 0; i--) {
725 myTLLogic->deleteStateIndex(unusedIndices[i]);
733 for (
int i = (
int)unusedIndices.size() - 1; i >= 0; i--) {
734 if (c->customTLIndex > i) {
737 if (c->customTLIndex2 > i) {
749 std::vector<std::string> states;
758 states.push_back(
getStates(c->tlLinkIndex));
759 c->customTLIndex = index++;
761 states.push_back(
getStates(c->tlLinkIndex2));
762 c->customTLIndex2 = index++;
767 for (
int i = 0; i < (int)states.size(); i++) {
768 for (
int p = 0; p < (int)states[i].size(); p++) {
778 std::map<int, std::string> oldStates;
779 std::map<int, std::string> newStates;
783 const int newIndex = c.getTLIndex();
784 std::string states =
getStates(oldIndex);
785 oldStates[oldIndex] = states;
786 if (newStates.count(newIndex) != 0 && newStates[newIndex] != states) {
788 +
"'. Possibly unsafe program.");
790 newStates[newIndex] = states;
796 for (
int i = 0; i < (int)newStates.size(); i++) {
797 for (
int p = 0; p < (int)newStates[i].size(); p++) {
808 std::vector<int> unusedIndices;
809 for (
int i = 0; i <= maxIndex; i++) {
811 if (unusedIndices.size() > 0) {
815 unusedIndices.push_back(i);
818 for (
int i = (
int)unusedIndices.size() - 1; i >= 0; i--) {
819 myTLLogic->deleteStateIndex(unusedIndices[i]);
821 if (unusedIndices.size() > 0) {
822 myTLLogic->setStateLength(maxIndex + 1 - (
int)unusedIndices.size());
843 std::map<int, int> indexUsage;
845 indexUsage[c.getTLIndex()]++;
849 indexUsage[c->tlLinkIndex]++;
850 indexUsage[c->tlLinkIndex2]++;
853 for (
auto it : indexUsage) {
854 if (it.first >= 0 && it.second > 1) {
863 bool hasMinMaxDur =
false;
864 for (
auto phase :
myTLLogic->getPhases()) {
873 std::set<int> yellowIndices;
874 for (
auto phase :
myTLLogic->getPhases()) {
875 for (
int i = 0; i < (int)phase.state.size(); i++) {
876 if (phase.state[i] ==
'y' || phase.state[i] ==
'Y') {
877 yellowIndices.insert(i);
881 for (
int ip = 0; ip < (int)
myTLLogic->getPhases().size(); ip++) {
882 bool needMinMaxDur =
false;
884 std::set<int> greenIndices;
885 if (phase.state.find_first_of(
"yY") != std::string::npos) {
888 for (
int i = 0; i < (int)phase.state.size(); i++) {
889 if (yellowIndices.count(i) != 0 && phase.state[i] ==
'G') {
890 needMinMaxDur =
true;
891 greenIndices.insert(i);
897 if (greenIndices.count(c.getTLIndex()) != 0) {
898 maxSpeed =
MAX2(maxSpeed, c.getFrom()->getLaneSpeed(c.getFromLane()));
902 const double minDurBySpeed = maxSpeed * 3.6 / 6 - 3.3;
904 myTLLogic->setPhaseMinDuration(ip, minDur);
905 myTLLogic->setPhaseMaxDuration(ip, maxDur);
914 for (
int i = 0; i <
myTLLogic->getNumLinks(); i++) {
#define WRITE_WARNINGF(...)
#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,...
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.
NBNode * getToNode() const
Returns the destination node of the edge.
const Connection & getConnection(int fromLane, const NBEdge *to, int toLane) const
Returns the specified connection (unmodifiable) This method goes through "myConnections" and returns ...
void setInsideTLS(bool inside)
Marks this edge being within an intersection.
const std::string & getID() const
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
NBNode * getFromNode() const
Returns the origin node of the edge.
bool hasConnectionTo(const NBEdge *destEdge, int destLane, int fromLane=-1) const
Retrieves info about a connection to a certain lane of a certain edge.
class for identifying connections
bool isUsed(int index) const
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.
void setID(const std::string &newID)
resets the id
int getMaxIndex()
return the highest known tls link index used by any controlled connection or crossing
bool myReconstructRemovedConnections
bool extraConflict(int index, int foeIndex) const
whether the given index must yield to the foeIndex while turing right on a red light
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
bool isValid(const NBConnection &con) const
return whether the given connection is still valid
void ungroupSignals()
let all connections use a distinct link index
NBLoadedSUMOTLDef(const std::string &id, const std::string &programID, SUMOTime offset, TrafficLightType type)
Constructor.
void addPhase(const SUMOTime duration, const std::string &state, const SUMOTime minDur, const SUMOTime maxDur, const SUMOTime earliestEnd, const SUMOTime latestEnd, const SUMOTime vehExt, const SUMOTime yellow, const SUMOTime red, 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.
bool myReconstructAddedConnections
whether the logic must be reconstructed
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 occurrences 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 finalChecks() const
perform optional final checks (on writing)
~NBLoadedSUMOTLDef()
Destructor.
void initNeedsContRelation() const
initialize myNeedsContRelation and set myNeedsContRelationReady to true
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 void addPedestrianScramble(NBTrafficLightLogic *logic, int totalNumLinks, 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
static std::string addPedestrianPhases(NBTrafficLightLogic *logic, const SUMOTime greenTime, const SUMOTime minDur, const SUMOTime maxDur, const SUMOTime earliestEnd, const SUMOTime latestEnd, 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
void setTLControllingInformation() const
Informs edges about being controlled by a tls.
const std::vector< NBNode * > & getNodes() const
Returns the list of controlled nodes.
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.
ExtraConflicts myExtraConflicts
virtual void addNode(NBNode *node)
Adds a node to the traffic light logic.
NBTrafficLightLogic * compute(const OptionsCont &oc)
Computes the traffic light logic.
virtual void initExtraConflicts() const
bool myExtraConflictsReady
SUMOTime getOffset()
Returns the offset.
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
const NBConnectionVector & getControlledLinks() const
returns the controlled links (depends on previous call to collectLinks)
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.
NBConnectionVector myControlledLinks
The list of controlled links.
bool myNeedsContRelationReady
virtual void initNeedsContRelation() const
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
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.
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.
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 setType(TrafficLightType type)
set the algorithm type (static etc..)
TrafficLightType getType() const
get the algorithm type (static etc..)
void setOffset(SUMOTime offset)
Sets the offset of this tls.
void addStep(const SUMOTime duration, const std::string &state, const std::vector< int > &next=std::vector< int >(), const std::string &name="", const int index=-1)
Adds a phase to the logic (static).
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.
const Parameterised::Map & getParametersMap() const
Returns the inner key/value map.
void updateParameters(const Parameterised::Map &mapArg)
Adds or updates all given parameters from the map.
#define UNUSED_PARAMETER(x)
*brief user defined string literal for JSON values *sa std::size_t n
bool indirectLeft
Whether this connection is an indirect left turn.
data structure for caching needsCont information