Skip to content

Commit d584c71

Browse files
authored
feat: improve integration of policies (#291)
* handle defaults for policies * feat: improve integration of policies * fix injection issue * fix tests and generalize discount policy * improve LTZ policy * update link list logic * write out policy-affected links * improve filtering in policies * fix for residency * limit analysis to car network * limit analysis to car network * adjust ltz logic * potential improvement * update logic * disable utility penalty * update * activity analysis * add link ids to analysis
1 parent d6c8a77 commit d584c71

File tree

61 files changed

+857
-629
lines changed

Some content is hidden

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

61 files changed

+857
-629
lines changed

core/src/main/java/org/eqasim/core/analysis/activities/ActivityItem.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.eqasim.core.analysis.activities;
22

33
import org.matsim.api.core.v01.Id;
4+
import org.matsim.api.core.v01.network.Link;
45
import org.matsim.api.core.v01.population.Person;
6+
import org.matsim.facilities.ActivityFacility;
57

68
public class ActivityItem {
79
public Id<Person> personId;
@@ -11,15 +13,19 @@ public class ActivityItem {
1113
public double endTime;
1214
public double x;
1315
public double y;
16+
public Id<ActivityFacility> facilityId;
17+
public Id<Link> linkId;
1418

1519
public ActivityItem(Id<Person> personId, int activityIndex, String purpose, double startTime, double endTime,
16-
double x, double y) {
20+
double x, double y, Id<ActivityFacility> facilityId, Id<Link> linkId) {
1721
this.personId = personId;
1822
this.activityIndex = activityIndex;
1923
this.purpose = purpose;
2024
this.startTime = startTime;
2125
this.endTime = endTime;
2226
this.x = x;
2327
this.y = y;
28+
this.facilityId = facilityId;
29+
this.linkId = linkId;
2430
}
2531
}

core/src/main/java/org/eqasim/core/analysis/activities/ActivityListener.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public void handleEvent(ActivityStartEvent event) {
4848

4949
// this is not the first one
5050
ActivityItem activity = new ActivityItem(event.getPersonId(), personActivityIndex, event.getActType(),
51-
event.getTime(), Double.POSITIVE_INFINITY, event.getCoord().getX(), event.getCoord().getY());
51+
event.getTime(), Double.POSITIVE_INFINITY, event.getCoord().getX(), event.getCoord().getY(),
52+
event.getFacilityId(), event.getLinkId());
5253

5354
activities.add(activity);
5455
ongoing.put(event.getPersonId(), activity);
@@ -67,10 +68,11 @@ public void handleEvent(ActivityEndEvent event) {
6768
// can happen for BeforeVrpSchedule activities of DRT vehicles
6869
return;
6970
}
70-
71+
7172
// this is the first one
7273
activity = new ActivityItem(event.getPersonId(), 0, event.getActType(), Double.NEGATIVE_INFINITY,
73-
event.getTime(), event.getCoord().getX(), event.getCoord().getY());
74+
event.getTime(), event.getCoord().getX(), event.getCoord().getY(), event.getFacilityId(),
75+
event.getLinkId());
7476

7577
Verify.verify(activityIndex.put(event.getPersonId(), 0) == null);
7678

core/src/main/java/org/eqasim/core/analysis/activities/ActivityReaderFromPopulation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,8 @@ public Collection<ActivityItem> readActivities(Population population) {
104104
}
105105

106106
activityItems.add(new ActivityItem(person.getId(), personActivityIndex, activity.getType(),
107-
startTime, endTime, location.getX(), location.getY()));
107+
startTime, endTime, location.getX(), location.getY(), activity.getFacilityId(),
108+
activity.getLinkId()));
108109

109110
personActivityIndex++;
110111
}

core/src/main/java/org/eqasim/core/analysis/activities/ActivityWriter.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ private String formatHeader() {
4343
"end_time", //
4444
"x", //
4545
"y", //
46+
"facility_id", //
47+
"link_id", //
4648
});
4749
}
4850

@@ -55,6 +57,8 @@ private String formatActivity(ActivityItem activity) {
5557
String.valueOf(activity.endTime), //
5658
String.valueOf(activity.x), //
5759
String.valueOf(activity.y), //
60+
activity.facilityId.toString(), //
61+
activity.linkId.toString(), //
5862
});
5963
}
6064
}

