void RORouteDef::preComputeCurrentRoute(SUMOAbstractRouter<ROEdge, ROVehicle>& router, SUMOTime begin, const ROVehicle& veh) const { myNewRoute = false; if (myTryRepair) { repairCurrentRoute(router, begin, veh); return; } if (ROCostCalculator::getCalculator().skipRouteCalculation()) { myPrecomputed = myAlternatives[myLastUsed]; } else { // build a new route to test whether it is better std::vector<const ROEdge*> edges; router.compute(myAlternatives[0]->getFirst(), myAlternatives[0]->getLast(), &veh, begin, edges); // check whether the same route was already used int cheapest = -1; for (unsigned int i = 0; i < myAlternatives.size(); i++) { if (edges == myAlternatives[i]->getEdgeVector()) { cheapest = i; break; } } if (cheapest >= 0) { myPrecomputed = myAlternatives[cheapest]; } else { RGBColor* col = myAlternatives[0]->getColor() != 0 ? new RGBColor(*myAlternatives[0]->getColor()) : 0; myPrecomputed = new RORoute(myID, 0, 1, edges, col); myNewRoute = true; } } }
void RORouteDef::preComputeCurrentRoute(SUMOAbstractRouter<ROEdge, ROVehicle>& router, SUMOTime begin, const ROVehicle& veh) const { myNewRoute = false; const OptionsCont& oc = OptionsCont::getOptions(); assert(myAlternatives[0]->getEdgeVector().size() > 0); MsgHandler* mh = (OptionsCont::getOptions().getBool("ignore-errors") ? MsgHandler::getWarningInstance() : MsgHandler::getErrorInstance()); if (myAlternatives[0]->getFirst()->prohibits(&veh) && (!oc.getBool("repair.from") // do not try to reassign starting edge for trip input || myMayBeDisconnected || myAlternatives[0]->getEdgeVector().size() < 2)) { mh->inform("Vehicle '" + veh.getID() + "' is not allowed to depart on edge '" + myAlternatives[0]->getFirst()->getID() + "'."); return; } else if (myAlternatives[0]->getLast()->prohibits(&veh) && (!oc.getBool("repair.to") // do not try to reassign destination edge for trip input || myMayBeDisconnected || myAlternatives[0]->getEdgeVector().size() < 2)) { // this check is not strictly necessary unless myTryRepair is set. // However, the error message is more helpful than "no connection found" mh->inform("Vehicle '" + veh.getID() + "' is not allowed to arrive on edge '" + myAlternatives[0]->getLast()->getID() + "'."); return; } if (myTryRepair || myUsingJTRR) { ConstROEdgeVector newEdges; if (repairCurrentRoute(router, begin, veh, myAlternatives[0]->getEdgeVector(), newEdges)) { if (myAlternatives[0]->getEdgeVector() != newEdges) { if (!myMayBeDisconnected) { WRITE_WARNING("Repaired route of vehicle '" + veh.getID() + "'."); } myNewRoute = true; RGBColor* col = myAlternatives[0]->getColor() != 0 ? new RGBColor(*myAlternatives[0]->getColor()) : 0; myPrecomputed = new RORoute(myID, 0, myAlternatives[0]->getProbability(), newEdges, col, myAlternatives[0]->getStops()); } else { myPrecomputed = myAlternatives[0]; } } return; } if (RouteCostCalculator<RORoute, ROEdge, ROVehicle>::getCalculator().skipRouteCalculation() || OptionsCont::getOptions().getBool("remove-loops")) { myPrecomputed = myAlternatives[myLastUsed]; } else { // build a new route to test whether it is better ConstROEdgeVector oldEdges; oldEdges.push_back(myAlternatives[0]->getFirst()); oldEdges.push_back(myAlternatives[0]->getLast()); ConstROEdgeVector edges; repairCurrentRoute(router, begin, veh, oldEdges, edges); // check whether the same route was already used int cheapest = -1; for (int i = 0; i < (int)myAlternatives.size(); i++) { if (edges == myAlternatives[i]->getEdgeVector()) { cheapest = i; break; } } if (cheapest >= 0) { myPrecomputed = myAlternatives[cheapest]; } else { RGBColor* col = myAlternatives[0]->getColor() != 0 ? new RGBColor(*myAlternatives[0]->getColor()) : 0; myPrecomputed = new RORoute(myID, 0, 1, edges, col, myAlternatives[0]->getStops()); myNewRoute = true; } } }