55 #include <mesosim/MELoop.h>
56 #include <mesosim/MESegment.h>
59 #ifdef CHECK_MEMORY_LEAKS
61 #endif // CHECK_MEMORY_LEAKS
74 const std::vector<MSEdge*>& edges,
75 SUMOReal prob,
const std::string& file,
bool off)
77 myProbability(prob), myUserProbability(prob), myAmInUserMode(false) {
83 for (std::vector<MSEdge*>::const_iterator j = edges.begin(); j != edges.end(); ++j) {
86 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**j);
91 const std::vector<MSLane*>& destLanes = (*j)->getLanes();
92 for (std::vector<MSLane*>::const_iterator i = destLanes.begin(); i != destLanes.end(); ++i) {
93 (*i)->addMoveReminder(
this);
120 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No destination edge id given.");
124 if (dest ==
"keepDestination") {
126 }
else if (dest ==
"terminateRoute") {
129 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Destination edge '" + dest +
"' is not known.");
139 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + dest +
"' is negative (must not).");
148 if (closed_id ==
"") {
149 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": closed edge id given.");
153 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Edge '" + closed_id +
"' to close is not known.");
162 if (routeStr ==
"") {
167 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Route '" + routeStr +
"' does not exist.");
177 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for route '" + routeStr +
"' is negative (must not).");
207 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
210 if ((*i).begin <= time && (*i).end >= time) {
215 ((*i).closed.size() == 0 && (*i).edgeProbs.getOverallProb() + (*i).routeProbs.getOverallProb() > 0)) {
227 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
229 if ((*i).begin <= time && (*i).end >= time) {
230 if ((*i).edgeProbs.getOverallProb() != 0 || (*i).routeProbs.getOverallProb() != 0 || (*i).closed.size() != 0) {
242 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
245 if ((*i).begin <= time && (*i).end >= time) {
246 if ((*i).edgeProbs.getOverallProb() != 0 || (*i).routeProbs.getOverallProb() != 0 || route.
containsAnyOf((*i).closed)) {
258 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
260 if ((*i).edgeProbs.getOverallProb() != 0 || (*i).routeProbs.getOverallProb() != 0 || (*i).closed.size() != 0) {
297 const MSEdge* newEdge = lastEdge;
299 const bool destUnreachable = std::find(rerouteDef.
closed.begin(), rerouteDef.
closed.end(), lastEdge) != rerouteDef.
closed.end();
301 if (rerouteDef.
closed.size() == 0 || destUnreachable) {
306 if (destUnreachable) {
307 WRITE_WARNING(
"Cannot keep destination for vehicle '" + veh.
getID() +
"' due to closed edges. Terminating route.");
312 }
else if (newEdge == 0) {
318 std::vector<const MSEdge*> edges;
321 veh.replaceRouteEdges(edges);