Skip to content

Commit 4393e86

Browse files
authored
feat: make vdf travel times useable in routing server (#309)
1 parent 8aac748 commit 4393e86

6 files changed

Lines changed: 87 additions & 11 deletions

File tree

server/src/main/java/org/eqasim/server/RunProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.function.Function;
1212

1313
import org.eqasim.core.misc.ParallelProgress;
14+
import org.eqasim.core.simulation.EqasimConfigurator;
1415
import org.eqasim.server.ServiceBuilder.Services;
1516
import org.eqasim.server.services.isochrone.road.RoadIsochroneRequest;
1617
import org.eqasim.server.services.isochrone.road.RoadIsochroneResponse;
@@ -36,7 +37,7 @@ public static void main(String[] args)
3637
ExecutionException {
3738
CommandLine cmd = new CommandLine.Builder(args) //
3839
.requireOptions("config-path", "input-path", "output-path") //
39-
.allowOptions("threads", "configuration-path", "use-transit", "indent-response") //
40+
.allowOptions("threads", "configuration-path", "use-transit", "indent-response", "vdf-path", EqasimConfigurator.CONFIGURATOR) //
4041
.build();
4142

4243
Services services = new ServiceBuilder().build(cmd);

server/src/main/java/org/eqasim/server/RunServer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.util.concurrent.ExecutorService;
55
import java.util.concurrent.Executors;
66

7+
import org.eqasim.core.simulation.EqasimConfigurator;
78
import org.eqasim.server.ServiceBuilder.Services;
89
import org.eqasim.server.api.RoadIsochroneEndpoint;
910
import org.eqasim.server.api.RoadRouterEndpoint;
@@ -22,7 +23,8 @@ public static void main(String[] args)
2223
throws ConfigurationException, JsonParseException, JsonMappingException, IOException {
2324
CommandLine cmd = new CommandLine.Builder(args) //
2425
.requireOptions("config-path", "port") //
25-
.allowOptions("threads", "configuration-path", "use-transit") //
26+
.allowOptions("threads", "configuration-path", "use-transit", "vdf-path",
27+
EqasimConfigurator.CONFIGURATOR) //
2628
.build();
2729

2830
Services services = new ServiceBuilder().build(cmd);

server/src/main/java/org/eqasim/server/ServiceBuilder.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import java.io.IOException;
55
import java.util.Collections;
66

7-
import org.eqasim.core.components.raptor.EqasimRaptorConfigGroup;
7+
import org.eqasim.core.misc.InjectorBuilder;
8+
import org.eqasim.core.simulation.EqasimConfigurator;
9+
import org.eqasim.core.simulation.vdf.VDFConfigGroup;
10+
import org.eqasim.core.simulation.vdf.travel_time.VDFTravelTime;
811
import org.eqasim.server.services.ServiceConfiguration;
912
import org.eqasim.server.services.isochrone.road.RoadIsochroneService;
1013
import org.eqasim.server.services.isochrone.transit.TransitIsochroneService;
@@ -21,7 +24,9 @@
2124
import org.matsim.core.network.algorithms.NetworkCleaner;
2225
import org.matsim.core.network.algorithms.TransportModeNetworkFilter;
2326
import org.matsim.core.network.io.MatsimNetworkReader;
27+
import org.matsim.core.router.util.TravelTime;
2428
import org.matsim.core.scenario.ScenarioUtils;
29+
import org.matsim.core.trafficmonitoring.FreeSpeedTravelTime;
2530
import org.matsim.pt.transitSchedule.api.TransitScheduleReader;
2631

2732
import com.fasterxml.jackson.core.JsonParseException;
@@ -49,9 +54,14 @@ public Services build(CommandLine cmd)
4954
ServiceConfiguration.class);
5055
}
5156

52-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"),
53-
new EqasimRaptorConfigGroup());
57+
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);
58+
59+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
60+
configurator.updateConfig(config);
61+
cmd.applyConfiguration(config);
62+
5463
Scenario scenario = ScenarioUtils.createScenario(config);
64+
configurator.configureScenario(scenario);
5565

5666
new MatsimNetworkReader(scenario.getNetwork())
5767
.readURL(ConfigGroup.getInputFileURL(config.getContext(),
@@ -64,17 +74,27 @@ public Services build(CommandLine cmd)
6474
config.transit().getTransitScheduleFile()));
6575
}
6676

77+
configurator.adjustScenario(scenario);
78+
6779
Network roadNetwork = NetworkUtils.createNetwork();
6880
new TransportModeNetworkFilter(scenario.getNetwork()).filter(roadNetwork, Collections.singleton("car"));
6981
new NetworkCleaner().run(roadNetwork);
7082

83+
TravelTime travelTime = new FreeSpeedTravelTime();
84+
if (cmd.hasOption("vdf-path")) {
85+
VDFConfigGroup vdfConfig = VDFConfigGroup.getOrCreate(config);
86+
vdfConfig.setInputTravelTimesFile(cmd.getOptionStrict("vdf-path"));
87+
88+
travelTime = new InjectorBuilder(scenario, configurator).build().getInstance(VDFTravelTime.class);
89+
}
90+
7191
final RoadRouterService roadRouterService;
7292
final RoadIsochroneService roadIsochroneService;
7393
final TransitRouterService transitRouterService;
7494
final TransitIsochroneService transitIsochroneService;
7595

