MATSIM
RaptorUtils.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.* *
3  *
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2023 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 package ch.sbb.matsim.routing.pt.raptor;
21 
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.Map;
25 
26 import org.apache.logging.log4j.LogManager;
27 import org.apache.logging.log4j.Logger;
28 import org.matsim.api.core.v01.Id;
35 import org.matsim.core.config.Config;
39 import org.matsim.core.gbl.Gbl;
44 
46 
50 public final class RaptorUtils {
51  private static final Logger log = LogManager.getLogger( RaptorUtils.class );
52 
53  private RaptorUtils() {
54  }
55 
57  RoutingConfigGroup routingConfig = config.routing();
59 
60  RaptorStaticConfig staticConfig = new RaptorStaticConfig();
61 
63 // RoutingConfigGroup.TeleportedModeParams walk = routingConfig.getModeRoutingParams().get(TransportMode.walk );
64 
65  // the code below also exists in TransitRouterConfig. kai, mar'25
67  if ( params==null ) {
68  params = routingConfig.getTeleportedModeParams().get( TransportMode.non_network_walk );
69  }
70  if ( params==null ) {
71  params = routingConfig.getTeleportedModeParams().get( TransportMode.walk) ;
72  }
73  if ( params==null ) {
74  log.error( "teleported mode params do not exist for " + TransportMode.transit_walk + ", " + TransportMode.non_network_walk + ", nor "
75  + TransportMode.walk + ". At least one of them needs to be defined for TransitRouterConfig. Aborting ...");
76  // yyyy I do not know which of this is conceptually the correct one. It should _not_ be walk since that may be routed on the network, see TransitRouterConfig. kai, mar'25
77  }
78  Gbl.assertNotNull( params );
80 
81  staticConfig.setBeelineWalkSpeed(walk.getTeleportedModeSpeed() / walk.getBeelineDistanceFactor());
82  staticConfig.setBeelineWalkDistanceFactor(walk.getBeelineDistanceFactor());
83  staticConfig.setTransferWalkMargin(srrConfig.getTransferWalkMargin());
86  staticConfig.setTransferCalculation(srrConfig.getTransferCalculation());
87 
89  if (srrConfig.isUseModeMappingForPassengers()) {
91  staticConfig.addModeMappingForPassengers(mapping.getRouteMode(), mapping.getPassengerMode());
92  }
93  }
94 
96  staticConfig.addModeToModeTransferPenalty(penalty.fromMode,penalty.toMode,penalty.transferPenalty);
97  }
98  staticConfig.setUseCapacityConstraints(srrConfig.isUseCapacityConstraints());
99 
100  return staticConfig;
101  }
102 
103  public static RaptorParameters createParameters(Config config) {
105 
106  TransitRouterConfig trConfig = new TransitRouterConfig(config);
107  RaptorParameters raptorParams = new RaptorParameters(advancedConfig);
108  raptorParams.setBeelineWalkSpeed(trConfig.getBeelineWalkSpeed());
109 
110  raptorParams.setSearchRadius(config.transitRouter().getSearchRadius());
111  raptorParams.setExtensionRadius(config.transitRouter().getExtensionRadius());
112  raptorParams.setDirectWalkFactor(config.transitRouter().getDirectWalkFactor());
113 
115 
116  ScoringConfigGroup pcsConfig = config.scoring();
117  double marginalUtilityPerforming = pcsConfig.getPerforming_utils_hr() / 3600.0;
118  for (Map.Entry<String, ScoringConfigGroup.ModeParams> e : pcsConfig.getModes().entrySet()) {
119  String mode = e.getKey();
120  ScoringConfigGroup.ModeParams modeParams = e.getValue();
121  double marginalUtility_utl_s = modeParams.getMarginalUtilityOfTraveling()/3600.0 - marginalUtilityPerforming;
122  raptorParams.setMarginalUtilityOfTravelTime_utl_s(mode, marginalUtility_utl_s);
123  }
124 
125  double costPerHour = advancedConfig.getTransferPenaltyCostPerTravelTimeHour();
126  if (costPerHour == 0.0) {
127  // for backwards compatibility, use the default utility of line switch.
129  } else {
131  }
132  raptorParams.setTransferPenaltyPerTravelTimeHour(costPerHour);
133  raptorParams.setTransferPenaltyMinimum(advancedConfig.getTransferPenaltyMinCost());
134  raptorParams.setTransferPenaltyMaximum(advancedConfig.getTransferPenaltyMaxCost());
135 
136  return raptorParams;
137  }
138 
139  public static List<? extends PlanElement> convertRouteToLegs(RaptorRoute route, double transferWalkMargin) {
140  List<PlanElement> legs = new ArrayList<>(route.parts.size());
141  double lastArrivalTime = Double.NaN;
142  boolean firstPtLegProcessed = false;
143  Leg previousTransferWalkleg = null;
144  for (RaptorRoute.RoutePart part : route.parts) {
145  if (part.planElements != null) {
146  for (PlanElement pe : part.planElements) {
147  if (pe instanceof Leg leg) {
148  legs.add(leg);
149  if (leg.getDepartureTime().isUndefined()) {
150  leg.setDepartureTime(lastArrivalTime);
151  }
152  lastArrivalTime = leg.getDepartureTime().seconds() + leg.getTravelTime().seconds();
153  }
154  else {
155  Activity act = (Activity) pe;
156  legs.add(act);
157  }
158  }
159  } else if (part.line != null) {
160  // a pt leg
161  Leg ptLeg = PopulationUtils.createLeg(part.mode);
162  ptLeg.setDepartureTime(part.depTime);
163  ptLeg.setTravelTime(part.arrivalTime - part.depTime);
164  DefaultTransitPassengerRoute ptRoute = new DefaultTransitPassengerRoute(part.fromStop, part.line, part.route, part.toStop);
165  ptRoute.setBoardingTime(part.boardingTime);
166  ptRoute.setTravelTime(part.arrivalTime - part.depTime);
167  ptRoute.setDistance(part.distance);
168  ptLeg.setRoute(ptRoute);
169  legs.add(ptLeg);
170  lastArrivalTime = part.arrivalTime;
171  firstPtLegProcessed = true;
172  if (previousTransferWalkleg != null) {
173  //adds the margin only to legs in between pt legs
174  double traveltime = Math.max(0, previousTransferWalkleg.getTravelTime().seconds() - transferWalkMargin);
175  previousTransferWalkleg.setTravelTime(traveltime);
176  previousTransferWalkleg.getRoute().setTravelTime(traveltime);
177 
178  }
179  } else {
180  // a non-pt leg
181  Leg walkLeg = PopulationUtils.createLeg(part.mode);
182  walkLeg.setDepartureTime(part.depTime);
183  double travelTime = part.arrivalTime - part.depTime;
184  walkLeg.setTravelTime(travelTime);
185  Id<Link> startLinkId = part.fromStop == null ? (route.fromFacility == null ? null : route.fromFacility.getLinkId()) : part.fromStop.getLinkId();
186  Id<Link> endLinkId = part.toStop == null ? (route.toFacility == null ? null : route.toFacility.getLinkId()) : part.toStop.getLinkId();
187  Route walkRoute = RouteUtils.createGenericRouteImpl(startLinkId, endLinkId);
188  walkRoute.setTravelTime(travelTime);
189  walkRoute.setDistance(part.distance);
190  walkLeg.setRoute(walkRoute);
191  legs.add(walkLeg);
192  lastArrivalTime = part.arrivalTime;
193  if (firstPtLegProcessed) {
194  previousTransferWalkleg = walkLeg;
195  }
196  }
197  }
198 
199  return legs;
200  }
201 }
void setTransferPenaltyFixCostPerTransfer(double transferPenaltyFixCostPerTransfer)
void addModeMappingForPassengers(String routeMode, String passengerMode)
void setDistance(final double distance)
void setMinimalTransferTime(double minimalTransferTime)
static< T extends ConfigGroup > T addOrGetModule(Config config, Class< T > moduleClass)
static Route createGenericRouteImpl(Id< Link > startLinkId, Id< Link > endLinkId)
final void setTravelTime(final double travTime)
Collection< ModeMappingForPassengersParameterSet > getModeMappingForPassengers()
void setDepartureTime(final double seconds)
void setBeelineWalkConnectionDistance(double beelineWalkConnectionDistance)
List< ModeToModeTransferPenalty > getModeToModeTransferPenaltyParameterSets()
void setUseModeMappingForPassengers(boolean useModeMappingForPassengers)
TransitRouterConfigGroup transitRouter()
Definition: Config.java:455
void setTransferPenaltyMinimum(double transferPenaltyMinimum)
final ScoringConfigGroup scoring()
Definition: Config.java:407
static RaptorParameters createParameters(Config config)
static RaptorStaticConfig createStaticConfig(Config config)
void setMarginalUtilityOfTravelTime_utl_s(String mode, double marginalUtilityOfTravelTime_utl_s)
void setBeelineWalkDistanceFactor(double beelineWalkDistanceFactor)
void setIntermodalLegOnlyHandling(SwissRailRaptorConfigGroup.IntermodalLegOnlyHandling intermodalLegOnlyHandling)
void setUseCapacityConstraints(boolean useCapacityConstraints)
final String getValue(final String param_name)
static Leg createLeg(String transportMode)
void setTransferPenaltyPerTravelTimeHour(double transferPenaltyPerTravelTimeHour)
static void assertNotNull(Object obj)
Definition: Gbl.java:212
void addModeToModeTransferPenalty(String fromMode, String toMode, double transferPenalty)
RoutingConfigGroup routing()
Definition: Config.java:439
void setTransferPenaltyMaximum(double transferPenaltyMaximum)
void setTravelTime(final double seconds)
Map< String, TeleportedModeParams > getTeleportedModeParams()
void setTransferCalculation(RaptorTransferCalculation transferCalculation)
static List<? extends PlanElement > convertRouteToLegs(RaptorRoute route, double transferWalkMargin)
void setMarginalUtilityOfWaitingPt_utl_s(double marginalUtilityOfWaitingPt_utl_s)
void setTravelTime(final double travelTime)