Skip to content

Commit a8a73b5

Browse files
authored
fix: population routing requires vehicles now (#192)
* insert vehicles for pipeline routing * add default vehicle type * clear vehicles for defaults * next try * update changelog
1 parent ffadf34 commit a8a73b5

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
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+
- fix: make compatible with downstream population pipelines
910
- Ensure outside activity id doesn't already exist
1011
- Network-based (car) routing now generates access and egress walk legs
1112
- Convert initial-routing only-walk legs to actual walk (instead of transit)

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

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,32 @@
11
package org.eqasim.core.scenario.routing;
22

3+
import java.util.HashMap;
34
import java.util.HashSet;
5+
import java.util.Map;
46
import java.util.Set;
57

68
import org.eqasim.core.misc.InjectorBuilder;
79
import org.eqasim.core.simulation.EqasimConfigurator;
10+
import org.matsim.api.core.v01.Id;
811
import org.matsim.api.core.v01.Scenario;
12+
import org.matsim.api.core.v01.population.Leg;
13+
import org.matsim.api.core.v01.population.Person;
14+
import org.matsim.api.core.v01.population.Plan;
915
import org.matsim.core.config.CommandLine;
1016
import org.matsim.core.config.CommandLine.ConfigurationException;
1117
import org.matsim.core.config.Config;
1218
import org.matsim.core.config.ConfigUtils;
19+
import org.matsim.core.config.groups.QSimConfigGroup.VehiclesSource;
1320
import org.matsim.core.population.io.PopulationWriter;
21+
import org.matsim.core.population.routes.NetworkRoute;
22+
import org.matsim.core.router.TripStructureUtils;
1423
import org.matsim.core.scenario.ScenarioUtils;
1524
import org.matsim.core.utils.timing.TimeInterpretationModule;
1625
import org.matsim.facilities.ActivityFacility;
26+
import org.matsim.vehicles.Vehicle;
27+
import org.matsim.vehicles.VehicleUtils;
28+
import org.matsim.vehicles.Vehicles;
29+
import org.matsim.vehicles.VehiclesFactory;
1730

1831
import com.google.inject.Injector;
1932

@@ -34,6 +47,7 @@ static public void main(String[] args) throws ConfigurationException, Interrupte
3447
.orElse(Runtime.getRuntime().availableProcessors());
3548

3649
Scenario scenario = ScenarioUtils.loadScenario(config);
50+
insertVehicles(config, scenario);
3751

3852
if (scenario.getActivityFacilities() != null) {
3953
for (ActivityFacility facility : scenario.getActivityFacilities().getFacilities().values()) {
@@ -54,12 +68,52 @@ static public void main(String[] args) throws ConfigurationException, Interrupte
5468
Injector injector = new InjectorBuilder(scenario) //
5569
.addOverridingModules(configurator.getModules()) //
5670
.addOverridingModule(new PopulationRouterModule(numberOfThreads, batchSize, true, modes)) //
57-
.addOverridingModule(new TimeInterpretationModule())
58-
.build();
71+
.addOverridingModule(new TimeInterpretationModule()).build();
5972

6073
PopulationRouter populationRouter = injector.getInstance(PopulationRouter.class);
6174
populationRouter.run(scenario.getPopulation());
6275

76+
clearVehicles(config, scenario);
6377
new PopulationWriter(scenario.getPopulation()).write(cmd.getOptionStrict("output-path"));
6478
}
79+
80+
static private void insertVehicles(Config config, Scenario scenario) {
81+
if (config.qsim().getVehiclesSource().equals(VehiclesSource.defaultVehicle)) {
82+
Vehicles vehicles = scenario.getVehicles();
83+
VehiclesFactory factory = vehicles.getFactory();
84+
85+
vehicles.addVehicleType(VehicleUtils.getDefaultVehicleType());
86+
87+
for (Person person : scenario.getPopulation().getPersons().values()) {
88+
Map<String, Id<Vehicle>> personVehicles = new HashMap<>();
89+
90+
for (String mode : config.plansCalcRoute().getNetworkModes()) {
91+
Vehicle vehicle = factory.createVehicle(Id.createVehicleId(person.getId().toString() + ":" + mode),
92+
VehicleUtils.getDefaultVehicleType());
93+
vehicles.addVehicle(vehicle);
94+
95+
personVehicles.put(mode, vehicle.getId());
96+
}
97+
98+
VehicleUtils.insertVehicleIdsIntoAttributes(person, personVehicles);
99+
}
100+
}
101+
}
102+
103+
static private void clearVehicles(Config config, Scenario scenario) {
104+
if (config.qsim().getVehiclesSource().equals(VehiclesSource.defaultVehicle)) {
105+
for (Person person : scenario.getPopulation().getPersons().values()) {
106+
person.getAttributes().removeAttribute("vehicles");
107+
108+
for (Plan plan : person.getPlans()) {
109+
for (Leg leg : TripStructureUtils.getLegs(plan)) {
110+
if (leg.getRoute() instanceof NetworkRoute) {
111+
NetworkRoute route = (NetworkRoute) leg.getRoute();
112+
route.setVehicleId(null);
113+
}
114+
}
115+
}
116+
}
117+
}
118+
}
65119
}

0 commit comments

Comments
 (0)