Skip to content

Commit 24fa8d8

Browse files
committed
refactor: update routing algorithm configuration and remove deprecated methods
1 parent e43fb3d commit 24fa8d8

11 files changed

Lines changed: 108 additions & 177 deletions

File tree

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/benchmark/DrtBenchmarkConfigGroup.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.matsim.core.config.Config;
1313
import org.matsim.core.config.ConfigGroup;
1414
import org.matsim.core.config.ReflectiveConfigGroup;
15+
import org.matsim.core.config.groups.ControllerConfigGroup;
1516

1617
import java.util.Arrays;
1718
import java.util.List;
@@ -373,10 +374,9 @@ public void setMeasuredRuns(int measuredRuns) {
373374
@Comment("Enable spatial request-fleet filter (reduces search space)")
374375
private boolean useSpatialFilter = true;
375376

376-
@Comment("Comma-separated list of detour path calculator types to benchmark. " +
377-
"Options: SpeedyALT, CH. " +
378-
"'SpeedyALT' uses the default Dijkstra-based one-to-many router. " +
379-
"'CH' uses Contraction Hierarchies (faster on large networks, requires one-time CH build).")
377+
@Comment("Comma-separated list of routing algorithm types for detour path computation. " +
378+
"Options: SpeedyALT, CHRouter. " +
379+
"Maps directly to config.controller.routingAlgorithmType.")
380380
@NotBlank
381381
private String detourPathCalculatorTypes = "SpeedyALT";
382382

@@ -415,14 +415,14 @@ public void setDetourPathCalculatorTypesString(String detourPathCalculatorTypes)
415415
this.detourPathCalculatorTypes = detourPathCalculatorTypes;
416416
}
417417

