bool ROLoader::loadWeights(RONet& net, const std::string& optionName, const std::string& measure, bool useLanes) { // check whether the file exists if (!myOptions.isUsableFileList(optionName)) { return false; } // build and prepare the weights handler std::vector<SAXWeightsHandler::ToRetrieveDefinition*> retrieverDefs; // travel time, first (always used) EdgeFloatTimeLineRetriever_EdgeTravelTime ttRetriever(net); retrieverDefs.push_back(new SAXWeightsHandler::ToRetrieveDefinition("traveltime", !useLanes, ttRetriever)); // the measure to use, then EdgeFloatTimeLineRetriever_EdgeWeight eRetriever(net); if (measure != "traveltime") { std::string umeasure = measure; if (measure == "CO" || measure == "CO2" || measure == "HC" || measure == "PMx" || measure == "NOx" || measure == "fuel") { umeasure = measure + "_perVeh"; } retrieverDefs.push_back(new SAXWeightsHandler::ToRetrieveDefinition(umeasure, !useLanes, eRetriever)); } // set up handler SAXWeightsHandler handler(retrieverDefs, ""); // go through files std::vector<std::string> files = myOptions.getStringVector(optionName); for (std::vector<std::string>::const_iterator fileIt = files.begin(); fileIt != files.end(); ++fileIt) { PROGRESS_BEGIN_MESSAGE("Loading precomputed net weights from '" + *fileIt + "'"); if (XMLSubSys::runParser(handler, *fileIt)) { PROGRESS_DONE_MESSAGE(); } else { WRITE_MESSAGE("failed."); return false; } } // build edge-internal time lines const std::map<std::string, ROEdge*>& edges = net.getEdgeMap(); for (std::map<std::string, ROEdge*>::const_iterator i = edges.begin(); i != edges.end(); ++i) { (*i).second->buildTimeLines(measure); } return true; }
bool NLBuilder::build() { // try to build the net if (!load("net-file", true)) { return false; } // check whether the loaded net agrees with the simulation options if (myOptions.getBool("no-internal-links") && myXMLHandler.haveSeenInternalEdge()) { WRITE_WARNING("Network contains internal links but option --no-internal-links is set. Vehicles will 'jump' across junctions and thus underestimate route lengths and travel times."); } if (myOptions.getString("lanechange.duration") != "0" && myXMLHandler.haveSeenNeighs()) { throw ProcessError("Network contains explicit neigh lanes which do not work together with option --lanechange.duration."); } buildNet(); // @note on loading order constraints: // - additional-files before route-files and state-files due to referencing // - additional-files before weight-files since the latter might contain intermodal edge data and the intermodal net depends on the stops and public transport from the additionals // load additional net elements (sources, detectors, ...) if (myOptions.isSet("additional-files")) { if (!load("additional-files")) { return false; } // load shapes with separate handler NLShapeHandler sh("", myNet.getShapeContainer()); if (!ShapeHandler::loadFiles(myOptions.getStringVector("additional-files"), sh)) { return false; } if (myXMLHandler.haveSeenAdditionalSpeedRestrictions()) { myNet.getEdgeControl().setAdditionalRestrictions(); } } // load weights if wished if (myOptions.isSet("weight-files")) { if (!myOptions.isUsableFileList("weight-files")) { return false; } // build and prepare the weights handler std::vector<SAXWeightsHandler::ToRetrieveDefinition*> retrieverDefs; // travel time, first (always used) EdgeFloatTimeLineRetriever_EdgeTravelTime ttRetriever(myNet); retrieverDefs.push_back(new SAXWeightsHandler::ToRetrieveDefinition("traveltime", true, ttRetriever)); // the measure to use, then EdgeFloatTimeLineRetriever_EdgeEffort eRetriever(myNet); std::string measure = myOptions.getString("weight-attribute"); if (!myOptions.isDefault("weight-attribute")) { if (measure == "CO" || measure == "CO2" || measure == "HC" || measure == "PMx" || measure == "NOx" || measure == "fuel" || measure == "electricity") { measure += "_perVeh"; } retrieverDefs.push_back(new SAXWeightsHandler::ToRetrieveDefinition(measure, true, eRetriever)); } // set up handler SAXWeightsHandler handler(retrieverDefs, ""); // start parsing; for each file in the list std::vector<std::string> files = myOptions.getStringVector("weight-files"); for (std::vector<std::string>::iterator i = files.begin(); i != files.end(); ++i) { // report about loading when wished WRITE_MESSAGE("Loading weights from '" + *i + "'..."); // parse the file if (!XMLSubSys::runParser(handler, *i)) { return false; } } } // load the previous state if wished if (myOptions.isSet("load-state")) { long before = SysUtils::getCurrentMillis(); const std::string& f = myOptions.getString("load-state"); PROGRESS_BEGIN_MESSAGE("Loading state from '" + f + "'"); MSStateHandler h(f, string2time(myOptions.getString("load-state.offset"))); XMLSubSys::runParser(h, f); if (myOptions.isDefault("begin")) { myOptions.set("begin", time2string(h.getTime())); if (TraCIServer::getInstance() != 0) { TraCIServer::getInstance()->setTargetTime(h.getTime()); } } if (MsgHandler::getErrorInstance()->wasInformed()) { return false; } if (h.getTime() != string2time(myOptions.getString("begin"))) { WRITE_WARNING("State was written at a different time " + time2string(h.getTime()) + " than the begin time " + myOptions.getString("begin") + "!"); } PROGRESS_TIME_MESSAGE(before); } // load routes if (myOptions.isSet("route-files") && string2time(myOptions.getString("route-steps")) <= 0) { if (!load("route-files")) { return false; } } // optionally switch off traffic lights if (myOptions.getBool("tls.all-off")) { myNet.getTLSControl().switchOffAll(); } WRITE_MESSAGE("Loading done."); return true; }