20 package ch.sbb.matsim.routing.pt.raptor;
28 import java.util.HashSet;
29 import java.util.Iterator;
34 import org.apache.logging.log4j.LogManager;
35 import org.apache.logging.log4j.Logger;
63 import jakarta.inject.Inject;
83 private final static VehicleData
DUMMY_VEHDATA =
new VehicleData(null, null, null, null);
99 PassengerData pd = this.data.paxData.computeIfAbsent(event.
getPersonId(), k -> {
102 return new PassengerData(person, modeParams);
104 pd.mode =
event.getLegMode();
112 this.data.vehicleData.put(event.
getVehicleId(),
new VehicleData(vehicle, event.
getTransitLineId(),
event.getTransitRouteId(),
event.getDepartureId()));
113 LineData line = this.data.lineData.computeIfAbsent(event.
getTransitLineId(),
id ->
new LineData());
114 RouteData route = line.routeData.computeIfAbsent(event.
getTransitRouteId(),
id ->
new RouteData(
128 VehicleData vehData = this.data.vehicleData.get(event.
getVehicleId());
129 if (vehData != null) {
130 LineData line = this.data.lineData.get(vehData.lineId);
131 RouteData route = line.routeData.get(vehData.routeId);
132 StopData stop = route.stopData.computeIfAbsent(vehData.stopFacilityId, id ->
new StopData());
134 dep.vehDepTime =
event.getTime();
135 dep.paxCountAtDeparture = vehData.currentPaxCount;
141 PassengerData pd = this.data.paxData.get(event.
getPersonId());
142 pd.waitingStartTime =
event.getTime();
143 pd.boardingStopId =
event.waitingAtStopId;
148 VehicleData vehData = this.data.vehicleData.get(event.
getVehicleId());
149 if (vehData != null && !this.transitDrivers.contains(event.
getPersonId())) {
150 vehData.currentPaxCount++;
151 PassengerData passengerData = this.data.paxData.get(event.
getPersonId());
152 double waitStart = passengerData.waitingStartTime;
153 LineData line = this.data.lineData.get(vehData.lineId);
154 RouteData route = line.routeData.get(vehData.routeId);
155 StopData stop = route.stopData.computeIfAbsent(vehData.stopFacilityId, id ->
new StopData());
156 stop.getOrCreate(vehData.departureId).addWaitingPerson(waitStart);
157 passengerData.vehBoardingTime =
event.getTime();
158 passengerData.departureId = vehData.departureId;
164 VehicleData vehData = this.data.vehicleData.get(event.
getVehicleId());
165 if (vehData != null && !this.transitDrivers.contains(event.
getPersonId())) {
166 vehData.currentPaxCount--;
167 if (this.useInVehCosts) {
176 this.transitDrivers.clear();
180 Person person = passengerData.person;
182 double depTime = this.data.
getRouteData(vehData.lineId, vehData.routeId).stopData.get(passengerData.boardingStopId).depData.get(passengerData.departureId).vehDepTime;
184 double arrTime = time;
185 double travelTime = arrTime - depTime;
189 double defaultScore = travelTime * margUtil_s;
192 double capacityScore = -this.inVehCostCalculator.
getInVehicleCost(travelTime, margUtil_s, person, vehData.vehicle, null, iter);
194 double scoreDiff = capacityScore - defaultScore;
195 if (Double.isNaN(scoreDiff)) {
196 LOG.warn(
"Getting NaN as score: " + passengerData.person.getId() +
" " + vehData.lineId +
" " + vehData.routeId +
" " +
Time.
writeTime(time) +
" " + depTime +
" " + travelTime +
" " + defaultScore +
" " + capacityScore);
204 final PassengerData passengerData;
205 final VehicleData vehData;
206 final RouteData routeData;
207 final double alightingTime;
211 Iterator<TransitRouteStop> stopIter;
217 this.passengerData = passengerData;
218 this.vehData = vehData;
219 this.alightingTime = alightingTime;
220 this.routeData = data.
getRouteData(vehData.lineId, vehData.routeId);
222 this.stopIter = ptRoute.
getStops().iterator();
233 this.currentDepData = this.nextFromStopDepData;
234 boolean searchStart = !this.
hasNext;
235 this.hasNext =
false;
236 this.nextFromStopDepData = this.nextToStopDepData;
239 while (this.stopIter.hasNext()) {
240 this.nextToStop = this.stopIter.next();
242 if (searchStart && this.nextFromStop != null && stopId.
equals(boardingStopId)) {
243 this.nextFromStopDepData = this.routeData.stopData.get(stopId).depData.get(this.passengerData.departureId);
251 this.nextFromStop = this.nextToStop;
255 this.nextToStopDepData = stopData == null ? null : stopData.depData.get(this.passengerData.departureId);
256 if (this.nextToStopDepData == null) {
258 this.nextToStopDepData =
new DepartureData(this.passengerData.departureId);
259 this.nextToStopDepData.vehDepTime = this.alightingTime;
261 this.nextFromStop = this.nextToStop;
267 return this.nextFromStopDepData.vehDepTime - this.currentDepData.vehDepTime;
272 return this.currentDepData.paxCountAtDeparture;
277 return this.currentDepData.vehDepTime;
Id< Vehicle > getVehicleId()
void calculateInVehicleCosts(double time, PassengerData passengerData, VehicleData vehData)
double getInVehicleTime()
void handleEvent(AgentWaitingForPtEvent event)
Id< TransitRoute > getTransitRouteId()
final boolean useInVehCosts
Id< Person > getDriverId()
double getInVehicleCost(double inVehicleTime, double marginalUtility_utl_s, Person person, Vehicle vehicle, RaptorParameters paramters, RouteSegmentIterator iterator)
Vehicles getTransitVehicles()
Id< TransitStopFacility > getFacilityId()
Id< Vehicle > getVehicleId()
void handleEvent(PersonLeavesVehicleEvent event)
final Set< Id< Person > > transitDrivers
Id< Person > getPersonId()
final Map< String, ModeUtilityParameters > modeParams
void handleEvent(PersonEntersVehicleEvent event)
Map< Id< Person >,? extends Person > getPersons()
Id< Person > getPersonId()
void reset(int iteration)
void processEvent(final Event event)
static final VehicleData DUMMY_VEHDATA
List< TransitRouteStop > getStops()
RouteData getRouteData(Id< TransitLine > transitLine, Id< TransitRoute > transitRoute)
Id< Vehicle > getVehicleId()
Population getPopulation()
void handleEvent(VehicleArrivesAtFacilityEvent event)
void handleEvent(PersonDepartureEvent event)
ScoringParameters getScoringParameters(Person person)
EffectiveRouteSegmentIterator(OccupancyData data, PassengerData passengerData, double alightingTime, VehicleData vehData)
static final String writeTime(final double seconds, final String timeformat)
Id< TransitLine > getTransitLineId()
final ScoringParametersForPerson scoringParams
abstract TransitStopFacility getStopFacility()
final double marginalUtilityOfTraveling_s
void handleEvent(VehicleDepartsAtFacilityEvent event)
void handleEvent(TransitDriverStartsEvent event)
Map< Id< Vehicle >, Vehicle > getVehicles()
Id< Person > getPersonId()
final RaptorInVehicleCostCalculator inVehCostCalculator
Id< Vehicle > getVehicleId()
double getPassengerCount()
TransitSchedule getTransitSchedule()
boolean equals(Object obj)
Map< Id< TransitLine >, TransitLine > getTransitLines()
final EventsManager events
OccupancyTracker(OccupancyData data, Scenario scenario, RaptorInVehicleCostCalculator inVehCostCalculator, EventsManager events, ScoringParametersForPerson scoringParams)
Id< Person > getPersonId()
Id< Vehicle > getVehicleId()