418-
public List<InsertionStrategy.DetourPathCalculatorType> getDetourPathCalculatorTypes() {
418+
public List<ControllerConfigGroup.RoutingAlgorithmType> getRoutingAlgorithmTypes() {
419419
return Arrays.stream(detourPathCalculatorTypes.split(","))
420420
.map(String::trim)
421-
.map(this::parseDetourPathCalculatorType)
421+
.map(this::parseRoutingAlgorithmType)
422422
.collect(Collectors.toList());
423423
}
424424

425-
public void setDetourPathCalculatorTypes(List<InsertionStrategy.DetourPathCalculatorType> types) {
425+
public void setRoutingAlgorithmTypes(List<ControllerConfigGroup.RoutingAlgorithmType> types) {
426426
this.detourPathCalculatorTypes = types.stream()
427427
.map(Enum::name)
428428
.collect(Collectors.joining(","));
@@ -507,12 +507,12 @@ private InsertionStrategy.InsertionSearchStrategy parseInsertionSearchStrategy(S
507507
};
508508
}
509509

510-
private InsertionStrategy.DetourPathCalculatorType parseDetourPathCalculatorType(String name) {
510+
private ControllerConfigGroup.RoutingAlgorithmType parseRoutingAlgorithmType(String name) {
511511
return switch (name.toLowerCase()) {
512-
case "speedyalt", "speedy" -> InsertionStrategy.DetourPathCalculatorType.SpeedyALT;
513-
case "ch", "contractionhierarchies" -> InsertionStrategy.DetourPathCalculatorType.CH;
512+
case "speedyalt", "speedy" -> ControllerConfigGroup.RoutingAlgorithmType.SpeedyALT;
513+
case "ch", "chrouter" -> ControllerConfigGroup.RoutingAlgorithmType.CHRouter;
514514
default -> throw new IllegalArgumentException("Unknown detour path calculator type: " + name +
515-
". Valid options: SpeedyALT, CH");
515+
". Valid options: SpeedyALT, CHRouter");
516516
};
517517
}
518518

@@ -533,7 +533,7 @@ public Map<String, String> getComments() {
533533
comments.put(MEASURED_RUNS, "Number of measured runs");
534534
comments.put(OUTPUT_DIRECTORY, "Output directory for results");
535535
comments.put(USE_SPATIAL_FILTER, "Enable spatial filter");
536-
comments.put(DETOUR_PATH_CALCULATOR_TYPES, "Detour path calculator types: SpeedyALT, CH");
536+
comments.put(DETOUR_PATH_CALCULATOR_TYPES, "Detour path calculator types: SpeedyALT, CHRouter");
537537
comments.put(NETWORK_URL, "URL or file path to a MATSim network (empty = synthetic grid)");
538538
return comments;
539539
}

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/benchmark/InsertionStrategy.java

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
/**
88
* Enums for DRT benchmark configuration.
99
* <p>
10-
* The benchmark has three orthogonal dimensions:
10+
* The benchmark has two orthogonal dimensions:
1111
* <ul>
1212
* <li>{@link RequestInserterType} – HOW requests are dispatched (Default sequential vs. Parallel partitioned)</li>
1313
* <li>{@link InsertionSearchStrategy} – WHICH algorithm finds the best insertion for a request</li>
14-
* <li>{@link DetourPathCalculatorType} – WHICH routing algorithm computes detour paths during insertion search</li>
1514
* </ul>
16-
* Every combination of these dimensions is valid.
15+
* The routing algorithm type for detour path computation is configured via
16+
* {@link org.matsim.core.config.groups.ControllerConfigGroup.RoutingAlgorithmType} directly
17+
* (e.g. {@code SpeedyALT}, {@code CHRouter}).
1718
*
1819
* @author Steffen Axer
1920
*/
@@ -43,17 +44,5 @@ public enum RequestInserterType {
4344
public enum InsertionSearchStrategy {
4445
Selective, Extensive, RepeatedSelective
4546
}
46-
47-
/**
48-
* The routing algorithm used for computing detour paths during DRT insertion search.
49-
* <ul>
50-
* <li><b>SpeedyALT</b> – default Dijkstra-based one-to-many router (SpeedyALT). Good for small/medium networks.</li>
51-
* <li><b>CH</b> – Contraction Hierarchies time-dependent router. Dramatically faster on large networks
52-
* (e.g. Berlin v7 with ~88k nodes), but requires a one-time CH graph build per network.</li>
53-
* </ul>
54-
*/
55-
public enum DetourPathCalculatorType {
56-
SpeedyALT, CH
57-
}
5847
}
5948

contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/benchmark/RunScalabilityBenchmark.java

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
package org.matsim.contrib.drt.extension.benchmark;
66

7-
import org.matsim.contrib.drt.extension.benchmark.InsertionStrategy.DetourPathCalculatorType;
87
import org.matsim.contrib.drt.extension.benchmark.InsertionStrategy.InsertionSearchStrategy;
98
import org.matsim.contrib.drt.extension.benchmark.InsertionStrategy.RequestInserterType;
109
import org.matsim.contrib.drt.extension.benchmark.scenario.SyntheticBenchmarkScenario;
@@ -23,6 +22,7 @@
2322
import org.matsim.core.config.CommandLine.ConfigurationException;
2423
import org.matsim.core.config.Config;
2524
import org.matsim.core.config.ConfigUtils;
25+
import org.matsim.core.config.groups.ControllerConfigGroup;
2626
import org.matsim.core.controler.Controler;
2727

2828
import java.nio.file.Path;
@@ -117,34 +117,32 @@ public static void runBenchmark(DrtBenchmarkConfigGroup config) {
117117
int vehicles = agents * config.getVehiclesPerHundredAgents() / 100;
118118

119119
for (InsertionSearchStrategy searchStrategy : config.getInsertionSearchStrategies()) {
120-
for (DetourPathCalculatorType pathCalcType : config.getDetourPathCalculatorTypes()) {
120+
for (ControllerConfigGroup.RoutingAlgorithmType routingType : config.getRoutingAlgorithmTypes()) {
121121
for (RequestInserterType inserterType : config.getRequestInserterTypes()) {
122122

123123
if (inserterType == RequestInserterType.Parallel) {
124-
// Parallel inserter: expand partitioner × collectionPeriod combinations
125124
for (int collectionPeriod : config.getCollectionPeriods()) {
126125
for (VehiclesPartitioner vp : config.getVehiclePartitioners()) {
127126
for (RequestsPartitioner rp : config.getRequestPartitioners()) {
128127

129128
String scenarioName = String.format("Parallel_%s_%s_%s_%s_cp%d_%dk",
130-
searchStrategy.name(), pathCalcType.name(),
129+
searchStrategy.name(), routingType.name(),
131130
shortName(vp), shortName(rp),
132131
collectionPeriod, agents / 1000);
133132
String outputDir = String.format("%s/%s/%s",
134133
config.getOutputDirectory(), timestamp, scenarioName);
135134

136-
// Capture for lambda
137135
final int fAgents = agents, fVehicles = vehicles, fCp = collectionPeriod;
138136
final VehiclesPartitioner fVp = vp;
139137
final RequestsPartitioner fRp = rp;
140138
final InsertionSearchStrategy fSearch = searchStrategy;
141-
final DetourPathCalculatorType fPathCalc = pathCalcType;
139+
final ControllerConfigGroup.RoutingAlgorithmType fRoutingType = routingType;
142140
final DrtBenchmarkConfigGroup fConfig = config;
143141

144142
runner.addScenario(scenarioName, () -> {
145143
DrtInsertionSearchParams searchParams = createSearchParams(fSearch);
146144
Controler c = buildControler(fConfig, fAgents, fVehicles,
147-
outputDir, searchParams, fPathCalc);
145+
outputDir, searchParams, fRoutingType);
148146

149147
var drtCfg = MultiModeDrtConfigGroup.get(c.getConfig())
150148
.getModalElements().iterator().next();
@@ -170,19 +168,19 @@ public static void runBenchmark(DrtBenchmarkConfigGroup config) {
170168
} else {
171169
// Default (sequential) inserter
172170
String scenarioName = String.format("Default_%s_%s_%dk",
173-
searchStrategy.name(), pathCalcType.name(), agents / 1000);
171+
searchStrategy.name(), routingType.name(), agents / 1000);
174172
String outputDir = String.format("%s/%s/%s",
175173
config.getOutputDirectory(), timestamp, scenarioName);
176174

177175
final int fAgents = agents, fVehicles = vehicles;
178176
final InsertionSearchStrategy fSearch = searchStrategy;
179-
final DetourPathCalculatorType fPathCalc = pathCalcType;
177+
final ControllerConfigGroup.RoutingAlgorithmType fRoutingType = routingType;
180178
final DrtBenchmarkConfigGroup fConfig = config;
181179

182180
runner.addScenario(scenarioName, () -> {
183181
DrtInsertionSearchParams searchParams = createSearchParams(fSearch);
184182
Controler c = buildControler(fConfig, fAgents, fVehicles,
185-
outputDir, searchParams, fPathCalc);
183+
outputDir, searchParams, fRoutingType);
186184

187185
var drtCfg = MultiModeDrtConfigGroup.get(c.getConfig())
188186
.getModalElements().iterator().next();
@@ -200,17 +198,13 @@ public static void runBenchmark(DrtBenchmarkConfigGroup config) {
200198
runner.run();
201199
}
202200

203-
// =========================================================================
204-
// Helper methods
205-
// =========================================================================
206-
207201
/**
208-
* Builds a Controler with the given insertion search params and detour path calculator type.
202+
* Builds a Controler and sets the routing algorithm type directly on the controller config.
209203
*/
210204
private static Controler buildControler(DrtBenchmarkConfigGroup config, int agents,
211205
int vehicles, String outputDir,
212206
DrtInsertionSearchParams searchParams,
213-
DetourPathCalculatorType pathCalcType) {
207+
ControllerConfigGroup.RoutingAlgorithmType routingAlgorithmType) {
214208
var builder = SyntheticBenchmarkScenario.builder()
215209
.agents(agents)
216210
.vehicles(vehicles)
@@ -223,11 +217,7 @@ private static Controler buildControler(DrtBenchmarkConfigGroup config, int agen
223217
}
224218

225219
Controler c = builder.build();
226-
227-
var drtCfg = MultiModeDrtConfigGroup.get(c.getConfig())
228-
.getModalElements().iterator().next();
229-
drtCfg.setUseCHForInsertionSearch(pathCalcType == DetourPathCalculatorType.CH);
230-
220+
c.getConfig().controller().setRoutingAlgorithmType(routingAlgorithmType);
231221
return c;
232222
}
233223

@@ -260,7 +250,7 @@ private static void printConfig(DrtBenchmarkConfigGroup config) {
260250
System.out.println("Vehicles per 100 agents: " + config.getVehiclesPerHundredAgents());
261251
System.out.println("Request Inserter Types: " + config.getRequestInserterTypesString());
262252
System.out.println("Insertion Search Strategies: " + config.getInsertionSearchStrategiesString());
263-
System.out.println("Detour Path Calculators: " + config.getDetourPathCalculatorTypesString());
253+
System.out.println("Routing Algorithm Types: " + config.getDetourPathCalculatorTypesString());
264254
System.out.println("Vehicle Partitioners (Parallel): " + config.getVehiclePartitionersString());
265255
System.out.println("Request Partitioners (Parallel): " + config.getRequestPartitionersString());
266256
System.out.println("Collection Periods (Parallel): " + config.getCollectionPeriods());
@@ -276,16 +266,16 @@ private static void printConfig(DrtBenchmarkConfigGroup config) {
276266

277267
int agentCount = config.getAgentCounts().size();
278268
int searchCount = config.getInsertionSearchStrategies().size();
279-
int pathCalcCount = config.getDetourPathCalculatorTypes().size();
269+
int routingTypeCount = config.getRoutingAlgorithmTypes().size();
280270
int parallelCombinations = config.getVehiclePartitioners().size()
281271
* config.getRequestPartitioners().size()
282272
* config.getCollectionPeriods().size();
283273
int totalScenarios = 0;
284274
for (RequestInserterType inserterType : config.getRequestInserterTypes()) {
285275
if (inserterType == RequestInserterType.Parallel) {
286-
totalScenarios += agentCount * searchCount * pathCalcCount * parallelCombinations;
276+
totalScenarios += agentCount * searchCount * routingTypeCount * parallelCombinations;
287277
} else {
288-
totalScenarios += agentCount * searchCount * pathCalcCount;
278+
totalScenarios += agentCount * searchCount * routingTypeCount;
289279
}
290280
}
291281
System.out.println("Total scenarios to run: " + totalScenarios);

contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/insertion/extensive/ExtensiveInsertionSearchQSimModule.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
/*
32
* *********************************************************************** *
43
* project: org.matsim.*
@@ -30,12 +29,12 @@
3029
import org.matsim.contrib.drt.run.DrtConfigGroup;
3130
import org.matsim.contrib.drt.stops.StopTimeCalculator;
3231
import org.matsim.contrib.dvrp.run.AbstractDvrpModeQSimModule;
33-
import org.matsim.contrib.dvrp.run.DvrpModes;
3432
import org.matsim.contrib.zone.skims.TravelTimeMatrix;
35-
import org.matsim.core.modal.ModalProviders;
3633
import org.matsim.core.router.costcalculators.TravelDisutilityFactory;
3734
import org.matsim.core.router.util.TravelDisutility;
3835
import org.matsim.core.router.util.TravelTime;
36+
import org.matsim.core.config.Config;
37+
import org.matsim.core.config.groups.ControllerConfigGroup;
3938

4039
/**
4140
* @author Michal Maciejewski (michalm)
@@ -74,16 +73,16 @@ protected void configureQSim() {
7473

7574
bindModal(DrtInsertionSearch.class).toProvider(modalProvider( getter -> getter.getModal(DrtInsertionSearchManager.class).create()));
7675

77-
addModalComponent(MultiInsertionDetourPathCalculatorManager.class,
78-
new ModalProviders.AbstractProvider<>(getMode(), DvrpModes::mode) {
79-
@Override
80-
public MultiInsertionDetourPathCalculatorManager get() {
81-
var travelTime = getModalInstance(TravelTime.class);
82-
Network network = getModalInstance(Network.class);
83-
TravelDisutility travelDisutility = getModalInstance(
84-
TravelDisutilityFactory.class).createTravelDisutility(travelTime);
85-
return new MultiInsertionDetourPathCalculatorManager(network, travelTime, travelDisutility, drtCfg);
86-
}
87-
});
76+
addModalComponent(MultiInsertionDetourPathCalculatorManager.class, modalProvider(getter -> {
77+
var travelTime = getter.getModal(TravelTime.class);
78+
Network network = getter.getModal(Network.class);
79+
TravelDisutility travelDisutility = getter.getModal(TravelDisutilityFactory.class).createTravelDisutility(travelTime);
80+
81+
Config config = getter.get(Config.class);
82+
boolean useCH = config.controller().getRoutingAlgorithmType()
83+
== ControllerConfigGroup.RoutingAlgorithmType.CHRouter;
84+
85+
return new MultiInsertionDetourPathCalculatorManager(network, travelTime, travelDisutility, drtCfg, useCH);
86+
}));
8887
}
8988
}

contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/insertion/extensive/MultiInsertionDetourPathCalculatorManager.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,23 @@ public class MultiInsertionDetourPathCalculatorManager implements MobsimBeforeCl
4040
private final TravelTime travelTime;
4141
private final TravelDisutility travelDisutility;
4242
private final DrtConfigGroup drtCfg;
43+
private final boolean useCH;
4344
private final List<MultiInsertionDetourPathCalculator> multiInsertionDetourPathCalculatorList;
4445

46+
/**
47+
* Creates a new manager.
48+
*
49+
* @param useCH if {@code true}, uses the CH (Contraction Hierarchies) accelerated
50+
* one-to-many path search; derive this from
51+
* {@code config.controller().getRoutingAlgorithmType() == ControllerConfigGroup.RoutingAlgorithmType.CHRouter}.
52+
*/
4553
MultiInsertionDetourPathCalculatorManager(Network network, TravelTime travelTime, TravelDisutility travelDisutility,
46-
DrtConfigGroup drtCfg)
47-
{
54+
DrtConfigGroup drtCfg, boolean useCH) {
4855
this.network = network;
4956
this.travelTime = travelTime;
5057
this.travelDisutility = travelDisutility;
5158
this.drtCfg = drtCfg;
59+
this.useCH = useCH;
5260
this.multiInsertionDetourPathCalculatorList = new ArrayList<>();
5361
}
5462

@@ -57,10 +65,9 @@ public void notifyMobsimBeforeCleanup(MobsimBeforeCleanupEvent e) {
5765
multiInsertionDetourPathCalculatorList.forEach(i -> i.notifyMobsimBeforeCleanup(e));
5866
}
5967

60-
MultiInsertionDetourPathCalculator create()
61-
{
68+
MultiInsertionDetourPathCalculator create() {
6269
MultiInsertionDetourPathCalculator instance;
63-
if (drtCfg.isUseCHForInsertionSearch()) {
70+
if (useCH) {
6471
instance = new MultiInsertionDetourPathCalculator(getOrBuildCHGraph(), travelTime, travelDisutility, drtCfg);
6572
} else {
6673
instance = new MultiInsertionDetourPathCalculator(network, travelTime, travelDisutility, drtCfg);

contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/insertion/repeatedselective/RepeatedSelectiveInsertionSearchQSimModule.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,11 @@
3030
import org.matsim.contrib.drt.run.DrtConfigGroup;
3131
import org.matsim.contrib.drt.stops.StopTimeCalculator;
3232
import org.matsim.contrib.dvrp.run.AbstractDvrpModeQSimModule;
33-
import org.matsim.contrib.dvrp.run.DvrpModes;
3433
import org.matsim.contrib.zone.skims.AdaptiveTravelTimeMatrix;
3534
import org.matsim.contrib.zone.skims.TravelTimeMatrix;
3635
import org.matsim.core.controler.MatsimServices;
37-
import org.matsim.core.modal.ModalProviders;
3836
import org.matsim.core.router.costcalculators.TravelDisutilityFactory;
37+
import org.matsim.core.router.util.LeastCostPathCalculatorFactory;
3938
import org.matsim.core.router.util.TravelDisutility;
4039
import org.matsim.core.router.util.TravelTime;
4140

@@ -86,16 +85,12 @@ protected void configureQSim() {
8685

8786
bindModal(DrtInsertionSearch.class).toProvider(modalProvider( getter -> getter.getModal(DrtInsertionSearchManager.class).create()));
8887

89-
addModalComponent(SingleInsertionDetourPathCalculatorManager.class,
90-
new ModalProviders.AbstractProvider<>(getMode(), DvrpModes::mode) {
91-
@Override
92-
public SingleInsertionDetourPathCalculatorManager get() {
93-
var travelTime = getModalInstance(TravelTime.class);
94-
Network network = getModalInstance(Network.class);
95-
TravelDisutility travelDisutility = getModalInstance(
96-
TravelDisutilityFactory.class).createTravelDisutility(travelTime);
97-
return new SingleInsertionDetourPathCalculatorManager(network, travelTime, travelDisutility, drtCfg);
98-
}
99-
});
88+
addModalComponent(SingleInsertionDetourPathCalculatorManager.class, modalProvider(getter -> {
89+
var travelTime = getter.getModal(TravelTime.class);
90+
Network network = getter.getModal(Network.class);
91+
TravelDisutility travelDisutility = getter.getModal(TravelDisutilityFactory.class).createTravelDisutility(travelTime);
92+
LeastCostPathCalculatorFactory factory = getter.get(LeastCostPathCalculatorFactory.class);
93+
return new SingleInsertionDetourPathCalculatorManager(network, travelTime, travelDisutility, drtCfg, factory);
94+
}));
10095
}
10196
}

0 commit comments

Comments
 (0)