Skip to content

Commit f795045

Browse files
author
Tarek Chouaki
committed
feat: optional modules, qSim modules and qSim components configuration steps
Allows subclasses to register optional config groups to avoid writing many Run scripts.
1 parent b1331d7 commit f795045

File tree

1 file changed

+61
-6
lines changed

1 file changed

+61
-6
lines changed

core/src/main/java/org/eqasim/core/simulation/EqasimConfigurator.java

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package org.eqasim.core.simulation;
22

3-
import java.util.Arrays;
4-
import java.util.LinkedList;
5-
import java.util.List;
3+
import java.util.*;
4+
import java.util.function.BiConsumer;
65

76
import org.eqasim.core.components.EqasimComponentsModule;
87
import org.eqasim.core.components.config.EqasimConfigGroup;
@@ -15,10 +14,12 @@
1514
import org.matsim.api.core.v01.population.Person;
1615
import org.matsim.contribs.discrete_mode_choice.modules.DiscreteModeChoiceModule;
1716
import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup;
17+
import org.matsim.core.config.Config;
1818
import org.matsim.core.config.ConfigGroup;
1919
import org.matsim.core.controler.AbstractModule;
2020
import org.matsim.core.controler.Controler;
2121
import org.matsim.core.mobsim.qsim.AbstractQSimModule;
22+
import org.matsim.core.mobsim.qsim.components.QSimComponentsConfig;
2223
import org.matsim.households.Household;
2324

2425
import ch.sbb.matsim.config.SwissRailRaptorConfigGroup;
@@ -28,6 +29,10 @@ public class EqasimConfigurator {
2829
protected final List<ConfigGroup> configGroups = new LinkedList<>();
2930
protected final List<AbstractModule> modules = new LinkedList<>();
3031
protected final List<AbstractQSimModule> qsimModules = new LinkedList<>();
32+
private final Map<String, Collection<AbstractModule>> optionalModules = new HashMap<>();
33+
private final Map<String, Collection<AbstractQSimModule>> optionalQSimModules = new HashMap<>();
34+
private final Map<String, List<BiConsumer<Controler, QSimComponentsConfig>>> optionalQSimComponentConfigurationSteps = new HashMap<>();
35+
private final Map<String, ConfigGroup> optionalConfigGroups = new HashMap<>();
3136

3237
public EqasimConfigurator() {
3338
configGroups.addAll(Arrays.asList( //
@@ -51,7 +56,7 @@ public EqasimConfigurator() {
5156
}
5257

5358
public ConfigGroup[] getConfigGroups() {
54-
return configGroups.toArray(new ConfigGroup[configGroups.size()]);
59+
return configGroups.toArray(ConfigGroup[]::new);
5560
}
5661

5762
public List<AbstractModule> getModules() {
@@ -63,19 +68,69 @@ public List<AbstractQSimModule> getQSimModules() {
6368
}
6469

6570
public void configureController(Controler controller) {
71+
72+
// The optional modules are added after the non-optional ones because we consider that their bindings have less priority
73+
this.optionalModules.entrySet().stream()
74+
.filter(e -> controller.getConfig().getModules().containsKey(e.getKey()))
75+
.map(Map.Entry::getValue)
76+
.flatMap(Collection::stream)
77+
.forEach(controller::addOverridingModule);
78+
6679
for (AbstractModule module : getModules()) {
6780
controller.addOverridingModule(module);
6881
}
6982

83+
this.optionalQSimModules.entrySet().stream()
84+
.filter(e -> controller.getConfig().getModules().containsKey(e.getKey()))
85+
.map(Map.Entry::getValue)
86+
.flatMap(Collection::stream)
87+
.forEach(controller::addOverridingQSimModule);
88+
7089
for (AbstractQSimModule module : getQSimModules()) {
7190
controller.addOverridingQSimModule(module);
7291
}
7392

74-
controller.configureQSimComponents(configurator -> {
75-
EqasimTransitQSimModule.configure(configurator, controller.getConfig());
93+
controller.configureQSimComponents(components -> {
94+
optionalQSimComponentConfigurationSteps.entrySet().stream()
95+
.filter(e -> controller.getConfig().getModules().containsKey(e.getKey()))
96+
.map(Map.Entry::getValue)
97+
.flatMap(Collection::stream)
98+
.forEach(step -> step.accept(controller, components));
99+
EqasimTransitQSimModule.configure(components, controller.getConfig());
76100
});
77101
}
78102

103+
protected void registerOptionalConfigGroup(ConfigGroup configGroup) {
104+
registerOptionalConfigGroup(configGroup, new ArrayList<>());
105+
}
106+
107+
protected void registerOptionalConfigGroup(ConfigGroup configGroup, Collection<AbstractModule> modules) {
108+
registerOptionalConfigGroup(configGroup, modules, new ArrayList<>());
109+
}
110+
111+
protected void registerOptionalConfigGroup(ConfigGroup configGroup, Collection<AbstractModule> modules, Collection<AbstractQSimModule> qsimModules) {
112+
registerOptionalConfigGroup(configGroup, modules, qsimModules, new ArrayList<>());
113+
}
114+
protected void registerOptionalConfigGroup(ConfigGroup configGroup, Collection<AbstractModule> modules, Collection<AbstractQSimModule> qsimModules, List<BiConsumer<Controler, QSimComponentsConfig>> componentsConsumers) {
115+
this.optionalConfigGroups.put(configGroup.getName(), configGroup);
116+
this.optionalModules.putIfAbsent(configGroup.getName(), new ArrayList<>());
117+
this.optionalModules.get(configGroup.getName()).addAll(modules);
118+
119+
this.optionalQSimModules.putIfAbsent(configGroup.getName(), new ArrayList<>());
120+
this.optionalQSimModules.get(configGroup.getName()).addAll(qsimModules);
121+
122+
this.optionalQSimComponentConfigurationSteps.putIfAbsent(configGroup.getName(), new ArrayList<>());
123+
this.optionalQSimComponentConfigurationSteps.get(configGroup.getName()).addAll(componentsConsumers);
124+
}
125+
126+
public void addOptionalConfigGroups(Config config) {
127+
for(ConfigGroup configGroup: optionalConfigGroups.values()) {
128+
if(config.getModules().get(configGroup.getName()) != null) {
129+
config.addModule(configGroup);
130+
}
131+
}
132+
}
133+
79134
public void configureScenario(Scenario scenario) {
80135
}
81136

0 commit comments

Comments
 (0)