20 package ch.sbb.matsim.routing.pt.raptor;
22 import org.apache.logging.log4j.LogManager;
23 import org.apache.logging.log4j.Logger;
34 import java.util.ArrayList;
35 import java.util.Arrays;
36 import java.util.Comparator;
37 import java.util.HashMap;
38 import java.util.List;
39 import java.util.ListIterator;
50 final Map<Id<Vehicle>, VehicleData> vehicleData =
new HashMap<>();
51 final Map<Id<Person>, PassengerData> paxData =
new HashMap<>();
55 LOG.info(
"[SwissRailRaptor] Resetting ExecutionData");
56 this.lineData.
clear();
57 this.vehicleData.
clear();
63 LineData line = this.lineData.
get(transitLine);
67 RouteData route = line.routeData.get(transitRoute);
71 StopData stop = route.stopData.get(stopFacility);
75 List<DepartureData> departures = stop.getSortedDepartures();
76 if (departures.isEmpty()) {
81 if (time <= dep.latestWaitStart) {
89 LineData line = this.lineData.
get(transitLine);
93 RouteData route = line.routeData.get(transitRoute);
97 StopData stop = route.stopData.get(stopFacility);
102 if (d.departureId.equals(departure)) {
110 LineData line = this.lineData.
get(transitLine);
114 return line.routeData.get(transitRoute);
132 int[] latestWaitStartTimes = cache.latestWaitingTimeStartPerRouteStopPerDeparture[routeStop.index];
133 int toIndex = latestWaitStartTimes.length;
134 int offset = latestWaitStartTimes[0] - 1;
135 int pos = Arrays.binarySearch(latestWaitStartTimes, 1, toIndex, (
int) time);
144 if (pos >= toIndex) {
164 LOG.info(
"[SwissRailRaptor] build query-cache for ExecutionData");
166 cache =
new CacheData(data.routeStops.length);
168 for (
int routeStopIdx = 0; routeStopIdx < routeStops.length; routeStopIdx++) {
171 int departuresCount = route.countDepartures;
172 int[] departures =
new int[departuresCount + 1];
173 departures[0] = route.indexFirstDeparture;
175 LineData lineData = this.lineData.
get(routeStop.line.getId());
176 RouteData routeData = lineData == null ? null : lineData.routeData.get(routeStop.route.getId());
177 StopData stopData = routeData == null ? null : routeData.stopData.get(routeStop.routeStop.getStopFacility().getId());
180 List<Departure> origDepartures =
new ArrayList<>(routeStop.route.getDepartures().values());
184 for (
int depIdx = 0; depIdx < origDepartures.size(); depIdx++) {
185 Departure departure = origDepartures.get(depIdx);
189 latestWaitStart = (int) (departure.
getDepartureTime() + routeStop.departureOffset);
191 latestWaitStart = Double.isFinite(dd.latestWaitStart) ? (int) dd.latestWaitStart : lastValue;
193 departures[depIdx + 1] = latestWaitStart;
194 lastValue = latestWaitStart;
196 cache.latestWaitingTimeStartPerRouteStopPerDeparture[routeStopIdx] = departures;
199 LOG.info(
"[SwissRailRaptor] done (build query-cache for ExecutionData)");
204 int[][] latestWaitingTimeStartPerRouteStopPerDeparture;
207 this.latestWaitingTimeStartPerRouteStopPerDeparture =
new int[routeStopsCount][];
211 static class LineData {
212 Map<Id<TransitRoute>, RouteData> routeData =
new HashMap<>();
215 static class RouteData {
216 Map<Id<TransitStopFacility>, StopData> stopData =
new HashMap<>();
224 static class StopData {
226 boolean sorted =
true;
227 List<DepartureData> depList =
new ArrayList<>();
233 this.depList.add(data);
234 this.depData.put(depId, data);
240 List<DepartureData> getSortedDepartures() {
242 this.depList.sort((o1, o2) -> Double.compare(o1.vehDepTime, o2.vehDepTime));
246 ListIterator<DepartureData> li = this.depList.listIterator(this.depList.size());
248 while (li.hasPrevious()) {
250 if (laterDep == null) {
251 dep.latestWaitStart = dep.vehDepTime;
254 if (laterDep.earliestWaitStart < dep.vehDepTime) {
257 if (Double.isFinite(dep.latestWaitStart)) {
259 laterDep.earliestWaitStart = dep.latestWaitStart;
264 laterDep.earliestWaitStart = dep.vehDepTime;
265 dep.latestWaitStart = dep.vehDepTime;
276 double vehDepTime = Double.NEGATIVE_INFINITY;
277 double earliestWaitStart = Double.POSITIVE_INFINITY;
278 double latestWaitStart = Double.NEGATIVE_INFINITY;
279 int paxCountAtDeparture = -1;
282 this.departureId = departureId;
285 void addWaitingPerson(
double startWaitTime) {
286 if (startWaitTime < this.earliestWaitStart) {
287 this.earliestWaitStart = startWaitTime;
289 if (startWaitTime > this.latestWaitStart) {
290 this.latestWaitStart = startWaitTime;
295 static class VehicleData {
301 int currentPaxCount = 0;
304 this.vehicle = vehicle;
305 this.lineId = lineId;
306 this.routeId = routeId;
307 this.departureId = departureId;
311 static class PassengerData {
313 final Map<String, ModeUtilityParameters> modeParams;
315 double waitingStartTime;
316 double vehBoardingTime;
320 public PassengerData(
Person person, Map<String, ModeUtilityParameters> modeParams) {
321 this.person = person;
322 this.modeParams = modeParams;
CacheData getCache(SwissRailRaptorData data)
double getDepartureTime()
DepartureData getDepartureData(Id< TransitLine > transitLine, Id< TransitRoute > transitRoute, Id< TransitStopFacility > stopFacility, Id< Departure > departure)
synchronized CacheData buildCache(SwissRailRaptorData data)
DepartureData(Id< Departure > departureId)
CacheData(int routeStopsCount)
RouteData getRouteData(Id< TransitLine > transitLine, Id< TransitRoute > transitRoute)
DepartureData getNextAvailableDeparture(Id< TransitLine > transitLine, Id< TransitRoute > transitRoute, Id< TransitStopFacility > stopFacility, double time)
int getNextAvailableDeparture(SwissRailRaptorData data, SwissRailRaptorData.RRouteStop routeStop, double time)