Skip to content

Commit 3608c7d

Browse files
committed
Merge branch 'develop' into feat/model-2024
2 parents 511ff54 + d73625f commit 3608c7d

File tree

47 files changed

+471
-368
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+471
-368
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ included in the (note yet determined) next version number.
66

77
**Development version**
88

9+
- Introduce `travelTimeRecordingInterval` config option that decouples travel time writing from general analysis
910
- Add eqasim_activities.csv for analysis
1011
- The cutters now take a GeoPackage file as an alterative to a ShapeFile
1112
- Emissions tools have been moved to core package (from ile_de_france)

core/src/main/java/org/eqasim/core/components/config/ConfigAdapter.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ static public void run(String[] args, EqasimConfigurator configurator, ConfigAda
1414
.requireOptions("input-path", "output-path", "prefix") //
1515
.build();
1616

17-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("input-path"), configurator.getConfigGroups());
18-
configurator.addOptionalConfigGroups(config);
17+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("input-path"));
18+
configurator.updateConfig(config);
1919
adapter.accept(config, cmd.getOptionStrict("prefix"));
2020

2121
new ConfigWriter(config).write(cmd.getOptionStrict("output-path"));

core/src/main/java/org/eqasim/core/components/config/EqasimConfigGroup.java

+14
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public class EqasimConfigGroup extends ReflectiveConfigGroup {
2222

2323
private final static String ANALYSIS_INTERVAL = "analysisInterval";
2424
private final static String ANALYSIS_DISTANCE_UNIT = "analysisDistanceUnit";
25+
26+
private final static String TRAVEL_TIME_RECORDING_INTERVAL = "travelTimeRecordingInterval";
2527

2628
private final static String USE_SCHEDULE_BASED_TRANSPORT = "useScheduleBasedTransport";
2729

@@ -35,6 +37,8 @@ public class EqasimConfigGroup extends ReflectiveConfigGroup {
3537

3638
private int analysisInterval = 0;
3739
private DistanceUnit analysisDistanceUnit = DistanceUnit.meter;
40+
41+
private int travelTimeRecordingInterval = 0;
3842

3943
private boolean useScheduleBasedTransport = true;
4044

@@ -208,6 +212,16 @@ public void setAnalysisInterval(int analysisInterval) {
208212
this.analysisInterval = analysisInterval;
209213
}
210214

215+
@StringGetter(TRAVEL_TIME_RECORDING_INTERVAL)
216+
public int getTravelTimeRecordingInterval() {
217+
return travelTimeRecordingInterval;
218+
}
219+
220+
@StringSetter(TRAVEL_TIME_RECORDING_INTERVAL)
221+
public void setTravelTimeRecordingInterval(int travelTimeRecordingInterval) {
222+
this.travelTimeRecordingInterval = travelTimeRecordingInterval;
223+
}
224+
211225
@StringGetter(DISTANCE_UNIT)
212226
public DistanceUnit getDistanceUnit() {
213227
return distanceUnit;

core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsEvents.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.eqasim.core.components.emissions;
22

3-
import org.apache.commons.lang3.ArrayUtils;
43
import org.apache.commons.lang3.StringUtils;
54
import org.eqasim.core.misc.ClassUtils;
65
import org.eqasim.core.simulation.EqasimConfigurator;
@@ -13,7 +12,6 @@
1312
import org.matsim.core.api.experimental.events.EventsManager;
1413
import org.matsim.core.config.CommandLine;
1514
import org.matsim.core.config.Config;
16-
import org.matsim.core.config.ConfigGroup;
1715
import org.matsim.core.config.ConfigUtils;
1816
import org.matsim.core.controler.AbstractModule;
1917
import org.matsim.core.controler.Injector;
@@ -39,9 +37,9 @@ public static void main(String[] args) throws CommandLine.ConfigurationException
3937
configurator = new EqasimConfigurator();
4038
}
4139

42-
ConfigGroup[] configGroups = ArrayUtils.addAll(configurator.getConfigGroups(), new EmissionsConfigGroup());
43-
44-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configGroups);
40+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
41+
configurator.registerConfigGroup(new EmissionsConfigGroup(), false);
42+
configurator.updateConfig(config);
4543
cmd.applyConfiguration(config);
4644

4745
EmissionsConfigGroup emissionsConfig = (EmissionsConfigGroup) config.getModules().get("emissions");

core/src/main/java/org/eqasim/core/components/emissions/RunComputeEmissionsGrid.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package org.eqasim.core.components.emissions;
22

3-
import org.apache.commons.lang3.ArrayUtils;
43
import org.eqasim.core.misc.ClassUtils;
54
import org.eqasim.core.simulation.EqasimConfigurator;
65
import org.geotools.api.feature.simple.SimpleFeature;
76
import org.locationtech.jts.geom.Geometry;
87
import org.matsim.api.core.v01.network.Network;
98
import org.matsim.contrib.emissions.analysis.EmissionGridAnalyzer;
10-
import org.matsim.contrib.emissions.utils.EmissionsConfigGroup;
119
import org.matsim.core.config.CommandLine;
1210
import org.matsim.core.config.Config;
13-
import org.matsim.core.config.ConfigGroup;
1411
import org.matsim.core.config.ConfigUtils;
1512
import org.matsim.core.network.NetworkUtils;
1613
import org.matsim.core.network.io.MatsimNetworkReader;
@@ -32,9 +29,8 @@ public static void main(String[] args) throws CommandLine.ConfigurationException
3229
configurator = new EqasimConfigurator();
3330
}
3431

