62 : myTLControl(tlcontrol), myTLLogic(tlLogic),
63 myAssumedNextSwitch(nextSwitch), myAmValid(true) {}
109 const std::string& programID,
SUMOTime delay,
const std::map<std::string, std::string>& parameters) :
125 if (phases.size() > 1) {
126 bool haveWarnedAboutUnusedStates =
false;
127 std::vector<bool> foundGreen(phases.front()->getState().size(),
false);
128 for (
int i = 0; i < (int)phases.size(); ++i) {
130 const int iNext = (i + 1) % phases.size();
131 const std::string& state1 = phases[i]->getState();
132 const std::string& state2 = phases[iNext]->getState();
133 assert(state1.size() == state2.size());
134 if (!haveWarnedAboutUnusedStates && state1.size() >
myLanes.size()) {
138 haveWarnedAboutUnusedStates =
true;
141 for (
int j = 0; j < (int)
MIN3(state1.size(), state2.size(),
myLanes.size()); ++j) {
145 for (LaneVector::const_iterator it =
myLanes[j].begin(); it !=
myLanes[j].end(); ++it) {
149 +
" when switching to phase " +
toString(iNext));
156 for (
int j = 0; j < (int)state1.size(); ++j) {
159 foundGreen[j] =
true;
163 for (
int j = 0; j < (int)foundGreen.size(); ++j) {
164 if (!foundGreen[j]) {
185 while ((
int)
myLinks.size() <= pos) {
191 while ((
int)
myLanes.size() <= pos) {
206 std::map<MSLink*, LinkState>
208 std::map<MSLink*, LinkState> ret;
209 for (LinkVectorVector::const_iterator i1 =
myLinks.begin(); i1 !=
myLinks.end(); ++i1) {
211 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
212 ret[*i2] = (*i2)->getState();
224 for (
int i = 0; i < (int)
myLinks.size(); i++) {
227 for (LinkVector::const_iterator j = currGroup.begin(); j != currGroup.end(); j++) {
228 (*j)->setTLState(ls, t);
237 for (LinkVectorVector::const_iterator i1 =
myLinks.begin(); i1 !=
myLinks.end(); ++i1) {
239 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
240 assert(vals.find(*i2) != vals.end());
251 for (LinkVectorVector::const_iterator i1 =
myLinks.begin(); i1 !=
myLinks.end(); ++i1, ++index) {
253 for (LinkVector::const_iterator i2 = l.begin(); i2 != l.end(); ++i2) {
274 if (nextSwitch == -1) {
299 const int numLinks = (int)
myLinks.size();
301 assert(numLinks <= (
int)phases.front()->getState().size());
303 std::vector<double> redDuration(numLinks, 0);
304 std::vector<double> totalRedDuration(numLinks, 0);
305 std::vector<double> penalty(numLinks, 0);
306 for (
int i = 0; i < (int)phases.size(); ++i) {
307 const std::string& state = phases[i]->getState();
308 duration += phases[i]->duration;
310 for (
int j = 0; j < numLinks; ++j) {
313 redDuration[j] +=
STEPS2TIME(phases[i]->duration);
314 totalRedDuration[j] +=
STEPS2TIME(phases[i]->duration);
315 }
else if (redDuration[j] > 0) {
316 penalty[j] += 0.5 * (redDuration[j] * redDuration[j] + redDuration[j]);
322 for (
int j = 0; j < numLinks; ++j) {
323 if (redDuration[j] > 0) {
324 penalty[j] += 0.5 * (redDuration[j] * redDuration[j] + redDuration[j]);
328 const double durationSeconds =
STEPS2TIME(duration);
329 std::set<const MSJunction*> controlledJunctions;
330 for (
int j = 0; j < numLinks; ++j) {
331 for (
int k = 0; k < (int)
myLinks[j].size(); ++k) {
334 controlledJunctions.insert(
myLinks[j][k]->getLane()->getEdge().getFromJunction());
340 for (std::set<const MSJunction*>::iterator it = controlledJunctions.begin(); it != controlledJunctions.end(); ++it) {
342 for (ConstMSEdgeVector::const_iterator it_e = incoming.begin(); it_e != incoming.end(); ++it_e) {
SUMOTime myCurrentDurationIncrement
A value for enlarge the current duration.
The link has green light, may pass.
bool isActive(const MSTrafficLightLogic *tl) const
Returns whether the given tls program is the currently active for his tls.
virtual int getCurrentPhaseIndex() const =0
Returns the current index within the program.
void resetLinkStates(const std::map< MSLink *, LinkState > &vals) const
Resets the states of controlled links.
Builds detectors for microsim.
void initMesoTLSPenalties()
initialize optional meso penalties
const std::string & getState() const
Returns the state within this phase.
bool setTrafficLightSignals(SUMOTime t) const
Applies the current signal states to controlled links.
Storage for all programs of a single tls.
MSTLLogicControl & myTLControl
The responsible traffic lights control.
static double gMesoTLSPenalty
std::vector< SUMOTime > myOverridingTimes
A list of duration overrides.
int getLinkIndex(const MSLink *const link) const
Returns the index of the given link.
SwitchCommand(MSTLLogicControl &tlcontrol, MSTrafficLightLogic *tlLogic, SUMOTime nextSwitch)
Constructor.
std::string myProgramID
The id of the logic.
SUMOTime myAssumedNextSwitch
Assumed switch time (may change in case of adaptive traffic lights)
The link has green light, has to brake.
void recalcCache()
Recalculates the cached values.
static const LaneVector myEmptyLaneVector
An empty lane vector.
void setTLState(LinkState state, SUMOTime t)
Sets the current tl-state.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSTrafficLightLogic(MSTLLogicControl &tlcontrol, const std::string &id, const std::string &programID, SUMOTime delay, const std::map< std::string, std::string > ¶meters)
Constructor.
std::vector< const MSEdge * > ConstMSEdgeVector
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
#define WRITE_WARNING(msg)
LaneVectorVector myLanes
The list of LaneVectors; each vector contains the incoming lanes that belong to the same link index...
virtual ~MSTrafficLightLogic()
Destructor.
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
A class that stores and controls tls and switching of their programs.
const std::string & getID() const
Returns the id.
A road/street connecting two junctions.
SUMOTime duration
The duration of the phase.
void deschedule(MSTrafficLightLogic *tlLogic)
Marks this swicth as invalid (if the phase duration has changed, f.e.)
Class realising the switch between the traffic light phases.
~SwitchCommand()
Destructor.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
SUMOTime myDefaultCycleTime
The cycle time (without changes)
MSTrafficLightLogic * myTLLogic
The logic to be executed on a switch.
virtual const MSPhaseDefinition & getCurrentPhaseDef() const =0
Returns the definition of the current phase.
virtual void init(NLDetectorBuilder &nb)
Initialises the tls with information about incoming lanes.
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
virtual void adaptLinkInformationFrom(const MSTrafficLightLogic &logic)
Applies information about controlled links and lanes from the given logic.
LinkState
The right-of-way state of a link between two lanes used when constructing a NBTrafficLightLogic, in MSLink and GNEInternalLane.
An upper class for objects with additional parameters.
void setCurrentDurationIncrement(SUMOTime delay)
Delays current phase by the given delay.
Base class for objects which have an id.
std::vector< MSLink * > LinkVector
Definition of the list of links that are subjected to this tls.
SUMOTime getNextSwitchTime() const
Returns the assumed next switch time.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
void addOverridingDuration(SUMOTime duration)
Changes the duration of the next phase.
LinkVectorVector myLinks
The list of LinkVectors; each vector contains the links that belong to the same link index...
std::vector< MSLane * > LaneVector
Definition of the list of arrival lanes subjected to this tls.
virtual const Phases & getPhases() const =0
Returns the phases of this tls program.
void executeOnSwitchActions() const
The link has red light (must brake)
virtual void addLink(MSLink *link, MSLane *lane, int pos)
Adds a link on building.
TLSLogicVariants & get(const std::string &id) const
Returns the variants of a named tls.
SwitchCommand * mySwitchCommand
The current switch command.
The parent class for traffic light logics.
const std::string & getProgramID() const
Returns this tl-logic's id.
bool myAmValid
Information whether this switch command is still valid.
virtual SUMOTime trySwitch()=0
Switches to the next phase.
SUMOTime getSpentDuration() const
Returns the duration spent in the current phase.
Representation of a lane in the micro simulation.
std::map< MSLink *, LinkState > collectLinkStates() const
Returns the (uncontrolled) states of the controlled links.
The link has red light (must brake) but indicates upcoming green.
SUMOTime execute(SUMOTime currentTime)
Executes the regarded junction's "trySwitch"- method.