void RODFDetector::buildDestinationDistribution(const RODFDetectorCon& detectors, SUMOTime startTime, SUMOTime endTime, SUMOTime stepOffset, const RODFNet& net, std::map<SUMOTime, RandomDistributor<int>* >& into) const { if (myRoutes == 0) { if (myType != DISCARDED_DETECTOR && myType != BETWEEN_DETECTOR) { WRITE_ERROR("Missing routes for detector '" + myID + "'."); } return; } std::vector<RODFRouteDesc>& descs = myRoutes->get(); // iterate through time (in output interval steps) for (SUMOTime time = startTime; time < endTime; time += stepOffset) { into[time] = new RandomDistributor<int>(); std::map<ROEdge*, SUMOReal> flowMap; // iterate through the routes int index = 0; for (std::vector<RODFRouteDesc>::iterator ri = descs.begin(); ri != descs.end(); ++ri, index++) { SUMOReal prob = 1.; for (ROEdgeVector::iterator j = (*ri).edges2Pass.begin(); j != (*ri).edges2Pass.end() && prob > 0;) { if (!net.hasDetector(*j)) { ++j; continue; } const RODFDetector& det = detectors.getAnyDetectorForEdge(static_cast<RODFEdge*>(*j)); const std::vector<std::map<RODFEdge*, SUMOReal> >& probs = det.getSplitProbabilities(); if (probs.size() == 0) { prob = 0; ++j; continue; } const std::map<RODFEdge*, SUMOReal>& tprobs = probs[(int)((time - startTime) / stepOffset)]; RODFEdge* splitEdge = 0; for (std::map<RODFEdge*, SUMOReal>::const_iterator k = tprobs.begin(); k != tprobs.end(); ++k) { if (find(j, (*ri).edges2Pass.end(), (*k).first) != (*ri).edges2Pass.end()) { prob *= (*k).second; splitEdge = (*k).first; break; } } if (splitEdge != 0) { j = find(j, (*ri).edges2Pass.end(), splitEdge); } else { ++j; } } into[time]->add(prob, index); (*ri).overallProb = prob; } } }