35-
ConfigGroup[] configGroups = ArrayUtils.addAll(configurator.getConfigGroups(), new EmissionsConfigGroup());
36-
37-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configGroups);
32+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
33+
configurator.updateConfig(config);
3834
cmd.applyConfiguration(config);
3935
final String outputDirectory = config.controller().getOutputDirectory() + "/";
4036

core/src/main/java/org/eqasim/core/components/emissions/RunExportEmissionsNetwork.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import java.util.List;
77
import java.util.Map;
88

9-
import org.apache.commons.lang3.ArrayUtils;
109
import org.eqasim.core.misc.ClassUtils;
1110
import org.eqasim.core.simulation.EqasimConfigurator;
1211
import org.geotools.api.feature.simple.SimpleFeature;
@@ -19,11 +18,9 @@
1918
import org.matsim.contrib.emissions.analysis.EmissionsByPollutant;
2019
import org.matsim.contrib.emissions.analysis.EmissionsOnLinkEventHandler;
2120
import org.matsim.contrib.emissions.events.EmissionEventsReader;
22-
import org.matsim.contrib.emissions.utils.EmissionsConfigGroup;
2321
import org.matsim.core.api.experimental.events.EventsManager;
2422
import org.matsim.core.config.CommandLine;
2523
import org.matsim.core.config.Config;
26-
import org.matsim.core.config.ConfigGroup;
2724
import org.matsim.core.config.ConfigUtils;
2825
import org.matsim.core.events.EventsUtils;
2926
import org.matsim.core.network.NetworkUtils;
@@ -49,9 +46,8 @@ public static void main(String[] args) throws CommandLine.ConfigurationException
4946
configurator = new EqasimConfigurator();
5047
}
5148

