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) :
79 myProbability(prob), myUserProbability(prob), myAmInUserMode(false) {
85 for (std::vector<MSEdge*>::const_iterator j = edges.begin(); j != edges.end(); ++j) {
88 MESegment* s = MSGlobals::gMesoNet->getSegmentForEdge(**j);
93 const std::vector<MSLane*>& destLanes = (*j)->getLanes();
94 for (std::vector<MSLane*>::const_iterator i = destLanes.begin(); i != destLanes.end(); ++i) {
95 (*i)->addMoveReminder(
this);
122 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No destination edge id given.");
126 if (dest ==
"keepDestination") {
128 }
else if (dest ==
"terminateRoute") {
131 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Destination edge '" + dest +
"' is not known.");
141 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + dest +
"' is negative (must not).");
150 if (closed_id ==
"") {
151 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": closed edge id given.");
155 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Edge '" + closed_id +
"' to close is not known.");
164 if (routeStr ==
"") {
169 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Route '" + routeStr +
"' does not exist.");
179 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for route '" + routeStr +
"' is negative (must not).");
209 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
212 if ((*i).begin <= time && (*i).end >= time) {
217 ((*i).closed.size() == 0 && (*i).edgeProbs.getOverallProb() + (*i).routeProbs.getOverallProb() > 0)) {
229 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
231 if ((*i).begin <= time && (*i).end >= time) {
232 if ((*i).edgeProbs.getOverallProb() != 0 || (*i).routeProbs.getOverallProb() != 0 || (*i).closed.size() != 0) {
244 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
247 if ((*i).begin <= time && (*i).end >= time) {
248 if ((*i).edgeProbs.getOverallProb() != 0 || (*i).routeProbs.getOverallProb() != 0 || route.
containsAnyOf((*i).closed)) {
260 std::vector<RerouteInterval>::const_iterator i =
myIntervals.begin();
262 if ((*i).edgeProbs.getOverallProb() != 0 || (*i).routeProbs.getOverallProb() != 0 || (*i).closed.size() != 0) {
299 const MSEdge* newEdge = lastEdge;
301 const bool destUnreachable = std::find(rerouteDef.
closed.begin(), rerouteDef.
closed.end(), lastEdge) != rerouteDef.
closed.end();
303 if (rerouteDef.
closed.size() == 0 || destUnreachable) {
308 if (destUnreachable) {
309 WRITE_WARNING(
"Cannot keep destination for vehicle '" + veh.
getID() +
"' due to closed edges. Terminating route.");
314 }
else if (newEdge == 0) {
320 std::vector<const MSEdge*> edges;
323 veh.replaceRouteEdges(edges);