ROJTREdge* ROJTREdge::chooseNext(const ROVehicle* const veh, double time, const std::set<const ROEdge*>& avoid) const { // if no usable follower exist, return 0 // their probabilities are not yet regarded if (myFollowingEdges.size() == 0 || (veh != 0 && allFollowersProhibit(veh))) { return 0; } // gather information about the probabilities at this time RandomDistributor<ROJTREdge*> dist; // use the loaded definitions, first for (FollowerUsageCont::const_iterator i = myFollowingDefs.begin(); i != myFollowingDefs.end(); ++i) { if (avoid.count(i->first) == 0) { if ((veh == 0 || !(*i).first->prohibits(veh)) && (*i).second->describesTime(time)) { dist.add((*i).first, (*i).second->getValue(time)); } } } // if no loaded definitions are valid for this time, try to use the defaults if (dist.getOverallProb() == 0) { for (int i = 0; i < (int)myParsedTurnings.size(); ++i) { if (avoid.count(myFollowingEdges[i]) == 0) { if (veh == 0 || !myFollowingEdges[i]->prohibits(veh)) { dist.add(static_cast<ROJTREdge*>(myFollowingEdges[i]), myParsedTurnings[i]); } } } } // if still no valid follower exists, return null if (dist.getOverallProb() == 0) { return 0; } // return one of the possible followers return dist.get(); }
RandomDistributor<std::string> GUISettingsHandler::getEventDistribution(const std::string& id) { RandomDistributor<std::string> result = myEventDistributions[id]; if (result.getOverallProb() > 0 && result.getOverallProb() < 1) { // unscaled probabilities are assumed, fill up with dummy event result.add(1 - result.getOverallProb(), ""); } return result; }
void MSStateHandler::myStartElement(int element, const SUMOSAXAttributes& attrs) { MSVehicleControl& vc = MSNet::getInstance()->getVehicleControl(); switch (element) { case SUMO_TAG_SNAPSHOT: { myTime = attrs.getInt(SUMO_ATTR_TIME); const std::string& version = attrs.getString(SUMO_ATTR_VERSION); if (version != VERSION_STRING) { WRITE_WARNING("State was written with sumo version " + version + " (present: " + VERSION_STRING + ")!"); } break; } case SUMO_TAG_DELAY: { vc.setState(attrs.getInt(SUMO_ATTR_NUMBER), attrs.getInt(SUMO_ATTR_END), attrs.getFloat(SUMO_ATTR_DEPART), attrs.getFloat(SUMO_ATTR_TIME)); break; } case SUMO_TAG_ROUTE: { const std::string id = attrs.getString(SUMO_ATTR_ID); if (MSRoute::dictionary(id) == 0) { MSEdgeVector edges; MSEdge::parseEdgesList(attrs.getString(SUMO_ATTR_EDGES), edges, id); MSRoute* r = new MSRoute(id, edges, attrs.getBool(SUMO_ATTR_STATE), 0, std::vector<SUMOVehicleParameter::Stop>()); MSRoute::dictionary(id, r); } break; } case SUMO_TAG_ROUTE_DISTRIBUTION: { const std::string id = attrs.getString(SUMO_ATTR_ID); if (MSRoute::dictionary(id) == 0) { RandomDistributor<const MSRoute*>* dist = new RandomDistributor<const MSRoute*>(); std::vector<std::string> routeIDs; std::istringstream iss(attrs.getString(SUMO_ATTR_PROBS)); SUMOSAXAttributes::parseStringVector(attrs.getString(SUMO_ATTR_ROUTES), routeIDs); for (std::vector<std::string>::const_iterator it = routeIDs.begin(); it != routeIDs.end(); ++it) { SUMOReal prob; iss >> prob; const MSRoute* r = MSRoute::dictionary(*it); assert(r != 0); dist->add(prob, r, false); r->addReference(); } MSRoute::dictionary(id, dist, attrs.getBool(SUMO_ATTR_STATE)); } break; } case SUMO_TAG_VTYPE: { myCurrentVType = SUMOVehicleParserHelper::beginVTypeParsing(attrs, getFileName()); break; } case SUMO_TAG_VTYPE_DISTRIBUTION: { const std::string id = attrs.getString(SUMO_ATTR_ID); if (vc.getVType(id) == 0) { RandomDistributor<MSVehicleType*>* dist = new RandomDistributor<MSVehicleType*>(); std::vector<std::string> typeIDs; std::istringstream iss(attrs.getString(SUMO_ATTR_PROBS)); SUMOSAXAttributes::parseStringVector(attrs.getString(SUMO_ATTR_VTYPES), typeIDs); for (std::vector<std::string>::const_iterator it = typeIDs.begin(); it != typeIDs.end(); ++it) { SUMOReal prob; iss >> prob; MSVehicleType* t = vc.getVType(*it); assert(t != 0); dist->add(prob, t, false); } vc.addVTypeDistribution(id, dist); } break; }