@@ -31,7 +31,7 @@ public void testDrtSharingFactorHandler() {
3131
3232
3333 ParallelEventsManager events = new ParallelEventsManager (false );
34- SharingMetricsTracker sharingFactorTracker = new SharingMetricsTracker ();
34+ SharingMetricsTracker sharingFactorTracker = new SharingMetricsTracker (mode );
3535 events .addHandler (sharingFactorTracker );
3636
3737 events .initProcessing ();
@@ -196,4 +196,71 @@ public void testDrtSharingFactorHandler() {
196196 Assertions .assertEquals (1. , sharingFactorTracker .getSharingFactors ().get (requestId1 ), MatsimTestUtils .EPSILON );
197197 }
198198 }
199+
200+ /**
201+ * Verifies that two trackers bound to different modes each process only their own
202+ * mode's events and produce independent, correct results.
203+ * <p>
204+ * mode_A has two pooled trips (sharing factor > 1); mode_B has a single solo trip
205+ * (sharing factor = 1). Before the fix both trackers would have seen all events and
206+ * produced identical, aggregated output.
207+ */
208+ @ Test
209+ public void testSharingMetricsAreComputedPerMode () {
210+ String modeA = "drt_A" ;
211+ String modeB = "drt_B" ;
212+
213+ var vehicleA = Id .create ("vA" , DvrpVehicle .class );
214+ var vehicleB = Id .create ("vB" , DvrpVehicle .class );
215+
216+ var person1 = Id .createPersonId ("p1" );
217+ var person2 = Id .createPersonId ("p2" );
218+ var person3 = Id .createPersonId ("p3" );
219+
220+ // Two requests in mode_A overlap completely -> both are pooled, sharing factor = 2
221+ var requestA1 = Id .create ("rA1" , Request .class );
222+ var requestA2 = Id .create ("rA2" , Request .class );
223+
224+ // One solo request in mode_B -> not pooled, sharing factor = 1
225+ var requestB1 = Id .create ("rB1" , Request .class );
226+
227+ ParallelEventsManager events = new ParallelEventsManager (false );
228+
229+ SharingMetricsTracker trackerA = new SharingMetricsTracker (modeA );
230+ SharingMetricsTracker trackerB = new SharingMetricsTracker (modeB );
231+
232+ events .addHandler (trackerA );
233+ events .addHandler (trackerB );
234+ events .initProcessing ();
235+
236+ // mode_A: two requests picked up at the same time and dropped off at the same time
237+ events .processEvent (new DrtRequestSubmittedEvent (0.0 , modeA , requestA1 , List .of (person1 ), null , null , 0 , 0 , 0 , 0 , 0 , 0 , null , null ));
238+ events .processEvent (new DrtRequestSubmittedEvent (0.0 , modeA , requestA2 , List .of (person2 ), null , null , 0 , 0 , 0 , 0 , 0 , 0 , null , null ));
239+ events .processEvent (new PassengerPickedUpEvent (100.0 , modeA , requestA1 , person1 , vehicleA ));
240+ events .processEvent (new PassengerPickedUpEvent (100.0 , modeA , requestA2 , person2 , vehicleA ));
241+ events .processEvent (new PassengerDroppedOffEvent (200.0 , modeA , requestA1 , person1 , vehicleA ));
242+ events .processEvent (new PassengerDroppedOffEvent (200.0 , modeA , requestA2 , person2 , vehicleA ));
243+
244+ // mode_B: single solo trip
245+ events .processEvent (new DrtRequestSubmittedEvent (0.0 , modeB , requestB1 , List .of (person3 ), null , null , 0 , 0 , 0 , 0 , 0 , 0 , null , null ));
246+ events .processEvent (new PassengerPickedUpEvent (100.0 , modeB , requestB1 , person3 , vehicleB ));
247+ events .processEvent (new PassengerDroppedOffEvent (300.0 , modeB , requestB1 , person3 , vehicleB ));
248+
249+ events .flush ();
250+
251+ // --- trackerA: must contain exactly the two mode_A requests ---
252+ Assertions .assertEquals (2 , trackerA .getSharingFactors ().size (), "trackerA must track only mode_A requests" );
253+ Assertions .assertNull (trackerA .getSharingFactors ().get (requestB1 ), "trackerA must not contain mode_B request" );
254+ Assertions .assertTrue (trackerA .getPoolingRates ().get (requestA1 ), "requestA1 must be pooled" );
255+ Assertions .assertTrue (trackerA .getPoolingRates ().get (requestA2 ), "requestA2 must be pooled" );
256+ Assertions .assertEquals (2. , trackerA .getSharingFactors ().get (requestA1 ), MatsimTestUtils .EPSILON );
257+ Assertions .assertEquals (2. , trackerA .getSharingFactors ().get (requestA2 ), MatsimTestUtils .EPSILON );
258+
259+ // --- trackerB: must contain exactly the one mode_B request ---
260+ Assertions .assertEquals (1 , trackerB .getSharingFactors ().size (), "trackerB must track only mode_B requests" );
261+ Assertions .assertNull (trackerB .getSharingFactors ().get (requestA1 ), "trackerB must not contain mode_A request rA1" );
262+ Assertions .assertNull (trackerB .getSharingFactors ().get (requestA2 ), "trackerB must not contain mode_A request rA2" );
263+ Assertions .assertFalse (trackerB .getPoolingRates ().get (requestB1 ), "requestB1 must not be pooled" );
264+ Assertions .assertEquals (1. , trackerB .getSharingFactors ().get (requestB1 ), MatsimTestUtils .EPSILON );
265+ }
199266}
0 commit comments