NBTrafficLightLogic* NBLoadedTLDef::myCompute(const NBEdgeCont& ec, unsigned int brakingTime) { MsgHandler::getWarningInstance()->clear(); // !!! NBLoadedTLDef::SignalGroupCont::const_iterator i; // compute the switching times std::set<SUMOReal> tmpSwitchTimes; for (i = mySignalGroups.begin(); i != mySignalGroups.end(); i++) { NBLoadedTLDef::SignalGroup* group = (*i).second; // needed later group->sortPhases(); // patch the yellow time for this group group->patchTYellow(brakingTime, OptionsCont::getOptions().getBool("tls.yellow.patch-small")); // copy the now valid times into the container // both the given red and green phases are added and also the // yellow times std::vector<SUMOReal> gtimes = group->getTimes(myCycleDuration); for (std::vector<SUMOReal>::const_iterator k = gtimes.begin(); k != gtimes.end(); k++) { tmpSwitchTimes.insert(*k); } } std::vector<SUMOReal> switchTimes; copy(tmpSwitchTimes.begin(), tmpSwitchTimes.end(), back_inserter(switchTimes)); sort(switchTimes.begin(), switchTimes.end()); // count the signals unsigned int noSignals = 0; for (i = mySignalGroups.begin(); i != mySignalGroups.end(); i++) { noSignals += (*i).second->getLinkNo(); } // build the phases NBTrafficLightLogic* logic = new NBTrafficLightLogic(getID(), getProgramID(), noSignals, myOffset, myType); for (std::vector<SUMOReal>::iterator l = switchTimes.begin(); l != switchTimes.end(); l++) { // compute the duration of the current phase unsigned int duration; if (l != switchTimes.end() - 1) { // get from the difference to the next switching time duration = (unsigned int)((*(l + 1)) - (*l)); } else { // get from the differenc to the first switching time duration = (unsigned int)(myCycleDuration - (*l) + * (switchTimes.begin())); } // no information about yellow times will be generated assert((*l) >= 0); logic->addStep(TIME2STEPS(duration), buildPhaseState(ec, (unsigned int)(*l))); } // check whether any warnings were printed if (MsgHandler::getWarningInstance()->wasInformed()) { WRITE_WARNING("During computation of traffic light '" + getID() + "'."); } logic->closeBuilding(); return logic; }
NBTrafficLightLogic* NBLoadedTLDef::myCompute(unsigned int brakingTimeSeconds) { MsgHandler::getWarningInstance()->clear(); // !!! NBLoadedTLDef::SignalGroupCont::const_iterator i; // compute the switching times std::set<SUMOReal> tmpSwitchTimes; for (i = mySignalGroups.begin(); i != mySignalGroups.end(); i++) { NBLoadedTLDef::SignalGroup* group = (*i).second; // needed later group->sortPhases(); // patch the yellow time for this group group->patchTYellow(brakingTimeSeconds, OptionsCont::getOptions().getBool("tls.yellow.patch-small")); // copy the now valid times into the container // both the given red and green phases are added and also the // yellow times std::vector<SUMOReal> gtimes = group->getTimes(myCycleDuration); for (std::vector<SUMOReal>::const_iterator k = gtimes.begin(); k != gtimes.end(); k++) { tmpSwitchTimes.insert(*k); } } std::vector<SUMOReal> switchTimes; copy(tmpSwitchTimes.begin(), tmpSwitchTimes.end(), back_inserter(switchTimes)); sort(switchTimes.begin(), switchTimes.end()); // count the signals unsigned int noSignals = 0; for (i = mySignalGroups.begin(); i != mySignalGroups.end(); i++) { noSignals += (*i).second->getLinkNo(); } // build the phases NBTrafficLightLogic* logic = new NBTrafficLightLogic(getID(), getProgramID(), noSignals, myOffset, myType); for (std::vector<SUMOReal>::iterator l = switchTimes.begin(); l != switchTimes.end(); l++) { // compute the duration of the current phase unsigned int duration; if (l != switchTimes.end() - 1) { // get from the difference to the next switching time duration = (unsigned int)((*(l + 1)) - (*l)); } else { // get from the differenc to the first switching time duration = (unsigned int)(myCycleDuration - (*l) + * (switchTimes.begin())); } // no information about yellow times will be generated assert((*l) >= 0); logic->addStep(TIME2STEPS(duration), buildPhaseState((unsigned int)(*l))); } // check whether any warnings were printed if (MsgHandler::getWarningInstance()->wasInformed()) { WRITE_WARNING("During computation of traffic light '" + getID() + "'."); } logic->closeBuilding(); // initialize myNeedsContRelation myNeedsContRelation.clear(); const bool controlledWithin = !OptionsCont::getOptions().getBool("tls.uncontrolled-within"); const std::vector<NBTrafficLightLogic::PhaseDefinition> phases = logic->getPhases(); for (std::vector<NBTrafficLightLogic::PhaseDefinition>::const_iterator it = phases.begin(); it != phases.end(); it++) { const std::string state = (*it).state; for (NBConnectionVector::const_iterator it1 = myControlledLinks.begin(); it1 != myControlledLinks.end(); it1++) { const NBConnection& c1 = *it1; const int i1 = c1.getTLIndex(); if (i1 == NBConnection::InvalidTlIndex || state[i1] != 'g' || c1.getFrom() == 0 || c1.getTo() == 0) { continue; } for (NBConnectionVector::const_iterator it2 = myControlledLinks.begin(); it2 != myControlledLinks.end(); it2++) { const NBConnection& c2 = *it2; const int i2 = c2.getTLIndex(); if (i2 != NBConnection::InvalidTlIndex && i2 != i1 && (state[i2] == 'G' || state[i2] == 'g') && c2.getFrom() != 0 && c2.getTo() != 0) { const bool rightTurnConflict = NBNode::rightTurnConflict( c1.getFrom(), c1.getTo(), c1.getFromLane(), c2.getFrom(), c2.getTo(), c2.getFromLane()); if (forbids(c2.getFrom(), c2.getTo(), c1.getFrom(), c1.getTo(), true, controlledWithin) || rightTurnConflict) { myNeedsContRelation.insert(StreamPair(c1.getFrom(), c1.getTo(), c2.getFrom(), c2.getTo())); } } } } } myNeedsContRelationReady = true; return logic; }