1
- package org .eqasim .vdf .engine ;
1
+ package org .eqasim .core . simulation . vdf .engine ;
2
2
3
3
import java .util .ArrayList ;
4
4
import java .util .Collection ;
5
5
import java .util .Comparator ;
6
6
import java .util .List ;
7
7
import java .util .PriorityQueue ;
8
8
9
- import org .eqasim .vdf .handlers .VDFTrafficHandler ;
10
- import org .eqasim .vdf .travel_time .VDFTravelTime ;
9
+ import org .eqasim .core . simulation . vdf .handlers .VDFTrafficHandler ;
10
+ import org .eqasim .core . simulation . vdf .travel_time .VDFTravelTime ;
11
11
import org .matsim .api .core .v01 .Id ;
12
12
import org .matsim .api .core .v01 .events .LinkEnterEvent ;
13
13
import org .matsim .api .core .v01 .events .LinkLeaveEvent ;
@@ -56,9 +56,8 @@ public VDFEngine(Collection<String> modes, VDFTravelTime travelTime, Network net
56
56
57
57
@ Override
58
58
public boolean handleDeparture (double now , MobsimAgent agent , Id <Link > linkId ) {
59
- Leg leg = (Leg ) ((PlanAgent ) agent ).getCurrentPlanElement ();
60
-
61
- if (!modes .contains (leg .getMode ())) {
59
+ String legMode = agent .getMode ();
60
+ if (!modes .contains (legMode )) {
62
61
return false ;
63
62
}
64
63
@@ -74,13 +73,19 @@ public boolean handleDeparture(double now, MobsimAgent agent, Id<Link> linkId) {
74
73
traversal .agent = (MobsimDriverAgent ) agent ;
75
74
traversal .linkId = agent .getCurrentLinkId ();
76
75
traversal .arrivalTime = now + getTraversalTime (now , linkId , driverAgent );
77
- traversal .modeIndex = modes .indexOf (leg . getMode () );
76
+ traversal .modeIndex = modes .indexOf (legMode );
78
77
traversals .add (traversal );
79
78
80
79
eventsManager .processEvent (new VehicleEntersTrafficEvent (now , traversal .agent .getId (), traversal .linkId ,
81
80
Id .createVehicleId (agent .getId ()), modes .get (traversal .modeIndex ), 1.0 ));
82
81
} else { // We have a handler and register traversals directly
83
- NetworkRoute route = (NetworkRoute ) leg .getRoute ();
82
+ NetworkRoute route ;
83
+ if (agent instanceof PlanAgent planAgent ) {
84
+ Leg leg = (Leg ) planAgent .getCurrentPlanElement ();
85
+ route = (NetworkRoute ) leg .getRoute ();
86
+ } else {
87
+ throw new IllegalStateException ("generateNetworkEvents is set to false while some agents to be processed by the VDF engine are not planAgent instances. Set generateNetworkEvents to false to fix this" );
88
+ }
84
89
now += getTraversalTime (now , route .getStartLinkId (), driverAgent );
85
90
86
91
for (Id <Link > nextLinkId : route .getLinkIds ()) {
@@ -92,7 +97,7 @@ public boolean handleDeparture(double now, MobsimAgent agent, Id<Link> linkId) {
92
97
traversal .agent = (MobsimDriverAgent ) agent ;
93
98
traversal .linkId = route .getEndLinkId ();
94
99
traversal .arrivalTime = now ;
95
- traversal .modeIndex = modes .indexOf (leg . getMode () );
100
+ traversal .modeIndex = modes .indexOf (legMode );
96
101
traversal .distance = route .getDistance ();
97
102
traversals .add (traversal );
98
103
}
@@ -161,7 +166,12 @@ public void afterSim() {
161
166
}
162
167
163
168
double getTraversalTime (double now , Id <Link > linkId , MobsimDriverAgent agent ) {
164
- Person person = ((HasPerson ) agent ).getPerson ();
169
+ // The current VDF travel time does not need a person object.
170
+ // We just pass one to respect the interface.
171
+ Person person = null ;
172
+ if (agent instanceof HasPerson hasPerson ) {
173
+ person = hasPerson .getPerson ();
174
+ }
165
175
Vehicle vehicle = null ; // agent.getVehicle().getVehicle();
166
176
Link link = network .getLinks ().get (linkId );
167
177
0 commit comments