MATSIM
ComplexTransitStopHandler.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * *
4  * *********************************************************************** *
5  * *
6  * copyright : (C) 2010 by the members listed in the COPYING, *
7  * LICENSE and WARRANTY file. *
8  * email : info at matsim dot org *
9  * *
10  * *********************************************************************** *
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * See also COPYING, LICENSE and WARRANTY file *
17  * *
18  * *********************************************************************** */
19 
20 package org.matsim.core.mobsim.qsim.pt;
21 
22 import java.util.List;
23 
24 import org.apache.logging.log4j.LogManager;
25 import org.apache.logging.log4j.Logger;
28 import org.matsim.vehicles.Vehicle;
31 
39 
40  private final static Logger log = LogManager.getLogger(ComplexTransitStopHandler.class);
41 
42  private boolean doorsOpen = false;
43  private double passengersLeavingTimeFraction = 0.0;
44  private double passengersEnteringTimeFraction = 0.0;
45 
46  private final double personEntersTime;
47  private final double personLeavesTime;
49 
50  // TODO make it dynamic
51  private static final double openDoorsDuration = 1.0;
52  private static final double closeDoorsDuration = 1.0;
53 
54  /*package*/ ComplexTransitStopHandler(Vehicle vehicle) {
55  this.personEntersTime = VehicleUtils.getAccessTime(vehicle.getType());
56  this.personLeavesTime = VehicleUtils.getEgressTime(vehicle.getType());
58  }
59 
60  @Override
61  public double handleTransitStop(TransitStopFacility stop, double now, List<PTPassengerAgent> leavingPassengers,
62  List<PTPassengerAgent> enteringPassengers, PassengerAccessEgress handler, MobsimVehicle vehicle) {
63 
65  return handleParallelStop(stop, now, leavingPassengers, enteringPassengers, handler, vehicle);
67  return handleSerialStop(stop, now, leavingPassengers, enteringPassengers, handler, vehicle);
68  } else {
69  log.info("Unimplemented door operation mode " + this.doorOperationMode + " set. Using parralel mode as default.");
70  return handleParallelStop(stop, now, leavingPassengers, enteringPassengers, handler, vehicle);
71  }
72  }
73 
74  private double handleSerialStop(TransitStopFacility stop, double now, List<PTPassengerAgent> leavingPassengers,
75  List<PTPassengerAgent> enteringPassengers, PassengerAccessEgress handler, MobsimVehicle vehicle){
76  double stopTime = 0.0;
77 
78  int cntEgress = leavingPassengers.size();
79  int cntAccess = enteringPassengers.size();
80 
81  if (!this.doorsOpen) {
82  // doors are closed
83 
84  if ((cntAccess > 0) || (cntEgress > 0)) {
85  // case doors are shut, but passengers want to leave or enter
86  // the veh
87  this.doorsOpen = true;
88  stopTime = openDoorsDuration; // Time to open doors
89  } else {
90  // case nobody wants to leave or enter the veh
91  stopTime = 0.0;
92  }
93 
94  } else {
95  // doors are already open
96 
97  if ((cntAccess > 0) || (cntEgress > 0)) {
98  // somebody wants to leave or enter the veh
99 
100  if (cntEgress > 0) {
101 
102  if (this.passengersLeavingTimeFraction < 1.0) {
103  // next passenger can leave the veh
104 
105  while (this.passengersLeavingTimeFraction < 1.0) {
106  if (leavingPassengers.size() == 0) {
107  break;
108  }
109 
110  if(handler.handlePassengerLeaving(leavingPassengers.get(0), vehicle, stop.getLinkId(), now)){
111  leavingPassengers.remove(0);
112  this.passengersLeavingTimeFraction += personLeavesTime;
113  } else {
114  break;
115  }
116 
117  }
118 
119  this.passengersLeavingTimeFraction -= 1.0;
120  stopTime = 1.0;
121 
122  } else {
123  // still time needed to allow next passenger to leave
124  this.passengersLeavingTimeFraction -= 1.0;
125  stopTime = 1.0;
126  }
127 
128  } else {
129  this.passengersLeavingTimeFraction -= 1.0;
130  this.passengersLeavingTimeFraction = Math.max(0, this.passengersLeavingTimeFraction);
131 
132  if (cntAccess > 0) {
133 
134  if (this.passengersEnteringTimeFraction < 1.0) {
135 
136  // next passenger can enter the veh
137 
138  while (this.passengersEnteringTimeFraction < 1.0) {
139  if (enteringPassengers.size() == 0) {
140  break;
141  }
142 
143  if(handler.handlePassengerEntering(enteringPassengers.get(0), vehicle, stop.getId(), now)){
144  enteringPassengers.remove(0);
145  this.passengersEnteringTimeFraction += personEntersTime;
146  } else {
147  break;
148  }
149 
150  }
151 
152  this.passengersEnteringTimeFraction -= 1.0;
153  stopTime = 1.0;
154 
155  } else {
156  // still time needed to allow next passenger to enter
157  this.passengersEnteringTimeFraction -= 1.0;
158  stopTime = 1.0;
159  }
160 
161  } else {
162  this.passengersEnteringTimeFraction -= 1.0;
163  this.passengersEnteringTimeFraction = Math.max(0, this.passengersEnteringTimeFraction);
164  }
165  }
166 
167  } else {
168 
169  // nobody left to handle
170 
171  if (this.passengersEnteringTimeFraction < 1.0 && this.passengersLeavingTimeFraction < 1.0) {
172  // every passenger entered or left the veh so close and
173  // leave
174 
175  this.doorsOpen = false;
176  this.passengersEnteringTimeFraction = 0.0;
177  this.passengersLeavingTimeFraction = 0.0;
178  stopTime = closeDoorsDuration; // Time to shut the doors
179  }
180 
181  // somebody is still leaving or entering the veh so wait again
182 
183  if (this.passengersEnteringTimeFraction >= 1) {
184  this.passengersEnteringTimeFraction -= 1.0;
185  stopTime = 1.0;
186  }
187 
188  if (this.passengersLeavingTimeFraction >= 1) {
189  this.passengersLeavingTimeFraction -= 1.0;
190  stopTime = 1.0;
191  }
192 
193  }
194 
195  }
196 
197  return stopTime;
198  }
199 
200  private double handleParallelStop(TransitStopFacility stop, double now, List<PTPassengerAgent> leavingPassengers,
201  List<PTPassengerAgent> enteringPassengers, PassengerAccessEgress handler, MobsimVehicle vehicle){
202  double stopTime = 0.0;
203 
204  int cntEgress = leavingPassengers.size();
205  int cntAccess = enteringPassengers.size();
206 
207  if (!this.doorsOpen) {
208  // doors are closed
209 
210  if ((cntAccess > 0) || (cntEgress > 0)) {
211  // case doors are shut, but passengers want to leave or enter
212  // the veh
213  this.doorsOpen = true;
214  stopTime = openDoorsDuration; // Time to open doors
215  } else {
216  // case nobody wants to leave or enter the veh
217  stopTime = 0.0;
218  }
219 
220  } else {
221  // doors are already open
222 
223  if ((cntAccess > 0) || (cntEgress > 0)) {
224  // somebody wants to leave or enter the veh
225 
226  if (cntAccess > 0) {
227 
228  if (this.passengersEnteringTimeFraction < 1.0) {
229 
230  // next passenger can enter the veh
231 
232  while (this.passengersEnteringTimeFraction < 1.0) {
233  if (enteringPassengers.size() == 0) {
234  break;
235  }
236 
237  if(handler.handlePassengerEntering(enteringPassengers.get(0), vehicle, stop.getId(), now)){
238  enteringPassengers.remove(0);
239  this.passengersEnteringTimeFraction += personEntersTime;
240  } else {
241  break;
242  }
243 
244  }
245 
246  this.passengersEnteringTimeFraction -= 1.0;
247  stopTime = 1.0;
248 
249  } else {
250  // still time needed to allow next passenger to enter
251  this.passengersEnteringTimeFraction -= 1.0;
252  stopTime = 1.0;
253  }
254 
255  } else {
256  this.passengersEnteringTimeFraction -= 1.0;
257  this.passengersEnteringTimeFraction = Math.max(0, this.passengersEnteringTimeFraction);
258  }
259 
260  if (cntEgress > 0) {
261 
262  if (this.passengersLeavingTimeFraction < 1.0) {
263  // next passenger can leave the veh
264 
265  while (this.passengersLeavingTimeFraction < 1.0) {
266  if (leavingPassengers.size() == 0) {
267  break;
268  }
269 
270  if(handler.handlePassengerLeaving(leavingPassengers.get(0), vehicle, stop.getLinkId(), now)){
271  leavingPassengers.remove(0);
272  this.passengersLeavingTimeFraction += personLeavesTime;
273  } else {
274  break;
275  }
276 
277  }
278 
279  this.passengersLeavingTimeFraction -= 1.0;
280  stopTime = 1.0;
281 
282  } else {
283  // still time needed to allow next passenger to leave
284  this.passengersLeavingTimeFraction -= 1.0;
285  stopTime = 1.0;
286  }
287 
288  } else {
289  this.passengersLeavingTimeFraction -= 1.0;
290  this.passengersLeavingTimeFraction = Math.max(0, this.passengersLeavingTimeFraction);
291  }
292 
293  } else {
294 
295  // nobody left to handle
296 
297  if (this.passengersEnteringTimeFraction < 1.0 && this.passengersLeavingTimeFraction < 1.0) {
298  // every passenger entered or left the veh so close and
299  // leave
300 
301  this.doorsOpen = false;
302  this.passengersEnteringTimeFraction = 0.0;
303  this.passengersLeavingTimeFraction = 0.0;
304  stopTime = closeDoorsDuration; // Time to shut the doors
305  }
306 
307  // somebody is still leaving or entering the veh so wait again
308 
309  if (this.passengersEnteringTimeFraction >= 1) {
310  this.passengersEnteringTimeFraction -= 1.0;
311  stopTime = 1.0;
312  }
313 
314  if (this.passengersLeavingTimeFraction >= 1) {
315  this.passengersLeavingTimeFraction -= 1.0;
316  stopTime = 1.0;
317  }
318 
319  }
320 
321  }
322 
323  return stopTime;
324  }
325 
326 }
boolean handlePassengerLeaving(final PTPassengerAgent agent, MobsimVehicle vehicle, Id< Link > toLinkId, final double time)
static double getAccessTime(VehicleType vehicleType)
static double getEgressTime(VehicleType vehicleType)
boolean handlePassengerEntering(final PTPassengerAgent agent, MobsimVehicle vehicle, Id< TransitStopFacility > fromStopFacilityId, final double time)
double handleTransitStop(TransitStopFacility stop, double now, List< PTPassengerAgent > leavingPassengers, List< PTPassengerAgent > enteringPassengers, PassengerAccessEgress handler, MobsimVehicle vehicle)
double handleSerialStop(TransitStopFacility stop, double now, List< PTPassengerAgent > leavingPassengers, List< PTPassengerAgent > enteringPassengers, PassengerAccessEgress handler, MobsimVehicle vehicle)
static VehicleType.DoorOperationMode getDoorOperationMode(VehicleType vehicleType)
double handleParallelStop(TransitStopFacility stop, double now, List< PTPassengerAgent > leavingPassengers, List< PTPassengerAgent > enteringPassengers, PassengerAccessEgress handler, MobsimVehicle vehicle)