Eclipse SUMO - Simulation of Urban MObility
NBTrafficLightLogicCont.cpp
Go to the documentation of this file.
1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 // Copyright (C) 2001-2024 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License 2.0 which is available at
6 // https://www.eclipse.org/legal/epl-2.0/
7 // This Source Code may also be made available under the following Secondary
8 // Licenses when the conditions for such availability set forth in the Eclipse
9 // Public License 2.0 are satisfied: GNU General Public License, version 2
10 // or later which is available at
11 // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 /****************************************************************************/
20 // A container for traffic light definitions and built programs
21 /****************************************************************************/
22 #include <config.h>
23 #include <map>
24 #include <string>
25 #include <algorithm>
27 #include <utils/common/ToString.h>
31 #include "NBTrafficLightLogic.h"
33 #include "NBOwnTLDef.h"
34 #include "NBLoadedSUMOTLDef.h"
35 #include "NBEdgeCont.h"
36 #include "NBNodeCont.h"
37 
38 
39 // ===========================================================================
40 // static members
41 // ===========================================================================
43 
44 // ===========================================================================
45 // method definitions
46 // ===========================================================================
48 
49 
51  clear();
52 }
53 
54 
55 void
57  // check whether any offsets shall be manipulated by setting
58  // them to half of the duration
59  if (oc.isSet("tls.half-offset")) {
60  std::vector<std::string> ids = oc.getStringVector("tls.half-offset");
61  myHalfOffsetTLS.insert(ids.begin(), ids.end());
62  }
63  // check whether any offsets shall be manipulated by setting
64  // them to a quarter of the duration
65  if (oc.isSet("tls.quarter-offset")) {
66  std::vector<std::string> ids = oc.getStringVector("tls.quarter-offset");
67  myQuarterOffsetTLS.insert(ids.begin(), ids.end());
68  }
69 }
70 
71 
72 std::string
73 NBTrafficLightLogicCont::getNextProgramID(const std::string& id) const {
74  IDSupplier idS("", 0);
75  if (myDefinitions.count(id)) {
76  const Program2Def& programs = myDefinitions.find(id)->second;
77  for (auto item : programs) {
78  idS.avoid(item.first);
79  }
80  }
81  return idS.getNext();
82 }
83 
84 
85 bool
87  myExtracted.erase(logic);
88  if (myDefinitions.count(logic->getID())) {
89  if (myDefinitions[logic->getID()].count(logic->getProgramID())) {
90  if (forceInsert) {
91  logic->setProgramID(getNextProgramID(logic->getID()));
92  } else {
93  return false;
94  }
95  }
96  } else {
97  myDefinitions[logic->getID()] = Program2Def();
98  }
99  myDefinitions[logic->getID()][logic->getProgramID()] = logic;
100  return true;
101 }
102 
103 
104 bool
106  if (myDefinitions.count(id)) {
107  // delete all programs
108  for (Program2Def::iterator i = myDefinitions[id].begin(); i != myDefinitions[id].end(); i++) {
109  delete i->second;
110  }
111  myDefinitions.erase(id);
112  // also delete any logics that were already computed
113  if (myComputed.count(id)) {
114  for (Program2Logic::iterator i = myComputed[id].begin(); i != myComputed[id].end(); i++) {
115  delete i->second;
116  }
117  myComputed.erase(id);
118  }
119  return true;
120  } else {
121  return false;
122  }
123 }
124 
125 
126 bool
127 NBTrafficLightLogicCont::removeProgram(const std::string id, const std::string programID, bool del) {
128  if (myDefinitions.count(id) && myDefinitions[id].count(programID)) {
129  if (del) {
130  delete myDefinitions[id][programID];
131  }
132  myDefinitions[id].erase(programID);
133  return true;
134  } else {
135  return false;
136  }
137 }
138 
139 
140 void
142  myExtracted.insert(definition);
143  removeProgram(definition->getID(), definition->getProgramID(), false);
144 }
145 
146 
147 bool
148 NBTrafficLightLogicCont::exist(const std::string& newID, bool requireComputed) const {
149  const auto itD = myDefinitions.find(newID);
150  const auto itC = myComputed.find(newID);
151  if ((itD != myDefinitions.end()) && (itC != myComputed.end() || !requireComputed)) {
152  return true;
153  } else {
154  return false;
155  }
156 }
157 
158 
159 std::pair<int, int>
161  // clean previous logics
162  Logics logics = getComputed();
163  for (Logics::iterator it = logics.begin(); it != logics.end(); it++) {
164  delete *it;
165  }
166  myComputed.clear();
167  if (oc.getBool("tls.rebuild")) {
169  NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(def);
170  if (lDef != nullptr) {
171  TrafficLightType type = def->getType();
172  if (!oc.isDefault("tls.default-type")) {
173  type = SUMOXMLDefinitions::TrafficLightTypes.get(oc.getString("tls.default-type"));
174  }
175  NBOwnTLDef* oDef = new NBOwnTLDef(def->getID(), def->getNodes(), def->getOffset(), type);
176  oDef->setProgramID(def->getProgramID());
178  for (NBEdge* e : oDef->getIncomingEdges()) {
179  e->clearControllingTLInformation();
180  }
182  for (NBNode* node : oDef->getNodes()) {
183  node->removeTrafficLight(def);
184  }
185  removeProgram(def->getID(), def->getProgramID());
186  insert(oDef);
187  }
188  }
189  }
190  if (oc.getBool("tls.group-signals")) {
191  // replace NBOwnTLDef tld with NBLoadedSUMOTLDef
193  NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(def);
194  if (lDef == nullptr) {
195  NBTrafficLightLogic* logic = def->compute(oc);
196  if (logic != nullptr) {
197  lDef = new NBLoadedSUMOTLDef(*def, *logic);
199  for (NBNode* node : lDef->getNodes()) {
200  node->removeTrafficLight(def);
201  node->addTrafficLight(lDef);
202  }
203  removeProgram(def->getID(), def->getProgramID());
204  insert(lDef);
205  delete logic;
206  }
207  }
208  if (lDef != nullptr) {
209  lDef->groupSignals();
210  }
211  }
212  } else if (oc.getBool("tls.ungroup-signals")) {
214  NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(def);
215  // NBOwnTLDef are always ungrouped
216  if (lDef != nullptr) {
217  if (lDef->usingSignalGroups()) {
218  lDef->ungroupSignals();
219  }
220  }
221  }
222  }
223  int numPrograms = 0;
225  if (computeSingleLogic(oc, def)) {
226  numPrograms++;
227  }
228  }
229  return std::pair<int, int>((int)myComputed.size(), numPrograms);
230 }
231 
232 
233 bool
235  if (def->getNodes().size() == 0) {
236  return false;
237  }
238  const std::string& id = def->getID();
239  const std::string& programID = def->getProgramID();
240  // build program
241  NBTrafficLightLogic* built = def->compute(oc);
242  if (built == nullptr) {
243  WRITE_WARNINGF(TL("Could not build program '%' for traffic light '%'"), programID, id);
244  return false;
245  }
246  // compute offset
247  SUMOTime T = built->getDuration();
248  if (myHalfOffsetTLS.count(id)) {
249  built->setOffset(TIME2STEPS(floor(STEPS2TIME(T / 2))));
250  }
251  if (myQuarterOffsetTLS.count(id)) {
252  built->setOffset(TIME2STEPS(floor(STEPS2TIME(T / 4))));
253  }
254  // and insert the result after computation
255  // make sure we don't leak memory if computeSingleLogic is called externally
256  if (myComputed[id][programID] != nullptr) {
257  delete myComputed[id][programID];
258  }
259  myComputed[id][programID] = built;
260  return true;
261 }
262 
263 
264 void
266  Definitions definitions = getDefinitions();
267  for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
268  delete *it;
269  }
270  myDefinitions.clear();
271  Logics logics = getComputed();
272  for (Logics::iterator it = logics.begin(); it != logics.end(); it++) {
273  delete *it;
274  }
275  myComputed.clear();
276  for (std::set<NBTrafficLightDefinition*>::iterator it = myExtracted.begin(); it != myExtracted.end(); it++) {
277  delete *it;
278  }
279  myExtracted.clear();
280 }
281 
282 
283 void
285  const EdgeVector& outgoing) {
286  Definitions definitions = getDefinitions();
287  for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
288  (*it)->remapRemoved(removed, incoming, outgoing);
289  }
290 }
291 
292 
293 void
295  NBEdge* by, int byLane, bool incoming) {
296  Definitions definitions = getDefinitions();
297  for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
298  (*it)->replaceRemoved(removed, removedLane, by, byLane, incoming);
299  }
300 }
301 
302 
304 NBTrafficLightLogicCont::getDefinition(const std::string& id, const std::string& programID) const {
305  Id2Defs::const_iterator i = myDefinitions.find(id);
306  if (i != myDefinitions.end()) {
307  Program2Def programs = i->second;
308  Program2Def::const_iterator i2 = programs.find(programID);
309  if (i2 != programs.end()) {
310  return i2->second;
311  }
312  }
313  return nullptr;
314 }
315 
317 NBTrafficLightLogicCont::getPrograms(const std::string& id) const {
318  Id2Defs::const_iterator it = myDefinitions.find(id);
319  if (it != myDefinitions.end()) {
320  return it->second;
321  } else {
322  return EmptyDefinitions;
323  }
324 }
325 
326 
328 NBTrafficLightLogicCont::getLogic(const std::string& id, const std::string& programID) const {
329  Id2Logics::const_iterator i = myComputed.find(id);
330  if (i != myComputed.end()) {
331  Program2Logic programs = i->second;
332  Program2Logic::const_iterator i2 = programs.find(programID);
333  if (i2 != programs.end()) {
334  return i2->second;
335  }
336  }
337  return nullptr;
338 }
339 
340 
341 void
343  Definitions definitions = getDefinitions();
344  // set the information about all participants, first
345  for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
346  (*it)->setParticipantsInformation();
347  }
348  // clear previous information because tlDefs may have been removed in netedit
350  // insert the information about the tl-controlling
351  for (Definitions::iterator it = definitions.begin(); it != definitions.end(); it++) {
352  (*it)->setTLControllingInformation();
353  }
354  // handle rail signals which are not instantiated as normal definitions
355  for (std::map<std::string, NBNode*>::const_iterator it = nc.begin(); it != nc.end(); it ++) {
356  NBNode* n = it->second;
358  NBOwnTLDef dummy(n->getID(), n, 0, TrafficLightType::STATIC);
361  n->setCrossingTLIndices(dummy.getID(), (int)dummy.getControlledLinks().size());
362  n->removeTrafficLight(&dummy);
363  }
364  }
365 }
366 
367 
368 void
370  Definitions definitions = getDefinitions();
372  std::map<NBEdge*, std::string> defaultSignalIDs;
373  for (const NBConnection& con : def->getControlledLinks()) {
374  const NBEdge::Connection& c = con.getFrom()->getConnection(con.getFromLane(), con.getTo(), con.getToLane());
375  if (c.hasParameter("signalID")) {
376  defaultSignalIDs[con.getFrom()] = c.getParameter("signalID");
377  def->setParameter("linkSignalID:" + toString(con.getTLIndex()), c.getParameter("signalID"));
378  }
379  }
380  // oftentimes, signals are placed on connecting road but are meant to apply to all connections from the incoming edge
381  for (const NBConnection& con : def->getControlledLinks()) {
382  const NBEdge::Connection& c = con.getFrom()->getConnection(con.getFromLane(), con.getTo(), con.getToLane());
383  if (!c.hasParameter("signalID") && defaultSignalIDs.count(con.getFrom()) != 0) {
384  WRITE_WARNINGF(TL("Guessing signalID for link index % at traffic light '%'."), con.getTLIndex(), def->getID());
385  def->setParameter("linkSignalID:" + toString(con.getTLIndex()), defaultSignalIDs[con.getFrom()]);
386  }
387  }
388  }
389 }
390 
391 
392 void
394  // collect connections with controllerID which can be controlled together
395  Definitions definitions = getDefinitions();
396  std::map<std::string, NBTrafficLightDefinition*> defsToGroup;
397  std::map<std::string, std::map<std::string, std::set<int>>> controllerID2tlIndex;
398  for (NBTrafficLightDefinition* def : definitions) {
399  bool makeGroups = false;
400  NBConnectionVector& connections = def->getControlledLinks();
401  std::string defID = def->getID();
402 
403  for (NBConnection conn : connections) {
404  std::string controllerID = conn.getFrom()->getConnection(conn.getFromLane(), conn.getTo(), conn.getToLane()).getParameter("controllerID");
405  if (controllerID != "") {
406  if (controllerID2tlIndex.find(defID) == controllerID2tlIndex.end()) {
407  controllerID2tlIndex[defID][controllerID] = std::set<int>({ conn.getTLIndex() });
408  } else if (controllerID2tlIndex[defID].find(controllerID) != controllerID2tlIndex[defID].end()) {
409  controllerID2tlIndex[defID][controllerID].insert(conn.getTLIndex());
410  } else {
411  controllerID2tlIndex[defID][controllerID] = std::set<int>({ conn.getTLIndex() });
412  }
413  makeGroups = controllerID2tlIndex[defID][controllerID].size() > 1 || makeGroups;
414  }
415  }
416  if (makeGroups) {
417  defsToGroup[def->getID()] = def;
418  }
419  }
420  bool same = true;
421  for (NBTrafficLightLogic* computed : getComputed()) {
422  const std::string computedID = computed->getID();
423  if (defsToGroup.find(computedID) != defsToGroup.end()) {
424  // remember corresponding tl indices and check if they can be joined
425  // execute tl index joins if possible
426  const std::vector<NBTrafficLightLogic::PhaseDefinition> phases = computed->getPhases();
427  std::vector<int> major2minor;
428  for (const auto& indexSet : controllerID2tlIndex[computedID]) {
429  if (indexSet.second.size() < 2) {
430  continue;
431  }
432  bool toMinor = false;
433  for (NBTrafficLightLogic::PhaseDefinition phase : phases) {
434  std::set<int>::iterator it = indexSet.second.begin();
435  char firstChar = phase.state[*it];
436  if (firstChar == LINKSTATE_TL_GREEN_MAJOR) {
437  firstChar = LINKSTATE_TL_GREEN_MINOR;
438  }
439  it++;
440  for (; it != indexSet.second.end(); it++) {
441  const char compareChar = (phase.state[*it] != LINKSTATE_TL_GREEN_MAJOR) ? phase.state[*it] : (char)LINKSTATE_TL_GREEN_MINOR;
442  if (compareChar != firstChar) {
443  same = false;
444  break;
445  } else if (phase.state[*it] == LINKSTATE_TL_GREEN_MINOR) {
446  toMinor = true;
447  }
448  }
449  if (!same) {
450  break;
451  }
452  }
453  if (toMinor) {
454  major2minor.push_back(*indexSet.second.begin());
455  }
456  }
457  if (same) {
458  NBLoadedSUMOTLDef* lDef = dynamic_cast<NBLoadedSUMOTLDef*>(defsToGroup[computedID]);
459  if (lDef == nullptr) {
460  lDef = new NBLoadedSUMOTLDef(*defsToGroup[computedID], *computed);
462  for (int index : major2minor) { // update the signal states (G -> g where needed)
463  for (int i = 0; i < (int)phases.size(); i++) {
464  if (phases[i].state[index] == LINKSTATE_TL_GREEN_MAJOR) {
465  lDef->getLogic()->setPhaseState(i, index, LINKSTATE_TL_GREEN_MINOR);
466  }
467  }
468  }
469  // join signal groups, update the connections
470  std::vector<int> indexToRemove;
471  for (const auto& indexSet : controllerID2tlIndex[computedID]) {
472  int minIndex = *indexSet.second.begin();
473  for (int index : indexSet.second) {
474  if (index != minIndex) {
475  lDef->replaceIndex(index, minIndex);
476  indexToRemove.push_back(index);
477  }
478  }
479  }
480  // remove unused indices from signal programs
481  lDef->cleanupStates();
482  for (NBNode* node : lDef->getNodes()) {
483  node->removeTrafficLight(defsToGroup[computedID]);
484  node->addTrafficLight(lDef);
485  }
486  removeProgram(defsToGroup[computedID]->getID(), defsToGroup[computedID]->getProgramID());
487  insert(lDef);
488  computeSingleLogic(oc, lDef);
489  }
490  } else { // TODO: try other strategy to build signal groups
491  WRITE_WARNINGF(TL("Was not able to apply the OpenDRIVE signal group information onto the signal program of traffic light % generated by SUMO."), computed->getID());
492  }
493  break;
494  }
495  }
496 }
497 
498 
501  Logics result;
502  for (Id2Logics::const_iterator it_id = myComputed.begin(); it_id != myComputed.end(); it_id++) {
503  const Program2Logic& programs = it_id->second;
504  for (Program2Logic::const_iterator it_prog = programs.begin(); it_prog != programs.end(); it_prog++) {
505  result.push_back(it_prog->second);
506  }
507  }
508  return result;
509 }
510 
511 
514  Definitions result;
515  for (Id2Defs::const_iterator it_id = myDefinitions.begin(); it_id != myDefinitions.end(); it_id++) {
516  const Program2Def& programs = it_id->second;
517  for (Program2Def::const_iterator it_prog = programs.begin(); it_prog != programs.end(); it_prog++) {
518  result.push_back(it_prog->second);
519  }
520  }
521  return result;
522 }
523 
524 
525 void
527  auto it = myDefinitions.find(tlDef->getID());
528  if (it != myDefinitions.end()) {
529  for (auto item : it->second) {
530  item.second->setID(newID);
531  }
532  myDefinitions[newID] = it->second;
533  myDefinitions.erase(it);
534  }
535  auto it2 = myComputed.find(tlDef->getID());
536  if (it2 != myComputed.end()) {
537  for (auto item : it2->second) {
538  item.second->setID(newID);
539  }
540  myComputed[newID] = it2->second;
541  myComputed.erase(it2);
542  }
543 }
544 
545 
546 int
548  return (int)myExtracted.size();
549 }
550 
551 /****************************************************************************/
long long int SUMOTime
Definition: GUI.h:35
#define WRITE_WARNINGF(...)
Definition: MsgHandler.h:296
#define TL(string)
Definition: MsgHandler.h:315
std::vector< NBConnection > NBConnectionVector
Definition of a connection vector.
std::vector< NBEdge * > EdgeVector
container for (sorted) edges
Definition: NBCont.h:35
#define STEPS2TIME(x)
Definition: SUMOTime.h:55
#define TIME2STEPS(x)
Definition: SUMOTime.h:57
TrafficLightType
@ LINKSTATE_TL_GREEN_MAJOR
The link has green light, may pass.
@ LINKSTATE_TL_GREEN_MINOR
The link has green light, has to brake.
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
Definition: ToString.h:46
std::string getNext()
Returns the next id.
Definition: IDSupplier.cpp:51
void avoid(const std::string &id)
make sure that the given id is never supplied
Definition: IDSupplier.cpp:59
Storage for edges, including some functionality operating on multiple edges.
Definition: NBEdgeCont.h:59
void clearControllingTLInformation() const
Clears information about controlling traffic lights for all connenections of all edges.
Definition: NBEdgeCont.cpp:836
The representation of a single edge during network building.
Definition: NBEdge.h:92
A loaded (complete) traffic light logic.
bool usingSignalGroups() const
whether this definition uses signal group (multiple connections with the same link index)
void ungroupSignals()
let all connections use a distinct link index
void groupSignals()
let connections with the same state use the same link index
void replaceIndex(int oldIndex, int newIndex)
replace the given link index in all connections
NBTrafficLightLogic * getLogic()
Returns the internal logic.
Container for nodes during the netbuilding process.
Definition: NBNodeCont.h:57
std::map< std::string, NBNode * >::const_iterator begin() const
Returns the pointer to the begin of the stored nodes.
Definition: NBNodeCont.h:113
std::map< std::string, NBNode * >::const_iterator end() const
Returns the pointer to the end of the stored nodes.
Definition: NBNodeCont.h:118
Represents a single node (junction) during network building.
Definition: NBNode.h:66
bool setCrossingTLIndices(const std::string &tlID, int startIndex)
Definition: NBNode.cpp:3918
SumoXMLNodeType getType() const
Returns the type of this node.
Definition: NBNode.h:285
void removeTrafficLight(NBTrafficLightDefinition *tlDef)
Removes the given traffic light from this node.
Definition: NBNode.cpp:406
A traffic light logics which must be computed (only nodes/edges are given)
Definition: NBOwnTLDef.h:44
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)
TrafficLightType getType() const
get the algorithm type (static etc..)
virtual void setProgramID(const std::string &programID)
Sets the programID.
NBTrafficLightLogic * compute(const OptionsCont &oc)
Computes the traffic light logic.
const std::vector< NBNode * > & getNodes() const
Returns the list of controlled nodes.
virtual void setParticipantsInformation()
Builds the list of participating nodes/edges/links.
The definition of a single phase of the logic.
bool exist(const std::string &newID, bool requireComputed=true) const
check if exists a definition with the given ID
void replaceRemoved(NBEdge *removed, int removedLane, NBEdge *by, int byLane, bool incoming)
Replaces occurrences of the removed edge/lane in all definitions by the given edge.
void applyOptions(OptionsCont &oc)
Initialises the storage by applying given options.
void setOpenDriveSignalParameters()
set OpenDRIVE signal reference parameters after all link indices are known
std::vector< NBTrafficLightLogic * > getComputed() const
Returns a list of all computed logics.
void rename(NBTrafficLightDefinition *tlDef, const std::string &newID)
rename traffic light
std::map< std::string, NBTrafficLightDefinition * > Program2Def
std::set< std::string > myHalfOffsetTLS
List of tls which shall have an offset of T/2.
static const Program2Def EmptyDefinitions
empty definition
std::vector< NBTrafficLightLogic * > Logics
std::vector< NBTrafficLightDefinition * > Definitions
Returns a list of all definitions (convenience for easier iteration)
bool removeProgram(const std::string id, const std::string programID, bool del=true)
Removes a program of a logic definition from the dictionary.
bool computeSingleLogic(OptionsCont &oc, NBTrafficLightDefinition *def)
Computes a specific traffic light logic (using by netedit)
int getNumExtracted() const
return the number of extracted traffic light definitions
void clear()
Destroys all stored definitions and logics.
const std::map< std::string, NBTrafficLightDefinition * > & getPrograms(const std::string &id) const
Returns all programs for the given tl-id.
void remapRemoved(NBEdge *removed, const EdgeVector &incoming, const EdgeVector &outgoing)
Replaces occurrences of the removed edge in incoming/outgoing edges of all definitions.
std::set< std::string > myQuarterOffsetTLS
List of tls which shall have an offset of T/2.
Id2Logics myComputed
The container for previously computed tl-logics.
NBTrafficLightLogic * getLogic(const std::string &id, const std::string &programID) const
Returns the computed logic for the given name.
void applyOpenDriveControllers(OptionsCont &oc)
post processing of signal programs to group tl indices according to OpenDrive controllers (signal gro...
Id2Defs myDefinitions
The container for tl-ids to their definitions.
std::pair< int, int > computeLogics(OptionsCont &oc)
Computes the traffic light logics using the stored definitions and stores the results.
bool removeFully(const std::string id)
Removes a logic definition (and all programs) from the dictionary.
std::map< std::string, NBTrafficLightLogic * > Program2Logic
Definition of internal the container types.
std::string getNextProgramID(const std::string &id) const
Returns a new (unused) programID for the given traffic light.
bool insert(NBTrafficLightDefinition *logic, bool forceInsert=false)
Adds a logic definition to the dictionary.
NBTrafficLightDefinition * getDefinition(const std::string &id, const std::string &programID) const
Returns the named definition.
void extract(NBTrafficLightDefinition *definition)
Extracts a traffic light definition from myDefinitions but keeps it in myExtracted for eventual * del...
void setTLControllingInformation(const NBEdgeCont &ec, const NBNodeCont &nc)
Informs the edges about being controlled by a tls.
std::set< NBTrafficLightDefinition * > myExtracted
The container for extracted definitions.
A SUMO-compliant built logic for a traffic light.
SUMOTime getDuration() const
Returns the duration of the complete cycle.
void setPhaseState(int phaseIndex, int tlIndex, LinkState linkState)
Modifies the state for an existing phase (used by netedit)
void setOffset(SUMOTime offset)
Sets the offset of this tls.
const std::string & getID() const
Returns the id.
Definition: Named.h:74
A storage for options typed value containers)
Definition: OptionsCont.h:89
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const StringVector & getStringVector(const std::string &name) const
Returns the list of string-value of the named option (only for Option_StringVector)
bool hasParameter(const std::string &key) const
Returns whether the parameter is set.
virtual const std::string getParameter(const std::string &key, const std::string defaultValue="") const
Returns the value for a given key.
static StringBijection< TrafficLightType > TrafficLightTypes
traffic light types
T get(const std::string &str) const
A structure which describes a connection between edges or lanes.
Definition: NBEdge.h:201