7696
roadRouterService = RoadRouterService.create(config, roadNetwork, configuration.walk,
77-
threads);
97+
threads, travelTime);
7898

7999
roadIsochroneService = RoadIsochroneService.create(config, roadNetwork,
80100
configuration.walk);

server/src/main/java/org/eqasim/server/services/router/road/RoadRouterService.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,13 @@ public class RoadRouterService {
4646
private final SpeedyALTFactory routerFactory = new SpeedyALTFactory();
4747
private final ConcurrentLinkedQueue<RouterInstance> routerPool = new ConcurrentLinkedQueue<>();
4848

49-
private final FreeSpeedTravelTime defaultTravelTime = new FreeSpeedTravelTime();
49+
private final TravelTime defaultTravelTime;
5050
private final ModifiedFreeSpeedTravelTime modifiedTravelTime;
5151

52-
RoadRouterService(Network network, QuadTree<? extends Link> linkIndex, WalkParameters walkParameters, int threads) {
52+
RoadRouterService(Network network, QuadTree<? extends Link> linkIndex, WalkParameters walkParameters, int threads, TravelTime defaultTravelTime) {
5353
this.walkParameters = walkParameters;
5454
this.linkIndex = linkIndex;
55+
this.defaultTravelTime = defaultTravelTime;
5556

5657
for (int k = 0; k < threads; k++) {
5758
routerPool.add(createRouterInstance(network));
@@ -196,11 +197,11 @@ public RoadRouterResponse processRequest(RoadRouterRequest request, @Nullable Fr
196197
}
197198

198199
static public RoadRouterService create(Config config, Network network, WalkConfiguration configuration,
199-
int threads) {
200+
int threads, TravelTime defauTravelTime) {
200201
WalkParameters walkParameters = createWalkParameters(config, configuration);
201202
QuadTree<? extends Link> linkIndex = QuadTrees.createQuadTree(network.getLinks().values());
202203

203-
return new RoadRouterService(network, linkIndex, walkParameters, threads);
204+
return new RoadRouterService(network, linkIndex, walkParameters, threads, defauTravelTime);
204205
}
205206

206207
static public record WalkParameters(double beelineWalkFactor, double beelineWalkSpeed_m_s) {
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package org.eqasim.server;
2+
3+
import java.util.Collection;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Set;
7+
8+
import org.eqasim.core.simulation.EqasimConfigurator;
9+
import org.eqasim.core.simulation.mode_choice.AbstractEqasimExtension;
10+
import org.eqasim.core.simulation.mode_choice.parameters.ModeParameters;
11+
import org.matsim.api.core.v01.TransportMode;
12+
import org.matsim.api.core.v01.population.Person;
13+
import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceTrip;
14+
import org.matsim.contribs.discrete_mode_choice.model.mode_availability.ModeAvailability;
15+
import org.matsim.core.config.CommandLine;
16+
import org.matsim.core.config.CommandLine.ConfigurationException;
17+
18+
public class ServerTestConfigurator extends EqasimConfigurator {
19+
public ServerTestConfigurator() throws ConfigurationException {
20+
super(new CommandLine.Builder(new String[0]).build());
21+
}
22+
23+
public ServerTestConfigurator(CommandLine commandLine) {
24+
super(commandLine);
25+
26+
registerModule(new AbstractEqasimExtension() {
27+
@Override
28+
public void installEqasimExtension() {
29+
bind(ModeParameters.class);
30+
bindModeAvailability("DefaultModeAvailability").to(TestModeAvailability.class);
31+
}
32+
});
33+
}
34+
35+
public static class TestModeAvailability implements ModeAvailability {
36+
@Override
37+
public Collection<String> getAvailableModes(Person person, List<DiscreteModeChoiceTrip> trips) {
38+
Set<String> modes = new HashSet<>();
39+
modes.add(TransportMode.walk);
40+
modes.add(TransportMode.pt);
41+
modes.add(TransportMode.car);
42+
modes.add(TransportMode.bike);
43+
// Add special mode "car_passenger" if applicable
44+
Boolean isCarPassenger = (Boolean) person.getAttributes().getAttribute("isPassenger");
45+
if (isCarPassenger) {
46+
modes.add("car_passenger");
47+
}
48+
return modes;
49+
}
50+
}
51+
}

server/src/test/java/org/eqasim/server/TestProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ public void testProcessor() throws JsonParseException, JsonMappingException, Con
4646
"--config-path", configPath,
4747
"--input-path", inputPath,
4848
"--output-path", outputPath,
49-
"--threads", "4"
49+
"--threads", "4",
50+
"--eqasim-configurator", "org.eqasim.server.ServerTestConfigurator"
5051
});
5152

5253
assertTrue(FileUtils.contentEquals(new File(expectedOutputPath), new File(outputPath)));

0 commit comments

Comments
 (0)