diff --git a/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsEvents.java b/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsEvents.java index c7c9984b5..f144cc03a 100644 --- a/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsEvents.java +++ b/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsEvents.java @@ -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; @@ -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); diff --git a/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsGrid.java b/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsGrid.java index 5f20f67ee..1fab508bc 100644 --- a/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsGrid.java +++ b/core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsGrid.java @@ -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; @@ -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); diff --git a/core/src/main/java/org/eqasim/core/components/emissions/RunExportEmissionsNetwork.java b/core/src/main/java/org/eqasim/core/components/emissions/RunExportEmissionsNetwork.java index d6404b7fe..8d5177c2b 100644 --- a/core/src/main/java/org/eqasim/core/components/emissions/RunExportEmissionsNetwork.java +++ b/core/src/main/java/org/eqasim/core/components/emissions/RunExportEmissionsNetwork.java @@ -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; @@ -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); diff --git a/core/src/main/java/org/eqasim/core/misc/ClassUtils.java b/core/src/main/java/org/eqasim/core/misc/ClassUtils.java deleted file mode 100644 index c81017dff..000000000 --- a/core/src/main/java/org/eqasim/core/misc/ClassUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.eqasim.core.misc; - -import java.lang.reflect.InvocationTargetException; - -public class ClassUtils { - public static T getInstanceOfClassExtendingOtherClass(String className, Class otherClass) { - try { - Class classDescription = Class.forName(className); - Object instance = null; - try { - instance = classDescription.getConstructor().newInstance(); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } catch (NoSuchMethodException e) { - throw new RuntimeException(String.format("The class %s does not have a constructor that does not require arguments", classDescription.getCanonicalName()), e); - } - - if (otherClass.isInstance(instance)) { - return (T) instance; - } else { - throw new IllegalStateException(String.format("Class %s does not extend %s", classDescription.getCanonicalName(), otherClass.getCanonicalName())); - } - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } -} diff --git a/core/src/main/java/org/eqasim/core/misc/InjectorBuilder.java b/core/src/main/java/org/eqasim/core/misc/InjectorBuilder.java index 667c47108..315161a1d 100644 --- a/core/src/main/java/org/eqasim/core/misc/InjectorBuilder.java +++ b/core/src/main/java/org/eqasim/core/misc/InjectorBuilder.java @@ -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 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(); } } \ No newline at end of file diff --git a/core/src/main/java/org/eqasim/core/scenario/config/EditConfig.java b/core/src/main/java/org/eqasim/core/scenario/config/EditConfig.java index 6bb0d6608..13cc7cff7 100644 --- a/core/src/main/java/org/eqasim/core/scenario/config/EditConfig.java +++ b/core/src/main/java/org/eqasim/core/scenario/config/EditConfig.java @@ -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.
@@ -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)); @@ -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 availableModules = new HashMap<>(ConfigUtils.createConfig().getModules()); availableModules.putAll(eqasimConfigurator.getRegisteredConfigGroups().stream().collect(Collectors.toMap(ConfigGroup::getName, configGroup -> configGroup))); diff --git a/core/src/main/java/org/eqasim/core/scenario/config/RunGenerateConfig.java b/core/src/main/java/org/eqasim/core/scenario/config/RunGenerateConfig.java index 0498cad13..9605a9c69 100644 --- a/core/src/main/java/org/eqasim/core/scenario/config/RunGenerateConfig.java +++ b/core/src/main/java/org/eqasim/core/scenario/config/RunGenerateConfig.java @@ -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); diff --git a/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutter.java b/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutter.java index 2eb56bf16..af700a6ec 100644 --- a/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutter.java +++ b/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutter.java @@ -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; @@ -47,7 +45,7 @@ public class RunScenarioCutter { public static final Collection REQUIRED_ARGS = Set.of("config-path", "output-path", "extent-path"); public static final Collection 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) // @@ -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); @@ -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)) // @@ -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()) // diff --git a/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutterV2.java b/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutterV2.java index 02c664e6f..db0f241b5 100644 --- a/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutterV2.java +++ b/core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutterV2.java @@ -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); diff --git a/core/src/main/java/org/eqasim/core/scenario/routing/RunPopulationRouting.java b/core/src/main/java/org/eqasim/core/scenario/routing/RunPopulationRouting.java index 543e54783..ae4b428c3 100644 --- a/core/src/main/java/org/eqasim/core/scenario/routing/RunPopulationRouting.java +++ b/core/src/main/java/org/eqasim/core/scenario/routing/RunPopulationRouting.java @@ -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); @@ -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(); diff --git a/core/src/main/java/org/eqasim/core/scenario/spatial/RunImputeSpatialAttribute.java b/core/src/main/java/org/eqasim/core/scenario/spatial/RunImputeSpatialAttribute.java index 08bce0d8e..a92a6c6a8 100644 --- a/core/src/main/java/org/eqasim/core/scenario/spatial/RunImputeSpatialAttribute.java +++ b/core/src/main/java/org/eqasim/core/scenario/spatial/RunImputeSpatialAttribute.java @@ -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")) { @@ -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); diff --git a/core/src/main/java/org/eqasim/core/simulation/EqasimConfigurator.java b/core/src/main/java/org/eqasim/core/simulation/EqasimConfigurator.java index e6ffa686f..fc4a4dac0 100644 --- a/core/src/main/java/org/eqasim/core/simulation/EqasimConfigurator.java +++ b/core/src/main/java/org/eqasim/core/simulation/EqasimConfigurator.java @@ -1,10 +1,16 @@ package org.eqasim.core.simulation; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Properties; import java.util.function.BiConsumer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.eqasim.core.components.EqasimComponentsModule; import org.eqasim.core.components.config.EqasimConfigGroup; import org.eqasim.core.components.raptor.EqasimRaptorConfigGroup; @@ -12,6 +18,7 @@ import org.eqasim.core.components.traffic.EqasimTrafficQSimModule; import org.eqasim.core.components.transit.EqasimTransitModule; import org.eqasim.core.components.transit.EqasimTransitQSimModule; +import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; import org.eqasim.core.simulation.mode_choice.constraints.leg_time.LegTimeConstraintConfigGroup; import org.eqasim.core.simulation.mode_choice.constraints.leg_time.LegTimeConstraintModule; @@ -46,6 +53,8 @@ import org.matsim.contrib.emissions.utils.EmissionsConfigGroup; import org.matsim.contribs.discrete_mode_choice.modules.DiscreteModeChoiceModule; import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup; +import org.matsim.core.config.CommandLine; +import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigGroup; import org.matsim.core.controler.AbstractModule; @@ -57,8 +66,8 @@ import ch.sbb.matsim.config.SwissRailRaptorConfigGroup; import ch.sbb.matsim.routing.pt.raptor.SwissRailRaptorModule; -public class EqasimConfigurator { - public EqasimConfigurator() { +public abstract class EqasimConfigurator { + public EqasimConfigurator(CommandLine cmd) { // Standard eqasim configuration registerConfigGroup(new SwissRailRaptorConfigGroup(), false); registerConfigGroup(new EqasimConfigGroup(), false); @@ -72,6 +81,7 @@ public EqasimConfigurator() { registerModule(new EpsilonModule()); registerModule(new EqasimRaptorModule()); registerModule(new EqasimModeChoiceModule()); + registerModule(new EqasimAnalysisModule()); registerQSimModule(new EqasimTransitQSimModule()); registerQSimModule(new EqasimTrafficQSimModule()); @@ -83,6 +93,8 @@ public EqasimConfigurator() { registerModule(new EqasimTerminationModule(), EqasimTerminationConfigGroup.GROUP_NAME); registerModule(new TerminationModeShareModule(), EqasimTerminationConfigGroup.GROUP_NAME); + // Analysis + // DRT functionality registerConfigGroup(new DvrpConfigGroup(), true); registerConfigGroup(new MultiModeDrtConfigGroup(), true); @@ -276,4 +288,69 @@ static protected void copyAttribute(Household household, Person person, String a person.getAttributes().putAttribute(attribute, household.getAttributes().getAttribute(attribute)); } } + + private static final Logger logger = LogManager.getLogger(EqasimConfigurator.class); + + static public final String ENVIONRMENT_VARIABLE = "eqasim_configurator"; + static public final String CONFIGURATOR = "eqasim-configurator"; + + static public final String PROPERTY = "configurator"; + static public final String PROPERTIES_FILE = "eqasim.properties"; + + static public EqasimConfigurator getInstance(CommandLine commandLine) throws ConfigurationException { + String configurator = null; + + logger.info("Identifying eqasim configurator ..."); + if (commandLine.hasOption(CONFIGURATOR)) { + configurator = commandLine.getOptionStrict(CONFIGURATOR); + logger.info(" Found on command line: " + configurator); + } else { + configurator = System.getenv(ENVIONRMENT_VARIABLE); + + if (configurator != null) { + logger.info(" Found on environment: " + configurator); + } else { + try { + Properties properties = new Properties(); + properties.load(EqasimConfigurator.class.getClassLoader().getResourceAsStream(PROPERTIES_FILE)); + configurator = properties.getProperty(PROPERTY); + } catch (IOException | NullPointerException e) { + } + + if (configurator != null) { + logger.info(" Found as property: " + configurator); + } else { + logger.error(" The script you have called requires to configure an EqasimConfigurator."); + logger.error(" However, it has not been found in your configuration. You can:"); + logger.error(" - Pass a configurator via the command line using --" + CONFIGURATOR); + logger.error(" - Pass a configurator via the environment variable " + ENVIONRMENT_VARIABLE); + logger.error(" - Define a default configurator in the " + PROPERTIES_FILE + " file in your JAR"); + throw new IllegalStateException("Missing eqasim configurator"); + } + } + } + + try { + Class clazz = Class.forName(configurator); + + if (EqasimConfigurator.class.isAssignableFrom(clazz)) { + try { + Constructor constructor = clazz.getConstructor(CommandLine.class); + + try { + return (EqasimConfigurator) constructor.newInstance(commandLine); + } catch (InstantiationException | IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { + throw new RuntimeException(e); + } + } catch (NoSuchMethodException e) { + throw new RuntimeException("Configurator class does not have proper constructor: " + configurator); + } + } else { + throw new RuntimeException("Configurator class is not a EqasimConfigurator: " + configurator); + } + } catch (ClassNotFoundException e) { + throw new RuntimeException("Configurator class does not exist: " + configurator); + } + } } diff --git a/core/src/main/java/org/eqasim/core/simulation/RunIdentifyConfigurator.java b/core/src/main/java/org/eqasim/core/simulation/RunIdentifyConfigurator.java new file mode 100644 index 000000000..9d2fcc059 --- /dev/null +++ b/core/src/main/java/org/eqasim/core/simulation/RunIdentifyConfigurator.java @@ -0,0 +1,14 @@ +package org.eqasim.core.simulation; + +import org.matsim.core.config.CommandLine; +import org.matsim.core.config.CommandLine.ConfigurationException; + +public class RunIdentifyConfigurator { + static public void main(String[] args) throws ConfigurationException { + CommandLine cmd = new CommandLine.Builder(args) + .allowOptions(EqasimConfigurator.CONFIGURATOR) + .build(); + + EqasimConfigurator.getInstance(cmd); + } +} diff --git a/core/src/main/java/org/eqasim/core/simulation/mode_choice/EqasimModeChoiceModule.java b/core/src/main/java/org/eqasim/core/simulation/mode_choice/EqasimModeChoiceModule.java index bf4b2b8e7..82b51516d 100644 --- a/core/src/main/java/org/eqasim/core/simulation/mode_choice/EqasimModeChoiceModule.java +++ b/core/src/main/java/org/eqasim/core/simulation/mode_choice/EqasimModeChoiceModule.java @@ -15,6 +15,7 @@ import org.eqasim.core.simulation.mode_choice.epsilon.EpsilonProvider; import org.eqasim.core.simulation.mode_choice.filters.OutsideFilter; import org.eqasim.core.simulation.mode_choice.filters.TourLengthFilter; +import org.eqasim.core.simulation.mode_choice.parameters.ModeParameters; import org.eqasim.core.simulation.mode_choice.utilities.EqasimUtilityEstimator; import org.eqasim.core.simulation.mode_choice.utilities.UtilityEstimator; import org.eqasim.core.simulation.mode_choice.utilities.estimators.BikeUtilityEstimator; @@ -100,6 +101,9 @@ protected void installEqasimExtension() { bindHomeFinder(HOME_FINDER).to(EqasimHomeFinder.class); install(new EpsilonModule()); + + // default binding that should be overridden + bind(ModeParameters.class).toInstance(new ModeParameters()); } @Provides diff --git a/core/src/main/java/org/eqasim/core/simulation/modes/drt/utils/AdaptConfigForDrt.java b/core/src/main/java/org/eqasim/core/simulation/modes/drt/utils/AdaptConfigForDrt.java index 4b402a632..e0ac12061 100644 --- a/core/src/main/java/org/eqasim/core/simulation/modes/drt/utils/AdaptConfigForDrt.java +++ b/core/src/main/java/org/eqasim/core/simulation/modes/drt/utils/AdaptConfigForDrt.java @@ -15,7 +15,6 @@ import java.util.stream.IntStream; import org.eqasim.core.components.config.EqasimConfigGroup; -import org.eqasim.core.misc.ClassUtils; import org.eqasim.core.simulation.EqasimConfigurator; import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; import org.eqasim.core.simulation.mode_choice.constraints.leg_time.LegTimeConstraintConfigGroup; @@ -180,7 +179,7 @@ public static void main(String[] args) throws CommandLine.ConfigurationException .requireOptions("input-config-path", "output-config-path", "vehicles-paths") .allowOptions("mode-names") .allowOptions("mode-availability") - .allowOptions("configurator-class") + .allowOptions(EqasimConfigurator.CONFIGURATOR) .allowOptions("operational-schemes") .allowOptions("cost-models", "estimators") .allowOptions("qsim-endtime") @@ -208,12 +207,7 @@ public static void main(String[] args) throws CommandLine.ConfigurationException Map> info = extractDrtInfo(modeNames, toExtract); - 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(inputConfigPath); configurator.updateConfig(config); diff --git a/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/analysis/run/RunFeederDrtPassengerAnalysis.java b/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/analysis/run/RunFeederDrtPassengerAnalysis.java index 2ffdfd72a..a18dd5965 100644 --- a/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/analysis/run/RunFeederDrtPassengerAnalysis.java +++ b/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/analysis/run/RunFeederDrtPassengerAnalysis.java @@ -45,6 +45,7 @@ public void writeAnalysis() throws IOException { static public void main(String[] args) throws CommandLine.ConfigurationException, IOException { CommandLine cmd = new CommandLine.Builder(args) // .requireOptions("config-path", "events-path", "network-path", "output-path") // + .allowOptions(EqasimConfigurator.CONFIGURATOR) // .build(); String configPath = cmd.getOptionStrict("config-path"); @@ -52,7 +53,7 @@ static public void main(String[] args) throws CommandLine.ConfigurationException String networkPath = cmd.getOptionStrict("network-path"); String outputPath = cmd.getOptionStrict("output-path"); - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd); Config config = ConfigUtils.loadConfig(configPath); configurator.updateConfig(config); diff --git a/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/utils/AdaptConfigForFeederDrt.java b/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/utils/AdaptConfigForFeederDrt.java index 193235254..a68740deb 100644 --- a/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/utils/AdaptConfigForFeederDrt.java +++ b/core/src/main/java/org/eqasim/core/simulation/modes/feeder_drt/utils/AdaptConfigForFeederDrt.java @@ -8,7 +8,6 @@ import java.util.Set; import org.eqasim.core.components.config.EqasimConfigGroup; -import org.eqasim.core.misc.ClassUtils; import org.eqasim.core.simulation.EqasimConfigurator; import org.eqasim.core.simulation.mode_choice.constraints.leg_time.LegTimeConstraintConfigGroup; import org.eqasim.core.simulation.mode_choice.constraints.leg_time.LegTimeConstraintSingleLegConfigGroup; @@ -134,7 +133,7 @@ public static void main(String[] args) throws CommandLine.ConfigurationException .allowOptions("access-egress-transit-stop-modes") .allowOptions("access-egress-transit-stop-ids") .allowOptions("mode-availability") - .allowOptions("configurator-class") + .allowOptions(EqasimConfigurator.CONFIGURATOR) .build(); String inputConfigPath = cmd.getOptionStrict("input-config-path"); @@ -155,12 +154,7 @@ public static void main(String[] args) throws CommandLine.ConfigurationException Map> info = AdaptConfigForDrt.extractDrtInfo(modeNames, toExtract); - 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(inputConfigPath); configurator.updateConfig(config); diff --git a/core/src/main/java/org/eqasim/core/simulation/vdf/utils/AdaptConfigForVDF.java b/core/src/main/java/org/eqasim/core/simulation/vdf/utils/AdaptConfigForVDF.java index 6aa2540df..29c5c408f 100644 --- a/core/src/main/java/org/eqasim/core/simulation/vdf/utils/AdaptConfigForVDF.java +++ b/core/src/main/java/org/eqasim/core/simulation/vdf/utils/AdaptConfigForVDF.java @@ -45,14 +45,14 @@ public static void adaptConfigForVDF(Config config, boolean engine) { public static void main(String[] args) throws CommandLine.ConfigurationException { CommandLine commandLine = new CommandLine.Builder(args) .requireOptions("input-config-path", "output-config-path") - .allowOptions("engine") + .allowOptions("engine", EqasimConfigurator.CONFIGURATOR) .build(); String inputPath = commandLine.getOptionStrict("input-config-path"); String outputPath = commandLine.getOptionStrict("output-config-path"); boolean engine = Boolean.parseBoolean(commandLine.getOption("engine").orElse("false")); - EqasimConfigurator eqasimConfigurator = new EqasimConfigurator(); + EqasimConfigurator eqasimConfigurator = EqasimConfigurator.getInstance(commandLine); Config config = ConfigUtils.loadConfig(inputPath); eqasimConfigurator.updateConfig(config); adaptConfigForVDF(config, engine); diff --git a/core/src/main/java/org/eqasim/core/standalone_mode_choice/RunStandaloneModeChoice.java b/core/src/main/java/org/eqasim/core/standalone_mode_choice/RunStandaloneModeChoice.java index 70a8402ed..cff0cb1fb 100644 --- a/core/src/main/java/org/eqasim/core/standalone_mode_choice/RunStandaloneModeChoice.java +++ b/core/src/main/java/org/eqasim/core/standalone_mode_choice/RunStandaloneModeChoice.java @@ -2,12 +2,12 @@ import java.io.BufferedReader; +import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.File; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.file.Paths; @@ -33,7 +33,6 @@ import org.eqasim.core.analysis.trips.TripReaderFromPopulation; import org.eqasim.core.analysis.trips.TripWriter; import org.eqasim.core.components.travel_time.RecordedTravelTime; -import org.eqasim.core.misc.ClassUtils; import org.eqasim.core.misc.InjectorBuilder; import org.eqasim.core.scenario.validation.ScenarioValidator; import org.eqasim.core.scenario.validation.VehiclesValidator; @@ -46,7 +45,6 @@ import org.matsim.api.core.v01.population.Population; 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.controler.AbstractModule; import org.matsim.core.controler.OutputDirectoryHierarchy; @@ -149,9 +147,7 @@ public double getLinkTravelTime(Link link, double time, Person person, Vehicle v public static final String CMD_TRAVEL_TIMES_FACTORS_PATH = "travel-times-factors-path"; public static final String CMD_RECORDED_TRAVEL_TIMES_PATH = "recorded-travel-times-path"; public static final String CMD_SKIP_SCENARIO_CHECK = "skip-scenario-check"; - public static final String EQASIM_CONFIGURATOR_CLASS = "eqasim-configurator-class"; - public static final String MODE_CHOICE_CONFIGURATOR_CLASS = "mode-choice-configurator-class"; - + public static void main(String[] args) throws CommandLine.ConfigurationException, InterruptedException, IOException { CommandLine cmd = new CommandLine.Builder(args) // .requireOptions(CMD_CONFIG_PATH) @@ -159,13 +155,14 @@ public static void main(String[] args) throws CommandLine.ConfigurationException .allowOptions(CMD_TRAVEL_TIMES_FACTORS_PATH, CMD_RECORDED_TRAVEL_TIMES_PATH) .allowOptions(CMD_SIMULATE_AFTER) .allowOptions(CMD_SKIP_SCENARIO_CHECK) - .allowOptions(EQASIM_CONFIGURATOR_CLASS, MODE_CHOICE_CONFIGURATOR_CLASS) + .allowOptions(EqasimConfigurator.CONFIGURATOR) .allowAnyOption(true) .build(); // Loading the config - EqasimConfigurator configurator = cmd.hasOption(EQASIM_CONFIGURATOR_CLASS) ? ClassUtils.getInstanceOfClassExtendingOtherClass(cmd.getOptionStrict(EQASIM_CONFIGURATOR_CLASS), EqasimConfigurator.class) : new EqasimConfigurator(); + EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd); configurator.registerConfigGroup(new StandaloneModeChoiceConfigGroup(), false); + configurator.registerModule(new StandaloneModeChoiceModule()); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict(CMD_CONFIG_PATH)); configurator.updateConfig(config); @@ -195,12 +192,7 @@ public static void main(String[] args) throws CommandLine.ConfigurationException } configurator.adjustScenario(scenario); - StandaloneModeChoiceConfigurator standaloneModeChoiceConfigurator = cmd.hasOption(MODE_CHOICE_CONFIGURATOR_CLASS) ? StandaloneModeChoiceConfigurator.getSubclassInstance(cmd.getOptionStrict(MODE_CHOICE_CONFIGURATOR_CLASS), config, cmd) : new StandaloneModeChoiceConfigurator(config, cmd); - - InjectorBuilder injectorBuilder = new InjectorBuilder(scenario); - - standaloneModeChoiceConfigurator.getModeChoiceModules(config).forEach(injectorBuilder::addOverridingModule); - + InjectorBuilder injectorBuilder = new InjectorBuilder(scenario, configurator); travelTimesFactorsPath.ifPresent(path -> injectorBuilder.addOverridingModule(new AbstractModule() { @Override diff --git a/core/src/main/java/org/eqasim/core/standalone_mode_choice/StandaloneModeChoiceConfigurator.java b/core/src/main/java/org/eqasim/core/standalone_mode_choice/StandaloneModeChoiceConfigurator.java deleted file mode 100644 index bb23527d6..000000000 --- a/core/src/main/java/org/eqasim/core/standalone_mode_choice/StandaloneModeChoiceConfigurator.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.eqasim.core.standalone_mode_choice; - -import org.eqasim.core.analysis.DefaultPersonAnalysisFilter; -import org.eqasim.core.analysis.PersonAnalysisFilter; -import org.eqasim.core.simulation.EqasimConfigurator; -import org.eqasim.core.simulation.modes.transit_with_abstract_access.TransitWithAbstractAbstractAccessModuleConfigGroup; -import org.eqasim.core.simulation.modes.transit_with_abstract_access.TransitWithAbstractAccessModule; -import org.eqasim.core.simulation.modes.transit_with_abstract_access.mode_choice.TransitWithAbstractAccessModeChoiceModule; -import org.eqasim.core.simulation.termination.EqasimTerminationModule; -import org.eqasim.core.simulation.vdf.VDFConfigGroup; -import org.eqasim.core.simulation.vdf.VDFModule; -import org.matsim.core.config.CommandLine; -import org.matsim.core.config.Config; -import org.matsim.core.config.ConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.utils.timing.TimeInterpretationModule; - -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class StandaloneModeChoiceConfigurator { - - private final Config config; - private final CommandLine commandLine; - - private final Map> optionalModules; - - public StandaloneModeChoiceConfigurator(Config config, CommandLine commandLine) { - this.config = config; - this.commandLine = commandLine; - this.optionalModules = new LinkedHashMap<>(); - - this.registerOptionalModule(new VDFConfigGroup(), new VDFModule()); - this.registerOptionalModule(TransitWithAbstractAbstractAccessModuleConfigGroup.GROUP_NAME, new TransitWithAbstractAccessModeChoiceModule()); - this.registerOptionalModule(TransitWithAbstractAbstractAccessModuleConfigGroup.GROUP_NAME, new TransitWithAbstractAccessModule()); - } - - public Config getConfig() { - return config; - } - - public CommandLine getCommandLine() { - return commandLine; - } - - protected void registerOptionalModule(ConfigGroup configGroup, AbstractModule module) { - this.registerOptionalModule(configGroup.getName(), module); - } - - protected void registerOptionalModule(String moduleName, AbstractModule module) { - this.optionalModules.computeIfAbsent(moduleName, key -> new ArrayList<>()).add(module); - } - - public final List getModeChoiceModules(Config config) { - List modules = new ArrayList<>(); - new EqasimConfigurator().getModules(config).stream().filter(module -> !(module instanceof EqasimTerminationModule)).forEach(modules::add); - modules.add(new TimeInterpretationModule()); - modules.add(new StandaloneModeChoiceModule(getConfig())); - // We add a module that just binds the PersonAnalysisFilter without having to add the whole EqasimAnalysisModule - // This bind is required for building the TripReaderFromPopulation object - modules.add(new AbstractModule() { - @Override - public void install() { - bind(PersonAnalysisFilter.class).to(DefaultPersonAnalysisFilter.class); - } - }); - modules.addAll(this.getSpecificModeChoiceModules()); - config.getModules().keySet().stream() - .filter(this.optionalModules::containsKey) - .flatMap(moduleName -> this.optionalModules.get(moduleName).stream()) - .forEach(modules::add); - return modules; - } - - protected List getSpecificModeChoiceModules() { - return new ArrayList<>(); - } - - public static StandaloneModeChoiceConfigurator getSubclassInstance(String className, Config config, CommandLine commandLine) { - try { - Class classDescription = Class.forName(className); - boolean isStandaloneModeChoiceConfigurator = classDescription.equals(StandaloneModeChoiceConfigurator.class); - Class tempClassDescription = classDescription; - while(!isStandaloneModeChoiceConfigurator && tempClassDescription != null && !tempClassDescription.equals(Object.class)) { - tempClassDescription = tempClassDescription.getSuperclass(); - isStandaloneModeChoiceConfigurator = StandaloneModeChoiceConfigurator.class.equals(tempClassDescription); - } - if(!isStandaloneModeChoiceConfigurator) { - throw new IllegalStateException(String.format("Class %s does not extend %s", classDescription.getCanonicalName(), StandaloneModeChoiceConfigurator.class.getCanonicalName())); - } - return (StandaloneModeChoiceConfigurator) classDescription.getConstructor(Config.class, CommandLine.class).newInstance(config, commandLine); - } catch (ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException e) { - throw new RuntimeException(e); - } catch (NoSuchMethodException e) { - throw new RuntimeException(String.format("Class %s needs to have a constructor that takes arguments of types %s and %s", className, Config.class.getCanonicalName(), CommandLine.class.getCanonicalName()), e); - } - } -} diff --git a/core/src/main/java/org/eqasim/core/standalone_mode_choice/StandaloneModeChoiceModule.java b/core/src/main/java/org/eqasim/core/standalone_mode_choice/StandaloneModeChoiceModule.java index 2a9facfea..dcbd429f1 100644 --- a/core/src/main/java/org/eqasim/core/standalone_mode_choice/StandaloneModeChoiceModule.java +++ b/core/src/main/java/org/eqasim/core/standalone_mode_choice/StandaloneModeChoiceModule.java @@ -8,74 +8,79 @@ import org.matsim.api.core.v01.population.Population; import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceModel; import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup; -import org.matsim.core.config.Config; import org.matsim.core.config.groups.ControllerConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.OutputDirectoryHierarchy; import org.matsim.core.controler.OutputDirectoryLogging; import org.matsim.core.utils.io.IOUtils; -import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Provides; import com.google.inject.Singleton; -import com.google.inject.name.Named; public class StandaloneModeChoiceModule extends AbstractModule { - private final StandaloneModeChoiceConfigGroup configGroup; - private final int numberOfThreads; - private final long randomSeed; + @Override + public void install() { + StandaloneModeChoiceConfigGroup configGroup = (StandaloneModeChoiceConfigGroup) getConfig().getModules() + .get(StandaloneModeChoiceConfigGroup.GROUP_NAME); - @Inject - public StandaloneModeChoiceModule(Config config) { - try { - this.configGroup = (StandaloneModeChoiceConfigGroup) config.getModules().get(StandaloneModeChoiceConfigGroup.GROUP_NAME); - } catch (NullPointerException e) { - throw new IllegalStateException(String.format("%s module is required in the config", StandaloneModeChoiceConfigGroup.GROUP_NAME), e); - } catch (ClassCastException e) { - throw new IllegalStateException(String.format("%s module is present in the config but its corresponding configGroup wasn't set while loading it", StandaloneModeChoiceConfigGroup.GROUP_NAME), e); - } - try { - DiscreteModeChoiceConfigGroup discreteModeChoiceConfigGroup = (DiscreteModeChoiceConfigGroup) config.getModules().get(DiscreteModeChoiceConfigGroup.GROUP_NAME); - if (!discreteModeChoiceConfigGroup.getFallbackBehaviour().equals(DiscreteModeChoiceModel.FallbackBehaviour.EXCEPTION) && this.configGroup.isRemovePersonsWithNoValidAlternative()) { - throw new IllegalStateException(String.format("The %s module relies on the exceptions thrown by the %s module to filter out persons with no alternatives. " + - "The %s attribute of the latter needs to be set to %s when the %s attribute of the former is set to true", StandaloneModeChoiceConfigGroup.GROUP_NAME, DiscreteModeChoiceConfigGroup.GROUP_NAME, DiscreteModeChoiceConfigGroup.FALLBACK_BEHAVIOUR, DiscreteModeChoiceModel.FallbackBehaviour.EXCEPTION, StandaloneModeChoiceConfigGroup.REMOVE_PERSON_WITH_NO_VALID_ALTERNATIVES)); - } - } catch (NullPointerException e) { - throw new IllegalStateException(String.format("%s module is required in the config", DiscreteModeChoiceConfigGroup.GROUP_NAME), e); - } catch (ClassCastException e) { - throw new IllegalStateException(String.format("%s module is present in the config but its corresponding configGroup wasn't set while loading it", DiscreteModeChoiceConfigGroup.GROUP_NAME), e); + if (configGroup == null) { + throw new IllegalStateException( + String.format("%s module is required in the config", StandaloneModeChoiceConfigGroup.GROUP_NAME)); } - this.numberOfThreads = config.global().getNumberOfThreads(); - this.randomSeed = config.global().getRandomSeed(); - } - @Override - public void install() { + DiscreteModeChoiceConfigGroup discreteModeChoiceConfigGroup = (DiscreteModeChoiceConfigGroup) getConfig() + .getModules().get(DiscreteModeChoiceConfigGroup.GROUP_NAME); + if (discreteModeChoiceConfigGroup == null) { + throw new IllegalStateException( + String.format("%s module is required in the config", DiscreteModeChoiceConfigGroup.GROUP_NAME)); + } else if (!discreteModeChoiceConfigGroup.getFallbackBehaviour() + .equals(DiscreteModeChoiceModel.FallbackBehaviour.EXCEPTION) + && configGroup.isRemovePersonsWithNoValidAlternative()) { + throw new IllegalStateException(String.format( + "The %s module relies on the exceptions thrown by the %s module to filter out persons with no alternatives. " + + + "The %s attribute of the latter needs to be set to %s when the %s attribute of the former is set to true", + StandaloneModeChoiceConfigGroup.GROUP_NAME, DiscreteModeChoiceConfigGroup.GROUP_NAME, + DiscreteModeChoiceConfigGroup.FALLBACK_BEHAVIOUR, + DiscreteModeChoiceModel.FallbackBehaviour.EXCEPTION, + StandaloneModeChoiceConfigGroup.REMOVE_PERSON_WITH_NO_VALID_ALTERNATIVES)); + } } @Provides - public StandaloneModeChoicePerformer provideStandaloneModeChoicePerformer(Provider discreteModeChoiceModelProvider, Population population, OutputDirectoryHierarchy outputDirectoryHierarchy, Scenario scenario) { - return new StandaloneModeChoicePerformer(discreteModeChoiceModelProvider, configGroup, population, this.numberOfThreads, this.randomSeed, outputDirectoryHierarchy, scenario); + public StandaloneModeChoicePerformer provideStandaloneModeChoicePerformer( + Provider discreteModeChoiceModelProvider, Population population, + OutputDirectoryHierarchy outputDirectoryHierarchy, Scenario scenario, + StandaloneModeChoiceConfigGroup configGroup) { + int numberOfThreads = getConfig().global().getNumberOfThreads(); + long randomSeed = getConfig().global().getRandomSeed(); + + return new StandaloneModeChoicePerformer(discreteModeChoiceModelProvider, configGroup, population, + numberOfThreads, randomSeed, outputDirectoryHierarchy, scenario); } @Provides @Singleton - public OutputDirectoryHierarchy provideOutputDirectoryHierarchy() { - OutputDirectoryHierarchy outputDirectoryHierarchy = new OutputDirectoryHierarchy(this.configGroup.getOutputDirectory(), null, OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles, false, ControllerConfigGroup.CompressionType.gzip); + public OutputDirectoryHierarchy provideOutputDirectoryHierarchy(StandaloneModeChoiceConfigGroup configGroup) { + OutputDirectoryHierarchy outputDirectoryHierarchy = new OutputDirectoryHierarchy( + configGroup.getOutputDirectory(), null, + OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles, false, + ControllerConfigGroup.CompressionType.gzip); File outputDir = new File(outputDirectoryHierarchy.getOutputPath()); if (outputDir.exists()) { if (outputDir.isFile()) { throw new RuntimeException("Cannot create output directory. " - + outputDirectoryHierarchy.getOutputPath() + " is a file and cannot be replaced by a directory."); + + outputDirectoryHierarchy.getOutputPath() + + " is a file and cannot be replaced by a directory."); } if (Objects.requireNonNull(outputDir.list()).length > 0) { IOUtils.deleteDirectoryRecursively(outputDir.toPath()); } } try { - OutputDirectoryLogging.initLoggingWithOutputDirectory(this.configGroup.getOutputDirectory()); + OutputDirectoryLogging.initLoggingWithOutputDirectory(configGroup.getOutputDirectory()); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/core/src/main/java/org/eqasim/core/tools/ExportNetworkRoutesToGeopackage.java b/core/src/main/java/org/eqasim/core/tools/ExportNetworkRoutesToGeopackage.java index 01b01a25a..abec1413d 100644 --- a/core/src/main/java/org/eqasim/core/tools/ExportNetworkRoutesToGeopackage.java +++ b/core/src/main/java/org/eqasim/core/tools/ExportNetworkRoutesToGeopackage.java @@ -1,7 +1,18 @@ package org.eqasim.core.tools; -import org.eqasim.core.misc.ClassUtils; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + import org.eqasim.core.simulation.EqasimConfigurator; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.feature.DefaultFeatureCollection; import org.geotools.feature.simple.SimpleFeatureBuilder; @@ -26,13 +37,6 @@ import org.matsim.core.router.TripStructureUtils; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.geometry.geotools.MGC; -import org.geotools.api.feature.simple.SimpleFeature; -import org.geotools.api.feature.simple.SimpleFeatureType; - -import java.io.File; -import java.io.IOException; -import java.util.*; -import java.util.stream.Collectors; public class ExportNetworkRoutesToGeopackage { @@ -95,7 +99,7 @@ private static Collection extractFeaturesFromPerson(Person person public static void main(String[] args) throws CommandLine.ConfigurationException, IOException { CommandLine commandLine = new CommandLine.Builder(args) .requireOptions("network-path", "plans-path", "output-path", "crs") - .allowOptions("configurator-class") + .allowOptions(EqasimConfigurator.CONFIGURATOR) .allowOptions("main-modes", "leg-modes") .build(); @@ -106,7 +110,7 @@ public static void main(String[] args) throws CommandLine.ConfigurationException Set mainModes = commandLine.hasOption("main-modes") ? Arrays.stream(commandLine.getOptionStrict("main-modes").split(",")).map(String::trim).collect(Collectors.toSet()) : new HashSet<>(); Set legModes = commandLine.hasOption("leg-modes") ? Arrays.stream(commandLine.getOptionStrict("leg-modes").split(",")).map(String::trim).collect(Collectors.toSet()) : new HashSet<>(); - EqasimConfigurator configurator = commandLine.hasOption("configurator-class") ? ClassUtils.getInstanceOfClassExtendingOtherClass(commandLine.getOptionStrict("configurator"), EqasimConfigurator.class) : new EqasimConfigurator(); + EqasimConfigurator configurator = EqasimConfigurator.getInstance(commandLine); Scenario scenario = ScenarioUtils.createScenario(ConfigUtils.createConfig()); configurator.configureScenario(scenario); diff --git a/core/src/main/java/org/eqasim/core/tools/RunImputeHeadway.java b/core/src/main/java/org/eqasim/core/tools/RunImputeHeadway.java index 2ceb3cc3b..ae359083f 100644 --- a/core/src/main/java/org/eqasim/core/tools/RunImputeHeadway.java +++ b/core/src/main/java/org/eqasim/core/tools/RunImputeHeadway.java @@ -18,10 +18,10 @@ public class RunImputeHeadway { static public void main(String[] args) throws ConfigurationException, InterruptedException { CommandLine cmd = new CommandLine.Builder(args) // .requireOptions("config-path", "output-path") // - .allowOptions("threads", "batch-size", "interval") // + .allowOptions("threads", "batch-size", "interval", EqasimConfigurator.CONFIGURATOR) // .build(); - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); cmd.applyConfiguration(config); @@ -35,8 +35,7 @@ static public void main(String[] args) throws ConfigurationException, Interrupte Scenario scenario = ScenarioUtils.createScenario(config); ScenarioUtils.loadScenario(scenario); - Injector injector = new InjectorBuilder(scenario) // - .addOverridingModules(configurator.getModules(config)) // + Injector injector = new InjectorBuilder(scenario, configurator) // .addOverridingModule(new HeadwayImputerModule(numberOfThreads, batchSize, true, interval)) // .build(); diff --git a/core/src/main/java/org/eqasim/core/tools/routing/RunBatchPublicTransportRouter.java b/core/src/main/java/org/eqasim/core/tools/routing/RunBatchPublicTransportRouter.java index 3348a3578..df8f5b76e 100644 --- a/core/src/main/java/org/eqasim/core/tools/routing/RunBatchPublicTransportRouter.java +++ b/core/src/main/java/org/eqasim/core/tools/routing/RunBatchPublicTransportRouter.java @@ -61,11 +61,12 @@ static public void main(String[] args) throws ConfigurationException, JsonGenera "transfer-utility", "waiting-utility", // "direct-walk-factor", "maximum-transfer-distance", // "walk-factor", "walk-speed", // - "output-trips-path", "output-legs-path", "output-config-path") // + "output-trips-path", "output-legs-path", "output-config-path", // + EqasimConfigurator.CONFIGURATOR) // .allowPrefixes("travel-utility") // .build(); - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); cmd.applyConfiguration(config); @@ -262,8 +263,7 @@ static public void main(String[] args) throws ConfigurationException, JsonGenera Optional outputTripsPath = cmd.getOption("output-trips-path"); Optional outputConfigPath = cmd.getOption("output-config-path"); - Injector injector = new InjectorBuilder(scenario) // - .addOverridingModules(configurator.getModules(config)) // + Injector injector = new InjectorBuilder(scenario, configurator) // .addOverridingModule(new HeadwayImputerModule(numberOfThreads, batchSize, false, interval)).build(); Provider routerProvider = injector.getProvider(TransitRouter.class); diff --git a/core/src/main/java/org/eqasim/core/tools/routing/RunBatchRoadRouter.java b/core/src/main/java/org/eqasim/core/tools/routing/RunBatchRoadRouter.java index b3536688a..4ce45e49c 100644 --- a/core/src/main/java/org/eqasim/core/tools/routing/RunBatchRoadRouter.java +++ b/core/src/main/java/org/eqasim/core/tools/routing/RunBatchRoadRouter.java @@ -43,10 +43,10 @@ static public void main(String[] args) throws ConfigurationException, JsonGenera IOException, InterruptedException { CommandLine cmd = new CommandLine.Builder(args) // .requireOptions("config-path", "input-path", "output-path") // - .allowOptions("threads", "batch-size", "modes", "write-paths") // + .allowOptions("threads", "batch-size", "modes", "write-paths", EqasimConfigurator.CONFIGURATOR) // .build(); - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = EqasimConfigurator.getInstance(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); cmd.applyConfiguration(config); @@ -66,8 +66,7 @@ static public void main(String[] args) throws ConfigurationException, JsonGenera modes.add(mode); } - Injector injector = new InjectorBuilder(scenario) // - .addOverridingModules(configurator.getModules(config)) // + Injector injector = new InjectorBuilder(scenario, configurator) // .addOverridingModule(new AbstractModule() { @Override public void install() { diff --git a/core/src/test/java/org/eqasim/TestConfigurator.java b/core/src/test/java/org/eqasim/TestConfigurator.java new file mode 100644 index 000000000..dc75ba1bb --- /dev/null +++ b/core/src/test/java/org/eqasim/TestConfigurator.java @@ -0,0 +1,51 @@ +package org.eqasim; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.core.simulation.mode_choice.AbstractEqasimExtension; +import org.eqasim.core.simulation.mode_choice.parameters.ModeParameters; +import org.matsim.api.core.v01.TransportMode; +import org.matsim.api.core.v01.population.Person; +import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceTrip; +import org.matsim.contribs.discrete_mode_choice.model.mode_availability.ModeAvailability; +import org.matsim.core.config.CommandLine; +import org.matsim.core.config.CommandLine.ConfigurationException; + +public class TestConfigurator extends EqasimConfigurator { + public TestConfigurator() throws ConfigurationException { + super(new CommandLine.Builder(new String[0]).build()); + } + + public TestConfigurator(CommandLine commandLine) { + super(commandLine); + + registerModule(new AbstractEqasimExtension() { + @Override + public void installEqasimExtension() { + bind(ModeParameters.class); + bindModeAvailability("DefaultModeAvailability").to(TestModeAvailability.class); + } + }); + } + + public static class TestModeAvailability implements ModeAvailability { + @Override + public Collection getAvailableModes(Person person, List trips) { + Set modes = new HashSet<>(); + modes.add(TransportMode.walk); + modes.add(TransportMode.pt); + modes.add(TransportMode.car); + modes.add(TransportMode.bike); + // Add special mode "car_passenger" if applicable + Boolean isCarPassenger = (Boolean) person.getAttributes().getAttribute("isPassenger"); + if (isCarPassenger) { + modes.add("car_passenger"); + } + return modes; + } + } +} diff --git a/core/src/test/java/org/eqasim/TestEmissions.java b/core/src/test/java/org/eqasim/TestEmissions.java index 9486550d9..a80be8a13 100644 --- a/core/src/test/java/org/eqasim/TestEmissions.java +++ b/core/src/test/java/org/eqasim/TestEmissions.java @@ -12,7 +12,11 @@ import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.zip.GZIPInputStream; import org.apache.commons.io.FileUtils; @@ -20,9 +24,7 @@ import org.eqasim.core.components.emissions.RunExportEmissionsNetwork; import org.eqasim.core.components.emissions.SafeOsmHbefaMapping; import org.eqasim.core.simulation.EqasimConfigurator; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; import org.eqasim.core.simulation.mode_choice.AbstractEqasimExtension; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; import org.eqasim.core.simulation.mode_choice.parameters.ModeParameters; import org.geotools.api.feature.simple.SimpleFeature; import org.junit.After; @@ -36,6 +38,7 @@ import org.matsim.api.core.v01.network.Network; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.config.CommandLine; +import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ControllerConfigGroup; @@ -74,8 +77,8 @@ public void tearDown() throws IOException { FileUtils.deleteDirectory(new File("melun_test")); } - private void runMelunSimulation() { - EqasimConfigurator eqasimConfigurator = new EqasimConfigurator(); + private void runMelunSimulation() throws ConfigurationException { + EqasimConfigurator eqasimConfigurator = new TestConfigurator(); Config config = ConfigUtils.loadConfig("melun_test/input/config.xml"); eqasimConfigurator.updateConfig(config); ((ControllerConfigGroup) config.getModules().get(ControllerConfigGroup.GROUP_NAME)) @@ -88,8 +91,6 @@ private void runMelunSimulation() { Controler controller = new Controler(scenario); eqasimConfigurator.configureController(controller); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new EqasimAnalysisModule()); controller.addOverridingModule(new AbstractEqasimExtension() { @Override protected void installEqasimExtension() { @@ -170,12 +171,14 @@ private void runMelunEmissions() throws CommandLine.ConfigurationException, IOEx "--hbefa-cold-avg", "sample_41_EFA_ColdStart_vehcat_2020average.csv", "--hbefa-hot-avg", "sample_41_EFA_HOT_vehcat_2020average.csv", "--hbefa-cold-detailed", "sample_41_EFA_ColdStart_SubSegm_2020detailed.csv", "--hbefa-hot-detailed", - "sample_41_EFA_HOT_SubSegm_2020detailed.csv", }); + "sample_41_EFA_HOT_SubSegm_2020detailed.csv", + "--eqasim-configurator", TestConfigurator.class.getName() }); assertEquals(353704, countLines(new File("melun_test/output/output_emissions_events.xml.gz"))); RunExportEmissionsNetwork.main(new String[] { "--config-path", "melun_test/input/config.xml", - "--pollutants", "PM,CO,NOx,Unknown", "--time-bin-size", "3600" }); + "--pollutants", "PM,CO,NOx,Unknown", "--time-bin-size", "3600", + "--eqasim-configurator", TestConfigurator.class.getName() }); Collection features = ShapeFileReader.getAllFeatures("melun_test/output/emissions_network.shp"); diff --git a/core/src/test/java/org/eqasim/TestSimulationPipeline.java b/core/src/test/java/org/eqasim/TestSimulationPipeline.java index 2e38890ab..f9faaddd9 100644 --- a/core/src/test/java/org/eqasim/TestSimulationPipeline.java +++ b/core/src/test/java/org/eqasim/TestSimulationPipeline.java @@ -3,9 +3,10 @@ import java.io.File; import java.io.IOException; import java.net.URL; -import java.util.*; +import java.util.Optional; import org.apache.commons.io.FileUtils; +import org.eqasim.TestConfigurator.TestModeAvailability; import org.eqasim.core.analysis.run.RunLegAnalysis; import org.eqasim.core.analysis.run.RunPublicTransportLegAnalysis; import org.eqasim.core.analysis.run.RunTripAnalysis; @@ -16,9 +17,7 @@ import org.eqasim.core.scenario.cutter.extent.ShapeScenarioExtent; import org.eqasim.core.scenario.routing.RunPopulationRouting; import org.eqasim.core.simulation.EqasimConfigurator; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; import org.eqasim.core.simulation.mode_choice.AbstractEqasimExtension; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; import org.eqasim.core.simulation.mode_choice.epsilon.AdaptConfigForEpsilon; import org.eqasim.core.simulation.mode_choice.parameters.ModeParameters; import org.eqasim.core.simulation.modes.drt.analysis.run.RunDrtPassengerAnalysis; @@ -37,25 +36,25 @@ import org.eqasim.core.simulation.vdf.travel_time.function.BPRFunction; import org.eqasim.core.simulation.vdf.utils.AdaptConfigForVDF; import org.eqasim.core.standalone_mode_choice.RunStandaloneModeChoice; -import org.eqasim.core.standalone_mode_choice.StandaloneModeChoiceConfigurator; -import org.eqasim.core.tools.*; +import org.eqasim.core.tools.ExportActivitiesToShapefile; +import org.eqasim.core.tools.ExportNetworkRoutesToGeopackage; +import org.eqasim.core.tools.ExportNetworkToShapefile; +import org.eqasim.core.tools.ExportPopulationToCSV; +import org.eqasim.core.tools.ExportTransitLinesToShapefile; +import org.eqasim.core.tools.ExportTransitStopsToShapefile; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.matsim.api.core.v01.Scenario; -import org.matsim.api.core.v01.TransportMode; import org.matsim.api.core.v01.network.Link; -import org.matsim.api.core.v01.population.*; -import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceTrip; import org.matsim.contribs.discrete_mode_choice.model.mode_availability.ModeAvailability; import org.matsim.core.config.CommandLine; +import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ControllerConfigGroup; -import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; import org.matsim.core.scenario.ScenarioUtils; - import org.matsim.core.utils.misc.CRCChecksum; import com.google.inject.Inject; @@ -75,17 +74,17 @@ public void tearDown() throws IOException { FileUtils.deleteDirectory(new File("melun_test")); } - private void runMelunSimulation(String configPath, String outputPath) { + private void runMelunSimulation(String configPath, String outputPath) throws ConfigurationException { runMelunSimulation(configPath, outputPath, null, null); } - private void runMelunSimulation(String configPath, String outputPath, String inputPlansFile, Integer lastIteration) { + private void runMelunSimulation(String configPath, String outputPath, String inputPlansFile, Integer lastIteration) throws ConfigurationException { Config config = ConfigUtils.loadConfig(configPath); runMelunSimulation(config, outputPath, inputPlansFile, lastIteration); } - private void runMelunSimulation(Config config, String outputPath, String inputPlansFile, Integer lastIteration) { - EqasimConfigurator eqasimConfigurator = new EqasimConfigurator(); + private void runMelunSimulation(Config config, String outputPath, String inputPlansFile, Integer lastIteration) throws ConfigurationException { + EqasimConfigurator eqasimConfigurator = new TestConfigurator(); eqasimConfigurator.updateConfig(config); ((ControllerConfigGroup) config.getModules().get(ControllerConfigGroup.GROUP_NAME)).setOutputDirectory(outputPath); @@ -105,8 +104,6 @@ private void runMelunSimulation(Config config, String outputPath, String inputPl Controler controller = new Controler(scenario); eqasimConfigurator.configureController(controller); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new EqasimAnalysisModule()); controller.addOverridingModule(new AbstractEqasimExtension() { @Override protected void installEqasimExtension() { @@ -212,18 +209,20 @@ private void runExports() throws Exception { "--plans-path", "melun_test/output/output_plans.xml.gz", "--network-path", "melun_test/input/network.xml.gz", "--output-path", "melun_test/exports/network_routes.gpkg", - "--crs", "EPSG:2154" + "--crs", "EPSG:2154", + "--eqasim-configurator", TestConfigurator.class.getName() }); } private void runCutter() throws Exception { - RunScenarioCutter.main(new String[] { - "--config-path", "melun_test/input/config.xml", - "--events-path", "melun_test/output/output_events.xml.gz", + RunScenarioCutter.main(new String[] { + "--config-path", "melun_test/input/config.xml", + "--events-path", "melun_test/output/output_events.xml.gz", "--output-path", "melun_test/cutter", "--prefix", "center_", - "--extent-path", "melun_test/input/center.shp" - }); + "--extent-path", "melun_test/input/center.shp", + "--eqasim-configurator", TestConfigurator.class.getName() + }); runMelunSimulation("melun_test/cutter/center_config.xml", "melun_test/output_cutter"); } @@ -236,7 +235,8 @@ public void runCutterV2() throws CommandLine.ConfigurationException, IOException "--output-path", "melun_test/cutter_v2", "--prefix", "center_", "--extent-path", "melun_test/input/center.shp", - "--flag-area-link-modes", "true" + "--flag-area-link-modes", "true", + "--eqasim-configurator", TestConfigurator.class.getName() }); CreateDrtVehicles.main(new String[]{ @@ -252,7 +252,8 @@ public void runCutterV2() throws CommandLine.ConfigurationException, IOException "--vehicles-paths", "melun_test/cutter_v2/drt_vehicles.xml", "--operational-schemes", "serviceAreaBased", "--config:multiModeDrt.drt[mode=drt].drtServiceAreaShapeFile", "extent/center.shp", - "--config:dvrp.networkModes", "inside_car" + "--config:dvrp.networkModes", "inside_car", + "--eqasim-configurator", TestConfigurator.class.getName() }); runMelunSimulation("melun_test/cutter_v2/center_config_drt.xml", "melun_test/output_cutter_v2_drt"); @@ -260,9 +261,9 @@ public void runCutterV2() throws CommandLine.ConfigurationException, IOException compareVdfTravelTimes("melun_test/cutter_v2/center_config_drt.xml", "melun_test/output_vdf/vdf_travel_times.bin", "melun_test/output_cutter_v2_drt/vdf_travel_times.bin", "melun_test/input/center.shp"); } - private void compareVdfTravelTimes(String configPath, String leftTravelTimesPath, String rightTravelTimesPath, String updateExtentPath) throws IOException { + private void compareVdfTravelTimes(String configPath, String leftTravelTimesPath, String rightTravelTimesPath, String updateExtentPath) throws IOException, ConfigurationException { Config config = ConfigUtils.loadConfig(configPath); - new EqasimConfigurator().updateConfig(config); + new TestConfigurator().updateConfig(config); Scenario scenario = ScenarioUtils.loadScenario(config); @@ -314,7 +315,8 @@ public void testDrt() throws IOException, CommandLine.ConfigurationException { "--output-config-path", "melun_test/input/config_drt.xml", "--mode-names", "drt_a,drt_b", "--vehicles-paths", "melun_test/input/drt_vehicles_a.xml.gz,melun_test/input/drt_vehicles_b.xml.gz", - "--add-leg-time-constraint", "false,true" + "--add-leg-time-constraint", "false,true", + "--eqasim-configurator", TestConfigurator.class.getName() }); runMelunSimulation("melun_test/input/config_drt.xml", "melun_test/output_drt"); @@ -357,7 +359,8 @@ public void testFeeder() throws IOException, CommandLine.ConfigurationException "--output-config-path", "melun_test/input/config_feeder.xml", "--mode-names", "drt_for_feeder_a,drt_for_feeder_b", "--vehicles-paths", "melun_test/input/feeder_drt_vehicles_a.xml.gz,melun_test/input/feeder_drt_vehicles_b.xml.gz", - "--add-leg-time-constraint", "false,true" + "--add-leg-time-constraint", "false,true", + "--eqasim-configurator", TestConfigurator.class.getName() }); @@ -367,7 +370,8 @@ public void testFeeder() throws IOException, CommandLine.ConfigurationException "--mode-names", "feeder_a,feeder_b", "--base-drt-modes", "drt_for_feeder_a,drt_for_feeder_b", "--access-egress-transit-stop-modes", "rail|tram|subway", - "--access-egress-transit-stop-ids", "IDFM:482345.link:305887|IDFM:31170.link:618272|IDFM:462597.link:511974" + "--access-egress-transit-stop-ids", "IDFM:482345.link:305887|IDFM:31170.link:618272|IDFM:462597.link:511974", + "--eqasim-configurator", TestConfigurator.class.getName() }); runMelunSimulation("melun_test/input/config_feeder.xml", "melun_test/output_feeder"); @@ -376,7 +380,8 @@ public void testFeeder() throws IOException, CommandLine.ConfigurationException "--config-path", "melun_test/input/config_feeder.xml", "--events-path", "melun_test/output_feeder/output_events.xml.gz", "--network-path", "melun_test/output_feeder/output_network.xml.gz", - "--output-path", "melun_test/output_feeder/eqasim_feeder_drt_trips_standalone.csv" + "--output-path", "melun_test/output_feeder/eqasim_feeder_drt_trips_standalone.csv", + "--eqasim-configurator", TestConfigurator.class.getName() }); } @@ -421,7 +426,8 @@ public void runVdf() throws CommandLine.ConfigurationException, IOException, Int "--output-config-path", "melun_test/input/config_vdf.xml", "--engine", "true", // We need to do this for DRT as DRT drivers are not PlanAgents - "--config:eqasim:vdf_engine.generateNetworkEvents", "true" + "--config:eqasim:vdf_engine.generateNetworkEvents", "true", + "--eqasim-configurator", TestConfigurator.class.getName() }); runMelunSimulation("melun_test/input/config_vdf.xml", "melun_test/output_vdf"); @@ -433,7 +439,8 @@ public void runVdf() throws CommandLine.ConfigurationException, IOException, Int "--output-config-path", "melun_test/input/config_vdf_horizon.xml", "--engine", "true", "--config:eqasim:vdf_engine.generateNetworkEvents", "true", - "--config:eqasim:vdf.handler", "Horizon" + "--config:eqasim:vdf.handler", "Horizon", + "--eqasim-configurator", TestConfigurator.class.getName() }); runMelunSimulation("melun_test/input/config_vdf_horizon.xml", "melun_test/output_vdf_horizon"); @@ -444,7 +451,7 @@ public void runVdf() throws CommandLine.ConfigurationException, IOException, Int "--config-path", "melun_test/input/config_vdf.xml", "--config:standaloneModeChoice.outputDirectory", "melun_test/output_mode_choice_vdf", "--config:eqasim:vdf.inputTravelTimesFile", "../output_vdf/vdf_travel_times.bin", // Relative to the config file - "--mode-choice-configurator-class", TestModeChoiceConfigurator.class.getName(), + "--eqasim-configurator", TestConfigurator.class.getName(), "--simulate-after", TestRunSimulation.class.getName() }); @@ -458,7 +465,8 @@ public void runVdf() throws CommandLine.ConfigurationException, IOException, Int AdaptConfigForDrt.main(new String[]{ "--input-config-path", "melun_test/input/config_vdf.xml", "--output-config-path", "melun_test/input/config_vdf_drt.xml", - "--vehicles-paths", "melun_test/input/drt_vehicles.xml.gz" + "--vehicles-paths", "melun_test/input/drt_vehicles.xml.gz", + "--eqasim-configurator", TestConfigurator.class.getName() }); runMelunSimulation("melun_test/input/config_vdf_drt.xml", "melun_test/output_vdf_drt"); @@ -477,7 +485,7 @@ public void testPipeline() throws Exception { } @Test - public void testBaseDeterminism() { + public void testBaseDeterminism() throws ConfigurationException { Config config = ConfigUtils.loadConfig("melun_test/input/config.xml"); runMelunSimulation(config, "melun_test/output_determinism_1", null, 2); @@ -494,11 +502,13 @@ public void testBaseDeterminism() { public void runPopulationRouting() throws CommandLine.ConfigurationException, InterruptedException { RunPopulationRouting.main(new String[] { "--config-path", "melun_test/input/config.xml", - "--output-path", "melun_test/output/routed_population.xml" + "--output-path", "melun_test/output/routed_population.xml", + "--eqasim-configurator", TestConfigurator.class.getName() }); RunPopulationRouting.main(new String[] { "--config-path", "melun_test/input/config.xml", - "--output-path", "melun_test/output/routed_population_again.xml" + "--output-path", "melun_test/output/routed_population_again.xml", + "--eqasim-configurator", TestConfigurator.class.getName() }); assert CRCChecksum.getCRCFromFile("melun_test/output/routed_population.xml") == CRCChecksum.getCRCFromFile("melun_test/output/routed_population_again.xml"); } @@ -510,7 +520,7 @@ public void runStandaloneModeChoice() throws CommandLine.ConfigurationException, "--write-input-csv-trips", "true", "--write-output-csv-trips", "true", "--config:standaloneModeChoice.outputDirectory", "melun_test/output_mode_choice", - "--mode-choice-configurator-class", TestModeChoiceConfigurator.class.getName(), + "--eqasim-configurator", TestConfigurator.class.getName(), "--simulate-after", TestRunSimulation.class.getName() }); } @@ -529,38 +539,4 @@ public static void main(String[] args) throws CommandLine.ConfigurationException new TestSimulationPipeline().runMelunSimulation(configPath, outputDirectory, inputPlansFile, lastIteration); } } - - private static class TestModeAvailability implements ModeAvailability { - @Override - public Collection getAvailableModes(Person person, List trips) { - Set modes = new HashSet<>(); - modes.add(TransportMode.walk); - modes.add(TransportMode.pt); - modes.add(TransportMode.car); - modes.add(TransportMode.bike); - // Add special mode "car_passenger" if applicable - Boolean isCarPassenger = (Boolean) person.getAttributes().getAttribute("isPassenger"); - if (isCarPassenger) { - modes.add("car_passenger"); - } - return modes; - } - } - - public static class TestModeChoiceConfigurator extends StandaloneModeChoiceConfigurator { - - public TestModeChoiceConfigurator(Config config, CommandLine commandLine) { - super(config, commandLine); - } - - public List getSpecificModeChoiceModules() { - return List.of(new AbstractEqasimExtension() { - @Override - public void installEqasimExtension() { - bind(ModeParameters.class); - bindModeAvailability("DefaultModeAvailability").to(TestModeAvailability.class); - } - }); - } - } } diff --git a/core/src/test/java/org/eqasim/mode_choice/TestSpecialModeChoiceCases.java b/core/src/test/java/org/eqasim/mode_choice/TestSpecialModeChoiceCases.java index b17d6977c..27c84d05b 100644 --- a/core/src/test/java/org/eqasim/mode_choice/TestSpecialModeChoiceCases.java +++ b/core/src/test/java/org/eqasim/mode_choice/TestSpecialModeChoiceCases.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; import org.apache.commons.io.FileUtils; +import org.eqasim.TestConfigurator; import org.eqasim.core.components.config.EqasimConfigGroup; import org.eqasim.core.components.raptor.EqasimRaptorConfigGroup; import org.eqasim.core.misc.InjectorBuilder; @@ -167,7 +168,7 @@ static private Set findChains(List trips, int sa EqasimConfigGroup.get(config).setEstimator("bike", EqasimModeChoiceModule.ZERO_ESTIMATOR_NAME); // Now create the model - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = new TestConfigurator(); Scenario scenario = ScenarioUtils.createScenario(config); @@ -178,17 +179,11 @@ static private Set findChains(List trips, int sa scenario.getNetwork().addNode(node); scenario.getNetwork().addLink(link); - Injector injector = new InjectorBuilder(scenario) // + // TODO: Check if we can remove stuff + Injector injector = new InjectorBuilder(scenario, configurator) // .addOverridingModules(configurator.getModules(config)) // - .addOverridingModule(new EqasimModeChoiceModule()) // .addOverridingModule(new StaticModeAvailabilityModule()) // .addOverridingModule(new TimeInterpretationModule()) // - .addOverridingModule(new AbstractModule() { - @Override - public void install() { - bind(OutputDirectoryHierarchy.class).toInstance(new OutputDirectoryHierarchy(scenario.getConfig())); - } - }) .build(); DiscreteModeChoiceModel model = injector.getInstance(DiscreteModeChoiceModel.class); diff --git a/examples/src/main/java/org/eqasim/examples/corsica_drt/RunCorsicaDrtSimulation.java b/examples/src/main/java/org/eqasim/examples/corsica_drt/RunCorsicaDrtSimulation.java index a8a88cc10..443a27405 100644 --- a/examples/src/main/java/org/eqasim/examples/corsica_drt/RunCorsicaDrtSimulation.java +++ b/examples/src/main/java/org/eqasim/examples/corsica_drt/RunCorsicaDrtSimulation.java @@ -7,14 +7,11 @@ import org.eqasim.core.components.config.EqasimConfigGroup; import org.eqasim.core.components.transit.EqasimTransitQSimModule; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; import org.eqasim.core.simulation.modes.drt.analysis.DrtAnalysisModule; import org.eqasim.examples.corsica_drt.mode_choice.CorsicaDrtModeAvailability; import org.eqasim.examples.corsica_drt.rejections.RejectionConstraint; import org.eqasim.examples.corsica_drt.rejections.RejectionModule; import org.eqasim.ile_de_france.IDFConfigurator; -import org.eqasim.ile_de_france.mode_choice.IDFModeChoiceModule; import org.matsim.api.core.v01.Scenario; import org.matsim.contrib.drt.optimizer.constraints.DefaultDrtOptimizationConstraintsSet; import org.matsim.contrib.drt.optimizer.insertion.DrtInsertionSearchParams; @@ -55,7 +52,7 @@ static public void main(String[] args) throws ConfigurationException { .build(); URL configUrl = Resources.getResource("corsica/corsica_config.xml"); - IDFConfigurator configurator = new IDFConfigurator(); + IDFConfigurator configurator = new IDFConfigurator(cmd); Config config = ConfigUtils.loadConfig(configUrl); configurator.updateConfig(config); @@ -142,9 +139,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimAnalysisModule()); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new IDFModeChoiceModule(cmd)); { // Configure controller for DRT controller.configureQSimComponents(components -> { diff --git a/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFEngineSimulation.java b/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFEngineSimulation.java index aa48c8419..04c6d218c 100644 --- a/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFEngineSimulation.java +++ b/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFEngineSimulation.java @@ -4,12 +4,9 @@ import java.util.HashSet; import java.util.Set; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; import org.eqasim.core.simulation.vdf.VDFConfigGroup; import org.eqasim.core.simulation.vdf.engine.VDFEngineConfigGroup; import org.eqasim.ile_de_france.IDFConfigurator; -import org.eqasim.ile_de_france.mode_choice.IDFModeChoiceModule; import org.matsim.api.core.v01.Scenario; import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; @@ -30,7 +27,7 @@ static public void main(String[] args) throws ConfigurationException { .allowPrefixes("mode-parameter", "cost-parameter") // .build(); - IDFConfigurator configurator = new IDFConfigurator(); + IDFConfigurator configurator = new IDFConfigurator(cmd); URL configUrl = Resources.getResource("corsica/corsica_config.xml"); Config config = ConfigUtils.loadConfig(configUrl); @@ -69,9 +66,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimAnalysisModule()); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new IDFModeChoiceModule(cmd)); controller.run(); } diff --git a/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFSimulation.java b/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFSimulation.java index dadf66e8e..74aa6383e 100644 --- a/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFSimulation.java +++ b/examples/src/main/java/org/eqasim/examples/corsica_vdf/RunCorsicaVDFSimulation.java @@ -2,11 +2,8 @@ import java.net.URL; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; import org.eqasim.core.simulation.vdf.VDFConfigGroup; import org.eqasim.ile_de_france.IDFConfigurator; -import org.eqasim.ile_de_france.mode_choice.IDFModeChoiceModule; import org.matsim.api.core.v01.Scenario; import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; @@ -27,7 +24,7 @@ static public void main(String[] args) throws ConfigurationException { .allowPrefixes("mode-parameter", "cost-parameter") // .build(); - IDFConfigurator configurator = new IDFConfigurator(); + IDFConfigurator configurator = new IDFConfigurator(cmd); URL configUrl = Resources.getResource("corsica/corsica_config.xml"); Config config = ConfigUtils.loadConfig(configUrl); @@ -52,9 +49,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimAnalysisModule()); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new IDFModeChoiceModule(cmd)); controller.run(); } diff --git a/ile_de_france/src/main/java/org/eqasim/ile_de_france/IDFConfigurator.java b/ile_de_france/src/main/java/org/eqasim/ile_de_france/IDFConfigurator.java index db1a5f5cc..9318dbb53 100644 --- a/ile_de_france/src/main/java/org/eqasim/ile_de_france/IDFConfigurator.java +++ b/ile_de_france/src/main/java/org/eqasim/ile_de_france/IDFConfigurator.java @@ -1,12 +1,16 @@ package org.eqasim.ile_de_france; import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.ile_de_france.mode_choice.IDFModeChoiceModule; import org.eqasim.ile_de_france.policies.PoliciesConfigGroup; +import org.matsim.core.config.CommandLine; public class IDFConfigurator extends EqasimConfigurator { - public IDFConfigurator() { - super(); + public IDFConfigurator(CommandLine cmd) { + super(cmd); registerConfigGroup(new PoliciesConfigGroup(), true); + + registerModule(new IDFModeChoiceModule(cmd)); } } diff --git a/ile_de_france/src/main/java/org/eqasim/ile_de_france/IDFStandaloneModeChoiceConfigurator.java b/ile_de_france/src/main/java/org/eqasim/ile_de_france/IDFStandaloneModeChoiceConfigurator.java deleted file mode 100644 index c8d82f774..000000000 --- a/ile_de_france/src/main/java/org/eqasim/ile_de_france/IDFStandaloneModeChoiceConfigurator.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.eqasim.ile_de_france; - -import org.eqasim.core.standalone_mode_choice.StandaloneModeChoiceConfigurator; -import org.eqasim.ile_de_france.mode_choice.IDFModeChoiceModule; -import org.matsim.core.config.CommandLine; -import org.matsim.core.config.Config; -import org.matsim.core.controler.AbstractModule; - -import java.util.List; - -public class IDFStandaloneModeChoiceConfigurator extends StandaloneModeChoiceConfigurator { - public IDFStandaloneModeChoiceConfigurator(Config config, CommandLine commandLine) { - super(config, commandLine); - } - - protected List getSpecificModeChoiceModules() { - return List.of(new IDFModeChoiceModule(this.getCommandLine())); - } -} diff --git a/ile_de_france/src/main/java/org/eqasim/ile_de_france/RunSimulation.java b/ile_de_france/src/main/java/org/eqasim/ile_de_france/RunSimulation.java index f5234accb..a60b6ff59 100644 --- a/ile_de_france/src/main/java/org/eqasim/ile_de_france/RunSimulation.java +++ b/ile_de_france/src/main/java/org/eqasim/ile_de_france/RunSimulation.java @@ -1,9 +1,6 @@ package org.eqasim.ile_de_france; import org.eqasim.core.scenario.validation.VehiclesValidator; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; -import org.eqasim.ile_de_france.mode_choice.IDFModeChoiceModule; import org.eqasim.ile_de_france.policies.PolicyExtension; import org.matsim.api.core.v01.Scenario; import org.matsim.core.config.CommandLine; @@ -20,9 +17,10 @@ static public void main(String[] args) throws ConfigurationException { .allowPrefixes("mode-choice-parameter", "cost-parameter") // .build(); - IDFConfigurator configurator = new IDFConfigurator(); + IDFConfigurator configurator = new IDFConfigurator(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); + cmd.applyConfiguration(config); VehiclesValidator.validate(config); @@ -36,9 +34,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimAnalysisModule()); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new IDFModeChoiceModule(cmd)); controller.addOverridingModule(policies); controller.run(); } diff --git a/ile_de_france/src/main/java/org/eqasim/ile_de_france/scenario/RunAdaptConfig.java b/ile_de_france/src/main/java/org/eqasim/ile_de_france/scenario/RunAdaptConfig.java index c4780cae2..9f74a1933 100644 --- a/ile_de_france/src/main/java/org/eqasim/ile_de_france/scenario/RunAdaptConfig.java +++ b/ile_de_france/src/main/java/org/eqasim/ile_de_france/scenario/RunAdaptConfig.java @@ -6,6 +6,7 @@ import org.eqasim.ile_de_france.mode_choice.IDFModeChoiceModule; import org.matsim.api.core.v01.TransportMode; import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup; +import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.groups.QSimConfigGroup; @@ -14,7 +15,8 @@ public class RunAdaptConfig { static public void main(String[] args) throws ConfigurationException { - ConfigAdapter.run(args, new IDFConfigurator(), RunAdaptConfig::adaptConfiguration); + CommandLine cmd = new CommandLine.Builder(args).build(); + ConfigAdapter.run(args, new IDFConfigurator(cmd), RunAdaptConfig::adaptConfiguration); } static public void adaptConfiguration(Config config, String prefix) { diff --git a/ile_de_france/src/main/resources/eqasim.properties b/ile_de_france/src/main/resources/eqasim.properties new file mode 100644 index 000000000..3fd5b3eff --- /dev/null +++ b/ile_de_france/src/main/resources/eqasim.properties @@ -0,0 +1 @@ +configurator=org.eqasim.ile_de_france.IDFConfigurator diff --git a/ile_de_france/src/test/java/org/eqasim/ile_de_france/TestCorisica.java b/ile_de_france/src/test/java/org/eqasim/ile_de_france/TestCorisica.java index b5879616c..ef3f2549e 100644 --- a/ile_de_france/src/test/java/org/eqasim/ile_de_france/TestCorisica.java +++ b/ile_de_france/src/test/java/org/eqasim/ile_de_france/TestCorisica.java @@ -18,6 +18,7 @@ import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.events.handler.PersonDepartureEventHandler; import org.matsim.core.api.experimental.events.EventsManager; +import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; @@ -40,8 +41,9 @@ public void tearDown() throws IOException { FileUtils.deleteDirectory(new File("corsica_test")); } - private void adjustConfig() { - IDFConfigurator configurator = new IDFConfigurator(); + private void adjustConfig() throws ConfigurationException { + CommandLine cmd = new CommandLine.Builder(new String[0]).build(); + IDFConfigurator configurator = new IDFConfigurator(cmd); Config config = ConfigUtils.loadConfig("corsica_test/corsica_config.xml"); configurator.updateConfig(config); config.vehicles().setVehiclesFile("corsica_vehicles.xml.gz"); @@ -91,8 +93,7 @@ public void testCorsicaPipeline() "--write-input-csv-trips", "true", "--write-output-csv-trips", "true", "--config:standaloneModeChoice.outputDirectory", "corsica_test/mode_choice_output", - "--eqasim-configurator-class", IDFConfigurator.class.getName(), - "--mode-choice-configurator-class", IDFStandaloneModeChoiceConfigurator.class.getName(), + "--eqasim-configurator", IDFConfigurator.class.getName(), "--simulate-after", RunSimulation.class.getName() }); } @@ -105,6 +106,7 @@ public void testCorsicaPipeline() "--threads", "4", // "--prefix", "cut_", // "--output-path", "corsica_test", // + "--eqasim-configurator", IDFConfigurator.class.getName() }); Assert.assertEquals(171, countPersons("corsica_test/cut_population.xml.gz")); @@ -137,8 +139,7 @@ public void testCorsicaPipeline() "--config:standaloneModeChoice.removePersonsWithNoValidAlternatives", "true", "--write-input-csv-trips", "true", "--write-output-csv-trips", "true", - "--eqasim-configurator-class", IDFConfigurator.class.getCanonicalName(), - "--mode-choice-configurator-class", IDFStandaloneModeChoiceConfigurator.class.getCanonicalName(), + "--eqasim-configurator", IDFConfigurator.class.getCanonicalName(), "--simulate-after", RunSimulation.class.getName() }); } diff --git a/los_angeles/src/main/java/org/eqasim/los_angeles/LosAngelesConfigurator.java b/los_angeles/src/main/java/org/eqasim/los_angeles/LosAngelesConfigurator.java new file mode 100644 index 000000000..8d14e0e4b --- /dev/null +++ b/los_angeles/src/main/java/org/eqasim/los_angeles/LosAngelesConfigurator.java @@ -0,0 +1,13 @@ +package org.eqasim.los_angeles; + +import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.los_angeles.mode_choice.LosAngelesModeChoiceModule; +import org.matsim.core.config.CommandLine; + +public class LosAngelesConfigurator extends EqasimConfigurator { + public LosAngelesConfigurator(CommandLine cmd) { + super(cmd); + + registerModule(new LosAngelesModeChoiceModule(cmd)); + } +} diff --git a/los_angeles/src/main/java/org/eqasim/los_angeles/RunSimulation.java b/los_angeles/src/main/java/org/eqasim/los_angeles/RunSimulation.java index 204cf0386..aac2f42b9 100644 --- a/los_angeles/src/main/java/org/eqasim/los_angeles/RunSimulation.java +++ b/los_angeles/src/main/java/org/eqasim/los_angeles/RunSimulation.java @@ -3,9 +3,6 @@ import org.eqasim.core.analysis.DistanceUnit; import org.eqasim.core.components.config.EqasimConfigGroup; import org.eqasim.core.simulation.EqasimConfigurator; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; -import org.eqasim.los_angeles.mode_choice.LosAngelesModeChoiceModule; import org.matsim.api.core.v01.Scenario; import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; @@ -21,7 +18,7 @@ static public void main(String[] args) throws ConfigurationException { .allowPrefixes("mode-parameter", "cost-parameter") // .build(); - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = new LosAngelesConfigurator(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); EqasimConfigGroup.get(config).setAnalysisInterval(5); @@ -40,10 +37,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new LosAngelesModeChoiceModule(cmd)); - controller.addOverridingModule(new EqasimAnalysisModule()); - // controller.addOverridingModule(new CalibrationModule()); controller.run(); } } \ No newline at end of file diff --git a/los_angeles/src/main/java/org/eqasim/los_angeles/mode_choice/LosAngelesModeChoiceModule.java b/los_angeles/src/main/java/org/eqasim/los_angeles/mode_choice/LosAngelesModeChoiceModule.java index 3fc21a6f6..b40c92e10 100644 --- a/los_angeles/src/main/java/org/eqasim/los_angeles/mode_choice/LosAngelesModeChoiceModule.java +++ b/los_angeles/src/main/java/org/eqasim/los_angeles/mode_choice/LosAngelesModeChoiceModule.java @@ -59,7 +59,7 @@ protected void installEqasimExtension() { @Provides @Singleton - public LosAngelesModeParameters provideModeChoiceParameters(EqasimConfigGroup config) + public LosAngelesModeParameters provideModeChoiceParameters(EqasimConfigGroup config, CommandLine commandLine) throws IOException, ConfigurationException { LosAngelesModeParameters parameters = LosAngelesModeParameters.buildDefault(); diff --git a/los_angeles/src/main/java/org/eqasim/los_angeles/scenario/RunAdaptConfig.java b/los_angeles/src/main/java/org/eqasim/los_angeles/scenario/RunAdaptConfig.java index c379c9d5b..fba00d1a2 100644 --- a/los_angeles/src/main/java/org/eqasim/los_angeles/scenario/RunAdaptConfig.java +++ b/los_angeles/src/main/java/org/eqasim/los_angeles/scenario/RunAdaptConfig.java @@ -6,11 +6,12 @@ import org.eqasim.core.components.config.ConfigAdapter; import org.eqasim.core.components.config.EqasimConfigGroup; -import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.los_angeles.LosAngelesConfigurator; import org.eqasim.los_angeles.mode_choice.LosAngelesModeChoiceModule; import org.matsim.api.core.v01.TransportMode; import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceModel.FallbackBehaviour; import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup; +import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.groups.ScoringConfigGroup; @@ -20,7 +21,8 @@ public class RunAdaptConfig { protected final static List ACTIVITY_TYPES = Arrays.asList("business"); static public void main(String[] args) throws ConfigurationException { - ConfigAdapter.run(args, new EqasimConfigurator(), RunAdaptConfig::adaptConfiguration); + CommandLine cmd = new CommandLine.Builder(args).build(); + ConfigAdapter.run(args, new LosAngelesConfigurator(cmd), RunAdaptConfig::adaptConfiguration); } static public void adaptConfiguration(Config config, String prefix) { diff --git a/los_angeles/src/main/resources/eqasim.properties b/los_angeles/src/main/resources/eqasim.properties new file mode 100644 index 000000000..090c63940 --- /dev/null +++ b/los_angeles/src/main/resources/eqasim.properties @@ -0,0 +1 @@ +configurator=org.eqasim.los_angeles.LosAngelesConfigurator diff --git a/san_francisco/src/main/java/org/eqasim/san_francisco/RunSimulation.java b/san_francisco/src/main/java/org/eqasim/san_francisco/RunSimulation.java index 45c89b236..778a3a730 100644 --- a/san_francisco/src/main/java/org/eqasim/san_francisco/RunSimulation.java +++ b/san_francisco/src/main/java/org/eqasim/san_francisco/RunSimulation.java @@ -3,9 +3,6 @@ import org.eqasim.core.analysis.DistanceUnit; import org.eqasim.core.components.config.EqasimConfigGroup; import org.eqasim.core.simulation.EqasimConfigurator; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; -import org.eqasim.san_francisco.mode_choice.SanFranciscoModeChoiceModule; import org.matsim.api.core.v01.Scenario; import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; @@ -21,7 +18,7 @@ static public void main(String[] args) throws ConfigurationException { .allowPrefixes("mode-parameter", "cost-parameter") // .build(); - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = new SanFranciscoConfigurator(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); EqasimConfigGroup.get(config).setAnalysisInterval(5); @@ -41,10 +38,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new SanFranciscoModeChoiceModule(cmd)); - controller.addOverridingModule(new EqasimAnalysisModule()); - // controller.addOverridingModule(new CalibrationModule()); controller.run(); } } \ No newline at end of file diff --git a/san_francisco/src/main/java/org/eqasim/san_francisco/SanFranciscoConfigurator.java b/san_francisco/src/main/java/org/eqasim/san_francisco/SanFranciscoConfigurator.java new file mode 100644 index 000000000..1bd8ee726 --- /dev/null +++ b/san_francisco/src/main/java/org/eqasim/san_francisco/SanFranciscoConfigurator.java @@ -0,0 +1,13 @@ +package org.eqasim.san_francisco; + +import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.san_francisco.mode_choice.SanFranciscoModeChoiceModule; +import org.matsim.core.config.CommandLine; + +public class SanFranciscoConfigurator extends EqasimConfigurator { + public SanFranciscoConfigurator(CommandLine cmd) { + super(cmd); + + registerModule(new SanFranciscoModeChoiceModule(cmd)); + } +} diff --git a/san_francisco/src/main/java/org/eqasim/san_francisco/scenario/RunAdaptConfig.java b/san_francisco/src/main/java/org/eqasim/san_francisco/scenario/RunAdaptConfig.java index 84f7fd917..ea708ec02 100644 --- a/san_francisco/src/main/java/org/eqasim/san_francisco/scenario/RunAdaptConfig.java +++ b/san_francisco/src/main/java/org/eqasim/san_francisco/scenario/RunAdaptConfig.java @@ -6,11 +6,12 @@ import org.eqasim.core.components.config.ConfigAdapter; import org.eqasim.core.components.config.EqasimConfigGroup; -import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.san_francisco.SanFranciscoConfigurator; import org.eqasim.san_francisco.mode_choice.SanFranciscoModeChoiceModule; import org.matsim.api.core.v01.TransportMode; import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceModel.FallbackBehaviour; import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup; +import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.groups.ScoringConfigGroup; @@ -21,7 +22,8 @@ public class RunAdaptConfig { protected final static List ACTIVITY_TYPES = Arrays.asList("business"); static public void main(String[] args) throws ConfigurationException { - ConfigAdapter.run(args, new EqasimConfigurator(), RunAdaptConfig::adaptConfiguration); + CommandLine cmd = new CommandLine.Builder(args).build(); + ConfigAdapter.run(args, new SanFranciscoConfigurator(cmd), RunAdaptConfig::adaptConfiguration); } static public void adaptConfiguration(Config config, String prefix) { diff --git a/san_francisco/src/main/resources/eqasim.properties b/san_francisco/src/main/resources/eqasim.properties new file mode 100644 index 000000000..f41cbbc62 --- /dev/null +++ b/san_francisco/src/main/resources/eqasim.properties @@ -0,0 +1 @@ +configurator=org.eqasim.san_francisco.SanFranciscoConfigurator diff --git a/sao_paulo/src/main/java/org/eqasim/sao_paulo/RunSimulation.java b/sao_paulo/src/main/java/org/eqasim/sao_paulo/RunSimulation.java index 8ab5ac71d..39ea71a7d 100644 --- a/sao_paulo/src/main/java/org/eqasim/sao_paulo/RunSimulation.java +++ b/sao_paulo/src/main/java/org/eqasim/sao_paulo/RunSimulation.java @@ -4,9 +4,6 @@ import org.eqasim.core.components.config.EqasimConfigGroup; import org.eqasim.core.simulation.EqasimConfigurator; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; -import org.eqasim.sao_paulo.mode_choice.SaoPauloModeChoiceModule; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.population.Leg; import org.matsim.api.core.v01.population.Person; @@ -27,7 +24,7 @@ static public void main(String[] args) throws ConfigurationException { .allowPrefixes("mode-parameter", "cost-parameter", "already-equilibrium") // .build(); - EqasimConfigurator configurator = new EqasimConfigurator(); + EqasimConfigurator configurator = new SaoPauloConfigurator(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); EqasimConfigGroup.get(config).setAnalysisInterval(1); @@ -67,10 +64,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimAnalysisModule()); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new SaoPauloModeChoiceModule(cmd)); - controller.addOverridingModule(new EqasimAnalysisModule()); controller.run(); } } diff --git a/sao_paulo/src/main/java/org/eqasim/sao_paulo/SaoPauloConfigurator.java b/sao_paulo/src/main/java/org/eqasim/sao_paulo/SaoPauloConfigurator.java new file mode 100644 index 000000000..3085c7147 --- /dev/null +++ b/sao_paulo/src/main/java/org/eqasim/sao_paulo/SaoPauloConfigurator.java @@ -0,0 +1,13 @@ +package org.eqasim.sao_paulo; + +import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.sao_paulo.mode_choice.SaoPauloModeChoiceModule; +import org.matsim.core.config.CommandLine; + +public class SaoPauloConfigurator extends EqasimConfigurator { + public SaoPauloConfigurator(CommandLine cmd) { + super(cmd); + + registerModule(new SaoPauloModeChoiceModule(cmd)); + } +} diff --git a/sao_paulo/src/main/java/org/eqasim/sao_paulo/scenario/RunAdaptConfig.java b/sao_paulo/src/main/java/org/eqasim/sao_paulo/scenario/RunAdaptConfig.java index 551d80a69..32ba803ae 100644 --- a/sao_paulo/src/main/java/org/eqasim/sao_paulo/scenario/RunAdaptConfig.java +++ b/sao_paulo/src/main/java/org/eqasim/sao_paulo/scenario/RunAdaptConfig.java @@ -6,18 +6,20 @@ import org.eqasim.core.components.config.ConfigAdapter; import org.eqasim.core.components.config.EqasimConfigGroup; -import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.sao_paulo.SaoPauloConfigurator; import org.eqasim.sao_paulo.mode_choice.SaoPauloModeChoiceModule; import org.eqasim.sao_paulo.mode_choice.parameters.SaoPauloModeParameters; import org.matsim.api.core.v01.TransportMode; import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup; +import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; import org.matsim.core.config.Config; import org.matsim.core.config.groups.ScoringConfigGroup.ModeParams; public class RunAdaptConfig { static public void main(String[] args) throws ConfigurationException { - ConfigAdapter.run(args, new EqasimConfigurator(), RunAdaptConfig::adaptConfiguration); + CommandLine cmd = new CommandLine.Builder(args).build(); + ConfigAdapter.run(args, new SaoPauloConfigurator(cmd), RunAdaptConfig::adaptConfiguration); } static public void adaptConfiguration(Config config, String prefix) { diff --git a/sao_paulo/src/main/resources/eqasim.properties b/sao_paulo/src/main/resources/eqasim.properties new file mode 100644 index 000000000..206a74a80 --- /dev/null +++ b/sao_paulo/src/main/resources/eqasim.properties @@ -0,0 +1 @@ +configurator=org.eqasim.sao_paulo.SaoPauloConfigurator diff --git a/switzerland/src/main/java/org/eqasim/switzerland/RunSimulation.java b/switzerland/src/main/java/org/eqasim/switzerland/RunSimulation.java index 29524f7aa..3490a49a0 100644 --- a/switzerland/src/main/java/org/eqasim/switzerland/RunSimulation.java +++ b/switzerland/src/main/java/org/eqasim/switzerland/RunSimulation.java @@ -1,8 +1,5 @@ package org.eqasim.switzerland; -import org.eqasim.core.simulation.analysis.EqasimAnalysisModule; -import org.eqasim.core.simulation.mode_choice.EqasimModeChoiceModule; -import org.eqasim.switzerland.mode_choice.SwissModeChoiceModule; import org.matsim.api.core.v01.Scenario; import org.matsim.core.config.CommandLine; import org.matsim.core.config.CommandLine.ConfigurationException; @@ -21,7 +18,7 @@ static public void main(String[] args) throws ConfigurationException { .allowPrefixes("mode-parameter", "cost-parameter", "preventwaitingtoentertraffic") // .build(); - SwitzerlandConfigurator configurator = new SwitzerlandConfigurator(); + SwitzerlandConfigurator configurator = new SwitzerlandConfigurator(cmd); Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path")); configurator.updateConfig(config); cmd.applyConfiguration(config); @@ -41,10 +38,6 @@ static public void main(String[] args) throws ConfigurationException { Controler controller = new Controler(scenario); configurator.configureController(controller); - controller.addOverridingModule(new EqasimAnalysisModule()); - controller.addOverridingModule(new EqasimModeChoiceModule()); - controller.addOverridingModule(new SwissModeChoiceModule(cmd)); - controller.run(); } } diff --git a/switzerland/src/main/java/org/eqasim/switzerland/SwitzerlandConfigurator.java b/switzerland/src/main/java/org/eqasim/switzerland/SwitzerlandConfigurator.java index 2162c4b31..1a9bb2184 100644 --- a/switzerland/src/main/java/org/eqasim/switzerland/SwitzerlandConfigurator.java +++ b/switzerland/src/main/java/org/eqasim/switzerland/SwitzerlandConfigurator.java @@ -1,12 +1,20 @@ package org.eqasim.switzerland; import org.eqasim.core.simulation.EqasimConfigurator; +import org.eqasim.switzerland.mode_choice.SwissModeChoiceModule; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.population.Person; +import org.matsim.core.config.CommandLine; import org.matsim.households.Household; public class SwitzerlandConfigurator extends EqasimConfigurator { + public SwitzerlandConfigurator(CommandLine cmd) { + super(cmd); + + registerModule(new SwissModeChoiceModule(cmd)); + } + @Override public void adjustScenario(Scenario scenario) { super.adjustScenario(scenario); diff --git a/switzerland/src/main/java/org/eqasim/switzerland/scenario/RunAdaptConfig.java b/switzerland/src/main/java/org/eqasim/switzerland/scenario/RunAdaptConfig.java index 4a26b68da..a3c4dee94 100644 --- a/switzerland/src/main/java/org/eqasim/switzerland/scenario/RunAdaptConfig.java +++ b/switzerland/src/main/java/org/eqasim/switzerland/scenario/RunAdaptConfig.java @@ -6,6 +6,7 @@ import org.matsim.api.core.v01.TransportMode; import org.matsim.contribs.discrete_mode_choice.modules.config.DiscreteModeChoiceConfigGroup; import org.matsim.core.config.CommandLine.ConfigurationException; +import org.matsim.core.config.CommandLine; import org.matsim.core.config.Config; import org.matsim.core.config.groups.QSimConfigGroup; import org.matsim.core.config.groups.ReplanningConfigGroup; @@ -19,7 +20,8 @@ public class RunAdaptConfig { private static double storageCapExponent = 0.75; static public void main(String[] args) throws ConfigurationException { - SwitzerlandConfigurator configurator = new SwitzerlandConfigurator(); + CommandLine cmd = new CommandLine.Builder(args).build(); + SwitzerlandConfigurator configurator = new SwitzerlandConfigurator(cmd); SwissConfigAdapter.run(args, configurator, RunAdaptConfig::adaptConfiguration); } diff --git a/switzerland/src/main/resources/eqasim.properties b/switzerland/src/main/resources/eqasim.properties new file mode 100644 index 000000000..c33716624 --- /dev/null +++ b/switzerland/src/main/resources/eqasim.properties @@ -0,0 +1 @@ +configurator=org.eqasim.switzerland.SwitzerlandConfigurator