54 : myTLControl(tlcontrol), myTLLogic(tlLogic),
55 myAssumedNextSwitch(nextSwitch), myAmValid(true) {}
68 int step1 = myTLLogic->getCurrentPhaseIndex();
69 SUMOTime next = myTLLogic->trySwitch();
70 int step2 = myTLLogic->getCurrentPhaseIndex();
72 if (myTLLogic->isActive()) {
76 myTLLogic->setTrafficLightSignals(t);
81 myAssumedNextSwitch += next;
88 if (tlLogic == myTLLogic) {
90 myAssumedNextSwitch = -1;
96 if (myTLLogic->getDefaultCycleTime() ==
DELTA_T) {
112 const std::map<std::string, std::string>& parameters) :
131 if (phases.size() > 1) {
132 bool haveWarnedAboutUnusedStates =
false;
133 std::vector<bool> foundGreen(phases.front()->getState().size(),
false);
134 for (
int i = 0; i < (int)phases.size(); ++i) {
136 std::vector<int> nextPhases;
137 nextPhases.push_back((i + 1) % phases.size());
138 bool iNextDefault =
true;
139 if (phases[i]->nextPhases.size() > 0) {
140 nextPhases = phases[i]->nextPhases;
141 iNextDefault =
false;
143 for (
int iNext : nextPhases) {
144 if (iNext < 0 || iNext >= (
int)phases.size()) {
148 const std::string optionalFrom = iNextDefault ?
"" :
" from phase " +
toString(i);
149 const std::string& state1 = phases[i]->getState();
150 const std::string& state2 = phases[iNext]->getState();
151 if (state1.size() != state2.size()) {
159 haveWarnedAboutUnusedStates =
true;
163 if (std::string::npos != illegal) {
168 bool haveWarned =
false;
169 for (
int j = 0; j < (int)
MIN3(state1.size(), state2.size(),
myLanes.size()) && !haveWarned; ++j) {
173 for (LaneVector::const_iterator it =
myLanes[j].begin(); it !=
myLanes[j].end(); ++it) {
178 +
" when switching" + optionalFrom +
" to phase " +
toString(iNext));
188 for (
int j = 0; j < (int)state1.size(); ++j) {
191 foundGreen[j] =
true;
196 for (
int j = 0; j < (int)foundGreen.size(); ++j) {
197 if (!foundGreen[j]) {
220 if (mustCheck && phases.size() > 0) {
222 std::set<const MSJunction*> controlledJunctions;
223 const int numLinks = (int)
myLinks.size();
224 for (
int j = 0; j < numLinks; ++j) {
225 for (
int k = 0; k < (int)
myLinks[j].size(); ++k) {
231 const std::string minor =
"gos";
232 for (
const MSJunction* junction : controlledJunctions) {
234 if (logic !=
nullptr) {
237 std::vector<int> tlIndex;
238 for (
int u = 0; u < logicSize; u++) {
240 for (
int v = 0; v < logicSize; v++) {
241 if (response.test(v)) {
244 if (tlIndex.size() == 0) {
246 tlIndex.resize(logicSize, -1);
247 for (
int j = 0; j < numLinks; ++j) {
248 for (
int k = 0; k < (int)
myLinks[j].size(); ++k) {
256 const int tlu = tlIndex[u];
257 const int tlv = tlIndex[v];
258 if (tlu >= 0 && tlv >= 0) {
261 if (minor.find(p->getState()[tlu]) != std::string::npos
262 && minor.find(p->getState()[tlv]) != std::string::npos) {
263 WRITE_ERROR(
"Program '" +
getProgramID() +
"' at tlLogic '" +
getID() +
"' is incompatible with logic at junction '" + junction->getID() +
"'"
264 +
" (mututal conflict between link indices " +
toString(u) +
"," +
toString(v)
266 +
"\n Rebuild the network with option '--tls.ignore-internal-junction-jam or include the program when building.");
294 while ((
int)
myLinks.size() <= pos) {
300 while ((
int)
myLanes.size() <= pos) {
316 std::map<MSLink*, LinkState>
318 std::map<MSLink*, LinkState> ret;
319 for (LinkVectorVector::const_iterator i1 =
myLinks.begin(); i1 !=
myLinks.end(); ++i1) {
321 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
322 ret[*i2] = (*i2)->getState();
334 for (
int i = 0; i < (int)
myLinks.size(); i++) {
337 for (LinkVector::const_iterator j = currGroup.begin(); j != currGroup.end(); j++) {
338 (*j)->setTLState(ls, t);
347 for (LinkVectorVector::const_iterator i1 =
myLinks.begin(); i1 !=
myLinks.end(); ++i1) {
349 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
350 assert(vals.find(*i2) != vals.end());
361 for (LinkVectorVector::const_iterator i1 =
myLinks.begin(); i1 !=
myLinks.end(); ++i1, ++index) {
363 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
387 if (nextSwitch == -1) {
390 const SUMOTime remaining = nextSwitch - simStep;
412 const int numLinks = (int)
myLinks.size();
414 assert(numLinks <= (
int)phases.front()->getState().size());
416 std::vector<double> redDuration(numLinks, 0);
417 std::vector<double> totalRedDuration(numLinks, 0);
418 std::vector<double> penalty(numLinks, 0);
419 for (
int i = 0; i < (int)phases.size(); ++i) {
420 const std::string& state = phases[i]->getState();
421 duration += phases[i]->duration;
423 for (
int j = 0; j < numLinks; ++j) {
426 redDuration[j] +=
STEPS2TIME(phases[i]->duration);
427 totalRedDuration[j] +=
STEPS2TIME(phases[i]->duration);
428 }
else if (redDuration[j] > 0) {
429 penalty[j] += 0.5 * (redDuration[j] * redDuration[j] + redDuration[j]);
435 for (
int j = 0; j < numLinks; ++j) {
436 if (redDuration[j] > 0) {
437 penalty[j] += 0.5 * (redDuration[j] * redDuration[j] + redDuration[j]);
441 const double durationSeconds =
STEPS2TIME(duration);
442 std::set<const MSJunction*> controlledJunctions;
443 for (
int j = 0; j < numLinks; ++j) {
444 for (
int k = 0; k < (int)
myLinks[j].size(); ++k) {
448 double greenFraction = (durationSeconds - totalRedDuration[j]) / durationSeconds;
454 if (greenFraction == 0.01) {
465 for (std::set<const MSJunction*>::iterator it = controlledJunctions.begin(); it != controlledJunctions.end(); ++it) {
467 for (ConstMSEdgeVector::const_iterator it_e = incoming.begin(); it_e != incoming.end(); ++it_e) {
513 const std::string& s = p->getState();
514 assert(linkIndex < (
int)s.size());
std::vector< const MSEdge * > ConstMSEdgeVector
#define WRITE_WARNINGF(...)
#define WRITE_WARNING(msg)
@ SVC_PEDESTRIAN
pedestrian
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic,...
@ LINKSTATE_TL_REDYELLOW
The link has red light (must brake) but indicates upcoming green.
@ LINKSTATE_TL_GREEN_MAJOR
The link has green light, may pass.
@ LINKSTATE_TL_RED
The link has red light (must brake)
@ LINKSTATE_TL_GREEN_MINOR
The link has green light, has to brake.
#define UNUSED_PARAMETER(x)
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A road/street connecting two junctions.
void recalcCache()
Recalculates the cached values.
const MSJunction * getFromJunction() const
const std::string & getEdgeType() const
Returns the type of the edge.
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
The base class for an intersection.
virtual const MSLogicJunction::LinkBits & getResponseFor(int linkIndex) const
Returns the response for the given link.
Representation of a lane in the micro simulation.
MSEdge & getEdge() const
Returns the lane's edge.
void setMesoTLSPenalty(const SUMOTime penalty)
Sets the time penalty for passing a tls-controlled link (meso)
void setTLState(LinkState state, SUMOTime t)
Sets the current tl-state.
MSLane * getLane() const
Returns the connected lane.
int getIndex() const
Returns the respond index (for visualization)
int getTLIndex() const
Returns the TLS index.
const MSLane * getLaneBefore() const
return the internalLaneBefore if it exists and the laneBefore otherwise
void setGreenFraction(const double fraction)
Sets the green fraction for passing a tls-controlled link (meso)
MSJunction * getJunction() const
std::bitset< SUMO_MAX_CONNECTIONS > LinkBits
Container for link response and foes.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
virtual bool isSelected(const MSTrafficLightLogic *) const
return wheter the given logic (or rather it's wrapper) is selected in the GUI
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
const MESegment::MesoEdgeType & getMesoType(const std::string &typeID)
Returns edge type specific meso parameters if no type specific parameters have been loaded,...
bool hasInternalLinks() const
return whether the network contains internal links
The definition of a single phase of a tls logic.
const std::string & getState() const
Returns the state within this phase.
SUMOTime duration
The duration of the phase.
Storage for all programs of a single tls.
void executeOnSwitchActions() const
A class that stores and controls tls and switching of their programs.
Class realising the switch between the traffic light phases.
void deschedule(MSTrafficLightLogic *tlLogic)
Marks this swicth as invalid (if the phase duration has changed, f.e.)
SUMOTime shiftTime(SUMOTime currentTime, SUMOTime execTime, SUMOTime newTime)
Reschedule or deschedule the command when quick-loading state.
SwitchCommand(MSTLLogicControl &tlcontrol, MSTrafficLightLogic *tlLogic, SUMOTime nextSwitch)
Constructor.
~SwitchCommand()
Destructor.
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
SUMOTime execute(SUMOTime currentTime)
Executes the regarded junction's "trySwitch"- method.
The parent class for traffic light logics.
virtual void adaptLinkInformationFrom(const MSTrafficLightLogic &logic)
Applies information about controlled links and lanes from the given logic.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
SUMOTime myOffset
the offset parameter of the current program
int getLinkIndex(const MSLink *const link) const
Returns the index of the given link.
virtual SUMOTime mapTimeInCycle(SUMOTime t) const
map the given time into the current cycle
void setCurrentDurationIncrement(SUMOTime delay)
Delays current phase by the given delay.
std::map< MSLink *, LinkState > collectLinkStates() const
Returns the (uncontrolled) states of the controlled links.
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
virtual ~MSTrafficLightLogic()
Destructor.
MSTrafficLightLogic(MSTLLogicControl &tlcontrol, const std::string &id, const std::string &programID, const SUMOTime offset, const TrafficLightType logicType, const SUMOTime delay, const std::map< std::string, std::string > ¶meters)
Constructor.
virtual void deactivateProgram()
std::vector< SUMOTime > myOverridingTimes
A list of duration overrides.
void ignoreLinkIndex(int pos)
ignore pedestrian crossing index in mesosim
static const LaneVector myEmptyLaneVector
An empty lane vector.
const TrafficLightType myLogicType
The type of the logic.
bool isSelected() const
whether this logic is selected in the GUI
SUMOTime myDefaultCycleTime
The cycle time (without changes)
SUMOTime getTimeInCycle() const
return time within the current cycle
const std::string myProgramID
The id of the logic.
TrafficLightType getLogicType() const
Returns the type of the logic.
LaneVectorVector myLanes
The list of LaneVectors; each vector contains the incoming lanes that belong to the same link index.
SwitchCommand * mySwitchCommand
The current switch command.
int myNumLinks
number of controlled links
int getNumLinks() const
return the number of controlled link indices
SUMOTime myCurrentDurationIncrement
A value for enlarge the current duration.
virtual bool getsMajorGreen(int linkIndex) const
whether the given link index ever turns 'G'
void resetLinkStates(const std::map< MSLink *, LinkState > &vals) const
Resets the states of controlled links.
virtual void activateProgram()
called when switching programs
void addOverridingDuration(SUMOTime duration)
Changes the duration of the next phase.
bool myAmActive
whether the current program is active
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
std::set< int > myIgnoredIndices
list of indices that are ignored in mesoscopic simulatino
SUMOTime getSpentDuration(SUMOTime simStep=-1) const
Returns the duration spent in the current phase.
bool setTrafficLightSignals(SUMOTime t) const
Applies the current signal states to controlled links.
virtual void addLink(MSLink *link, MSLane *lane, int pos)
Adds a link on building.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
std::vector< MSLink * > LinkVector
Definition of the list of links that are subjected to this tls.
LinkVectorVector myLinks
The list of LinkVectors; each vector contains the links that belong to the same link index.
void initMesoTLSPenalties()
initialize optional meso penalties
virtual const Phases & getPhases() const =0
Returns the phases of this tls program.
virtual void init(NLDetectorBuilder &nb)
Initialises the tls with information about incoming lanes.
const std::string & getProgramID() const
Returns this tl-logic's id.
Builds detectors for microsim.
Base class for objects which have an id.
const std::string & getID() const
Returns the id.
An upper class for objects with additional parameters.
static const std::string ALLOWED_TLS_LINKSTATES
all allowed characters for phase state
edge type specific meso parameters