81 }
else if (forced &&
myTYellow < tyellow) {
91 std::vector<double> ret;
92 for (std::vector<PhaseDef>::const_iterator i =
myPhases.begin(); i !=
myPhases.end(); i++) {
93 ret.push_back((
double)(*i).myTime);
97 for (std::vector<PhaseDef>::const_iterator i =
myPhases.begin(); i !=
myPhases.end(); i++) {
100 if (time > cycleDuration) {
101 time = time - cycleDuration;
103 ret.push_back((
double) time);
120 for (std::vector<PhaseDef>::const_reverse_iterator i =
myPhases.rbegin(); i !=
myPhases.rend(); i++) {
122 if (time >= nextTime) {
134 return has_red_now && had_green;
141 if ((*i).getFrom() == from && (*i).getTo() == to) {
160 if ((*i).getFrom() == from) {
172 if ((*i).getFrom() == which) {
175 for (EdgeVector::const_iterator j = by.begin(); j != by.end(); j++) {
178 throw ProcessError(
"Could not replace edge '" + which->
getID() +
"' by '" + (*j)->getID() +
"'.\nUndefined...");
180 newConns.push_back(curr);
186 copy(newConns.begin(), newConns.end(),
194 if ((*i).getTo() == to) {
206 if ((*i).getTo() == which) {
209 for (EdgeVector::const_iterator j = by.begin(); j != by.end(); j++) {
212 throw ProcessError(
"Could not replace edge '" + which->
getID() +
"' by '" + (*j)->getID() +
"'.\nUndefined...");
214 newConns.push_back(curr);
220 copy(newConns.begin(), newConns.end(),
229 if ((*i).getTo() == removed
231 ((*i).getToLane() == removedLane
233 (*i).getToLane() == -1)) {
234 (*i).replaceTo(removed, removedLane, by, byLane);
236 }
else if ((*i).getTo() == removed && removedLane == -1) {
237 (*i).replaceTo(removed, by);
240 if ((*i).getFrom() == removed
242 ((*i).getFromLane() == removedLane
244 (*i).getFromLane() == -1)) {
245 (*i).replaceFrom(removed, removedLane, by, byLane);
247 }
else if ((*i).getFrom() == removed && removedLane == -1) {
248 (*i).replaceFrom(removed, by);
286 NBLoadedTLDef::SignalGroupCont::const_iterator i;
288 std::set<double> tmpSwitchTimes;
299 for (std::vector<double>::const_iterator k = gtimes.begin(); k != gtimes.end(); k++) {
300 tmpSwitchTimes.insert(*k);
303 std::vector<double> switchTimes;
304 copy(tmpSwitchTimes.begin(), tmpSwitchTimes.end(), back_inserter(switchTimes));
305 sort(switchTimes.begin(), switchTimes.end());
310 noSignals += (*i).second->getLinkNo();
314 for (std::vector<double>::iterator l = switchTimes.begin(); l != switchTimes.end(); l++) {
317 if (l != switchTimes.end() - 1) {
319 duration = (int)((*(l + 1)) - (*l));
337 const std::vector<NBTrafficLightLogic::PhaseDefinition> phases = logic->
getPhases();
338 for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator it = phases.begin(); it != phases.end(); it++) {
339 const std::string state = (*it).state;
351 && (state[i2] ==
'G' || state[i2] ==
'g')
390 bool mayDrive = group->
mayDrive(time);
399 for (
int j = 0; j < linkNo; j++) {
414 for (
int j = 0; j < linkNo; j++) {
419 if (state[pos] ==
'g') {
422 if (state[pos] ==
'y') {
436 const std::string& state,
439 if (state[strmpos] !=
'g' && state[strmpos] !=
'G') {
450 for (
int j = 0; j < linkNo; j++) {
461 if (state[pos] ==
'g' || state[pos] ==
'G') {
486 SignalGroupCont::const_iterator m;
490 for (
int j = 0; j < linkNo; j++) {
508 for (
int j = 0; j < noLanes; j++) {
510 for (std::vector<NBEdge::Connection>::iterator k = elv.begin(); k != elv.end(); k++) {
512 if (el.
toEdge !=
nullptr) {
524 for (
int j = 0; j < linkNo; j++) {
530 if (tst.getFrom()->mayBeTLSControlled(tst.getFromLane(), tst.getTo(), tst.getToLane())) {
534 && tst.getFrom() == c.
getFrom() && tst.getTo() == c.
getTo()
535 && (tst.getFromLane() < 0 || tst.getFromLane() == c.
getFromLane())
536 && (tst.getToLane() < 0 || tst.getToLane() == c.
getToLane())) {
554 if ((*i).second->containsConnection(from, to)) {
587 for (NBConnectionVector::const_iterator i = connections.begin(); i != connections.end(); i++) {
644 group->
remap(removed, removedLane, by, byLane);
653 throw ProcessError(
"myNeedsContRelation was not propperly initialized\n");
662 if (logic !=
nullptr) {
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
bool check(const NBEdgeCont &ec)
checks whether the edges are still valid
std::vector< double > getTimes(SUMOTime cycleDuration) const
Returns the times at which the signal switches.
bool setControllingTLInformation(const NBConnection &c, const std::string &tlID)
Returns if the link could be set as to be controlled.
A structure which describes a connection between edges or lanes.
void setSignalYellowTimes(const std::string &groupid, SUMOTime tRedYellow, SUMOTime tYellow)
Sets the times the light is yellow or red/yellow.
int toLane
The lane the connections yields in.
TrafficLightType myType
The algorithm type for the traffic light.
bool containsOutgoing(NBEdge *to) const
Returns whether this signal controls a connection where the given edge is the destination.
virtual void addNode(NBNode *node)
Adds a node to the traffic light logic.
NBEdge * toEdge
The edge the connections yields in.
~SignalGroup()
Destructor.
A single signal group, may control several connections.
SignalGroup(const std::string &id)
Constructor.
int getNumLinks()
Returns the number of participating links.
void addSignalGroupPhaseBegin(const std::string &groupid, SUMOTime time, TLColor color)
Sets the information about the begin of a phase.
A SUMO-compliant built logic for a traffic light.
EdgeVector myIncomingEdges
The list of incoming edges.
The representation of a single edge during network building.
std::string buildPhaseState(int time) const
Builds the phase for a given time.
void sortPhases()
Sorts the phases.
bool replaceTo(NBEdge *which, NBEdge *by)
replaces the to-edge by the one given
const std::vector< PhaseDefinition > & getPhases() const
Returns the phases.
void collectNodes()
Collects the nodes participating in this traffic light.
NBTrafficLightLogic * compute(OptionsCont &oc)
Computes the traffic light logic.
Used for sorting the cells by the begin time they describe.
The base class for traffic light logic definitions.
bool containsConnection(NBEdge *from, NBEdge *to) const
Returns whether the given connection is controlled by this signal.
NBEdge * getFrom() const
returns the from-edge (start of the connection)
const NBConnection & getConnection(int pos) const
Returns the connection at the given index.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
TLColor
An enumeration of possible tl-signal states.
const std::string & getID() const
Returns the id.
SUMOTime myOffset
The offset in the program.
Definition of a single, loaded phase.
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
static bool rightTurnConflict(const NBEdge *from, const NBEdge *to, int fromLane, const NBEdge *prohibitorFrom, const NBEdge *prohibitorTo, int prohibitorFromLane, bool lefthand=false)
return whether the given laneToLane connection is a right turn which must yield to a bicycle crossing...
void setTLIndex(int tlIndex)
void remapOutgoing(NBEdge *which, const EdgeVector &by)
Replaces the given outgoing edge by the others given.
virtual void collectEdges()
Build the list of participating edges.
static const int InvalidTlIndex
bool replaceFrom(NBEdge *which, NBEdge *by)
replaces the from-edge by the one given
void remapIncoming(NBEdge *which, const EdgeVector &by)
Replaces the given incoming edge by the others given.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
bool addToSignalGroup(const std::string &groupid, const NBConnection &connection)
Adds a connection to a signal group.
int getLinkNo() const
Returns the number of links (connection) controlled by this signal.
NBLoadedTLDef(const NBEdgeCont &ec, const std::string &id, const std::vector< NBNode *> &junctions, SUMOTime offset, TrafficLightType type)
Constructor.
SignalGroupCont mySignalGroups
Controlled signal groups.
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.
int getNumLanes() const
Returns the number of lanes.
SignalGroup * findGroup(NBEdge *from, NBEdge *to) const
Returns the signal group which is responsible for the given connection.
void setTLControllingInformation() const
Informs edges about being controlled by a tls.
void setCycleDuration(int cycleDur)
Sets the duration of a cycle.
void setParticipantsInformation()
Builds the list of participating nodes/edges/links.
const std::string & getID() const
std::vector< PhaseDef > myPhases
The phases of this signal.
Storage for edges, including some functionality operating on multiple edges.
void remap(NBEdge *removed, int removedLane, NBEdge *by, int byLane)
Replaces a removed edge/lane.
void collectLinks()
Collects the links participating in this traffic light.
static const std::string DefaultProgramID
const std::string & getProgramID() const
Returns the ProgramID.
void addConnection(const NBConnection &c)
Inserts a controlled connection.
Base class for objects which have an id.
void addPhaseBegin(SUMOTime time, TLColor color)
Sets the begin of a phase.
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
void setYellowTimes(SUMOTime tRedYellowe, SUMOTime tYellow)
Sets the times for redyellow and yellow.
void initNeedsContRelation() const
int getToLane() const
returns the to-lane
NBEdge * getTo() const
returns the to-edge (end of the connection)
void closeBuilding(bool checkVarDurations=true)
closes the building process
void addTrafficLight(NBTrafficLightDefinition *tlDef)
Adds a traffic light to the list of traffic lights that control this node.
void patchTYellow(int tyellow, bool forced)
Sets the yellow time.
SUMOTime myTRedYellow
The times of redyellow and yellow.
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.
void addSignalGroup(const std::string &id)
Adds a signal group.
bool myNeedsContRelationReady
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
bool mayDrive(SUMOTime time) const
Returns whether vehicles on controlled links may drive at the given time.
Sorts phases by their begin time.
NBTrafficLightLogic * myCompute(int brakingTimeSeconds)
Computes the traffic light logic finally in dependence to the type.
bool containsIncoming(NBEdge *from) const
Returns whether this signal controls the given edge.
int myCycleDuration
The duration of a single cycle.
NeedsContRelation myNeedsContRelation
int getFromLane() const
returns the from-lane
Represents a single node (junction) during network building.
bool mustBrake(const NBConnection &possProhibited, const std::string &state, int strmpos) const
Returns the information whether a connection must brake, given a phase.
std::vector< Connection > getConnectionsFromLane(int lane, NBEdge *to=nullptr, int toLane=-1) const
Returns connections from a given lane.
void replaceRemoved(NBEdge *removed, int removedLane, NBEdge *by, int byLane)
Replaces a removed edge/lane.
NBConnectionVector myConnections
Connections controlled by this signal.
data structure for caching needsCont information
~NBLoadedTLDef()
Destructor.
int getTLIndex() const
returns the index within the controlling tls or InvalidTLIndex if this link is unontrolled ...
std::vector< NBNode * > myControlledNodes
The container with participating nodes.
NBNode * getFromNode() const
Returns the origin node of the edge.
void remapRemoved(NBEdge *removed, const EdgeVector &incoming, const EdgeVector &outgoing)
Replaces occurences of the removed edge in incoming/outgoing edges of all definitions.
virtual void clear()
Clears information whether an error occurred previously.
const NBEdgeCont * myEdgeCont
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.
NBNode * getToNode() const
Returns the destination node of the edge.
int getMaxIndex()
Returns the maximum index controlled by this traffic light.
bool hasYellow(SUMOTime time) const
Returns whether controlled links have yellow at the given time.