Skip to content

Commit

Permalink
chore: update injection structure (#294)
Browse files Browse the repository at this point in the history
* clean up overrdides, merge into configurator

* streamline configurator

* unify injection

* enforce use of a custom EqasimConfigurator

* define default configurator via properties

* clarify error
  • Loading branch information
sebhoerl authored Jan 22, 2025
1 parent 14df7ba commit 350331e
Show file tree
Hide file tree
Showing 55 changed files with 425 additions and 497 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.eqasim.core.components.emissions;

import org.apache.commons.lang3.StringUtils;
import org.eqasim.core.misc.ClassUtils;
import org.eqasim.core.simulation.EqasimConfigurator;
import org.matsim.api.core.v01.Scenario;
import org.matsim.api.core.v01.network.Link;
Expand All @@ -26,15 +25,10 @@ public static void main(String[] args) throws CommandLine.ConfigurationException

CommandLine cmd = new CommandLine.Builder(args) //
.requireOptions("config-path", "hbefa-cold-avg", "hbefa-hot-avg") //
.allowOptions("hbefa-cold-detailed", "hbefa-hot-detailed", "configurator-class")
.allowOptions("hbefa-cold-detailed", "hbefa-hot-detailed", EqasimConfigurator.CONFIGURATOR)
.build();

EqasimConfigurator configurator;
if(cmd.hasOption("configurator-class")) {
configurator = ClassUtils.getInstanceOfClassExtendingOtherClass(cmd.getOptionStrict("configurator-class"), EqasimConfigurator.class);
} else {
configurator = new EqasimConfigurator();
}
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);

Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
configurator.registerConfigGroup(new EmissionsConfigGroup(), false);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.eqasim.core.components.emissions;

import org.eqasim.core.misc.ClassUtils;
import org.eqasim.core.simulation.EqasimConfigurator;
import org.geotools.api.feature.simple.SimpleFeature;
import org.locationtech.jts.geom.Geometry;
Expand All @@ -19,15 +18,10 @@ public static void main(String[] args) throws CommandLine.ConfigurationException

CommandLine cmd = new CommandLine.Builder(args) //
.requireOptions("config-path", "domain-shp-path") //
.allowOptions("scale-factor", "grid-size", "smooth-radius", "time-bin-size", "configurator-class")
.allowOptions("scale-factor", "grid-size", "smooth-radius", "time-bin-size", EqasimConfigurator.CONFIGURATOR)
.build();

EqasimConfigurator configurator;
if(cmd.hasOption("configurator-class")) {
configurator = ClassUtils.getInstanceOfClassExtendingOtherClass(cmd.getOptionStrict("configurator-class"), EqasimConfigurator.class);
} else {
configurator = new EqasimConfigurator();
}
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);

Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
configurator.updateConfig(config);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.util.List;
import java.util.Map;

import org.eqasim.core.misc.ClassUtils;
import org.eqasim.core.simulation.EqasimConfigurator;
import org.geotools.api.feature.simple.SimpleFeature;
import org.locationtech.jts.geom.Coordinate;
Expand Down Expand Up @@ -36,15 +35,10 @@ public static void main(String[] args) throws CommandLine.ConfigurationException
CommandLine cmd = new CommandLine.Builder(args) //
.requireOptions("config-path") //
.allowOptions("time-bin-size")
.allowOptions("pollutants", "configurator-class")
.allowOptions("pollutants", EqasimConfigurator.CONFIGURATOR)
.build();

EqasimConfigurator configurator;
if(cmd.hasOption("configurator-class")) {
configurator = ClassUtils.getInstanceOfClassExtendingOtherClass(cmd.getOptionStrict("configurator-class"), EqasimConfigurator.class);
} else {
configurator = new EqasimConfigurator();
}
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);

Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
configurator.updateConfig(config);
Expand Down
31 changes: 0 additions & 31 deletions core/src/main/java/org/eqasim/core/misc/ClassUtils.java

