21 package ch.sbb.matsim.routing.pt.raptor;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.Iterator;
27 import java.util.List;
29 import java.util.function.Supplier;
31 import org.apache.logging.log4j.LogManager;
32 import org.apache.logging.log4j.Logger;
75 this.raptor =
new SwissRailRaptorCore(data, inVehicleCostCalculator, transferCostCalculator);
77 this.defaultRouteSelector = routeSelector;
91 return this.
performRangeQuery(fromFacility, toFacility, departureTime, person, routingAttributes, parameters);
93 List<InitialStop> accessStops =
findAccessStops(fromFacility, toFacility, person, departureTime, routingAttributes, parameters);
94 List<InitialStop> egressStops =
findEgressStops(fromFacility, toFacility, person, departureTime, routingAttributes, parameters);
96 RaptorRoute foundRoute = this.raptor.
calcLeastCostRoute(departureTime, fromFacility, toFacility, accessStops, egressStops, parameters, person);
104 foundRoute = directWalk;
107 if (foundRoute == null || (foundRoute.parts.size() == 0 && forbidPurelyIntermodalRoutes)) {
108 if (person == null) {
109 log.debug(
"No route found for person null: trip from x=" + fromFacility.
getCoord().
getX() +
",y=" + fromFacility.
getCoord().
getY() +
" departure at " + departureTime +
" to x=" + toFacility.
getCoord().
getX() +
",y=" + toFacility.
getCoord().
getY());
111 log.debug(
"No route found for person " + person.getId() +
": trip from x=" + fromFacility.
getCoord().
getX() +
",y=" + fromFacility.
getCoord().
getY() +
" departure at " + departureTime +
" to x=" + toFacility.
getCoord().
getX() +
",y=" + toFacility.
getCoord().
getY());
116 if (forbidPurelyIntermodalRoutes){
129 if (part.line != null) {
143 double latestDepartureTime = desiredDepartureTime + rangeSettings.getMaxLaterDeparture();
149 selector.setBetaTransfer(params.getBetaTransfers());
151 selector.setBetaDepartureTime(params.getBetaDepartureTime());
154 return this.
calcRoute(fromFacility, toFacility, earliestDepartureTime, desiredDepartureTime, latestDepartureTime, person, routingAttributes, this.defaultRouteSelector);
157 public List<? extends PlanElement>
calcRoute(
Facility fromFacility,
Facility toFacility,
double earliestDepartureTime,
double desiredDepartureTime,
double latestDepartureTime,
Person person,
Attributes routingAttributes) {
158 return calcRoute(fromFacility, toFacility, earliestDepartureTime, desiredDepartureTime, latestDepartureTime, person, routingAttributes, this.defaultRouteSelector);
163 List<InitialStop> accessStops =
findAccessStops(fromFacility, toFacility, person, desiredDepartureTime, routingAttributes, parameters);
164 List<InitialStop> egressStops =
findEgressStops(fromFacility, toFacility, person, desiredDepartureTime, routingAttributes, parameters);
166 List<RaptorRoute> foundRoutes = this.raptor.
calcRoutes(earliestDepartureTime, desiredDepartureTime, latestDepartureTime, fromFacility, toFacility, accessStops, egressStops, parameters, person);
170 if (foundRoute == null || foundRoute.parts.size() == 0 ||
hasNoPtLeg(foundRoute.parts)) {
171 if (person == null) {
172 log.debug(
"No route found for person null: trip from x=" + fromFacility.
getCoord().
getX() +
",y=" + fromFacility.
getCoord().
getY() +
" departure at " + desiredDepartureTime +
" to x=" + toFacility.
getCoord().
getX() +
",y=" + toFacility.
getCoord().
getY());
174 log.debug(
"No route found for person " + person.getId() +
": trip from x=" + fromFacility.
getCoord().
getX() +
",y=" + fromFacility.
getCoord().
getY() +
" departure at " + desiredDepartureTime +
" to x=" + toFacility.
getCoord().
getX() +
",y=" + toFacility.
getCoord().
getY());
179 foundRoute = directWalk;
199 List<InitialStop> accessStops =
findAccessStops(fromFacility, toFacility, person, desiredDepartureTime, routingAttributes, parameters);
200 List<InitialStop> egressStops =
findEgressStops(fromFacility, toFacility, person, desiredDepartureTime, routingAttributes, parameters);
202 List<RaptorRoute> foundRoutes = this.raptor.
calcRoutes(earliestDepartureTime, desiredDepartureTime, latestDepartureTime, fromFacility, toFacility, accessStops, egressStops, parameters, person);
205 if (foundRoutes == null) {
206 foundRoutes =
new ArrayList<>(1);
208 Iterator<RaptorRoute> iter = foundRoutes.iterator();
209 while (iter.hasNext()) {
211 if (foundRoute.parts.size() == 0 ||
hasNoPtLeg(foundRoute.parts)) {
216 foundRoutes.add(directWalk);
222 return this.
calcTree(Collections.singletonList(fromStop), departureTime, parameters, person);
227 log.warn(
"SwissRailRaptorData was not initialized with full support for tree calculations and may result in unexpected results. Use `RaptorStaticConfig.setOptimization(RaptorOptimization.OneToAllRouting)` to fix this issue.");
228 this.treeWarningShown =
true;
230 List<InitialStop> accessStops =
new ArrayList<>();
232 accessStops.add(
new InitialStop(stop, 0, 0, 0, null));
234 return this.
calcLeastCostTree(accessStops, departureTime, parameters, person, null);
239 List<InitialStop> accessStops =
findAccessStops(fromFacility, fromFacility, person, departureTime, routingAttributes, parameters);
240 return this.
calcLeastCostTree(accessStops, departureTime, parameters, person, null);
250 log.warn(
"SwissRailRaptorData was not initialized with full support for tree calculations and may result in unexpected results. Use `RaptorStaticConfig.setOptimization(RaptorOptimization.OneToAllRouting)` to fix this issue.");
251 this.treeWarningShown =
true;
253 parameters.setExactDeparturesOnly(
true);
255 List<InitialStop> accessStops = List.of(
new InitialStop(stopFacility, 0, 0, 0, null));
257 int[] routeStopIndices = this.data.routeStopsPerStopFacility.get(stopFacility);
259 List<Double> departureTimes =
new ArrayList<>();
261 for (
int routeStopIndex : routeStopIndices) {
264 int fromIndex = route.indexFirstDeparture;
265 int toIndex = fromIndex + route.countDepartures;
266 for (
int depIndex = fromIndex; depIndex < toIndex; depIndex++) {
267 double departureTime = this.data.departures[depIndex] + routeStop.departureOffset;
268 if (departureTime >= earliestDepartureTime && departureTime <= latestStartTime) {
269 departureTimes.add(departureTime);
273 departureTimes.sort(Double::compare);
275 double lastDepTime = -1;
276 for (
double departureTime : departureTimes) {
277 if (departureTime > lastDepTime) {
279 lastDepTime = departureTime;
285 return this.raptor.
calcLeastCostTree(departureTime, accessStops, parameters, person, observer);
305 double walkCost = walkTime * walkCost_per_s;
309 route.addNonPt(null, null, departureTime, walkTime, beelineDistance * beelineDistanceFactor,
TransportMode.
walk);
352 return new SwissRailRaptor(this.data, this.parametersForPerson, this.routeSelector, this.stopFinder, this.inVehicleCostCalculator, this.transferCostCalculator);
357 void arrivedAtStop(
double departureTime,
TransitStopFacility stopFacility,
double arrivalTime,
int transferCount, Supplier<RaptorRoute> route);
Builder with(RaptorParametersForPerson parametersForPerson)
double getTransferWalkMargin()
RaptorTransferCostCalculator transferCostCalculator
List<? extends PlanElement > calcRoute(Facility fromFacility, Facility toFacility, double earliestDepartureTime, double desiredDepartureTime, double latestDepartureTime, Person person, Attributes routingAttributes)
Attributes getAttributes()
int getMaxEarlierDeparture()
List< InitialStop > findAccessStops(Facility fromFacility, Facility toFacility, Person person, double departureTime, Attributes routingAttributes, RaptorParameters parameters)
double getMarginalUtilityOfTravelTime_utl_s(String mode)
static double calcEuclideanDistance(Coord coord, Coord other)
Map< Id< TransitStopFacility >, SwissRailRaptorCore.TravelInfo > calcLeastCostTree(Collection< InitialStop > accessStops, double departureTime, RaptorParameters parameters, Person person, RaptorObserver observer)
List< InitialStop > findEgressStops(Facility fromFacility, Facility toFacility, Person person, double departureTime, Attributes routingAttributes, RaptorParameters parameters)
RaptorRoute createDirectWalk(Facility fromFacility, Facility toFacility, double departureTime, Person person, RaptorParameters parameters)
List< InitialStop > findStops(Facility fromFacility, Facility toFacility, Person person, double departureTime, Attributes routingAttributes, RaptorParameters parameters, SwissRailRaptorData data, Direction type)
RaptorRoute calcLeastCostRoute(double depTime, Facility fromFacility, Facility toFacility, List< InitialStop > accessStops, List< InitialStop > egressStops, RaptorParameters parameters, Person person)
List<? extends PlanElement > calcRoute(RoutingRequest request)
SwissRailRaptorConfigGroup.IntermodalLegOnlyHandling getIntermodalLegOnlyHandling()
List<? extends PlanElement > performRangeQuery(Facility fromFacility, Facility toFacility, double desiredDepartureTime, Person person, Attributes routingAttributes, RaptorParameters parameters)
boolean isUseRangeQuery()
RangeQuerySettingsParameterSet getRangeQuerySettings(String subpopulation)
double getBeelineWalkSpeed()
List< RaptorRoute > calcRoutes(Facility fromFacility, Facility toFacility, double earliestDepartureTime, double desiredDepartureTime, double latestDepartureTime, Person person, Attributes routingAttributes)
final SwissRailRaptorData data
double getBeelineWalkDistanceFactor()
RaptorInVehicleCostCalculator inVehicleCostCalculator
final RaptorParametersForPerson parametersForPerson
SwissRailRaptorData getUnderlyingData()
RaptorParametersForPerson parametersForPerson
Builder with(RaptorInVehicleCostCalculator inVehicleCostCalculator)
RaptorParameters getRaptorParameters(Person person)
void calcTreesObservable(TransitStopFacility stopFacility, double earliestDepartureTime, double latestStartTime, RaptorParameters parameters, Person person, RaptorObserver observer)
final RaptorRouteSelector defaultRouteSelector
double getDepartureTime()
Map< Id< TransitStopFacility >, SwissRailRaptorCore.TravelInfo > calcTree(Collection< TransitStopFacility > fromStops, double departureTime, RaptorParameters parameters, Person person)
RaptorOptimization getOptimization()
void setBetaTravelTime(double betaTravelTime)
final SwissRailRaptorCore raptor
static String getSubpopulation(HasPlansAndId<?, ?> person)
boolean hasNoPtLeg(List< RoutePart > parts)
Map< Id< TransitStopFacility >, SwissRailRaptorCore.TravelInfo > calcTree(TransitStopFacility fromStop, double departureTime, RaptorParameters parameters, Person person)
List< RaptorRoute > calcRoutes(double earliestDepTime, double desiredDepTime, double latestDepTime, Facility fromFacility, Facility toFacility, List< InitialStop > accessStops, List< InitialStop > egressStops, RaptorParameters parameters, Person person)
final RaptorStopFinder stopFinder
RaptorStopFinder stopFinder
RaptorRouteSelector routeSelector
Builder with(RaptorStopFinder stopFinder)
Map< Id< TransitStopFacility >, TravelInfo > calcLeastCostTree(double depTime, Collection< InitialStop > startStops, RaptorParameters parameters, Person person)
List<? extends PlanElement > calcRoute(Facility fromFacility, Facility toFacility, double earliestDepartureTime, double desiredDepartureTime, double latestDepartureTime, Person person, Attributes routingAttributes, RaptorRouteSelector selector)
Builder with(RaptorTransferCostCalculator transferCostCalculator)
final SwissRailRaptorData data
static List<? extends PlanElement > convertRouteToLegs(RaptorRoute route, double transferWalkMargin)
double getDirectWalkFactor()
Builder(SwissRailRaptorData data, Config config)
SwissRailRaptor(SwissRailRaptorData data, RaptorParametersForPerson parametersForPerson, RaptorRouteSelector routeSelector, RaptorStopFinder stopFinder, RaptorInVehicleCostCalculator inVehicleCostCalculator, RaptorTransferCostCalculator transferCostCalculator)
Map< Id< TransitStopFacility >, SwissRailRaptorCore.TravelInfo > calcTree(Facility fromFacility, double departureTime, Person person, Attributes routingAttributes)
RouteSelectorParameterSet getRouteSelector(String subpopulation)
RaptorRoute selectOne(List< RaptorRoute > routes, double desiredDepartureTime)
SwissRailRaptorConfigGroup getConfig()
Facility getFromFacility()
Builder with(RaptorRouteSelector routeSelector)