From 9adfdfc07146a3524559390870d8fb1792ee8e64 Mon Sep 17 00:00:00 2001 From: Joschka Bischoff Date: Thu, 11 Jan 2024 11:45:06 +0100 Subject: [PATCH 1/2] make WeightedCoord a record --- .../analysis/skims/CalculateSkimMatrices.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/CalculateSkimMatrices.java b/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/CalculateSkimMatrices.java index b3300eda5b7..2c608d83743 100644 --- a/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/CalculateSkimMatrices.java +++ b/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/CalculateSkimMatrices.java @@ -494,7 +494,8 @@ public final PTSkimMatrices.PtIndicators calculatePTMatrices(String netw log.info("calc PT matrices for " + Time.writeTime(startTime) + " - " + Time.writeTime(endTime)); PTSkimMatrices.PtIndicators matrices = PTSkimMatrices.calculateSkimMatrices( - raptorData, this.coordsPerZone, startTime, endTime, 120, raptorParameters, this.numberOfThreads, trainDetector); + raptorData, this.coordsPerZone, startTime, endTime, 120, raptorParameters, this.numberOfThreads, trainDetector, new PTSkimMatrices.CoordAggregator() { + }); return matrices; } @@ -511,15 +512,6 @@ private String findZone(Coord coord, SpatialIndex zonesQt, String zonesIdAttribu return null; } - private static class WeightedCoord { - - Coord coord; - double weight; - - private WeightedCoord(Coord coord, double weight) { - this.coord = coord; - this.weight = weight; - } - } + public record WeightedCoord(Coord coord, double weight){} } From 31eb0e3a57767e3e5c6fbb4c8f688dd9ff07ba4c Mon Sep 17 00:00:00 2001 From: Joschka Bischoff Date: Thu, 11 Jan 2024 11:57:40 +0100 Subject: [PATCH 2/2] allow CoordAggregation in PTSkimMatrices --- .../matsim/analysis/skims/PTSkimMatrices.java | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) 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()); + } + } + }