52-
ConfigGroup[] configGroups = ArrayUtils.addAll(configurator.getConfigGroups(), new EmissionsConfigGroup());
53-
54-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configGroups);
49+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
50+
configurator.updateConfig(config);
5551
cmd.applyConfiguration(config);
5652
final String outputDirectory = config.controller().getOutputDirectory() + "/";
5753

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.eqasim.core.components.traffic;
2+
3+
import org.matsim.api.core.v01.network.Link;
4+
import org.matsim.core.mobsim.qsim.qnetsimengine.QVehicle;
5+
6+
public class DefaultEqasimLinkSpeedCalculator implements EqasimLinkSpeedCalculator {
7+
private final CrossingPenalty crossingPenalty;
8+
9+
public DefaultEqasimLinkSpeedCalculator(CrossingPenalty crossingPenalty) {
10+
this.crossingPenalty = crossingPenalty;
11+
}
12+
13+
@Override
14+
public double getMaximumVelocity(QVehicle vehicle, Link link, double time) {
15+
double maximumVelocity = Math.min(vehicle.getMaximumVelocity(), link.getFreespeed(time));
16+
double travelTime = link.getLength() / maximumVelocity;
17+
travelTime += crossingPenalty.calculateCrossingPenalty(link);
18+
return link.getLength() / travelTime;
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,6 @@
11
package org.eqasim.core.components.traffic;
22

3-
import org.matsim.api.core.v01.network.Link;
4-
import org.matsim.core.mobsim.qsim.qnetsimengine.QVehicle;
53
import org.matsim.core.mobsim.qsim.qnetsimengine.linkspeedcalculator.LinkSpeedCalculator;
64

7-
public class EqasimLinkSpeedCalculator implements LinkSpeedCalculator {
8-
private final CrossingPenalty crossingPenalty;
9-
10-
public EqasimLinkSpeedCalculator(CrossingPenalty crossingPenalty) {
11-
this.crossingPenalty = crossingPenalty;
12-
}
13-
14-
@Override
15-
public double getMaximumVelocity(QVehicle vehicle, Link link, double time) {
16-
double maximumVelocity = Math.min(vehicle.getMaximumVelocity(), link.getFreespeed(time));
17-
double travelTime = link.getLength() / maximumVelocity;
18-
travelTime += crossingPenalty.calculateCrossingPenalty(link);
19-
return link.getLength() / travelTime;
20-
}
5+
public interface EqasimLinkSpeedCalculator extends LinkSpeedCalculator {
216
}

core/src/main/java/org/eqasim/core/components/traffic/EqasimTrafficQSimModule.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ public class EqasimTrafficQSimModule extends AbstractQSimModule {
99
@Override
1010
protected void configureQSim() {
1111
addLinkSpeedCalculator().to(EqasimLinkSpeedCalculator.class);
12+
bind(EqasimLinkSpeedCalculator.class).to(DefaultEqasimLinkSpeedCalculator.class);
1213
}
1314

1415
@Provides
1516
@Singleton
16-
public EqasimLinkSpeedCalculator provideBaselineLinkSpeedCalculator(CrossingPenalty crossigPenalty) {
17-
return new EqasimLinkSpeedCalculator(crossigPenalty);
17+
public DefaultEqasimLinkSpeedCalculator provideDefaultEqasimLinkSpeedCalculator(CrossingPenalty crossigPenalty) {
18+
return new DefaultEqasimLinkSpeedCalculator(crossigPenalty);
1819
}
1920
}

core/src/main/java/org/eqasim/core/scenario/config/RunGenerateConfig.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ static public void main(String[] args) throws ConfigurationException {
1515
.build();
1616

1717
EqasimConfigurator configurator = new EqasimConfigurator();
18-
Config config = ConfigUtils.createConfig(configurator.getConfigGroups());
18+
Config config = ConfigUtils.createConfig();
19+
configurator.updateConfig(config);
1920

2021
String prefix = cmd.getOptionStrict("prefix");
2122
double sampleSize = Double.parseDouble(cmd.getOptionStrict("sample-size"));

core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutter.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import org.eqasim.core.scenario.validation.VehiclesValidator;
3232
import org.eqasim.core.simulation.EqasimConfigurator;
3333
import org.eqasim.core.simulation.mode_choice.AbstractEqasimExtension;
34-
import org.eqasim.core.simulation.termination.EqasimTerminationModule;
34+
import org.eqasim.core.simulation.termination.EqasimTerminationConfigGroup;
3535
import org.matsim.api.core.v01.Scenario;
3636
import org.matsim.contribs.discrete_mode_choice.modules.DiscreteModeChoiceModule;
3737
import org.matsim.core.config.CommandLine;
@@ -71,9 +71,9 @@ static public void main(String[] args) throws ConfigurationException, IOExceptio
7171

7272
// Load scenario
7373
EqasimConfigurator configurator = new EqasimConfigurator();
74-
configurator.getModules().removeIf(m -> m instanceof EqasimTerminationModule);
75-
76-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configurator.getConfigGroups());
74+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
75+
configurator.updateConfig(config);
76+
config.removeModule(EqasimTerminationConfigGroup.GROUP_NAME);
7777
cmd.applyConfiguration(config);
7878

7979
VehiclesValidator.validate(config);
@@ -111,7 +111,7 @@ static public void main(String[] args) throws ConfigurationException, IOExceptio
111111

112112
// Cut population
113113
Injector populationCutterInjector = new InjectorBuilder(scenario) //
114-
.addOverridingModules(configurator.getModules().stream()
114+
.addOverridingModules(configurator.getModules(config).stream()
115115
.filter(module -> !(module instanceof AbstractEqasimExtension) && !(module instanceof DiscreteModeChoiceModule)).toList()) //
116116
.addOverridingModule(
117117
new PopulationCutterModule(extent, numberOfThreads, 40, cmd.getOption("events-path"))) //
@@ -162,14 +162,15 @@ static public void main(String[] args) throws ConfigurationException, IOExceptio
162162

163163
// "Cut" config
164164
// (we need to reload it, because it has become locked at this point)
165-
config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configurator.getConfigGroups());
165+
config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
166+
configurator.updateConfig(config);
166167
cmd.applyConfiguration(config);
167168
ConfigCutter configCutter = new ConfigCutter(prefix);
168169
configCutter.run(config);
169170

170171
// Final routing
171172
Injector routingInjector = new InjectorBuilder(scenario) //
172-
.addOverridingModules(configurator.getModules().stream()
173+
.addOverridingModules(configurator.getModules(config).stream()
173174
.filter(module -> !(module instanceof AbstractEqasimExtension) && !(module instanceof DiscreteModeChoiceModule)).toList()) //
174175
.addOverridingModule(new PopulationRouterModule(numberOfThreads, 100, false)) //
175176
.addOverridingModule(new CutterTravelTimeModule(travelTime)) //

core/src/main/java/org/eqasim/core/scenario/cutter/RunScenarioCutterV2.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ static public void main(String[] args)
4444
String outputPath = cmd.getOptionStrict("output-path");
4545

4646
EqasimConfigurator eqasimConfigurator = new EqasimConfigurator();
47-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), eqasimConfigurator.getConfigGroups());
47+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
48+
eqasimConfigurator.updateConfig(config);
4849
cmd.applyConfiguration(config);
49-
eqasimConfigurator.addOptionalConfigGroups(config);
5050

5151
if(!config.getModules().containsKey(VDFConfigGroup.GROUP_NAME) || !config.getModules().containsKey(VDFEngineConfigGroup.GROUP_NAME)) {
5252
throw new IllegalStateException(String.format("This scenario cutter only works with configs where both '%s' and '%s' modules are used", VDFConfigGroup.GROUP_NAME, VDFEngineConfigGroup.GROUP_NAME));
@@ -126,9 +126,9 @@ static public void main(String[] args)
126126

127127
// "Cut" config
128128
// (we need to reload it, because it has become locked at this point)
129-
config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), eqasimConfigurator.getConfigGroups());
129+
config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
130+
eqasimConfigurator.updateConfig(config);
130131
cmd.applyConfiguration(config);
131-
eqasimConfigurator.addOptionalConfigGroups(config);
132132
ConfigCutter configCutter = new ConfigCutter(prefix);
133133
configCutter.run(config);
134134

core/src/main/java/org/eqasim/core/scenario/routing/RunPopulationRouting.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ static public void main(String[] args) throws ConfigurationException, Interrupte
2929
.build();
3030

3131
EqasimConfigurator configurator = new EqasimConfigurator();
32-
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"), configurator.getConfigGroups());
32+
Config config = ConfigUtils.loadConfig(cmd.getOptionStrict("config-path"));
33+
configurator.updateConfig(config);
3334
config.getModules().remove(EqasimTerminationConfigGroup.GROUP_NAME);
34-
configurator.addOptionalConfigGroups(config);
3535
cmd.applyConfiguration(config);
3636
config.replanning().clearStrategySettings();
3737
VehiclesValidator.validate(config);
@@ -59,7 +59,7 @@ static public void main(String[] args) throws ConfigurationException, Interrupte
5959
}
6060

6161
Injector injector = new InjectorBuilder(scenario) //
62-
.addOverridingModules(configurator.getModules().stream()
62+
.addOverridingModules(configurator.getModules(config).stream()
6363
.filter(module -> !(module instanceof AbstractEqasimExtension)) //
6464
.filter(module -> !(module instanceof DiscreteModeChoiceModule)).toList()) //
6565
.addOverridingModule(new PopulationRouterModule(numberOfThreads, batchSize, true, modes)) //

0 commit comments

Comments
 (0)