This file was deleted.

38 changes: 9 additions & 29 deletions core/src/main/java/org/eqasim/core/misc/InjectorBuilder.java
Original file line number Diff line number Diff line change
@@ -1,54 +1,34 @@
package org.eqasim.core.misc;

import java.util.Collections;
import java.util.List;

import org.eqasim.core.simulation.EqasimConfigurator;
import org.matsim.api.core.v01.Scenario;
import org.matsim.core.controler.AbstractModule;
import org.matsim.core.controler.Injector;
import org.matsim.core.events.EventsManagerModule;
import org.matsim.core.router.TripRouterModule;
import org.matsim.core.router.costcalculators.TravelDisutilityModule;
import org.matsim.core.scenario.ScenarioByInstanceModule;
import org.matsim.core.scoring.functions.CharyparNagelScoringFunctionModule;
import org.matsim.core.trafficmonitoring.TravelTimeCalculatorModule;
import org.matsim.core.controler.Controler;

public class InjectorBuilder {
private final Scenario scenario;
private AbstractModule module = AbstractModule.emptyModule(); // new ControlerDefaultsModule();
private final Controler controller;

public InjectorBuilder(Scenario scenario) {
this.scenario = scenario;
public InjectorBuilder(Scenario scenario, EqasimConfigurator configurator) {
this.controller = new Controler(scenario);
configurator.configureController(controller);
}

public InjectorBuilder addOverridingModule(AbstractModule module) {
this.module = AbstractModule.override(Collections.singleton(this.module), module);
controller.addOverridingModule(module);
return this;
}

public InjectorBuilder addOverridingModules(List<AbstractModule> modules) {
for (AbstractModule module : modules) {
addOverridingModule(module);
controller.addOverridingModule(module);
}

return this;
}

public com.google.inject.Injector build() {
AbstractModule standardModule = new AbstractModule() {
@Override
public void install() {
install(new EventsManagerModule());
install(new TripRouterModule());
install(new CharyparNagelScoringFunctionModule());
install(new TravelDisutilityModule());
install(new TravelTimeCalculatorModule());
}
};

return Injector.createInjector( //
scenario.getConfig(), //
new ScenarioByInstanceModule(scenario), //
AbstractModule.override(Collections.singleton(standardModule), module));
return controller.getInjector();
}
}
21 changes: 10 additions & 11 deletions core/src/main/java/org/eqasim/core/scenario/config/EditConfig.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package org.eqasim.core.scenario.config;

import com.google.common.base.Verify;
import org.eqasim.core.misc.ClassUtils;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.eqasim.core.simulation.EqasimConfigurator;
import org.matsim.core.config.CommandLine;
import org.matsim.core.config.Config;
import org.matsim.core.config.ConfigGroup;
import org.matsim.core.config.ConfigUtils;
import org.matsim.core.config.Config;

import java.util.Set;
import java.util.HashSet;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import com.google.common.base.Verify;

/**
* This script allows to edit a MATSim configuration file exclusively through the command line. <br/>
Expand All @@ -34,14 +34,13 @@ public class EditConfig {
public static final String CMD_OUTPUT_PATH = "output-path";
public static final String CMD_ADD_MODULE_PREFIX = "add-module";
public static final String CMD_REMOVE_MODULE_PREFIX = "remove-module";
public static final String CMD_EQASIM_CONFIGURATOR= "eqasim-configurator";

public static void main(String[] args) throws CommandLine.ConfigurationException {
CommandLine cmd = new CommandLine.Builder(args)
.requireOptions(CMD_INPUT_PATH, CMD_OUTPUT_PATH)
.allowPrefixes(CMD_ADD_MODULE_PREFIX)
.allowPrefixes(CMD_REMOVE_MODULE_PREFIX)
.allowOptions(CMD_EQASIM_CONFIGURATOR)
.allowOptions(EqasimConfigurator.CONFIGURATOR)
.build();

Config config = ConfigUtils.loadConfig(cmd.getOptionStrict(CMD_INPUT_PATH));
Expand All @@ -67,7 +66,7 @@ public static void main(String[] args) throws CommandLine.ConfigurationException
config.removeModule(module);
}

EqasimConfigurator eqasimConfigurator = cmd.hasOption(CMD_EQASIM_CONFIGURATOR) ? ClassUtils.getInstanceOfClassExtendingOtherClass(cmd.getOptionStrict(CMD_EQASIM_CONFIGURATOR), EqasimConfigurator.class) : new EqasimConfigurator();
EqasimConfigurator eqasimConfigurator = EqasimConfigurator.getInstance(cmd);

Map<String, ConfigGroup> availableModules = new HashMap<>(ConfigUtils.createConfig().getModules());
availableModules.putAll(eqasimConfigurator.getRegisteredConfigGroups().stream().collect(Collectors.toMap(ConfigGroup::getName, configGroup -> configGroup)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ public class RunGenerateConfig {
static public void main(String[] args) throws ConfigurationException {
CommandLine cmd = new CommandLine.Builder(args) //
.requireOptions("output-path", "prefix", "sample-size", "threads") //
.allowOptions("random-seed") //
.allowOptions("random-seed", EqasimConfigurator.CONFIGURATOR) //
.build();

EqasimConfigurator configurator = new EqasimConfigurator();
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);
Config config = ConfigUtils.createConfig();
configurator.updateConfig(config);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,8 @@
import org.eqasim.core.scenario.validation.ScenarioValidator;
import org.eqasim.core.scenario.validation.VehiclesValidator;
import org.eqasim.core.simulation.EqasimConfigurator;
import org.eqasim.core.simulation.mode_choice.AbstractEqasimExtension;
import org.eqasim.core.simulation.termination.EqasimTerminationConfigGroup;
import org.matsim.api.core.v01.Scenario;
import org.matsim.contribs.discrete_mode_choice.modules.DiscreteModeChoiceModule;
import org.matsim.core.config.CommandLine;
import org.matsim.core.config.CommandLine.ConfigurationException;
import org.matsim.core.config.Config;
Expand All @@ -47,7 +45,7 @@ public class RunScenarioCutter {

public static final Collection<String> REQUIRED_ARGS = Set.of("config-path", "output-path", "extent-path");
public static final Collection<String> OPTIONAL_ARGS = Set.of("threads", "prefix", "extent-attribute",
"extent-value", "plans-path", "events-path", "skip-routing");
"extent-value", "plans-path", "events-path", "skip-routing", EqasimConfigurator.CONFIGURATOR);

static public void main(String[] args) throws ConfigurationException, IOException, InterruptedException {
CommandLine cmd = new CommandLine.Builder(args) //
Expand All @@ -70,7 +68,7 @@ static public void main(String[] args) throws ConfigurationException, IOExceptio
ScenarioExtent extent = new ShapeScenarioExtent.Builder(extentPath, extentAttribute, extentValue).build();

// Load scenario
EqasimConfigurator configurator = new EqasimConfigurator();
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
configurator.updateConfig(config);
config.removeModule(EqasimTerminationConfigGroup.GROUP_NAME);
Expand Down Expand Up @@ -110,9 +108,8 @@ static public void main(String[] args) throws ConfigurationException, IOExceptio
}

// Cut population
Injector populationCutterInjector = new InjectorBuilder(scenario) //
.addOverridingModules(configurator.getModules(config).stream()
.filter(module -> !(module instanceof AbstractEqasimExtension) && !(module instanceof DiscreteModeChoiceModule)).toList()) //
// TODO Check if we can remove stuff
Injector populationCutterInjector = new InjectorBuilder(scenario, configurator) //
.addOverridingModule(
new PopulationCutterModule(extent, numberOfThreads, 40, cmd.getOption("events-path"))) //
.addOverridingModule(new CutterTravelTimeModule(travelTime)) //
Expand Down Expand Up @@ -169,9 +166,8 @@ static public void main(String[] args) throws ConfigurationException, IOExceptio
configCutter.run(config);

// Final routing
Injector routingInjector = new InjectorBuilder(scenario) //
.addOverridingModules(configurator.getModules(config).stream()
.filter(module -> !(module instanceof AbstractEqasimExtension) && !(module instanceof DiscreteModeChoiceModule)).toList()) //
// TODO: Check if we can remove stuff
Injector routingInjector = new InjectorBuilder(scenario, configurator) //
.addOverridingModule(new PopulationRouterModule(numberOfThreads, 100, false)) //
.addOverridingModule(new CutterTravelTimeModule(travelTime)) //
.addOverridingModule(new TimeInterpretationModule()) //
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,12 @@ static public void main(String[] args)
CommandLine cmd = new CommandLine.Builder(args) //
.requireOptions("config-path", "output-path", "extent-path", "vdf-travel-times-path") //
.allowOptions("threads", "prefix", "extent-attribute", "extent-value", "plans-path", "events-path") //
.allowOptions("flag-area-link-modes") //
.allowOptions("flag-area-link-modes", EqasimConfigurator.CONFIGURATOR) //
.build();

String outputPath = cmd.getOptionStrict("output-path");

EqasimConfigurator eqasimConfigurator = new EqasimConfigurator();
EqasimConfigurator eqasimConfigurator = EqasimConfigurator.getInstance(cmd);
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
eqasimConfigurator.updateConfig(config);
cmd.applyConfiguration(config);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ public class RunPopulationRouting {
static public void main(String[] args) throws ConfigurationException, InterruptedException {
CommandLine cmd = new CommandLine.Builder(args) //
.requireOptions("config-path", "output-path") //
.allowOptions("threads", "batch-size", "modes") //
.allowOptions("threads", "batch-size", "modes", EqasimConfigurator.CONFIGURATOR) //
.build();

EqasimConfigurator configurator = new EqasimConfigurator();
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
configurator.updateConfig(config);
config.getModules().remove(EqasimTerminationConfigGroup.GROUP_NAME);
Expand Down Expand Up @@ -58,10 +58,8 @@ static public void main(String[] args) throws ConfigurationException, Interrupte
}
}

Injector injector = new InjectorBuilder(scenario) //
.addOverridingModules(configurator.getModules(config).stream()
.filter(module -> !(module instanceof AbstractEqasimExtension)) //
.filter(module -> !(module instanceof DiscreteModeChoiceModule)).toList()) //
// TODO: Check what we can remove here
Injector injector = new InjectorBuilder(scenario, configurator) //
.addOverridingModule(new PopulationRouterModule(numberOfThreads, batchSize, true, modes)) //
.addOverridingModule(new TimeInterpretationModule()).build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ static public void main(String[] args)
CommandLine cmd = new CommandLine.Builder(args) //
.allowOptions("input-population-path", "input-network-path", "output-population-path",
"output-network-path") //
.requireOptions("shape-path", "shape-attribute", "shape-value", "attribute") //
.requireOptions("shape-path", "shape-attribute", "shape-value", "attribute", EqasimConfigurator.CONFIGURATOR) //
.build();

if (cmd.hasOption("input-population-path") ^ cmd.hasOption("output-population-path")) {
Expand All @@ -45,7 +45,7 @@ static public void main(String[] args)

// Set up imputation

EqasimConfigurator configurator = new EqasimConfigurator();
EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd);
Config config = ConfigUtils.createConfig();
Scenario scenario = ScenarioUtils.createScenario(config);
configurator.configureScenario(scenario);
Expand Down
Loading

0 comments on commit 350331e

Please sign in to comment.