core/src/main/java/org/eqasim/core/analysis/legs/LegItem.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.matsim.api.core.v01.Coord;
44
import org.matsim.api.core.v01.Id;
5+
import org.matsim.api.core.v01.network.Link;
56
import org.matsim.api.core.v01.population.Person;
67

78
public class LegItem {
@@ -16,10 +17,12 @@ public class LegItem {
1617
public double routedDistance;
1718
public String mode;
1819
public double euclideanDistance;
20+
public Id<Link> originLinkId;
21+
public Id<Link> destinationLinkId;
1922

2023
public LegItem(Id<Person> personId, int personTripId, int legIndex, Coord origin, Coord destination,
2124
double startTime, double travelTime, double vehicleDistance, double routedDistance, String mode,
22-
double euclideanDistance) {
25+
double euclideanDistance, Id<Link> originLinkId, Id<Link> destinationLinkId) {
2326
this.personId = personId;
2427
this.personTripId = personTripId;
2528
this.legIndex = legIndex;
@@ -31,5 +34,7 @@ public LegItem(Id<Person> personId, int personTripId, int legIndex, Coord origin
3134
this.routedDistance = routedDistance;
3235
this.mode = mode;
3336
this.euclideanDistance = euclideanDistance;
37+
this.originLinkId = originLinkId;
38+
this.destinationLinkId = destinationLinkId;
3439
}
3540
}

core/src/main/java/org/eqasim/core/analysis/legs/LegListener.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public class LegListener implements ActivityStartEventHandler, ActivityEndEventH
3838
PersonEntersVehicleEventHandler, PersonLeavesVehicleEventHandler, LinkEnterEventHandler,
3939
TeleportationArrivalEventHandler, GenericEventHandler {
4040
final private Network network;
41-
final private PopulationFactory factory;
4241

4342
final private Collection<LegItem> trips = new LinkedList<>();
4443
final private Map<Id<Person>, LegListenerItem> ongoing = new HashMap<>();
@@ -50,7 +49,6 @@ public class LegListener implements ActivityStartEventHandler, ActivityEndEventH
5049

5150
public LegListener(Network network, PersonAnalysisFilter personFilter) {
5251
this.network = network;
53-
this.factory = ScenarioUtils.createScenario(ConfigUtils.createConfig()).getPopulation().getFactory();
5452
this.personFilter = personFilter;
5553
}
5654

@@ -89,7 +87,7 @@ public void handleEvent(ActivityEndEvent event) {
8987
}
9088

9189
ongoing.put(event.getPersonId(), new LegListenerItem(event.getPersonId(), personTripIndex, localLegIndex,
92-
network.getLinks().get(event.getLinkId()).getCoord()));
90+
network.getLinks().get(event.getLinkId()).getCoord(), event.getLinkId()));
9391

9492
tripIndex.put(event.getPersonId(), personTripIndex);
9593
legIndex.put(event.getPersonId(), localLegIndex);
@@ -112,11 +110,12 @@ public void handleEvent(ActivityStartEvent event) {
112110
if (leg != null) {
113111
leg.travelTime = event.getTime() - leg.departureTime;
114112
leg.destination = network.getLinks().get(event.getLinkId()).getCoord();
113+
leg.destinationLinkId = event.getLinkId();
115114
leg.euclideanDistance = CoordUtils.calcEuclideanDistance(leg.origin, leg.destination);
116115

117116
trips.add(new LegItem(leg.personId, leg.personTripId, leg.legIndex, leg.origin, leg.destination,
118117
leg.departureTime, leg.travelTime, leg.vehicleDistance, leg.routedDistance, leg.mode,
119-
leg.euclideanDistance));
118+
leg.euclideanDistance, leg.originLinkId, leg.destinationLinkId));
120119
}
121120
}
122121
}

core/src/main/java/org/eqasim/core/analysis/legs/LegListenerItem.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
import org.matsim.api.core.v01.Coord;
44
import org.matsim.api.core.v01.Id;
5+
import org.matsim.api.core.v01.network.Link;
56
import org.matsim.api.core.v01.population.Person;
67

