Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
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>
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
53
54
55void
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
72std::string
73NBTrafficLightLogicCont::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
85bool
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
104bool
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
126bool
127NBTrafficLightLogicCont::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
140void
142 myExtracted.insert(definition);
143 removeProgram(definition->getID(), definition->getProgramID(), false);
144}
145
146
147bool
148NBTrafficLightLogicCont::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
159std::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
233bool
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
264void
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
283void
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
293void
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
304NBTrafficLightLogicCont::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
317NBTrafficLightLogicCont::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
328NBTrafficLightLogicCont::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
341void
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
368void
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
392void
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) {
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
525void
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
546int
548 return (int)myExtracted.size();
549}
550
551/****************************************************************************/
long long int SUMOTime
Definition GUI.h:36
#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:42
#define STEPS2TIME(x)
Definition SUMOTime.h:55
#define TIME2STEPS(x)
Definition SUMOTime.h:57
@ 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.
void avoid(const std::string &id)
make sure that the given id is never supplied
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.
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
NBTrafficLightLogic * getLogic()
Returns the internal logic.
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
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:3920
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 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)
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 NBConnectionVector & getControlledLinks() const
returns the controlled links (depends on previous call to collectLinks)
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