20 package org.matsim.core.mobsim.qsim.pt;
22 import java.util.ArrayList;
23 import java.util.HashSet;
24 import java.util.List;
52 class PassengerAccessEgressImpl
implements PassengerAccessEgress {
54 private final InternalInterface internalInterface;
55 private final TransitStopAgentTracker agentTracker;
56 private final boolean isGeneratingDeniedBoardingEvents ;
57 private Set<PTPassengerAgent> agentsDeniedToBoard = null;
58 private Scenario scenario;
59 private EventsManager eventsManager;
61 PassengerAccessEgressImpl(InternalInterface internalInterface, TransitStopAgentTracker agentTracker, Scenario scenario, EventsManager eventsManager) {
62 this.internalInterface = internalInterface;
63 this.agentTracker = agentTracker;
64 this.scenario = scenario;
65 this.eventsManager = eventsManager;
66 this.isGeneratingDeniedBoardingEvents =
67 this.scenario.getConfig().vspExperimental().isGeneratingBoardingDeniedEvents() ;
68 if (this.isGeneratingDeniedBoardingEvents){
69 this.agentsDeniedToBoard =
new HashSet<>();
76 double calculateStopTimeAndTriggerBoarding(TransitRoute transitRoute, TransitLine transitLine,
final TransitVehicle vehicle,
77 final TransitStopFacility stop, List<TransitRouteStop> stopsToCome,
final double now) {
78 ArrayList<PTPassengerAgent> passengersLeaving = findPassengersLeaving(vehicle, stop);
79 int freeCapacity = vehicle.getPassengerCapacity() - vehicle.getPassengers().size() + passengersLeaving.size();
80 List<PTPassengerAgent> passengersEntering = findPassengersEntering(transitRoute, transitLine, vehicle, stop, stopsToCome, freeCapacity, now);
82 TransitStopHandler stopHandler = vehicle.getStopHandler();
83 double stopTime = stopHandler.handleTransitStop(stop, now, passengersLeaving, passengersEntering,
this, vehicle);
85 if (this.isGeneratingDeniedBoardingEvents){
86 this.fireBoardingDeniedEvents(vehicle, now);
87 this.agentsDeniedToBoard.clear();
93 private void fireBoardingDeniedEvents(TransitVehicle vehicle,
double now){
94 Id<Vehicle> vehicleId = vehicle.getId() ;
95 for (PTPassengerAgent agent : this.agentsDeniedToBoard){
96 Id<Person> agentId = agent.getId() ;
97 this.eventsManager.processEvent(
98 new BoardingDeniedEvent(now, agentId, vehicleId)
104 private List<PTPassengerAgent> findPassengersEntering(TransitRoute transitRoute, TransitLine transitLine, TransitVehicle vehicle,
105 final TransitStopFacility stop, List<TransitRouteStop> stopsToCome,
int freeCapacity,
double now) {
106 ArrayList<PTPassengerAgent> passengersEntering =
new ArrayList<>();
108 if (this.isGeneratingDeniedBoardingEvents) {
110 for (PTPassengerAgent agent : this.agentTracker.getAgentsAtFacility(stop.getId())) {
111 if (agent.getEnterTransitRoute(transitLine, transitRoute, stopsToCome, vehicle)) {
112 if (freeCapacity >= 1) {
113 passengersEntering.add(agent);
116 this.agentsDeniedToBoard.add(agent);
123 for (PTPassengerAgent agent : this.agentTracker.getAgentsAtFacility(stop.getId())) {
124 if (freeCapacity == 0) {
127 if (agent.getEnterTransitRoute(transitLine, transitRoute, stopsToCome, vehicle)) {
128 passengersEntering.add(agent);
135 return passengersEntering;
140 private ArrayList<PTPassengerAgent> findPassengersLeaving(TransitVehicle vehicle,
141 final TransitStopFacility stop) {
142 ArrayList<PTPassengerAgent> passengersLeaving =
new ArrayList<>();
143 for (PassengerAgent passenger : vehicle.getPassengers()) {
144 if (((PTPassengerAgent) passenger).getExitAtStop(stop)) {
145 passengersLeaving.add((PTPassengerAgent) passenger);
148 return passengersLeaving;
153 public boolean handlePassengerEntering(PTPassengerAgent passenger, MobsimVehicle vehicle, Id<TransitStopFacility> fromStopFacilityId,
double time) {
154 boolean handled = vehicle.addPassenger(passenger);
156 this.agentTracker.removeAgentFromStop(passenger, fromStopFacilityId);
157 MobsimAgent planAgent = (MobsimAgent) passenger;
159 Id<Person> agentId = planAgent.getId();
160 Id<Link> linkId = planAgent.getCurrentLinkId();
161 this.internalInterface.unregisterAdditionalAgentOnLink(agentId, linkId) ;
163 MobsimDriverAgent agent = (MobsimDriverAgent) passenger;
164 passenger.setVehicle(vehicle);
165 eventsManager.processEvent(
new PersonEntersVehicleEvent(time, agent.getId(), vehicle.getVehicle().getId()));
171 public boolean handlePassengerLeaving(PTPassengerAgent passenger, MobsimVehicle vehicle, Id<Link> toLinkId,
double time) {
172 boolean handled = vehicle.removePassenger(passenger);
174 passenger.setVehicle(null);
175 eventsManager.processEvent(
new PersonLeavesVehicleEvent(time, passenger.getId(), vehicle.getVehicle().getId()));
180 MobsimAgent agent = (MobsimAgent) passenger ;
181 agent.notifyArrivalOnLinkByNonNetworkMode(toLinkId);
182 agent.endLegAndComputeNextState(time);
183 this.internalInterface.arrangeNextAgentState(agent) ;