53 #ifdef CHECK_MEMORY_LEAKS
55 #endif // CHECK_MEMORY_LEAKS
63 : myID(id), myLaneID(laneID), myPosition(pos), myType(type), myRoutes(0) {}
67 : myID(id), myLaneID(f.myLaneID), myPosition(f.myPosition),
68 myType(f.myType), myRoutes(0) {
90 for (std::vector<ROEdge*>::const_iterator i = rd.
edges2Pass.begin(); i != rd.
edges2Pass.end(); ++i) {
91 length += (*i)->getLength();
93 return (distance / length);
105 const std::vector<RODFRouteDesc> &routes =
myRoutes->
get();
106 std::vector<RODFEdge*> nextDetEdges;
107 for (std::vector<RODFRouteDesc>::const_iterator i = routes.begin(); i != routes.end(); ++i) {
109 bool hadSplit =
false;
110 bool hadDetectorAfterSplit =
false;
111 for (std::vector<ROEdge*>::const_iterator j = rd.
edges2Pass.begin(); !hadDetectorAfterSplit && j != rd.
edges2Pass.end(); ++j) {
112 if (hadSplit && !hadDetectorAfterSplit && net->
hasDetector(*j)) {
113 hadDetectorAfterSplit =
true;
114 if (find(nextDetEdges.begin(), nextDetEdges.end(), *j) == nextDetEdges.end()) {
115 nextDetEdges.push_back(static_cast<RODFEdge*>(*j));
119 if ((*j)->getNoFollowing() > 1) {
126 for (
SUMOTime time = startTime; time < endTime; time += stepOffset, ++index) {
130 for (std::vector<RODFEdge*>::const_iterator i = nextDetEdges.begin(); i != nextDetEdges.end(); ++i) {
136 if (overallProb > 0) {
137 for (std::vector<RODFEdge*>::const_iterator i = nextDetEdges.begin(); i != nextDetEdges.end(); ++i) {
153 int maxFollower)
const {
161 std::vector<RODFRouteDesc> &descs =
myRoutes->
get();
164 for (
SUMOTime time = startTime; time < endTime; time += stepOffset) {
166 std::map<ROEdge*, SUMOReal> flowMap;
169 for (std::vector<RODFRouteDesc>::iterator ri = descs.begin(); ri != descs.end(); ++ri, index++) {
171 for (std::vector<ROEdge*>::iterator j = (*ri).edges2Pass.begin(); j != (*ri).edges2Pass.end() && prob > 0; ++j) {
177 if (probs.size() == 0) {
181 const std::map<RODFEdge*, SUMOReal> &tprobs = probs[(time - startTime) / stepOffset];
182 for (std::map<RODFEdge*, SUMOReal>::const_iterator k = tprobs.begin(); k != tprobs.end(); ++k) {
183 if (find(j, (*ri).edges2Pass.end(), (*k).first) != (*ri).edges2Pass.end()) {
188 into[time]->add(prob, index);
189 (*ri).overallProb = prob;
195 const std::vector<RODFRouteDesc> &
213 const std::vector<RODFDetector*> &
219 const std::vector<RODFDetector*> &
254 bool includeUnusedRoutes,
264 const std::vector<RODFRouteDesc> &routes =
myRoutes->
get();
265 out.
openTag(
"routeDistribution") <<
" id=\"" <<
myID <<
"\">\n";
266 bool isEmptyDist =
true;
267 for (std::vector<RODFRouteDesc>::const_iterator i = routes.begin(); i != routes.end(); ++i) {
268 if ((*i).overallProb > 0) {
272 for (std::vector<RODFRouteDesc>::const_iterator i = routes.begin(); i != routes.end(); ++i) {
273 if ((*i).overallProb > 0 || includeUnusedRoutes) {
274 out.
openTag(
"route") <<
" refId=\"" << (*i).routename <<
"\" probability=\"" << (*i).overallProb <<
"\"";
278 out.
openTag(
"route") <<
" refId=\"" << (*i).routename <<
"\" probability=\"1\"";
288 if (insertionsOnly || flows.
knows(
myID)) {
294 for (
SUMOTime time = startTime; time < endTime; time += stepOffset, index++) {
296 assert(index < mflows.size());
297 const FlowDef& srcFD = mflows[index];
301 size_t carNo = (size_t)((srcFD.qPKW + srcFD.qLKW) * scale);
302 for (
size_t car = 0; car < carNo; ++car) {
304 std::string type =
"test";
307 if (srcFD.isLKW >= 1) {
308 srcFD.isLKW = srcFD.isLKW - (
SUMOReal) 1.;
316 if (v < 0 || v > 250) {
325 out.
openTag(
"vehicle") <<
" id=\"";
327 out <<
"emitter_" <<
myID;
329 out <<
"calibrator_" <<
myID;
331 out <<
"_" << ctime <<
"\""
333 <<
" departSpeed=\"";
334 if (v > defaultSpeed) {
339 out <<
"\" departPos=\"" <<
myPosition <<
"\""
340 <<
" departLane=\"" <<
myLaneID.substr(
myLaneID.rfind(
"_") + 1) <<
"\" route=\"";
341 if (destIndex >= 0) {
342 out <<
myRoutes->
get()[destIndex].routename <<
"\"";
347 srcFD.isLKW += srcFD.fLKW;
377 for (
SUMOTime t = startTime; t < endTime; t += stepOffset, index++) {
378 assert(index < mflows.size());
379 const FlowDef& srcFD = mflows[index];
381 if (speed <= 0 || speed > 250) {
382 speed = defaultSpeed;
386 out <<
" <step time=\"" << t <<
"\" speed=\"" << speed <<
"\"/>\n";
440 if ((*i)->hasRoutes()) {
448 const std::vector< RODFDetector*> &
460 <<
"\" lane=\"" << (*i)->getLaneID()
461 <<
"\" pos=\"" << (*i)->getPos();
462 switch ((*i)->getType()) {
464 out <<
"\" type=\"between\"";
467 out <<
"\" type=\"source\"";
470 out <<
"\" type=\"sink\"";
473 out <<
"\" type=\"discarded\"";
490 switch ((*i)->getType()) {
492 out <<
"\" type=\"between_detector_position\" color=\"0,0,1\"";
495 out <<
"\" type=\"source_detector_position\" color=\"0,1,0\"";
498 out <<
"\" type=\"sink_detector_position\" color=\"1,0,0\"";
501 out <<
"\" type=\"discarded_detector_position\" color=\".2,.2,.2\"";
506 out <<
" lane=\"" << (*i)->getLaneID() <<
"\" pos=\""
507 << (*i)->getPos() <<
"\"/>\n";
517 std::vector<std::string> saved;
519 bool lastWasSaved =
true;
528 lastWasSaved = (*i)->writeRoutes(saved, out);
552 bool writeCalibrators,
553 bool includeUnusedRoutes,
556 bool insertionsOnly) {
559 (*i)->computeSplitProbabilities(&net, *
this, flows, startTime, endTime, stepOffset);
568 std::string defFileName;
580 std::map<size_t, RandomDistributor<size_t>* > dists;
581 if (!insertionsOnly && flows.
knows(det->
getID())) {
585 if (!det->
writeEmitterDefinition(defFileName, dists, flows, startTime, endTime, stepOffset, includeUnusedRoutes, scale, insertionsOnly, defaultSpeed)) {
593 out <<
" <calibrator id=\"calibrator_" << escapedID
594 <<
"\" pos=\"" << det->
getPos() <<
"\" "
595 <<
"lane=\"" << det->
getLaneID() <<
"\" "
596 <<
"friendlyPos=\"x\" "
597 <<
"file=\"" << defFileName <<
"\"/>\n";
617 switch ((*i)->getType()) {
619 out <<
"\" type=\"between_detector_position\" color=\"0,0," << col <<
"\"";
622 out <<
"\" type=\"source_detector_position\" color=\"0," << col <<
",0\"";
625 out <<
"\" type=\"sink_detector_position\" color=\"" << col <<
",0,0\"";
628 out <<
"\" type=\"discarded_detector_position\" color=\".2,.2,.2\"";
633 out <<
" lane=\"" << (*i)->getLaneID() <<
"\" pos=\"" << (*i)->getPos() <<
"\"/>\n";
651 const std::vector<FlowDef> &flows =
static_cast<const RODFEdge*
>(edge)->getFlows();
653 for (std::vector<FlowDef>::const_iterator i = flows.begin(); i != flows.end(); ++i) {
655 if (srcFD.
qLKW >= 0) {
658 if (srcFD.
qPKW >= 0) {
685 const std::string& file,
697 <<
" lanes=\"" << det->
getLaneID() <<
'\"'
698 <<
" file=\"" << filename <<
"\"/>\n";
717 det->
getLaneID() <<
"\" attr=\"reroute\" pos=\"0\" file=\"endrerouter_"
718 << det->
getID() <<
".def.xml\"/>\n";
728 bool singleFile,
bool friendly) {
740 <<
"lane=\"" << det->
getLaneID() <<
"\" "
741 <<
"pos=\"" << pos <<
"\" "
744 out <<
"friendlyPos=\"x\" ";
749 out <<
"file=\"validation_dets.xml\"/>\n";
760 std::map<std::string, RODFDetector*>::iterator ri1 =
myDetectorMap.find(
id);
764 std::vector<RODFDetector*>::iterator ri2 =
770 std::vector<RODFDetector*> &dets = (*rr3).second;
771 for (std::vector<RODFDetector*>::iterator ri3 = dets.begin(); !found && ri3 != dets.end();) {
772 if (*ri3 == oldDet) {
774 ri3 = dets.erase(ri3);
795 size_t noFollowerWithRoutes = 0;
796 size_t noPriorWithRoutes = 0;
798 std::vector<RODFDetector*>::const_iterator j;
799 for (j = prior.begin(); j != prior.end(); ++j) {
800 if (flows.
knows((*j)->getID())) {
804 assert(noPriorWithRoutes <= prior.size());
805 for (j = follower.begin(); j != follower.end(); ++j) {
806 if (flows.
knows((*j)->getID())) {
807 ++noFollowerWithRoutes;
810 assert(noFollowerWithRoutes <= follower.size());
818 if (noFollowerWithRoutes == follower.size()) {
831 if ((*i)->getEdgeID() == edge->
getID()) {
849 const std::vector<std::string> &oldids) {
855 for (std::vector<std::string>::const_iterator i = oldids.begin(); i != oldids.end(); ++i) {