Skip to content

Commit f4265df

Browse files
authored
feat: simplify analysis with routing mode (#199)
1 parent 7fa8f3f commit f4265df

File tree

6 files changed

+33
-50
lines changed

6 files changed

+33
-50
lines changed

core/src/main/java/org/eqasim/core/analysis/run/RunTripAnalysis.java

+3-7
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
import org.matsim.core.config.ConfigUtils;
2525
import org.matsim.core.network.NetworkUtils;
2626
import org.matsim.core.network.io.MatsimNetworkReader;
27-
import org.matsim.core.router.MainModeIdentifier;
28-
import org.matsim.core.router.RoutingModeMainModeIdentifier;
2927
import org.matsim.core.scenario.ScenarioUtils;
3028
import org.matsim.facilities.ActivityFacilities;
3129
import org.matsim.facilities.MatsimFacilitiesReader;
@@ -66,8 +64,6 @@ public static void run(CommandLine cmd, PersonAnalysisFilter personAnalysisFilte
6664

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

69-
MainModeIdentifier mainModeIdentifier = new RoutingModeMainModeIdentifier();
70-
7167
Collection<String> vehicleModes = Arrays.asList(cmd.getOption("vehicle-modes").orElse("car,pt").split(","))
7268
.stream().map(s -> s.trim()).collect(Collectors.toSet());
7369

@@ -79,7 +75,7 @@ public static void run(CommandLine cmd, PersonAnalysisFilter personAnalysisFilte
7975
new MatsimNetworkReader(network).readFile(networkPath);
8076

8177
String eventsPath = cmd.getOptionStrict("events-path");
82-
TripListener tripListener = new TripListener(network, mainModeIdentifier, personAnalysisFilter);
78+
TripListener tripListener = new TripListener(network, personAnalysisFilter);
8379
trips = new TripReaderFromEvents(tripListener).readTrips(eventsPath);
8480
} else {
8581
Network network = null;
@@ -102,8 +98,8 @@ public static void run(CommandLine cmd, PersonAnalysisFilter personAnalysisFilte
10298
}
10399

104100
String populationPath = cmd.getOptionStrict("population-path");
105-
trips = new TripReaderFromPopulation(vehicleModes, mainModeIdentifier, personAnalysisFilter,
106-
Optional.ofNullable(network), Optional.ofNullable(facilities)).readTrips(populationPath);
101+
trips = new TripReaderFromPopulation(vehicleModes, personAnalysisFilter, Optional.ofNullable(network),
102+
Optional.ofNullable(facilities)).readTrips(populationPath);
107103
}
108104

109105
DistanceUnit inputUnit = DistanceUnit.valueOf(cmd.getOption("input-distance-unit").orElse("meter"));

core/src/main/java/org/eqasim/core/analysis/trips/TripListener.java

+3-13
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@
2424
import org.matsim.api.core.v01.events.handler.PersonEntersVehicleEventHandler;
2525
import org.matsim.api.core.v01.events.handler.PersonLeavesVehicleEventHandler;
2626
import org.matsim.api.core.v01.network.Network;
27-
import org.matsim.api.core.v01.population.Leg;
2827
import org.matsim.api.core.v01.population.Person;
2928
import org.matsim.api.core.v01.population.PopulationFactory;
3029
import org.matsim.core.api.experimental.events.TeleportationArrivalEvent;
3130
import org.matsim.core.api.experimental.events.handler.TeleportationArrivalEventHandler;
3231
import org.matsim.core.config.ConfigUtils;
33-
import org.matsim.core.router.MainModeIdentifier;
3432
import org.matsim.core.router.TripStructureUtils;
3533
import org.matsim.core.scenario.ScenarioUtils;
3634
import org.matsim.core.utils.geometry.CoordUtils;
@@ -39,7 +37,6 @@
3937
public class TripListener implements ActivityStartEventHandler, ActivityEndEventHandler, PersonDepartureEventHandler,
4038
PersonEntersVehicleEventHandler, PersonLeavesVehicleEventHandler, LinkEnterEventHandler,
4139
TeleportationArrivalEventHandler, GenericEventHandler {
42-
final private MainModeIdentifier mainModeIdentifier;
4340
final private Network network;
4441
final private PopulationFactory factory;
4542

@@ -50,9 +47,8 @@ public class TripListener implements ActivityStartEventHandler, ActivityEndEvent
5047

5148
final private PersonAnalysisFilter personFilter;
5249

53-
public TripListener(Network network, MainModeIdentifier mainModeIdentifier, PersonAnalysisFilter personFilter) {
50+
public TripListener(Network network, PersonAnalysisFilter personFilter) {
5451
this.network = network;
55-
this.mainModeIdentifier = mainModeIdentifier;
5652
this.factory = ScenarioUtils.createScenario(ConfigUtils.createConfig()).getPopulation().getFactory();
5753
this.personFilter = personFilter;
5854
}
@@ -93,26 +89,20 @@ public void handleEvent(ActivityEndEvent event) {
9389
@Override
9490
public void handleEvent(PersonDepartureEvent event) {
9591
if (personFilter.analyzePerson(event.getPersonId())) {
96-
Leg leg = factory.createLeg(event.getLegMode());
97-
leg.setRoutingMode(event.getRoutingMode());
98-
ongoing.get(event.getPersonId()).elements.add(leg);
92+
ongoing.get(event.getPersonId()).mode = event.getRoutingMode();
9993
}
10094
}
10195

10296
@Override
10397
public void handleEvent(ActivityStartEvent event) {
10498
if (personFilter.analyzePerson(event.getPersonId())) {
105-
if (TripStructureUtils.isStageActivityType(event.getActType())) {
106-
ongoing.get(event.getPersonId()).elements
107-
.add(factory.createActivityFromLinkId(event.getActType(), event.getLinkId()));
108-
} else {
99+
if (!TripStructureUtils.isStageActivityType(event.getActType())) {
109100
TripListenerItem trip = ongoing.remove(event.getPersonId());
110101

111102
if (trip != null) {
112103
trip.returning = event.getActType().equals("home");
113104
trip.followingPurpose = event.getActType();
114105
trip.travelTime = event.getTime() - trip.departureTime;
115-
trip.mode = mainModeIdentifier.identifyMainMode(trip.elements);
116106
trip.destination = network.getLinks().get(event.getLinkId()).getCoord();
117107
trip.euclideanDistance = CoordUtils.calcEuclideanDistance(trip.origin, trip.destination);
118108

core/src/main/java/org/eqasim/core/analysis/trips/TripListenerItem.java

-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
package org.eqasim.core.analysis.trips;
22

3-
import java.util.LinkedList;
4-
import java.util.List;
5-
63
import org.matsim.api.core.v01.Coord;
74
import org.matsim.api.core.v01.Id;
85
import org.matsim.api.core.v01.population.Person;
9-
import org.matsim.api.core.v01.population.PlanElement;
106

117
public class TripListenerItem extends TripItem {
12-
public List<PlanElement> elements = new LinkedList<>();
138
public double lastAddedLinkDistance = 0.0;
149

1510
public TripListenerItem(Id<Person> personId, int personTripId, Coord origin, double startTime,

core/src/main/java/org/eqasim/core/analysis/trips/TripReaderFromPopulation.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.matsim.core.config.Config;
1919
import org.matsim.core.config.ConfigUtils;
2020
import org.matsim.core.population.io.PopulationReader;
21-
import org.matsim.core.router.MainModeIdentifier;
2221
import org.matsim.core.router.TripStructureUtils;
2322
import org.matsim.core.scenario.ScenarioUtils;
2423
import org.matsim.core.utils.geometry.CoordUtils;
@@ -28,15 +27,13 @@
2827

2928
public class TripReaderFromPopulation {
3029
final private Collection<String> networkModes;
31-
final private MainModeIdentifier mainModeIdentifier;
3230
final private PersonAnalysisFilter personFilter;
3331
final private Optional<Network> network;
3432
final private Optional<ActivityFacilities> facilities;
3533

36-
public TripReaderFromPopulation(Collection<String> networkModes, MainModeIdentifier mainModeIdentifier,
37-
PersonAnalysisFilter personFilter, Optional<Network> network, Optional<ActivityFacilities> facilities) {
34+
public TripReaderFromPopulation(Collection<String> networkModes, PersonAnalysisFilter personFilter,
35+
Optional<Network> network, Optional<ActivityFacilities> facilities) {
3836
this.networkModes = networkModes;
39-
this.mainModeIdentifier = mainModeIdentifier;
4037
this.personFilter = personFilter;
4138
this.network = network;
4239
this.facilities = facilities;
@@ -109,7 +106,7 @@ public Collection<TripItem> readTrips(Population population) {
109106

110107
tripItems.add(new TripItem(person.getId(), personTripIndex, originCoord, destinationCoord,
111108
departureTime, duration, getVehicleDistance(trip), getRoutedDistance(trip),
112-
mainModeIdentifier.identifyMainMode(trip.getTripElements()),
109+
TripStructureUtils.getRoutingMode(trip.getLegsOnly().get(0)),
113110
trip.getOriginActivity().getType(), trip.getDestinationActivity().getType(), isHomeTrip,
114111
CoordUtils.calcEuclideanDistance(originCoord, destinationCoord)));
115112

core/src/main/java/org/eqasim/core/simulation/analysis/EqasimAnalysisModule.java

+7-9
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,33 @@
1010
import org.matsim.api.core.v01.network.Network;
1111
import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup;
1212
import org.matsim.core.controler.AbstractModule;
13-
import org.matsim.core.router.MainModeIdentifier;
1413
import org.matsim.pt.transitSchedule.api.TransitSchedule;
1514

1615
import com.google.inject.Provides;
1716
import com.google.inject.Singleton;
1817

19-
2018
public class EqasimAnalysisModule extends AbstractModule {
2119
@Override
2220
public void install() {
2321
addControlerListenerBinding().to(AnalysisOutputListener.class);
24-
25-
if(getConfig().getModules().containsKey(MultiModeDrtConfigGroup.GROUP_NAME)) {
22+
23+
if (getConfig().getModules().containsKey(MultiModeDrtConfigGroup.GROUP_NAME)) {
2624
install(new DrtAnalysisModule());
2725
} else {
28-
// Would be better if there was a way to add the module above as an overriding module from this method.
26+
// Would be better if there was a way to add the module above as an overriding
27+
// module from this method.
2928
// That way we could simply bind the two classes below before the if clause
3029
bind(DefaultPersonAnalysisFilter.class);
3130
bind(PersonAnalysisFilter.class).to(DefaultPersonAnalysisFilter.class);
3231
}
33-
32+
3433
install(new StuckAnalysisModule());
3534
}
3635

3736
@Provides
3837
@Singleton
39-
public TripListener provideTripListener(Network network, MainModeIdentifier mainModeIdentifier,
40-
PersonAnalysisFilter personFilter) {
41-
return new TripListener(network, mainModeIdentifier, personFilter);
38+
public TripListener provideTripListener(Network network, PersonAnalysisFilter personFilter) {
39+
return new TripListener(network, personFilter);
4240
}
4341

4442
@Provides

ile_de_france/src/main/java/org/eqasim/ile_de_france/standalone_mode_choice/RunStandaloneModeChoice.java

+17-10
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
package org.eqasim.ile_de_france.standalone_mode_choice;
22

33

4-
import com.google.inject.Key;
5-
import com.google.inject.Provides;
6-
import com.google.inject.Singleton;
7-
import com.google.inject.name.Names;
4+
import java.io.BufferedReader;
5+
import java.io.FileInputStream;
6+
import java.io.IOException;
7+
import java.io.InputStream;
8+
import java.io.InputStreamReader;
9+
import java.nio.file.Paths;
10+
import java.util.ArrayList;
11+
import java.util.Arrays;
12+
import java.util.Collection;
13+
import java.util.List;
14+
import java.util.Optional;
15+
816
import org.eqasim.core.analysis.DefaultPersonAnalysisFilter;
917
import org.eqasim.core.analysis.DistanceUnit;
1018
import org.eqasim.core.analysis.PersonAnalysisFilter;
@@ -31,19 +39,18 @@
3139
import org.matsim.core.config.ConfigGroup;
3240
import org.matsim.core.config.ConfigUtils;
3341
import org.matsim.core.controler.AbstractModule;
34-
import org.matsim.core.controler.Controler;
3542
import org.matsim.core.controler.OutputDirectoryHierarchy;
36-
import org.matsim.core.router.MainModeIdentifier;
3743
import org.matsim.core.router.util.TravelTime;
3844
import org.matsim.core.scenario.ScenarioUtils;
3945
import org.matsim.core.trafficmonitoring.FreeSpeedTravelTime;
4046
import org.matsim.core.utils.timing.TimeInterpretationModule;
4147
import org.matsim.pt.transitSchedule.api.TransitSchedule;
4248
import org.matsim.vehicles.Vehicle;
4349

44-
import java.io.*;
45-
import java.nio.file.Paths;
46-
import java.util.*;
50+
import com.google.inject.Key;
51+
import com.google.inject.Provides;
52+
import com.google.inject.Singleton;
53+
import com.google.inject.name.Names;
4754

4855
/**
4956
* This class offers the functionality of running the discrete mode choice model on the whole population without having to go through the whole iterative MATSim process. It is also possible to filter-out the persons that do not have a valid alternative.
@@ -226,7 +233,7 @@ RecordedTravelTime provideRecordedTravelTime() {
226233

227234
Population population = injector.getInstance(Population.class);
228235
// We initialize the TripReaderFromPopulation here as we might need it just below
229-
TripReaderFromPopulation tripReader = new TripReaderFromPopulation(Arrays.asList("car,pt".split(",")), injector.getInstance(MainModeIdentifier.class), injector.getInstance(PersonAnalysisFilter.class), Optional.empty(), Optional.empty());
236+
TripReaderFromPopulation tripReader = new TripReaderFromPopulation(Arrays.asList("car,pt".split(",")), injector.getInstance(PersonAnalysisFilter.class), Optional.empty(), Optional.empty());
230237
PublicTransportLegReaderFromPopulation ptLegReader = new PublicTransportLegReaderFromPopulation(injector.getInstance(TransitSchedule.class), injector.getInstance(PersonAnalysisFilter.class));
231238
OutputDirectoryHierarchy outputDirectoryHierarchy = injector.getInstance(Key.get(OutputDirectoryHierarchy.class, Names.named("StandaloneModeChoice")));
232239

0 commit comments

Comments
 (0)