bool RODFNet::isFalseSource(const RODFDetector& det, ROEdge* edge, ROEdgeVector& seen, const RODFDetectorCon& detectors) const { if (seen.size() == 1000) { // !!! WRITE_WARNING("Quitting checking for being a false source for detector '" + det.getID() + "' due to seen edge limit."); return false; } seen.push_back(edge); if (edge != getDetectorEdge(det)) { // ok, we are at one of the edges coming behind if (hasDetector(edge)) { const std::vector<std::string>& dets = myDetectorsOnEdges.find(edge)->second; for (std::vector<std::string>::const_iterator i = dets.begin(); i != dets.end(); ++i) { if (detectors.getDetector(*i).getType() == SINK_DETECTOR) { return false; } if (detectors.getDetector(*i).getType() == BETWEEN_DETECTOR) { return false; } if (detectors.getDetector(*i).getType() == SOURCE_DETECTOR) { return true; } } } else { if (myAmInHighwayMode && edge->getSpeed() < 19.) { return false; } } } if (myApproachedEdges.find(edge) == myApproachedEdges.end()) { return false; } const ROEdgeVector& appr = myApproachedEdges.find(edge)->second; bool isall = false; for (size_t i = 0; i < appr.size() && !isall; i++) { //printf("checking %s->\n", appr[i].c_str()); bool had = std::find(seen.begin(), seen.end(), appr[i]) != seen.end(); if (!had) { if (isFalseSource(det, appr[i], seen, detectors)) { isall = true; } } } return isall; }
bool RODFNet::isSource(const RODFDetector& det, ROEdge* edge, ROEdgeVector& seen, const RODFDetectorCon& detectors, bool strict) const { if (seen.size() == 1000) { // !!! WRITE_WARNING("Quitting checking for being a source for detector '" + det.getID() + "' due to seen edge limit."); return false; } if (edge == getDetectorEdge(det)) { // maybe there is another detector at the same edge // get the list of this/these detector(s) const std::vector<std::string>& detsOnEdge = myDetectorsOnEdges.find(edge)->second; for (std::vector<std::string>::const_iterator i = detsOnEdge.begin(); i != detsOnEdge.end(); ++i) { if ((*i) == det.getID()) { continue; } const RODFDetector& sec = detectors.getDetector(*i); if (getAbsPos(sec) < getAbsPos(det)) { // ok, there is another detector on the same edge and it is // before this one -> no source return false; } } } // it's a source if no edges are approaching the edge if (!hasApproaching(edge)) { if (edge != getDetectorEdge(det)) { if (hasDetector(edge)) { return false; } } return true; } if (edge != getDetectorEdge(det)) { // ok, we are at one of the edges in front if (myAmInHighwayMode) { if (edge->getSpeed() >= 19.4) { if (hasDetector(edge)) { // we are still on the highway and there is another detector return false; } // the next is a hack for the A100 scenario... // We have to look into further edges herein edges const ROEdgeVector& appr = myApproachingEdges.find(edge)->second; size_t noOk = 0; size_t noFalse = 0; size_t noSkipped = 0; for (size_t i = 0; i < appr.size(); i++) { if (!hasDetector(appr[i])) { noOk++; } else { noFalse++; } } if ((noFalse + noSkipped) == appr.size()) { return false; } } } } if (myAmInHighwayMode) { if (edge->getSpeed() < 19.4 && edge != getDetectorEdge(det)) { // we have left the highway already // -> the detector will be a highway source if (!hasDetector(edge)) { return true; } } } if (myDetectorsOnEdges.find(edge) != myDetectorsOnEdges.end() && myDetectorEdges.find(det.getID())->second != edge) { return false; } // let's check the edges in front const ROEdgeVector& appr = myApproachingEdges.find(edge)->second; size_t noOk = 0; size_t noFalse = 0; size_t noSkipped = 0; seen.push_back(edge); for (size_t i = 0; i < appr.size(); i++) { bool had = std::find(seen.begin(), seen.end(), appr[i]) != seen.end(); if (!had) { if (isSource(det, appr[i], seen, detectors, strict)) { noOk++; } else { noFalse++; } } else { noSkipped++; } } if (!strict) { return (noFalse + noSkipped) != appr.size(); } else { return (noOk + noSkipped) == appr.size(); } }
bool RODFNet::isDestination(const RODFDetector& det, ROEdge* edge, ROEdgeVector& seen, const RODFDetectorCon& detectors) const { if (seen.size() == 1000) { // !!! WRITE_WARNING("Quitting checking for being a destination for detector '" + det.getID() + "' due to seen edge limit."); return false; } if (edge == getDetectorEdge(det)) { // maybe there is another detector at the same edge // get the list of this/these detector(s) const std::vector<std::string>& detsOnEdge = myDetectorsOnEdges.find(edge)->second; for (std::vector<std::string>::const_iterator i = detsOnEdge.begin(); i != detsOnEdge.end(); ++i) { if ((*i) == det.getID()) { continue; } const RODFDetector& sec = detectors.getDetector(*i); if (getAbsPos(sec) > getAbsPos(det)) { // ok, there is another detector on the same edge and it is // after this one -> no destination return false; } } } if (!hasApproached(edge)) { if (edge != getDetectorEdge(det)) { if (hasDetector(edge)) { return false; } } return true; } if (edge != getDetectorEdge(det)) { // ok, we are at one of the edges coming behind if (myAmInHighwayMode) { if (edge->getSpeed() >= 19.4) { if (hasDetector(edge)) { // we are still on the highway and there is another detector return false; } } } } if (myAmInHighwayMode) { if (edge->getSpeed() < 19.4 && edge != getDetectorEdge(det)) { if (hasDetector(edge)) { return true; } if (myApproachedEdges.find(edge)->second.size() > 1) { return true; } } } if (myDetectorsOnEdges.find(edge) != myDetectorsOnEdges.end() && myDetectorEdges.find(det.getID())->second != edge) { return false; } const ROEdgeVector& appr = myApproachedEdges.find(edge)->second; bool isall = true; size_t no = 0; seen.push_back(edge); for (size_t i = 0; i < appr.size() && isall; i++) { bool had = std::find(seen.begin(), seen.end(), appr[i]) != seen.end(); if (!had) { if (!isDestination(det, appr[i], seen, detectors)) { no++; isall = false; } } } return isall; }
void RODFNet::revalidateFlows(const RODFDetector* detector, RODFDetectorFlows& flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset) { { if (flows.knows(detector->getID())) { const std::vector<FlowDef>& detFlows = flows.getFlowDefs(detector->getID()); for (std::vector<FlowDef>::const_iterator j = detFlows.begin(); j != detFlows.end(); ++j) { if ((*j).qPKW > 0 || (*j).qLKW > 0) { return; } } } } // ok, there is no information for the whole time; // lets find preceding detectors and rebuild the flows if possible WRITE_WARNING("Detector '" + detector->getID() + "' has no flows.\n Trying to rebuild."); // go back and collect flows ROEdgeVector previous; { std::vector<IterationEdge> missing; IterationEdge ie; ie.depth = 0; ie.edge = getDetectorEdge(*detector); missing.push_back(ie); bool maxDepthReached = false; while (!missing.empty() && !maxDepthReached) { IterationEdge last = missing.back(); missing.pop_back(); ROEdgeVector approaching = myApproachingEdges[last.edge]; for (ROEdgeVector::const_iterator j = approaching.begin(); j != approaching.end(); ++j) { if (hasDetector(*j)) { previous.push_back(*j); } else { ie.depth = last.depth + 1; ie.edge = *j; missing.push_back(ie); if (ie.depth > 5) { maxDepthReached = true; } } } } if (maxDepthReached) { WRITE_WARNING(" Could not build list of previous flows."); } } // Edges with previous detectors are now in "previous"; // compute following ROEdgeVector latter; { std::vector<IterationEdge> missing; for (ROEdgeVector::const_iterator k = previous.begin(); k != previous.end(); ++k) { IterationEdge ie; ie.depth = 0; ie.edge = *k; missing.push_back(ie); } bool maxDepthReached = false; while (!missing.empty() && !maxDepthReached) { IterationEdge last = missing.back(); missing.pop_back(); ROEdgeVector approached = myApproachedEdges[last.edge]; for (ROEdgeVector::const_iterator j = approached.begin(); j != approached.end(); ++j) { if (*j == getDetectorEdge(*detector)) { continue; } if (hasDetector(*j)) { latter.push_back(*j); } else { IterationEdge ie; ie.depth = last.depth + 1; ie.edge = *j; missing.push_back(ie); if (ie.depth > 5) { maxDepthReached = true; } } } } if (maxDepthReached) { WRITE_WARNING(" Could not build list of latter flows."); return; } } // Edges with latter detectors are now in "latter"; // lets not validate them by now - surely this should be done // for each time step: collect incoming flows; collect outgoing; std::vector<FlowDef> mflows; int index = 0; for (SUMOTime t = startTime; t < endTime; t += stepOffset, index++) { FlowDef inFlow; inFlow.qLKW = 0; inFlow.qPKW = 0; inFlow.vLKW = 0; inFlow.vPKW = 0; // collect incoming { // !! time difference is missing for (ROEdgeVector::iterator i = previous.begin(); i != previous.end(); ++i) { const std::vector<FlowDef>& flows = static_cast<const RODFEdge*>(*i)->getFlows(); if (flows.size() != 0) { const FlowDef& srcFD = flows[index]; inFlow.qLKW += srcFD.qLKW; inFlow.qPKW += srcFD.qPKW; inFlow.vLKW += srcFD.vLKW; inFlow.vPKW += srcFD.vPKW; } } } inFlow.vLKW /= (SUMOReal) previous.size(); inFlow.vPKW /= (SUMOReal) previous.size(); // collect outgoing FlowDef outFlow; outFlow.qLKW = 0; outFlow.qPKW = 0; outFlow.vLKW = 0; outFlow.vPKW = 0; { // !! time difference is missing for (ROEdgeVector::iterator i = latter.begin(); i != latter.end(); ++i) { const std::vector<FlowDef>& flows = static_cast<const RODFEdge*>(*i)->getFlows(); if (flows.size() != 0) { const FlowDef& srcFD = flows[index]; outFlow.qLKW += srcFD.qLKW; outFlow.qPKW += srcFD.qPKW; outFlow.vLKW += srcFD.vLKW; outFlow.vPKW += srcFD.vPKW; } } } outFlow.vLKW /= (SUMOReal) latter.size(); outFlow.vPKW /= (SUMOReal) latter.size(); // FlowDef mFlow; mFlow.qLKW = inFlow.qLKW - outFlow.qLKW; mFlow.qPKW = inFlow.qPKW - outFlow.qPKW; mFlow.vLKW = (inFlow.vLKW + outFlow.vLKW) / (SUMOReal) 2.; mFlow.vPKW = (inFlow.vPKW + outFlow.vPKW) / (SUMOReal) 2.; mflows.push_back(mFlow); } static_cast<RODFEdge*>(getDetectorEdge(*detector))->setFlows(mflows); flows.setFlows(detector->getID(), mflows); }