Skip to content

Commit 708cb61

Browse files
authored
DrtModeAvailabilityWrapper and FeederDrtModeAvailabilityWrapper are now compatible with non-drt simulations (#209)
* feat: DrtModeAvailabilityWrapper now supports null values * feat: FeederDrtModeAvailabilityWrapper now supports null values for MultiModeDrtConfigGroup and MultiModeFeederDrtConfigGroup * chore: using FeederDrtModeAvailabilityWrapper instead of explicitly passing extra modes to runMelunSimulation
1 parent 4b93368 commit 708cb61

File tree

3 files changed

+62
-24
lines changed

3 files changed

+62
-24
lines changed

core/src/main/java/org/eqasim/core/simulation/modes/drt/mode_choice/DrtModeAvailabilityWrapper.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,26 @@
44
import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup;
55
import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceTrip;
66
import org.matsim.contribs.discrete_mode_choice.model.mode_availability.ModeAvailability;
7+
import org.matsim.core.config.Config;
78

89
import java.util.Collection;
10+
import java.util.Collections;
911
import java.util.List;
1012

1113
public class DrtModeAvailabilityWrapper implements ModeAvailability {
1214
private final Collection<String> drtModes;
1315
private final ModeAvailability delegate;
1416

17+
public DrtModeAvailabilityWrapper(Config config, ModeAvailability delegate) {
18+
this((MultiModeDrtConfigGroup) config.getModules().get(MultiModeDrtConfigGroup.GROUP_NAME), delegate);
19+
}
20+
1521
public DrtModeAvailabilityWrapper(MultiModeDrtConfigGroup multiModeDrtConfigGroup, ModeAvailability delegate) {
16-
this.drtModes = multiModeDrtConfigGroup.modes().toList();
22+
if(multiModeDrtConfigGroup != null) {
23+
this.drtModes = multiModeDrtConfigGroup.modes().toList();
24+
} else {
25+
this.drtModes = Collections.emptyList();
26+
}
1727
this.delegate = delegate;
1828
}
1929

core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/mode_choice/FeederDrtModeAvailabilityWrapper.java

+24-6
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,43 @@
11
package org.eqasim.core.simulation.modes.feeder_drt.mode_choice;
22

3+
import org.apache.logging.log4j.LogManager;
4+
import org.apache.logging.log4j.Logger;
35
import org.eqasim.core.simulation.modes.feeder_drt.config.MultiModeFeederDrtConfigGroup;
46
import org.matsim.api.core.v01.population.Person;
57
import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup;
68
import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceTrip;
79
import org.matsim.contribs.discrete_mode_choice.model.mode_availability.ModeAvailability;
10+
import org.matsim.core.config.Config;
811

9-
import java.util.Collection;
10-
import java.util.List;
11-
import java.util.Set;
12+
import java.util.*;
1213
import java.util.stream.Collectors;
1314

1415
public class FeederDrtModeAvailabilityWrapper implements ModeAvailability {
16+
private final static Logger logger = LogManager.getLogger(FeederDrtModeAvailabilityWrapper.class);
1517
private final Set<String> extraModes;
1618
private final ModeAvailability delegate;
1719

20+
public FeederDrtModeAvailabilityWrapper(Config config, ModeAvailability delegate) {
21+
this((MultiModeDrtConfigGroup) config.getModules().get(MultiModeDrtConfigGroup.GROUP_NAME), (MultiModeFeederDrtConfigGroup) config.getModules().get(MultiModeFeederDrtConfigGroup.GROUP_NAME), delegate);
22+
}
23+
1824
public FeederDrtModeAvailabilityWrapper(MultiModeDrtConfigGroup multiModeDrtConfigGroup, MultiModeFeederDrtConfigGroup multiModeFeederDrtConfigGroup, ModeAvailability delegate) {
1925
this.delegate = delegate;
20-
this.extraModes = multiModeFeederDrtConfigGroup.modes().collect(Collectors.toSet());
21-
Collection<String> coveredDrtModes = multiModeFeederDrtConfigGroup.getModalElements().stream().map(cfg -> cfg.accessEgressModeName).toList();
22-
this.extraModes.addAll(multiModeDrtConfigGroup.modes().filter(mode -> !coveredDrtModes.contains(mode)).toList());
26+
Collection<String> coveredDrtModes;
27+
if(multiModeFeederDrtConfigGroup == null) {
28+
this.extraModes = new HashSet<>();
29+
coveredDrtModes = Collections.emptyList();
30+
} else {
31+
this.extraModes = multiModeFeederDrtConfigGroup.modes().collect(Collectors.toSet());
32+
coveredDrtModes = multiModeFeederDrtConfigGroup.getModalElements().stream().map(cfg -> cfg.accessEgressModeName).toList();
33+
}
34+
if(multiModeDrtConfigGroup == null) {
35+
if(multiModeFeederDrtConfigGroup != null) {
36+
logger.warn(String.format("A %s config was supplied but a %s was not, DRT modes not covered by a feeder mode will not be considered", MultiModeFeederDrtConfigGroup.GROUP_NAME, MultiModeDrtConfigGroup.GROUP_NAME));
37+
}
38+
} else {
39+
this.extraModes.addAll(multiModeDrtConfigGroup.modes().filter(mode -> !coveredDrtModes.contains(mode)).toList());
40+
}
2341
}
2442

2543
@Override

core/src/test/java/org/eqasim/TestSimulationPipeline.java

+27-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.eqasim;
22

3+
import com.google.inject.Inject;
4+
import com.google.inject.Provider;
35
import org.apache.commons.io.FileUtils;
46
import org.eqasim.core.analysis.run.RunLegAnalysis;
57
import org.eqasim.core.analysis.run.RunPublicTransportLegAnalysis;
@@ -13,6 +15,7 @@
1315
import org.eqasim.core.simulation.modes.drt.analysis.run.RunDrtPassengerAnalysis;
1416
import org.eqasim.core.simulation.modes.drt.analysis.run.RunDrtVehicleAnalysis;
1517
import org.eqasim.core.simulation.modes.feeder_drt.analysis.run.RunFeederDrtPassengerAnalysis;
18+
import org.eqasim.core.simulation.modes.feeder_drt.mode_choice.FeederDrtModeAvailabilityWrapper;
1619
import org.eqasim.core.simulation.modes.feeder_drt.utils.AdaptConfigForFeederDrt;
1720
import org.eqasim.core.tools.*;
1821
import org.eqasim.core.simulation.modes.drt.utils.AdaptConfigForDrt;
@@ -22,6 +25,7 @@
2225
import org.junit.Test;
2326
import org.matsim.api.core.v01.Scenario;
2427
import org.matsim.api.core.v01.TransportMode;
28+
import org.matsim.contribs.discrete_mode_choice.model.mode_availability.ModeAvailability;
2529
import org.matsim.core.config.CommandLine;
2630
import org.matsim.core.config.Config;
2731
import org.matsim.core.config.ConfigUtils;
@@ -49,7 +53,7 @@ public void tearDown() throws IOException {
4953
FileUtils.deleteDirectory(new File("melun_test"));
5054
}
5155

52-
private void runMelunSimulation(String configPath, String outputPath, Collection<String> extraModes) {
56+
private void runMelunSimulation(String configPath, String outputPath) {
5357
EqasimConfigurator eqasimConfigurator = new EqasimConfigurator();
5458
Config config = ConfigUtils.loadConfig(configPath, eqasimConfigurator.getConfigGroups());
5559
((ControlerConfigGroup) config.getModules().get(ControlerConfigGroup.GROUP_NAME)).setOutputDirectory(outputPath);
@@ -69,19 +73,25 @@ private void runMelunSimulation(String configPath, String outputPath, Collection
6973
@Override
7074
protected void installEqasimExtension() {
7175
bind(ModeParameters.class);
72-
bindModeAvailability("DefaultModeAvailability").toProvider(() -> (person, trips) -> {
73-
Set<String> modes = new HashSet<>();
74-
modes.add(TransportMode.walk);
75-
modes.add(TransportMode.pt);
76-
modes.add(TransportMode.car);
77-
modes.add(TransportMode.bike);
78-
// Add special mode "car_passenger" if applicable
79-
Boolean isCarPassenger = (Boolean) person.getAttributes().getAttribute("isPassenger");
80-
if(isCarPassenger) {
81-
modes.add("car_passenger");
76+
bindModeAvailability("DefaultModeAvailability").toProvider(new Provider<>() {
77+
@Inject
78+
private Config config;
79+
@Override
80+
public ModeAvailability get() {
81+
return new FeederDrtModeAvailabilityWrapper(config, (person, trips) -> {
82+
Set<String> modes = new HashSet<>();
83+
modes.add(TransportMode.walk);
84+
modes.add(TransportMode.pt);
85+
modes.add(TransportMode.car);
86+
modes.add(TransportMode.bike);
87+
// Add special mode "car_passenger" if applicable
88+
Boolean isCarPassenger = (Boolean) person.getAttributes().getAttribute("isPassenger");
89+
if(isCarPassenger) {
90+
modes.add("car_passenger");
91+
}
92+
return modes;
93+
});
8294
}
83-
modes.addAll(extraModes);
84-
return modes;
8595
}).asEagerSingleton();
8696
}
8797
});
@@ -194,7 +204,7 @@ public void testDrt() throws IOException, CommandLine.ConfigurationException {
194204
"--vehicles-paths", "melun_test/input/drt_vehicles_a.xml.gz,melun_test/input/drt_vehicles_b.xml.gz"
195205
});
196206

197-
runMelunSimulation("melun_test/input/config_drt.xml", "melun_test/output_drt", List.of("drt_a", "drt_b"));
207+
runMelunSimulation("melun_test/input/config_drt.xml", "melun_test/output_drt");
198208

199209
RunDrtPassengerAnalysis.main(new String[] {
200210
"--events-path", "melun_test/output_drt/output_events.xml.gz",
@@ -243,7 +253,7 @@ public void testFeeder() throws IOException, CommandLine.ConfigurationException
243253
"--access-egress-transit-stop-modes", "rail|tram|subway"
244254
});
245255

246-
runMelunSimulation("melun_test/input/config_feeder.xml", "melun_test/output_feeder", List.of("feeder_a", "feeder_b"));
256+
runMelunSimulation("melun_test/input/config_feeder.xml", "melun_test/output_feeder");
247257

248258
RunFeederDrtPassengerAnalysis.main(new String[] {
249259
"--config-path", "melun_test/input/config_feeder.xml",
@@ -260,12 +270,12 @@ public void testEpsilon() throws CommandLine.ConfigurationException {
260270
"--output-config-path", "melun_test/input/config_epsilon.xml"
261271
});
262272

263-
runMelunSimulation("melun_test/input/config_epsilon.xml", "melun_test/output_epsilon", Collections.emptyList());
273+
runMelunSimulation("melun_test/input/config_epsilon.xml", "melun_test/output_epsilon");
264274
}
265275

266276
@Test
267277
public void testPipeline() throws Exception {
268-
runMelunSimulation("melun_test/input/config.xml", "melun_test/output", Collections.emptyList());
278+
runMelunSimulation("melun_test/input/config.xml", "melun_test/output");
269279
runAnalyses();
270280
runExports();
271281
}

0 commit comments

Comments
 (0)