78
public class LegListenerItem extends LegItem {
89
public double lastAddedLinkDistance = 0.0;
910

10-
public LegListenerItem(Id<Person> personId, int personTripId, int legIndex, Coord origin) {
11-
super(personId, personTripId, legIndex, origin, null, Double.NaN, Double.NaN, 0.0, 0.0, "unknown", Double.NaN);
11+
public LegListenerItem(Id<Person> personId, int personTripId, int legIndex, Coord origin, Id<Link> originLinkId) {
12+
super(personId, personTripId, legIndex, origin, null, Double.NaN, Double.NaN, 0.0, 0.0, "unknown", Double.NaN, originLinkId, null);
1213
}
1314
}

core/src/main/java/org/eqasim/core/analysis/legs/LegReaderFromPopulation.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,13 @@ public Collection<LegItem> readLegs(Population population) {
102102
double departureTime = leg.getDepartureTime().orElse(Double.NaN);
103103
double duration = leg.getTravelTime().orElse(Double.NaN);
104104

105+
Id<Link> originLinkId = precedingActivity.getLinkId();
106+
Id<Link> destinationLinkId = followingActivity.getLinkId();
107+
105108
legItems.add(new LegItem(person.getId(), personTripIndex, legIndex, originCoord,
106109
destinationCoord, departureTime, duration, getVehicleDistance(leg),
107110
getRoutedDistance(leg), leg.getMode(),
108-
CoordUtils.calcEuclideanDistance(originCoord, destinationCoord)));
111+
CoordUtils.calcEuclideanDistance(originCoord, destinationCoord), originLinkId, destinationLinkId));
109112

110113
legIndex++;
111114
}

core/src/main/java/org/eqasim/core/analysis/legs/LegWriter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ private String formatHeader() {
5454
"vehicle_distance", //
5555
"routed_distance", //
5656
"mode", //
57-
"euclidean_distance" //
57+
"euclidean_distance", //
58+
"origin_link_id", //
59+
"destination_link_id" //
5860
});
5961
}
6062

@@ -101,7 +103,9 @@ private String formatLeg(LegItem leg) {
101103
String.valueOf(leg.vehicleDistance * inputFactor * outputFactor), //
102104
String.valueOf(leg.routedDistance * inputFactor * outputFactor), //
103105
String.valueOf(leg.mode), //
104-
String.valueOf(leg.euclideanDistance * inputFactor * outputFactor) //
106+
String.valueOf(leg.euclideanDistance * inputFactor * outputFactor), //
107+
String.valueOf(leg.originLinkId), //
108+
String.valueOf(leg.destinationLinkId) //
105109
});
106110
}
107111
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.matsim.api.core.v01.Coord;
44
import org.matsim.api.core.v01.Id;
5+
import org.matsim.api.core.v01.network.Link;
56
import org.matsim.api.core.v01.population.Person;
67

78
public class TripItem {
@@ -18,10 +19,12 @@ public class TripItem {
1819
public String precedingPurpose;
1920
public boolean returning;
2021
public double euclideanDistance;
22+
public Id<Link> originLinkId;
23+
public Id<Link> destinationLinkId;
2124

2225
public TripItem(Id<Person> personId, int personTripId, Coord origin, Coord destination, double startTime,
2326
double travelTime, double vehicleDistance, double routedDistance, String mode, String precedingPurpose,
24-
String followingPurpose, boolean returning, double euclideanDistance) {
27+
String followingPurpose, boolean returning, double euclideanDistance, Id<Link> originLinkId, Id<Link> destinationLinkId) {
2528
this.personId = personId;
2629
this.personTripId = personTripId;
2730
this.origin = origin;
@@ -35,5 +38,7 @@ public TripItem(Id<Person> personId, int personTripId, Coord origin, Coord desti
3538
this.precedingPurpose = precedingPurpose;
3639
this.returning = returning;
3740
this.euclideanDistance = euclideanDistance;
41+
this.originLinkId = originLinkId;
42+
this.destinationLinkId = destinationLinkId;
3843
}
3944
}

0 commit comments

Comments
 (0)