Skip to content

Commit 9fab628

Browse files
authored
add multi-stage taxi trip to SaoPauloTaxiPredictor (#194)
* add multi-stage taxi trip * fix wrong parameters * update changelog
1 parent a8a73b5 commit 9fab628

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
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+
- Add support for multi-stage taxi trips in Sao Paulo
910
- fix: make compatible with downstream population pipelines
1011
- Ensure outside activity id doesn't already exist
1112
- Network-based (car) routing now generates access and egress walk legs

sao_paulo/src/main/java/org/eqasim/sao_paulo/mode_choice/utilities/predictors/SaoPauloTaxiPredictor.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,51 @@
66
import org.eqasim.core.simulation.mode_choice.utilities.predictors.CachedVariablePredictor;
77
import org.eqasim.core.simulation.mode_choice.utilities.predictors.PredictorUtils;
88
import org.eqasim.sao_paulo.mode_choice.utilities.variables.TaxiVariables;
9+
import org.matsim.api.core.v01.TransportMode;
910
import org.matsim.api.core.v01.population.Leg;
1011
import org.matsim.api.core.v01.population.Person;
1112
import org.matsim.api.core.v01.population.PlanElement;
1213
import org.matsim.contribs.discrete_mode_choice.model.DiscreteModeChoiceTrip;
14+
import org.matsim.core.router.TripStructureUtils;
1315

16+
import com.google.common.base.Verify;
1417
import com.google.inject.Inject;
1518
import com.google.inject.name.Named;
1619

1720
public class SaoPauloTaxiPredictor extends CachedVariablePredictor<TaxiVariables> {
1821
private final CostModel costModel;
22+
1923

2024
@Inject
2125
public SaoPauloTaxiPredictor(@Named("taxi") CostModel costModel) {
2226
this.costModel = costModel;
27+
2328
}
2429

2530
@Override
2631
public TaxiVariables predict(Person person, DiscreteModeChoiceTrip trip, List<? extends PlanElement> elements) {
27-
if (elements.size() > 1) {
28-
throw new IllegalStateException("We do not support multi-stage taxi trips yet.");
32+
33+
double taxiTravelTime_min = 0;
34+
double accessEgressTime_min = 0;
35+
36+
boolean foundTaxi = false;
37+
38+
for (Leg leg : TripStructureUtils.getLegs(elements)) {
39+
if (leg.getMode().equals(TransportMode.taxi)) {
40+
Verify.verify(!foundTaxi);
41+
taxiTravelTime_min += leg.getTravelTime().seconds() / 60.0;
42+
} else if (leg.getMode().equals(TransportMode.walk)) {
43+
accessEgressTime_min += leg.getTravelTime().seconds() / 60.0;
44+
} else {
45+
throw new IllegalStateException("Unexpected mode in taxi chain: " + leg.getMode());
46+
}
2947
}
3048

31-
Leg leg = (Leg) elements.get(0);
32-
33-
double travelTime_min = leg.getTravelTime().seconds() / 60.0;
49+
3450
double cost_MU = costModel.calculateCost_MU(person, trip, elements);
35-
3651
double euclideanDistance_km = PredictorUtils.calculateEuclideanDistance_km(trip);
37-
double accessEgressTime_min = 0;// parameters.car.constantAccessEgressWalkTime_min;
52+
3853

39-
return new TaxiVariables(travelTime_min, cost_MU, euclideanDistance_km, accessEgressTime_min);
54+
return new TaxiVariables(taxiTravelTime_min, cost_MU, euclideanDistance_km, accessEgressTime_min);
4055
}
4156
}

0 commit comments

Comments
 (0)