void RODFNet::buildApproachList() { const std::map<std::string, ROEdge*>& edges = getEdgeMap(); for (std::map<std::string, ROEdge*>::const_iterator rit = edges.begin(); rit != edges.end(); ++rit) { ROEdge* ce = (*rit).second; unsigned int i = 0; unsigned int length_size = ce->getNoFollowing(); for (i = 0; i < length_size; i++) { ROEdge* help = ce->getFollower(i); if (find(myDisallowedEdges.begin(), myDisallowedEdges.end(), help->getID()) != myDisallowedEdges.end()) { // edges in sinks will not be used continue; } if (!myKeepTurnarounds && help->getToNode() == ce->getFromNode()) { // do not use turnarounds continue; } // add the connection help->ce to myApproachingEdges if (myApproachingEdges.find(help) == myApproachingEdges.end()) { myApproachingEdges[help] = std::vector<ROEdge*>(); } myApproachingEdges[help].push_back(ce); // add the connection ce->help to myApproachingEdges if (myApproachedEdges.find(ce) == myApproachedEdges.end()) { myApproachedEdges[ce] = std::vector<ROEdge*>(); } myApproachedEdges[ce].push_back(help); } } }
void RODFNet::buildApproachList() { const std::map<std::string, ROEdge*>& edges = getEdgeMap(); for (std::map<std::string, ROEdge*>::const_iterator rit = edges.begin(); rit != edges.end(); ++rit) { ROEdge* ce = (*rit).second; const ROEdgeVector& successors = ce->getSuccessors(); for (ROEdgeVector::const_iterator it = successors.begin(); it != successors.end(); ++it) { ROEdge* help = *it; if (find(myDisallowedEdges.begin(), myDisallowedEdges.end(), help->getID()) != myDisallowedEdges.end()) { // edges in sinks will not be used continue; } if (!myKeepTurnarounds && help->getToJunction() == ce->getFromJunction()) { // do not use turnarounds continue; } // add the connection help->ce to myApproachingEdges if (myApproachingEdges.find(help) == myApproachingEdges.end()) { myApproachingEdges[help] = ROEdgeVector(); } myApproachingEdges[help].push_back(ce); // add the connection ce->help to myApproachingEdges if (myApproachedEdges.find(ce) == myApproachedEdges.end()) { myApproachedEdges[ce] = ROEdgeVector(); } myApproachedEdges[ce].push_back(help); } } }
void RODFNet::buildEdgeFlowMap(const RODFDetectorFlows& flows, const RODFDetectorCon& detectors, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset) { std::map<ROEdge*, std::vector<std::string>, idComp>::iterator i; for (i = myDetectorsOnEdges.begin(); i != myDetectorsOnEdges.end(); ++i) { ROEdge* into = (*i).first; const std::vector<std::string>& dets = (*i).second; std::map<SUMOReal, std::vector<std::string> > cliques; std::vector<std::string>* maxClique = 0; for (std::vector<std::string>::const_iterator j = dets.begin(); j != dets.end(); ++j) { if (!flows.knows(*j)) { continue; } const RODFDetector& det = detectors.getDetector(*j); bool found = false; for (std::map<SUMOReal, std::vector<std::string> >::iterator k = cliques.begin(); !found && k != cliques.end(); ++k) { if (fabs((*k).first - det.getPos()) < 1) { (*k).second.push_back(*j); if ((*k).second.size() > maxClique->size()) { maxClique = &(*k).second; } found = true; } } if (!found) { cliques[det.getPos()].push_back(*j); maxClique = &cliques[det.getPos()]; } } if (maxClique == 0) { continue; } std::vector<FlowDef> mflows; // !!! reserve for (SUMOTime t = startTime; t < endTime; t += stepOffset) { FlowDef fd; fd.qPKW = 0; fd.qLKW = 0; fd.vLKW = 0; fd.vPKW = 0; fd.fLKW = 0; fd.isLKW = 0; mflows.push_back(fd); } for (std::vector<std::string>::iterator l = maxClique->begin(); l != maxClique->end(); ++l) { bool didWarn = false; const std::vector<FlowDef>& dflows = flows.getFlowDefs(*l); int index = 0; for (SUMOTime t = startTime; t < endTime; t += stepOffset, index++) { const FlowDef& srcFD = dflows[index]; FlowDef& fd = mflows[index]; fd.qPKW += srcFD.qPKW; fd.qLKW += srcFD.qLKW; fd.vLKW += (srcFD.vLKW / (SUMOReal) maxClique->size()); fd.vPKW += (srcFD.vPKW / (SUMOReal) maxClique->size()); fd.fLKW += (srcFD.fLKW / (SUMOReal) maxClique->size()); fd.isLKW += (srcFD.isLKW / (SUMOReal) maxClique->size()); if (!didWarn && srcFD.vPKW > 0 && srcFD.vPKW < 255 && srcFD.vPKW / 3.6 > into->getSpeed()) { WRITE_MESSAGE("Detected PKW speed higher than allowed speed at '" + (*l) + "' on '" + into->getID() + "'."); didWarn = true; } if (!didWarn && srcFD.vLKW > 0 && srcFD.vLKW < 255 && srcFD.vLKW / 3.6 > into->getSpeed()) { WRITE_MESSAGE("Detected LKW speed higher than allowed speed at '" + (*l) + "' on '" + into->getID() + "'."); didWarn = true; } } } static_cast<RODFEdge*>(into)->setFlows(mflows); } }