diff --git a/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/PTSkimMatrices.java b/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/PTSkimMatrices.java index 56121f8558a..f1255adf028 100644 --- a/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/PTSkimMatrices.java +++ b/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/PTSkimMatrices.java @@ -36,14 +36,10 @@ import org.matsim.pt.transitSchedule.api.TransitRoute; import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.function.BiPredicate; +import java.util.stream.Collectors; /** * Calculates zone-to-zone matrices containing a number of performance indicators related to public transport. @@ -76,7 +72,7 @@ private PTSkimMatrices() { } public static PTSkimMatrices.PtIndicators calculateSkimMatrices(SwissRailRaptorData raptorData, Map coordsPerZone, double minDepartureTime, double maxDepartureTime, - double stepSize_seconds, RaptorParameters parameters, int numberOfThreads, BiPredicate trainDetector) { + double stepSize_seconds, RaptorParameters parameters, int numberOfThreads, BiPredicate trainDetector, CoordAggregator coordAggregator) { // prepare calculation Set zoneIds = coordsPerZone.keySet(); PtIndicators pti = new PtIndicators<>(zoneIds); @@ -89,7 +85,7 @@ public static PTSkimMatrices.PtIndicators calculateSkimMatrices(SwissRail Thread[] threads = new Thread[numberOfThreads]; for (int i = 0; i < numberOfThreads; i++) { SwissRailRaptor raptor = new SwissRailRaptor.Builder(raptorData, config).build(); - RowWorker worker = new RowWorker<>(originZones, zoneIds, coordsPerZone, pti, raptor, parameters, minDepartureTime, maxDepartureTime, stepSize_seconds, counter, trainDetector); + RowWorker worker = new RowWorker<>(originZones, zoneIds, coordsPerZone, pti, raptor, parameters, minDepartureTime, maxDepartureTime, stepSize_seconds, counter, trainDetector, coordAggregator); threads[i] = new Thread(worker, "PT-FrequencyMatrix-" + Time.writeTime(minDepartureTime) + "-" + Time.writeTime(maxDepartureTime) + "-" + i); threads[i].start(); } @@ -148,9 +144,10 @@ static class RowWorker implements Runnable { private final double stepSize; private final Counter counter; private final BiPredicate trainDetector; + private final CoordAggregator coordAggregator; - RowWorker(ConcurrentLinkedQueue originZones, Set destinationZones, Map coordsPerZone, PtIndicators pti, SwissRailRaptor raptor, RaptorParameters parameters, - double minDepartureTime, double maxDepartureTime, double stepSize, Counter counter, BiPredicate trainDetector) { + RowWorker(ConcurrentLinkedQueue originZones, Set destinationZones, Map coordsPerZone, PtIndicators pti, SwissRailRaptor raptor, RaptorParameters parameters, + double minDepartureTime, double maxDepartureTime, double stepSize, Counter counter, BiPredicate trainDetector, CoordAggregator coordAggregator) { this.originZones = originZones; this.destinationZones = destinationZones; this.coordsPerZone = coordsPerZone; @@ -162,6 +159,7 @@ static class RowWorker implements Runnable { this.stepSize = stepSize; this.counter = counter; this.trainDetector = trainDetector; + this.coordAggregator = coordAggregator; } private static Collection findStopCandidates(Coord coord, SwissRailRaptor raptor, RaptorParameters parameters) { @@ -185,14 +183,15 @@ public void run() { this.counter.incCounter(); Coord[] fromCoords = this.coordsPerZone.get(fromZoneId); if (fromCoords != null) { - for (Coord fromCoord : fromCoords) { - calcForRow(fromZoneId, fromCoord); + var weightedRelevantFromCoords = coordAggregator.aggregateCoords(fromCoords); + for (var fromCoord : weightedRelevantFromCoords) { + calcForRow(fromZoneId, fromCoord.coord(),fromCoord.weight()); } } } } - private void calcForRow(T fromZoneId, Coord fromCoord) { + private void calcForRow(T fromZoneId, Coord fromCoord, double fromCoordWeight) { double walkSpeed = this.parameters.getBeelineWalkSpeed(); Collection fromStops = findStopCandidates(fromCoord, this.raptor, this.parameters); @@ -216,13 +215,13 @@ private void calcForRow(T fromZoneId, Coord fromCoord) { Coord[] toCoords = this.coordsPerZone.get(toZoneId); if (toCoords != null) { for (Coord toCoord : toCoords) { - calcForOD(fromZoneId, toZoneId, toCoord, accessTimes, trees); + calcForOD(fromZoneId, toZoneId, toCoord, accessTimes, trees, (float) fromCoordWeight); } } } } - private void calcForOD(T fromZoneId, T toZoneId, Coord toCoord, Map, Double> accessTimes, List, TravelInfo>> trees) { + private void calcForOD(T fromZoneId, T toZoneId, Coord toCoord, Map, Double> accessTimes, List, TravelInfo>> trees, float fromCoordWeight) { double walkSpeed = this.parameters.getBeelineWalkSpeed(); Collection toStops = findStopCandidates(toCoord, this.raptor, this.parameters); @@ -297,15 +296,15 @@ private void calcForOD(T fromZoneId, T toZoneId, Coord toCoord, Map buildODConnections(List, TravelInfo>> trees, Map, Double> accessTimes, @@ -359,4 +358,10 @@ public static class PtIndicators { } } + public interface CoordAggregator{ + default List aggregateCoords(Coord[] coords){ + return Arrays.stream(coords).map(coord -> new CalculateSkimMatrices.WeightedCoord(coord,1.0)).collect(Collectors.toList()); + } + } + }