void RODFNet::buildDetectorEdgeDependencies(RODFDetectorCon& detcont) const { myDetectorsOnEdges.clear(); myDetectorEdges.clear(); const std::vector<RODFDetector*>& dets = detcont.getDetectors(); for (std::vector<RODFDetector*>::const_iterator i = dets.begin(); i != dets.end(); ++i) { ROEdge* e = getDetectorEdge(**i); myDetectorsOnEdges[e].push_back((*i)->getID()); myDetectorEdges[(*i)->getID()] = e; } }
void RODFNet::revalidateFlows(const RODFDetectorCon& detectors, RODFDetectorFlows& flows, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset) { const std::vector<RODFDetector*>& dets = detectors.getDetectors(); for (std::vector<RODFDetector*>::const_iterator i = dets.begin(); i != dets.end(); ++i) { // check whether there is at least one entry with a flow larger than zero revalidateFlows(*i, flows, startTime, endTime, stepOffset); } }
void RODFNet::reportEmptyDetectors(RODFDetectorCon& detectors, RODFDetectorFlows& flows) { const std::vector<RODFDetector*>& dets = detectors.getDetectors(); for (std::vector<RODFDetector*>::const_iterator i = dets.begin(); i != dets.end(); ++i) { bool remove = true; // check whether there is at least one entry with a flow larger than zero if (flows.knows((*i)->getID())) { remove = false; } if (remove) { WRITE_MESSAGE("Detector '" + (*i)->getID() + "' has no flow."); } } }
void RODFNet::removeEmptyDetectors(RODFDetectorCon& detectors, RODFDetectorFlows& flows) { const std::vector<RODFDetector*>& dets = detectors.getDetectors(); for (std::vector<RODFDetector*>::const_iterator i = dets.begin(); i != dets.end();) { bool remove = true; // check whether there is at least one entry with a flow larger than zero if (flows.knows((*i)->getID())) { remove = false; } if (remove) { WRITE_MESSAGE("Removed detector '" + (*i)->getID() + "' because no flows for him exist."); flows.removeFlow((*i)->getID()); detectors.removeDetector((*i)->getID()); i = dets.begin(); } else { i++; } } }
void RODFNet::computeTypes(RODFDetectorCon& detcont, bool sourcesStrict) const { PROGRESS_BEGIN_MESSAGE("Computing detector types"); const std::vector< RODFDetector*>& dets = detcont.getDetectors(); // build needed information. first buildDetectorEdgeDependencies(detcont); // compute detector types then for (std::vector< RODFDetector*>::const_iterator i = dets.begin(); i != dets.end(); ++i) { if (isSource(**i, detcont, sourcesStrict)) { (*i)->setType(SOURCE_DETECTOR); mySourceNumber++; } if (isDestination(**i, detcont)) { (*i)->setType(SINK_DETECTOR); mySinkNumber++; } if ((*i)->getType() == TYPE_NOT_DEFINED) { (*i)->setType(BETWEEN_DETECTOR); myInBetweenNumber++; } } // recheck sources for (std::vector< RODFDetector*>::const_iterator i = dets.begin(); i != dets.end(); ++i) { if ((*i)->getType() == SOURCE_DETECTOR && isFalseSource(**i, detcont)) { (*i)->setType(DISCARDED_DETECTOR); myInvalidNumber++; mySourceNumber--; } } // print results PROGRESS_DONE_MESSAGE(); WRITE_MESSAGE("Computed detector types:"); WRITE_MESSAGE(" " + toString(mySourceNumber) + " source detectors"); WRITE_MESSAGE(" " + toString(mySinkNumber) + " sink detectors"); WRITE_MESSAGE(" " + toString(myInBetweenNumber) + " in-between detectors"); WRITE_MESSAGE(" " + toString(myInvalidNumber) + " invalid detectors"); }
/* ------------------------------------------------------------------------- * data processing methods * ----------------------------------------------------------------------- */ void readDetectors(RODFDetectorCon& detectors, OptionsCont& oc, RODFNet* optNet) { if (!oc.isSet("detector-files")) { throw ProcessError("No detector file given (use --detector-files <FILE>)."); } // read definitions stored in XML-format std::vector<std::string> files = oc.getStringVector("detector-files"); for (std::vector<std::string>::const_iterator fileIt = files.begin(); fileIt != files.end(); ++fileIt) { if (!FileHelpers::exists(*fileIt)) { throw ProcessError("Could not open detector file '" + *fileIt + "'"); } PROGRESS_BEGIN_MESSAGE("Loading detector definitions from '" + *fileIt + "'"); RODFDetectorHandler handler(optNet, oc.getBool("ignore-invalid-detectors"), detectors, *fileIt); if (XMLSubSys::runParser(handler, *fileIt)) { PROGRESS_DONE_MESSAGE(); } else { PROGRESS_FAILED_MESSAGE(); throw ProcessError(); } } if (detectors.getDetectors().empty()) { throw ProcessError("No detectors found."); } }
void RODFNet::buildRoutes(RODFDetectorCon& detcont, bool allEndFollower, bool keepUnfoundEnds, bool includeInBetween, bool keepShortestOnly, int maxFollowingLength) const { // build needed information first buildDetectorEdgeDependencies(detcont); // then build the routes std::map<ROEdge*, RODFRouteCont* > doneEdges; const std::vector< RODFDetector*>& dets = detcont.getDetectors(); for (std::vector< RODFDetector*>::const_iterator i = dets.begin(); i != dets.end(); ++i) { ROEdge* e = getDetectorEdge(**i); if (doneEdges.find(e) != doneEdges.end()) { // use previously build routes (*i)->addRoutes(new RODFRouteCont(*doneEdges[e])); continue; } std::vector<ROEdge*> seen; RODFRouteCont* routes = new RODFRouteCont(); doneEdges[e] = routes; RODFRouteDesc rd; rd.edges2Pass.push_back(e); rd.duration_2 = (e->getLength() / e->getSpeed()); //!!!; rd.endDetectorEdge = 0; rd.lastDetectorEdge = 0; rd.distance = e->getLength(); rd.distance2Last = 0; rd.duration2Last = 0; rd.overallProb = 0; std::vector<ROEdge*> visited; visited.push_back(e); computeRoutesFor(e, rd, 0, keepUnfoundEnds, keepShortestOnly, visited, **i, *routes, detcont, maxFollowingLength, seen); if (allEndFollower) { routes->addAllEndFollower(); } //!!!routes->removeIllegal(illegals); (*i)->addRoutes(routes); // add routes to in-between detectors if wished if (includeInBetween) { // go through the routes const std::vector<RODFRouteDesc>& r = routes->get(); for (std::vector<RODFRouteDesc>::const_iterator j = r.begin(); j != r.end(); ++j) { const RODFRouteDesc& mrd = *j; SUMOReal duration = mrd.duration_2; SUMOReal distance = mrd.distance; // go through each route's edges std::vector<ROEdge*>::const_iterator routeend = mrd.edges2Pass.end(); for (std::vector<ROEdge*>::const_iterator k = mrd.edges2Pass.begin(); k != routeend; ++k) { // check whether any detectors lies on the current edge if (myDetectorsOnEdges.find(*k) == myDetectorsOnEdges.end()) { duration -= (*k)->getLength() / (*k)->getSpeed(); distance -= (*k)->getLength(); continue; } // get the detectors const std::vector<std::string>& dets = myDetectorsOnEdges.find(*k)->second; // go through the detectors for (std::vector<std::string>::const_iterator l = dets.begin(); l != dets.end(); ++l) { const RODFDetector& m = detcont.getDetector(*l); if (m.getType() == BETWEEN_DETECTOR) { RODFRouteDesc nrd; copy(k, routeend, back_inserter(nrd.edges2Pass)); nrd.duration_2 = duration;//!!!; nrd.endDetectorEdge = mrd.endDetectorEdge; nrd.lastDetectorEdge = mrd.lastDetectorEdge; nrd.distance = distance; nrd.distance2Last = mrd.distance2Last; nrd.duration2Last = mrd.duration2Last; nrd.overallProb = mrd.overallProb; nrd.factor = mrd.factor; ((RODFDetector&) m).addRoute(nrd); } } duration -= (*k)->getLength() / (*k)->getSpeed(); distance -= (*k)->getLength(); } } } } }
void startComputation(RODFNet* optNet, RODFDetectorFlows& flows, RODFDetectorCon& detectors, OptionsCont& oc) { if (oc.getBool("print-absolute-flows")) { flows.printAbsolute(); } // if a network was loaded... (mode1) if (optNet != 0) { if (oc.getBool("remove-empty-detectors")) { PROGRESS_BEGIN_MESSAGE("Removing empty detectors"); optNet->removeEmptyDetectors(detectors, flows); PROGRESS_DONE_MESSAGE(); } else if (oc.getBool("report-empty-detectors")) { PROGRESS_BEGIN_MESSAGE("Scanning for empty detectors"); optNet->reportEmptyDetectors(detectors, flows); PROGRESS_DONE_MESSAGE(); } // compute the detector types (optionally) if (!detectors.detectorsHaveCompleteTypes() || oc.getBool("revalidate-detectors")) { optNet->computeTypes(detectors, oc.getBool("strict-sources")); } std::vector<RODFDetector*>::const_iterator i = detectors.getDetectors().begin(); for (; i != detectors.getDetectors().end(); ++i) { if ((*i)->getType() == SOURCE_DETECTOR) { break; } } if (i == detectors.getDetectors().end() && !oc.getBool("routes-for-all")) { throw ProcessError("No source detectors found."); } // compute routes between the detectors (optionally) if (!detectors.detectorsHaveRoutes() || oc.getBool("revalidate-routes") || oc.getBool("guess-empty-flows")) { PROGRESS_BEGIN_MESSAGE("Computing routes"); optNet->buildRoutes(detectors, oc.getBool("all-end-follower"), oc.getBool("keep-unfinished-routes"), oc.getBool("routes-for-all"), !oc.getBool("keep-longer-routes"), oc.getInt("max-search-depth")); PROGRESS_DONE_MESSAGE(); } } // check // whether the detectors are valid if (!detectors.detectorsHaveCompleteTypes()) { throw ProcessError("The detector types are not defined; use in combination with a network"); } // whether the detectors have routes if (!detectors.detectorsHaveRoutes()) { throw ProcessError("The emitters have no routes; use in combination with a network"); } // save the detectors if wished if (oc.isSet("detector-output")) { detectors.save(oc.getString("detector-output")); } // save their positions as POIs if wished if (oc.isSet("detectors-poi-output")) { detectors.saveAsPOIs(oc.getString("detectors-poi-output")); } // save the routes file if it was changed or it's wished if (detectors.detectorsHaveRoutes() && oc.isSet("routes-output")) { detectors.saveRoutes(oc.getString("routes-output")); } // guess flows if wished if (oc.getBool("guess-empty-flows")) { optNet->buildDetectorDependencies(detectors); detectors.guessEmptyFlows(flows); } const SUMOTime begin = string2time(oc.getString("begin")); const SUMOTime end = string2time(oc.getString("end")); const SUMOTime step = string2time(oc.getString("time-step")); // save emitters if wished if (oc.isSet("emitters-output") || oc.isSet("emitters-poi-output")) { optNet->buildEdgeFlowMap(flows, detectors, begin, end, step); // !!! if (oc.getBool("revalidate-flows")) { PROGRESS_BEGIN_MESSAGE("Rechecking loaded flows"); optNet->revalidateFlows(detectors, flows, begin, end, step); PROGRESS_DONE_MESSAGE(); } if (oc.isSet("emitters-output")) { PROGRESS_BEGIN_MESSAGE("Writing emitters"); detectors.writeEmitters(oc.getString("emitters-output"), flows, begin, end, step, *optNet, oc.getBool("calibrator-output"), oc.getBool("include-unused-routes"), oc.getFloat("scale"), // oc.getInt("max-search-depth"), oc.getBool("emissions-only")); PROGRESS_DONE_MESSAGE(); } if (oc.isSet("emitters-poi-output")) { PROGRESS_BEGIN_MESSAGE("Writing emitter pois"); detectors.writeEmitterPOIs(oc.getString("emitters-poi-output"), flows); PROGRESS_DONE_MESSAGE(); } } // save end speed trigger if wished if (oc.isSet("variable-speed-sign-output")) { PROGRESS_BEGIN_MESSAGE("Writing speed triggers"); detectors.writeSpeedTrigger(optNet, oc.getString("variable-speed-sign-output"), flows, begin, end, step); PROGRESS_DONE_MESSAGE(); } // save checking detectors if wished if (oc.isSet("validation-output")) { PROGRESS_BEGIN_MESSAGE("Writing validation detectors"); detectors.writeValidationDetectors(oc.getString("validation-output"), oc.getBool("validation-output.add-sources"), true, true); // !!! PROGRESS_DONE_MESSAGE(); } // build global rerouter on end if wished if (oc.isSet("end-reroute-output")) { PROGRESS_BEGIN_MESSAGE("Writing highway end rerouter"); detectors.writeEndRerouterDetectors(oc.getString("end-reroute-output")); // !!! PROGRESS_DONE_MESSAGE(); } /* // save the insertion definitions if(oc.isSet("flow-definitions")) { buildVehicleEmissions(oc.getString("flow-definitions")); } */ // }