From b5b629ab56af23e52eab0565fbfa13df11d1d84c Mon Sep 17 00:00:00 2001 From: Marcel Rieser Date: Tue, 9 Apr 2024 22:26:59 +0200 Subject: [PATCH 01/77] provide new calcTreesObservable method The observer allows to gather additional information and more potential transit routes. Include vehicleDepartureTime in RaptorRoute. --- .../matsim/routing/pt/raptor/RaptorRoute.java | 13 +++-- .../routing/pt/raptor/SwissRailRaptor.java | 54 +++++++++++++++++-- .../pt/raptor/SwissRailRaptorCore.java | 40 ++++++++++---- 3 files changed, 89 insertions(+), 18 deletions(-) diff --git a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/RaptorRoute.java b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/RaptorRoute.java index ab4c991d99c..1fa5abc2824 100644 --- a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/RaptorRoute.java +++ b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/RaptorRoute.java @@ -51,7 +51,7 @@ public class RaptorRoute { } void addNonPt(TransitStopFacility fromStop, TransitStopFacility toStop, double depTime, double travelTime, double distance, String mode) { - this.editableParts.add(new RoutePart(fromStop, toStop, mode, depTime, Double.NaN, depTime + travelTime, distance, null, null, null)); + this.editableParts.add(new RoutePart(fromStop, toStop, mode, depTime, Double.NaN, Double.NaN, depTime + travelTime, distance, null, null, null)); if (Double.isNaN(this.departureTime)) { this.departureTime = depTime; } @@ -59,15 +59,15 @@ void addNonPt(TransitStopFacility fromStop, TransitStopFacility toStop, double d } void addPlanElements(double depTime, double travelTime, List planElements) { - this.editableParts.add(new RoutePart(null, null, null, depTime, Double.NaN, depTime + travelTime, Double.NaN, null, null, planElements)); + this.editableParts.add(new RoutePart(null, null, null, depTime, Double.NaN, Double.NaN, depTime + travelTime, Double.NaN, null, null, planElements)); if (Double.isNaN(this.departureTime)) { this.departureTime = depTime; } this.travelTime += travelTime; } - void addPt(TransitStopFacility fromStop, TransitStopFacility toStop, TransitLine line, TransitRoute route, String mode, double depTime, double boardingTime, double arrivalTime, double distance) { - this.editableParts.add(new RoutePart(fromStop, toStop, mode, depTime, boardingTime, arrivalTime, distance, line, route, null)); + void addPt(TransitStopFacility fromStop, TransitStopFacility toStop, TransitLine line, TransitRoute route, String mode, double depTime, double boardingTime, double vehDepTime, double arrivalTime, double distance) { + this.editableParts.add(new RoutePart(fromStop, toStop, mode, depTime, boardingTime, vehDepTime, arrivalTime, distance, line, route, null)); if (Double.isNaN(this.departureTime)) { this.departureTime = depTime; } @@ -102,20 +102,23 @@ public static final class RoutePart { public final TransitStopFacility fromStop; public final TransitStopFacility toStop; public final String mode; + // the agent's departure time, i.e. when the agent starts waiting for this bus/train/... public final double depTime; public final double boardingTime; + public final double vehicleDepTime; public final double arrivalTime; public final double distance; public final TransitLine line; public final TransitRoute route; final List planElements; - RoutePart(TransitStopFacility fromStop, TransitStopFacility toStop, String mode, double depTime, double boardingTime, double arrivalTime, double distance, TransitLine line, TransitRoute route, List planElements) { + RoutePart(TransitStopFacility fromStop, TransitStopFacility toStop, String mode, double depTime, double boardingTime, double vehicleDepTime, double arrivalTime, double distance, TransitLine line, TransitRoute route, List planElements) { this.fromStop = fromStop; this.toStop = toStop; this.mode = mode; this.depTime = depTime; this.boardingTime = boardingTime; + this.vehicleDepTime = vehicleDepTime; this.arrivalTime = arrivalTime; this.distance = distance; this.line = line; diff --git a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java index 2808064eb1f..201d2730cc8 100644 --- a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java +++ b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -37,6 +38,7 @@ import org.matsim.core.population.PopulationUtils; import org.matsim.core.router.RoutingRequest; import org.matsim.core.utils.geometry.CoordUtils; +import org.matsim.core.utils.misc.Time; import org.matsim.facilities.Facility; import org.matsim.pt.router.TransitRouter; import org.matsim.pt.transitSchedule.api.TransitStopFacility; @@ -229,17 +231,57 @@ public Map, SwissRailRaptorCore.TravelInfo> calcTree(Col for (TransitStopFacility stop : fromStops) { accessStops.add(new InitialStop(stop, 0, 0, 0, null)); } - return this.calcLeastCostTree(accessStops, departureTime, parameters, person); + return this.calcLeastCostTree(accessStops, departureTime, parameters, person, null); } public Map, SwissRailRaptorCore.TravelInfo> calcTree(Facility fromFacility, double departureTime, Person person, Attributes routingAttributes) { RaptorParameters parameters = this.parametersForPerson.getRaptorParameters(person); List accessStops = findAccessStops(fromFacility, fromFacility, person, departureTime, routingAttributes, parameters); - return this.calcLeastCostTree(accessStops, departureTime, parameters, person); + return this.calcLeastCostTree(accessStops, departureTime, parameters, person, null); } - private Map, SwissRailRaptorCore.TravelInfo> calcLeastCostTree(Collection accessStops, double departureTime, RaptorParameters parameters, Person person) { - return this.raptor.calcLeastCostTree(departureTime, accessStops, parameters, person); + /** Calculates a least-cost-tree for every actual departure time between earliestDepartureTime + * and latestDepartureTime at the provided stop-facility. + * This method returns nothing, instead users have to use the observer to collect + * relevant results. + */ + public void calcTreesObservable(TransitStopFacility stopFacility, double earliestDepartureTime, double latestStartTime, RaptorParameters parameters, Person person, RaptorObserver observer) { + if (this.data.config.getOptimization() != RaptorStaticConfig.RaptorOptimization.OneToAllRouting && !this.treeWarningShown) { + log.warn("SwissRailRaptorData was not initialized with full support for tree calculations and may result in unexpected results. Use `RaptorStaticConfig.setOptimization(RaptorOptimization.OneToAllRouting)` to fix this issue."); + this.treeWarningShown = true; + } + + List accessStops = List.of(new InitialStop(stopFacility, 0, 0, 0, null)); + + int[] routeStopIndices = this.data.routeStopsPerStopFacility.get(stopFacility); + + List departureTimes = new ArrayList<>(); + + for (int routeStopIndex : routeStopIndices) { + SwissRailRaptorData.RRouteStop routeStop = this.data.routeStops[routeStopIndex]; + SwissRailRaptorData.RRoute route = this.data.routes[routeStop.transitRouteIndex]; + int fromIndex = route.indexFirstDeparture; + int toIndex = fromIndex + route.countDepartures; + for (int depIndex = fromIndex; depIndex < toIndex; depIndex++) { + double departureTime = this.data.departures[depIndex] + routeStop.departureOffset; + if (departureTime >= earliestDepartureTime && departureTime <= latestStartTime) { + departureTimes.add(departureTime); + } + } + } + departureTimes.sort(Double::compare); + // we might have some departure times multiple times. helper variable to skip those + double lastDepTime = -1; + for (double departureTime : departureTimes) { + if (departureTime > lastDepTime) { + calcLeastCostTree(accessStops, departureTime, parameters, person, observer); + lastDepTime = departureTime; + } + } + } + + private Map, SwissRailRaptorCore.TravelInfo> calcLeastCostTree(Collection accessStops, double departureTime, RaptorParameters parameters, Person person, RaptorObserver observer) { + return this.raptor.calcLeastCostTree(departureTime, accessStops, parameters, person, observer); } public SwissRailRaptorData getUnderlyingData() { @@ -310,4 +352,8 @@ public SwissRailRaptor build() { } } + public interface RaptorObserver { + void arrivedAtStop(double departureTime, TransitStopFacility stopFacility, double arrivalTime, int transferCount, Supplier route); + } + } diff --git a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java index 0242f5e91ab..c867bc8c2ce 100644 --- a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java +++ b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java @@ -22,6 +22,7 @@ import ch.sbb.matsim.config.SwissRailRaptorConfigGroup; import ch.sbb.matsim.routing.pt.raptor.OccupancyData.DepartureData; import ch.sbb.matsim.routing.pt.raptor.RaptorInVehicleCostCalculator.RouteSegmentIterator; +import ch.sbb.matsim.routing.pt.raptor.SwissRailRaptor.RaptorObserver; import ch.sbb.matsim.routing.pt.raptor.SwissRailRaptorData.CachingTransferProvider; import ch.sbb.matsim.routing.pt.raptor.SwissRailRaptorData.RRoute; import ch.sbb.matsim.routing.pt.raptor.SwissRailRaptorData.RRouteStop; @@ -176,7 +177,7 @@ public RaptorRoute calcLeastCostRoute(double depTime, Facility fromFacility, Fac double waitingCost = waitingTime * -parameters.getMarginalUtilityOfWaitingPt_utl_s(); RRouteStop toRouteStop = this.data.routeStops[routeStopIndex]; - PathElement pe = new PathElement(null, toRouteStop, TIME_UNDEFINED, nextDepartureTimeAtStop, arrivalTime, arrivalCost, 0, stop.distance, 0, true, null, stop); + PathElement pe = new PathElement(null, toRouteStop, TIME_UNDEFINED, nextDepartureTimeAtStop, nextDepartureTimeAtStop, arrivalTime, arrivalCost, 0, stop.distance, 0, true, null, stop); /* okay, the following is not very nice... * we want to find the least-cost access leg including the waiting time @@ -204,7 +205,7 @@ public RaptorRoute calcLeastCostRoute(double depTime, Facility fromFacility, Fac } else if (isIntermodalAccess) { // there is no more departure, but we start here by intermodal access, so still register to allow transfers to other (non-)intermodal stops. RRouteStop toRouteStop = this.data.routeStops[routeStopIndex]; - PathElement pe = new PathElement(null, toRouteStop, TIME_UNDEFINED, TIME_UNDEFINED, arrivalTime, arrivalCost, 0, stop.distance, 0, true, null, stop); + PathElement pe = new PathElement(null, toRouteStop, TIME_UNDEFINED, TIME_UNDEFINED, TIME_UNDEFINED,arrivalTime, arrivalCost, 0, stop.distance, 0, true, null, stop); /* okay, the following is not very nice... * ... see long comment above, it's the same @@ -365,7 +366,7 @@ public List calcRoutes(double earliestDepTime, double desiredDepTim double arrivalCost = depAtRouteStop.accessStop.accessCost + depAtRouteStop.costOffset; RRouteStop toRouteStop = depAtRouteStop.routeStop; int routeStopIndex = depAtRouteStop.routeStopIndex; - PathElement pe = new PathElement(null, toRouteStop, depAtRouteStop.depTime, depAtRouteStop.depTime, arrivalTime, arrivalCost, 0, depAtRouteStop.accessStop.distance, 0, true, null, depAtRouteStop.accessStop); + PathElement pe = new PathElement(null, toRouteStop, depAtRouteStop.depTime, depAtRouteStop.depTime, depAtRouteStop.depTime, arrivalTime, arrivalCost, 0, depAtRouteStop.accessStop.distance, 0, true, null, depAtRouteStop.accessStop); this.arrivalPathPerRouteStop[routeStopIndex] = pe; this.leastArrivalCostAtRouteStop[routeStopIndex] = arrivalCost; this.arrivalPathPerStop[toRouteStop.stopFacilityIndex] = pe; @@ -486,6 +487,10 @@ private List filterRoutes(List allRoutes) { } public Map, TravelInfo> calcLeastCostTree(double depTime, Collection startStops, RaptorParameters parameters, Person person) { + return this.calcLeastCostTree(depTime, startStops, parameters, person, null); + } + + public Map, TravelInfo> calcLeastCostTree(double depTime, Collection startStops, RaptorParameters parameters, Person person, RaptorObserver observer) { reset(); BitSet initialRouteStopIndices = new BitSet(); @@ -496,7 +501,7 @@ public Map, TravelInfo> calcLeastCostTree(double depTime int arrivalTime = (int) (depTime + stop.accessTime); double arrivalCost = stop.accessCost; RRouteStop toRouteStop = this.data.routeStops[routeStopIndex]; - PathElement pe = new PathElement(null, toRouteStop, TIME_UNDEFINED, TIME_UNDEFINED, arrivalTime, arrivalCost, 0, stop.distance, 0, true, null, stop); + PathElement pe = new PathElement(null, toRouteStop, TIME_UNDEFINED, TIME_UNDEFINED, TIME_UNDEFINED, arrivalTime, arrivalCost, 0, stop.distance, 0, true, null, stop); this.arrivalPathPerRouteStop[routeStopIndex] = pe; this.arrivalPathPerStop[toRouteStop.stopFacilityIndex] = pe; this.leastArrivalCostAtRouteStop[routeStopIndex] = arrivalCost; @@ -527,6 +532,21 @@ public Map, TravelInfo> calcLeastCostTree(double depTime initialStopIndices = null; } + if (observer != null) { + for (int stopIndex = this.improvedStops.nextSetBit(0); stopIndex >= 0; stopIndex = this.improvedStops.nextSetBit(stopIndex + 1)) { + PathElement fromPE = this.arrivalPathPerStop[stopIndex]; + PathElement backpointer = fromPE.comingFrom; + if (backpointer != null) { + while (backpointer.comingFrom != null) { + backpointer = backpointer.comingFrom; + } + TransitStopFacility departureStopFacility = backpointer.toRouteStop.routeStop.getStopFacility(); + TransitStopFacility arrivalStopFacility = fromPE.toRouteStop.routeStop.getStopFacility(); + observer.arrivedAtStop(fromPE.firstDepartureTime, arrivalStopFacility, fromPE.arrivalTime, fromPE.transferCount, () -> createRaptorRoute(departureStopFacility, arrivalStopFacility, fromPE, fromPE.firstDepartureTime)); + } + } + } + // third stage (according to paper): handle footpaths / transfers handleTransfers(true, parameters); @@ -644,7 +664,7 @@ private void exploreRoutes(RaptorParameters parameters, Person person) { double totalArrivalCost = arrivalTravelCost + arrivalTransferCost; if (totalArrivalCost <= previousArrivalCost) { double distance = toRouteStop.distanceAlongRoute - boardingPE.toRouteStop.distanceAlongRoute; - PathElement pe = new PathElement(boardingPE, toRouteStop, firstDepartureTime, currentAgentBoardingTime, arrivalTime, arrivalTravelCost, arrivalTransferCost, distance, boardingPE.transferCount, false, null, null); + PathElement pe = new PathElement(boardingPE, toRouteStop, firstDepartureTime, currentAgentBoardingTime, currentDepartureTime + firstRouteStop.departureOffset, arrivalTime, arrivalTravelCost, arrivalTransferCost, distance, boardingPE.transferCount, false, null, null); this.arrivalPathPerRouteStop[toRouteStopIndex] = pe; this.leastArrivalCostAtRouteStop[toRouteStopIndex] = totalArrivalCost; if (totalArrivalCost <= this.leastArrivalCostAtStop[toRouteStop.stopFacilityIndex]) { @@ -765,7 +785,7 @@ private void handleTransfers(boolean strict, RaptorParameters raptorParams) { double prevLeastArrivalCost = this.leastArrivalCostAtRouteStop[toRouteStopIndex]; if (newTotalArrivalCost < prevLeastArrivalCost || (!strict && newTotalArrivalCost <= prevLeastArrivalCost)) { RRouteStop toRouteStop = this.data.routeStops[toRouteStopIndex]; - PathElement pe = new PathElement(fromPE, toRouteStop, fromPE.firstDepartureTime, TIME_UNDEFINED, newArrivalTime, newArrivalTravelCost, newArrivalTransferCost, transfer.transferDistance, fromPE.transferCount + 1, true, transfer, null); + PathElement pe = new PathElement(fromPE, toRouteStop, fromPE.firstDepartureTime, TIME_UNDEFINED, TIME_UNDEFINED, newArrivalTime, newArrivalTravelCost, newArrivalTransferCost, transfer.transferDistance, fromPE.transferCount + 1, true, transfer, null); this.arrivalPathPerRouteStop[toRouteStopIndex] = pe; this.leastArrivalCostAtRouteStop[toRouteStopIndex] = newTotalArrivalCost; this.improvedRouteStopIndices.set(toRouteStopIndex); @@ -805,7 +825,7 @@ private PathElement findLeastCostArrival(Map d double arrivalTravelCost = pe.arrivalTravelCost + egressStop.accessCost; double totalCost = arrivalTravelCost + pe.arrivalTransferCost; if ((totalCost < leastCost) || (totalCost == leastCost && pe.transferCount < leastCostPath.transferCount)) { - PathElement egressLegCandidate = new PathElement(pe, null, pe.firstDepartureTime, TIME_UNDEFINED, arrivalTime, arrivalTravelCost, pe.arrivalTransferCost, egressStop.distance, pe.transferCount, true, null, egressStop); + PathElement egressLegCandidate = new PathElement(pe, null, pe.firstDepartureTime, TIME_UNDEFINED, TIME_UNDEFINED, arrivalTime, arrivalTravelCost, pe.arrivalTransferCost, egressStop.distance, pe.transferCount, true, null, egressStop); if (pe.comingFrom == null && checkBothPtAndPurelyIntermodalRoutes) { if (totalCost < leastCostFeederOnly) { @@ -872,7 +892,7 @@ private static RaptorRoute createRaptorRoute(Facility fromFacility, Facility toF } else { TransitLine line = pe.toRouteStop.line; TransitRoute route = pe.toRouteStop.route; - raptorRoute.addPt(fromStop, toStop, line, route, pe.toRouteStop.mode, time, pe.boardingTime, pe.arrivalTime, pe.distance); + raptorRoute.addPt(fromStop, toStop, line, route, pe.toRouteStop.mode, time, pe.boardingTime, pe.vehDepartureTime, pe.arrivalTime, pe.distance); } time = pe.arrivalTime; fromStop = toStop; @@ -889,6 +909,7 @@ static class PathElement { final RRouteStop toRouteStop; final int firstDepartureTime; // the departure time at the start stop final int boardingTime; + final int vehDepartureTime; final int arrivalTime; double arrivalTravelCost; double arrivalTransferCost; @@ -898,11 +919,12 @@ static class PathElement { final RTransfer transfer; final InitialStop initialStop; - PathElement(PathElement comingFrom, RRouteStop toRouteStop, int firstDepartureTime, int boardingTime, int arrivalTime, double arrivalTravelCost, double arrivalTransferCost, double distance, int transferCount, boolean isTransfer, RTransfer transfer, InitialStop initialStop) { + PathElement(PathElement comingFrom, RRouteStop toRouteStop, int firstDepartureTime, int boardingTime, int vehDeparturetime, int arrivalTime, double arrivalTravelCost, double arrivalTransferCost, double distance, int transferCount, boolean isTransfer, RTransfer transfer, InitialStop initialStop) { this.comingFrom = comingFrom; this.toRouteStop = toRouteStop; this.firstDepartureTime = firstDepartureTime; this.boardingTime = boardingTime; + this.vehDepartureTime = vehDeparturetime; this.arrivalTime = arrivalTime; this.arrivalTravelCost = arrivalTravelCost; this.arrivalTransferCost = arrivalTransferCost; From deb05bf47434922e159ad1813587ac85968ba633 Mon Sep 17 00:00:00 2001 From: Marcel Rieser Date: Fri, 12 Apr 2024 17:59:10 +0200 Subject: [PATCH 02/77] make sure the (newly tracked) vehicleDepartureTime is correctly updated during routing --- .../sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java index c867bc8c2ce..9228e2612c7 100644 --- a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java +++ b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java @@ -691,7 +691,9 @@ private void exploreRoutes(RaptorParameters parameters, Person person) { currentDepartureIndex = alternativeDepartureIndex; currentVehicle = this.data.departureVehicles[currentDepartureIndex]; currentDepartureTime = alternativeDepartureTime; - if (!alternativeBoardingPE.isTransfer) { + if (alternativeBoardingPE.isTransfer) { + firstRouteStop = this.data.routeStops[toRouteStopIndex]; + } else { // we improve to a line/route we entered at some earlier stop, do not create a new transfer for this, // but set the boarding info back to the original boarding of this route alternativeBoardingPE = alternativeBoardingPE.comingFrom; @@ -702,6 +704,8 @@ private void exploreRoutes(RaptorParameters parameters, Person person) { alternativeWaitingTime = alternativeAgentBoardingTime - alternativeAgentFirstArrivalTime; alternativeWaitingCost = -marginalUtilityOfWaitingPt_utl_s * alternativeWaitingTime; alternativeTravelCostWhenBoarding = alternativeBoardingPE.arrivalTravelCost + alternativeWaitingCost; + + firstRouteStop = alternativeBoardingPE.toRouteStop; } currentAgentBoardingTime = alternativeAgentBoardingTime; currentTravelCostWhenBoarding = alternativeTravelCostWhenBoarding; From 8c9a1928622363c1d9baf5920d09fa5a88231ea8 Mon Sep 17 00:00:00 2001 From: Marcel Rieser Date: Sat, 20 Apr 2024 01:34:14 +0200 Subject: [PATCH 03/77] call observer for every stop arrival, not only for improved ones at the end of each route this results in many more routes to be found, but also many illogical ones, and requires improved filtering afterwards. --- .../pt/raptor/SwissRailRaptorCore.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java index 9228e2612c7..8a2393aba97 100644 --- a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java +++ b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java @@ -519,7 +519,7 @@ public Map, TravelInfo> calcLeastCostTree(double depTime // but because we re-use the earliestArrivalTime-array, we don't have to do anything. // second stage: process routes - exploreRoutes(parameters, person); + exploreRoutes(parameters, person, observer); if (this.improvedStops.isEmpty()) { break; @@ -532,21 +532,6 @@ public Map, TravelInfo> calcLeastCostTree(double depTime initialStopIndices = null; } - if (observer != null) { - for (int stopIndex = this.improvedStops.nextSetBit(0); stopIndex >= 0; stopIndex = this.improvedStops.nextSetBit(stopIndex + 1)) { - PathElement fromPE = this.arrivalPathPerStop[stopIndex]; - PathElement backpointer = fromPE.comingFrom; - if (backpointer != null) { - while (backpointer.comingFrom != null) { - backpointer = backpointer.comingFrom; - } - TransitStopFacility departureStopFacility = backpointer.toRouteStop.routeStop.getStopFacility(); - TransitStopFacility arrivalStopFacility = fromPE.toRouteStop.routeStop.getStopFacility(); - observer.arrivedAtStop(fromPE.firstDepartureTime, arrivalStopFacility, fromPE.arrivalTime, fromPE.transferCount, () -> createRaptorRoute(departureStopFacility, arrivalStopFacility, fromPE, fromPE.firstDepartureTime)); - } - } - } - // third stage (according to paper): handle footpaths / transfers handleTransfers(true, parameters); @@ -602,6 +587,10 @@ private TravelInfo getTravelInfo(PathElement destination, RaptorParameters param } private void exploreRoutes(RaptorParameters parameters, Person person) { + this.exploreRoutes(parameters, person, null); + } + + private void exploreRoutes(RaptorParameters parameters, Person person, RaptorObserver observer) { this.improvedStops.clear(); this.reachedRouteStopIndices.clear(); @@ -662,6 +651,17 @@ private void exploreRoutes(RaptorParameters parameters, Person person) { double arrivalTransferCost = (boardingPE.firstDepartureTime != TIME_UNDEFINED) ? (currentTransferCostWhenBoarding + this.transferCostCalculator.calcTransferCost(boardingPE,transferProvider, data.config, parameters, arrivalTime - firstDepartureTime, boardingPE.transferCount, boardingPE.arrivalTransferCost, boardingPE.arrivalTime)) : 0; double previousArrivalCost = this.leastArrivalCostAtRouteStop[toRouteStopIndex]; double totalArrivalCost = arrivalTravelCost + arrivalTransferCost; + if (observer != null) { + double distance = toRouteStop.distanceAlongRoute - boardingPE.toRouteStop.distanceAlongRoute; + PathElement pe = new PathElement(boardingPE, toRouteStop, firstDepartureTime, currentAgentBoardingTime, currentDepartureTime + firstRouteStop.departureOffset, arrivalTime, arrivalTravelCost, arrivalTransferCost, distance, boardingPE.transferCount, false, null, null); + PathElement backpointer = boardingPE; + while (backpointer.comingFrom != null) { + backpointer = backpointer.comingFrom; + } + TransitStopFacility departureStopFacility = backpointer.toRouteStop.routeStop.getStopFacility(); + TransitStopFacility arrivalStopFacility = toRouteStop.routeStop.getStopFacility(); + observer.arrivedAtStop(pe.firstDepartureTime, arrivalStopFacility, pe.arrivalTime, pe.transferCount, () -> createRaptorRoute(departureStopFacility, arrivalStopFacility, pe, pe.firstDepartureTime)); + } if (totalArrivalCost <= previousArrivalCost) { double distance = toRouteStop.distanceAlongRoute - boardingPE.toRouteStop.distanceAlongRoute; PathElement pe = new PathElement(boardingPE, toRouteStop, firstDepartureTime, currentAgentBoardingTime, currentDepartureTime + firstRouteStop.departureOffset, arrivalTime, arrivalTravelCost, arrivalTransferCost, distance, boardingPE.transferCount, false, null, null); From f16ab0aac4f334ad4943293c7970df5d3deda5b2 Mon Sep 17 00:00:00 2001 From: rakow Date: Wed, 8 May 2024 09:44:57 +0200 Subject: [PATCH 04/77] combined distribution of tour start and duration --- ...rateSmallScaleCommercialTrafficDemand.java | 540 +++++++++++++++++- 1 file changed, 513 insertions(+), 27 deletions(-) diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java index 4077f18d080..dc34f2d8f2f 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java @@ -22,6 +22,10 @@ import com.google.inject.Inject; import com.google.inject.Provider; import it.unimi.dsi.fastutil.objects.Object2DoubleMap; +import org.apache.commons.math3.distribution.EnumeratedDistribution; +import org.apache.commons.math3.random.MersenneTwister; +import org.apache.commons.math3.random.RandomGenerator; +import org.apache.commons.math3.util.Pair; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -164,6 +168,7 @@ public enum SmallScaleCommercialTrafficType { private Path output; private Random rnd; + private RandomGenerator rng; private final Map>> facilitiesPerZone = new HashMap<>(); private Index indexZones; @@ -500,7 +505,10 @@ private Config readAndCheckConfig(Path configPath, String modelName, String samp config.controller().getOverwriteFileSetting(), ControllerConfigGroup.CompressionType.gzip); new File(Path.of(config.controller().getOutputDirectory()).resolve("calculatedData").toString()).mkdir(); MatsimRandom.getRandom().setSeed(config.global().getRandomSeed()); + rnd = MatsimRandom.getRandom(); + rng = new MersenneTwister(config.global().getRandomSeed()); + if (config.network().getInputFile() == null) throw new Exception("No network file in config"); if (config.global().getCoordinateSystem() == null) @@ -543,8 +551,9 @@ private void createCarriers(Scenario scenario, TripDistributionMatrix odMatrix, * odMatrix.getListOfModesOrVehTypes().size(); int createdCarrier = 0; int fixedNumberOfVehiclePerTypeAndLocation = 1; //TODO possible improvement, perhaps check KiD - ValueSelectorUnderGivenProbability tourStartTimeSelector = createTourStartTimeDistribution(smallScaleCommercialTrafficType); - ValueSelectorUnderGivenProbability tourDurationTimeSelector = createTourDurationTimeDistribution(smallScaleCommercialTrafficType); + + EnumeratedDistribution tourDistribution = createTourDistribution(smallScaleCommercialTrafficType); + Map stopDurationTimeSelector = createStopDurationTimeDistributionPerCategory( smallScaleCommercialTrafficType); @@ -674,7 +683,7 @@ private void createCarriers(Scenario scenario, TripDistributionMatrix odMatrix, createNewCarrierAndAddVehicleTypes(scenario, purpose, startZone, selectedStartCategory, carrierName, vehicleTypes, numberOfDepots, fleetSize, fixedNumberOfVehiclePerTypeAndLocation, vehicleDepots, linksPerZone, smallScaleCommercialTrafficType, - tourStartTimeSelector, tourDurationTimeSelector); + tourDistribution); log.info("Create services for carrier: {}", carrierName); for (String stopZone : odMatrix.getListOfZones()) { int trafficVolumeForOD = Math.round((float)odMatrix.getTripDistributionValue(startZone, @@ -702,11 +711,12 @@ private void createCarriers(Scenario scenario, TripDistributionMatrix odMatrix, } } } - System.out.println("Final results for the start time distribution"); - tourStartTimeSelector.writeResults(); - System.out.println("Final results for the tour duration distribution"); - tourDurationTimeSelector.writeResults(); +// System.out.println("Final results for the start time distribution"); +// tourStartTimeSelector.writeResults(); + +// System.out.println("Final results for the tour duration distribution"); +// tourDurationTimeSelector.writeResults(); for (StopDurationGoodTrafficKey sector : stopDurationTimeSelector.keySet()) { System.out.println("Final results for the stop duration distribution in sector " + sector); @@ -750,8 +760,7 @@ private void createNewCarrierAndAddVehicleTypes(Scenario scenario, Integer purpo int fixedNumberOfVehiclePerTypeAndLocation, List vehicleDepots, Map, Link>> linksPerZone, String smallScaleCommercialTrafficType, - ValueSelectorUnderGivenProbability tourStartTimeSelector, - ValueSelectorUnderGivenProbability tourDurationTimeSelector) { + EnumeratedDistribution tourStartTimeSelector) { Carriers carriers = CarriersUtils.addOrGetCarriers(scenario); CarrierVehicleTypes carrierVehicleTypes = CarriersUtils.getCarrierVehicleTypes(scenario); @@ -777,8 +786,10 @@ private void createNewCarrierAndAddVehicleTypes(Scenario scenario, Integer purpo } for (String singleDepot : vehicleDepots) { - int vehicleStartTime = getVehicleStartTime(tourStartTimeSelector); - int tourDuration = getVehicleTourDuration(tourDurationTimeSelector); + TourStartAndDuration t = tourStartTimeSelector.sample(); + + int vehicleStartTime = getVehicleStartTime(t); + int tourDuration = getVehicleTourDuration(t); int vehicleEndTime = vehicleStartTime + tourDuration; for (String thisVehicleType : vehicleTypes) { //TODO Flottenzusammensetzung anpassen. Momentan pro Depot alle Fahrzeugtypen 1x erzeugen VehicleType thisType = carrierVehicleTypes.getVehicleTypes() @@ -807,28 +818,16 @@ private void createNewCarrierAndAddVehicleTypes(Scenario scenario, Integer purpo /** * Gives a duration for the created tour under the given probability. * - * @param tourDurationTimeSelector - * @return */ - private int getVehicleTourDuration(ValueSelectorUnderGivenProbability tourDurationTimeSelector) { - ValueSelectorUnderGivenProbability.ProbabilityForValue selectedValue = tourDurationTimeSelector.getNextValueUnderGivenProbability(); - int tourDurationLowerBound = Integer.parseInt(selectedValue.getValue()); - int tourDurationUpperBound = Integer.parseInt(selectedValue.getUpperBound()); - return rnd.nextInt(tourDurationLowerBound * 3600, tourDurationUpperBound * 3600); + private int getVehicleTourDuration(TourStartAndDuration t) { + return (int) rnd.nextDouble(t.minDuration * 60, t.maxDuration * 60); } /** * Gives a tour start time for the created tour under the given probability. - * - * @param tourStartTimeSelector - * @return */ - private int getVehicleStartTime(ValueSelectorUnderGivenProbability tourStartTimeSelector) { - ValueSelectorUnderGivenProbability.ProbabilityForValue selectedValue = tourStartTimeSelector.getNextValueUnderGivenProbability(); - int tourStartTimeLowerBound = Integer.parseInt(selectedValue.getValue()); - int tourStartTimeUpperBound = Integer.parseInt(selectedValue.getUpperBound()); - return rnd.nextInt(tourStartTimeLowerBound * 3600, tourStartTimeUpperBound * 3600); - + private int getVehicleStartTime(TourStartAndDuration t) { + return rnd.nextInt(t.hourLower * 3600, t.hourUpper * 3600); } @@ -1306,6 +1305,490 @@ private ValueSelectorUnderGivenProbability createTourDurationTimeDistribution(St return new ValueSelectorUnderGivenProbability(tourDurationProbabilityDistribution, rnd); } + private EnumeratedDistribution createTourDistribution(String smallScaleCommercialTrafficType) { + + if (smallScaleCommercialTrafficType.equals(SmallScaleCommercialTrafficType.commercialPersonTraffic.toString())) { + + return new EnumeratedDistribution<>(rng, List.of( + Pair.create(new TourStartAndDuration(0, 4, 0.0, 30.0), 0.0005917893035900173), + Pair.create(new TourStartAndDuration(0, 4, 30.0, 60.0), 0.00021859484237437887), + Pair.create(new TourStartAndDuration(0, 4, 90.0, 120.0), 0.00037490287407786324), + Pair.create(new TourStartAndDuration(0, 4, 120.0, 180.0), 0.0004337321926125666), + Pair.create(new TourStartAndDuration(0, 4, 180.0, 240.0), 0.0005834182239827621), + Pair.create(new TourStartAndDuration(0, 4, 240.0, 300.0), 0.0005116938323661723), + Pair.create(new TourStartAndDuration(0, 4, 300.0, 360.0), 0.0005027065159573272), + Pair.create(new TourStartAndDuration(0, 4, 360.0, 420.0), 0.0006719740164147071), + Pair.create(new TourStartAndDuration(0, 4, 420.0, 480.0), 0.00022375027665644004), + Pair.create(new TourStartAndDuration(0, 4, 480.0, 540.0), 0.00022103749529549306), + Pair.create(new TourStartAndDuration(0, 4, 540.0, 600.0), 0.00022119440831885122), + Pair.create(new TourStartAndDuration(0, 4, 600.0, 660.0), 0.0002732185104003396), + Pair.create(new TourStartAndDuration(0, 4, 660.0, 720.0), 7.287567629774946e-05), + Pair.create(new TourStartAndDuration(0, 4, 720.0, 780.0), 0.0005090670761685264), + Pair.create(new TourStartAndDuration(0, 4, 780.0, 840.0), 0.0002169454122557984), + Pair.create(new TourStartAndDuration(0, 4, 840.0, 1080.0), 0.0016947794402011696), + Pair.create(new TourStartAndDuration(4, 5, 0.0, 30.0), 0.00033050926084770643), + Pair.create(new TourStartAndDuration(4, 5, 30.0, 60.0), 0.0004963985976117265), + Pair.create(new TourStartAndDuration(4, 5, 60.0, 90.0), 0.0009458837608304906), + Pair.create(new TourStartAndDuration(4, 5, 90.0, 120.0), 0.0006507941771038976), + Pair.create(new TourStartAndDuration(4, 5, 120.0, 180.0), 0.0002949035696660126), + Pair.create(new TourStartAndDuration(4, 5, 180.0, 240.0), 0.0005812406149568905), + Pair.create(new TourStartAndDuration(4, 5, 240.0, 300.0), 0.00072666224822023), + Pair.create(new TourStartAndDuration(4, 5, 300.0, 360.0), 0.0006017750128936798), + Pair.create(new TourStartAndDuration(4, 5, 360.0, 420.0), 0.0007696491628020603), + Pair.create(new TourStartAndDuration(4, 5, 420.0, 480.0), 0.0006951014583380694), + Pair.create(new TourStartAndDuration(4, 5, 480.0, 540.0), 0.0006675367479652174), + Pair.create(new TourStartAndDuration(4, 5, 540.0, 600.0), 0.0009951412624367468), + Pair.create(new TourStartAndDuration(4, 5, 600.0, 660.0), 0.0006193958232902363), + Pair.create(new TourStartAndDuration(4, 5, 660.0, 720.0), 0.0005496335422364244), + Pair.create(new TourStartAndDuration(4, 5, 720.0, 780.0), 0.000963763774344583), + Pair.create(new TourStartAndDuration(4, 5, 780.0, 840.0), 0.001585152586657775), + Pair.create(new TourStartAndDuration(4, 5, 840.0, 1080.0), 0.0022779973751500433), + Pair.create(new TourStartAndDuration(5, 6, 0.0, 30.0), 0.003678291745870938), + Pair.create(new TourStartAndDuration(5, 6, 30.0, 60.0), 0.0037749680865755936), + Pair.create(new TourStartAndDuration(5, 6, 60.0, 90.0), 0.0021464058981758467), + Pair.create(new TourStartAndDuration(5, 6, 90.0, 120.0), 0.0010105726369455444), + Pair.create(new TourStartAndDuration(5, 6, 120.0, 180.0), 0.0017166729332290624), + Pair.create(new TourStartAndDuration(5, 6, 180.0, 240.0), 0.001218657902054598), + Pair.create(new TourStartAndDuration(5, 6, 240.0, 300.0), 0.0019212859349972463), + Pair.create(new TourStartAndDuration(5, 6, 300.0, 360.0), 0.0018498349748915703), + Pair.create(new TourStartAndDuration(5, 6, 360.0, 420.0), 0.0020820722844894844), + Pair.create(new TourStartAndDuration(5, 6, 420.0, 480.0), 0.0033255032578691536), + Pair.create(new TourStartAndDuration(5, 6, 480.0, 540.0), 0.004499580798913233), + Pair.create(new TourStartAndDuration(5, 6, 540.0, 600.0), 0.004508722079694882), + Pair.create(new TourStartAndDuration(5, 6, 600.0, 660.0), 0.009460453046374911), + Pair.create(new TourStartAndDuration(5, 6, 660.0, 720.0), 0.008632039128635343), + Pair.create(new TourStartAndDuration(5, 6, 720.0, 780.0), 0.005173130409039029), + Pair.create(new TourStartAndDuration(5, 6, 780.0, 840.0), 0.0021287189901771954), + Pair.create(new TourStartAndDuration(5, 6, 840.0, 1080.0), 0.002735246591728173), + Pair.create(new TourStartAndDuration(6, 7, 0.0, 30.0), 0.015534599731489868), + Pair.create(new TourStartAndDuration(6, 7, 30.0, 60.0), 0.009424737666749776), + Pair.create(new TourStartAndDuration(6, 7, 60.0, 90.0), 0.003979757502241877), + Pair.create(new TourStartAndDuration(6, 7, 90.0, 120.0), 0.0026219034509082214), + Pair.create(new TourStartAndDuration(6, 7, 120.0, 180.0), 0.004373894821911171), + Pair.create(new TourStartAndDuration(6, 7, 180.0, 240.0), 0.005349695968407728), + Pair.create(new TourStartAndDuration(6, 7, 240.0, 300.0), 0.008398668008895199), + Pair.create(new TourStartAndDuration(6, 7, 300.0, 360.0), 0.013017576110359298), + Pair.create(new TourStartAndDuration(6, 7, 360.0, 420.0), 0.013178466937493282), + Pair.create(new TourStartAndDuration(6, 7, 420.0, 480.0), 0.015799261066253244), + Pair.create(new TourStartAndDuration(6, 7, 480.0, 540.0), 0.031932993774084484), + Pair.create(new TourStartAndDuration(6, 7, 540.0, 600.0), 0.056976770375347194), + Pair.create(new TourStartAndDuration(6, 7, 600.0, 660.0), 0.03411514635058722), + Pair.create(new TourStartAndDuration(6, 7, 660.0, 720.0), 0.010952547256934878), + Pair.create(new TourStartAndDuration(6, 7, 720.0, 780.0), 0.005071677294689363), + Pair.create(new TourStartAndDuration(6, 7, 780.0, 840.0), 0.002758017802376135), + Pair.create(new TourStartAndDuration(6, 7, 840.0, 1080.0), 0.003182481371327368), + Pair.create(new TourStartAndDuration(7, 8, 0.0, 30.0), 0.018010507239762663), + Pair.create(new TourStartAndDuration(7, 8, 30.0, 60.0), 0.009246211080247332), + Pair.create(new TourStartAndDuration(7, 8, 60.0, 90.0), 0.006297103845359016), + Pair.create(new TourStartAndDuration(7, 8, 90.0, 120.0), 0.003415561088528113), + Pair.create(new TourStartAndDuration(7, 8, 120.0, 180.0), 0.010918022744746231), + Pair.create(new TourStartAndDuration(7, 8, 180.0, 240.0), 0.011371721163141522), + Pair.create(new TourStartAndDuration(7, 8, 240.0, 300.0), 0.01861910064916215), + Pair.create(new TourStartAndDuration(7, 8, 300.0, 360.0), 0.015443374909900384), + Pair.create(new TourStartAndDuration(7, 8, 360.0, 420.0), 0.020470726990450452), + Pair.create(new TourStartAndDuration(7, 8, 420.0, 480.0), 0.030727618880727087), + Pair.create(new TourStartAndDuration(7, 8, 480.0, 540.0), 0.07364088624635841), + Pair.create(new TourStartAndDuration(7, 8, 540.0, 600.0), 0.04082061588575034), + Pair.create(new TourStartAndDuration(7, 8, 600.0, 660.0), 0.012935881167590665), + Pair.create(new TourStartAndDuration(7, 8, 660.0, 720.0), 0.005469250367916343), + Pair.create(new TourStartAndDuration(7, 8, 720.0, 780.0), 0.0030030673084490513), + Pair.create(new TourStartAndDuration(7, 8, 780.0, 840.0), 0.0011042643367551329), + Pair.create(new TourStartAndDuration(7, 8, 840.0, 1080.0), 0.0011327583672022575), + Pair.create(new TourStartAndDuration(8, 9, 0.0, 30.0), 0.015589932735904798), + Pair.create(new TourStartAndDuration(8, 9, 30.0, 60.0), 0.007157798082590814), + Pair.create(new TourStartAndDuration(8, 9, 60.0, 90.0), 0.006563655710107534), + Pair.create(new TourStartAndDuration(8, 9, 90.0, 120.0), 0.004888423230467872), + Pair.create(new TourStartAndDuration(8, 9, 120.0, 180.0), 0.01261126944262904), + Pair.create(new TourStartAndDuration(8, 9, 180.0, 240.0), 0.013275311108363174), + Pair.create(new TourStartAndDuration(8, 9, 240.0, 300.0), 0.011059737216827653), + Pair.create(new TourStartAndDuration(8, 9, 300.0, 360.0), 0.00980644443311104), + Pair.create(new TourStartAndDuration(8, 9, 360.0, 420.0), 0.013476523854959467), + Pair.create(new TourStartAndDuration(8, 9, 420.0, 480.0), 0.01766932338862498), + Pair.create(new TourStartAndDuration(8, 9, 480.0, 540.0), 0.013855266610087914), + Pair.create(new TourStartAndDuration(8, 9, 540.0, 600.0), 0.006090238569895901), + Pair.create(new TourStartAndDuration(8, 9, 600.0, 660.0), 0.00326688741194661), + Pair.create(new TourStartAndDuration(8, 9, 660.0, 720.0), 0.0009742217966822537), + Pair.create(new TourStartAndDuration(8, 9, 720.0, 780.0), 0.0008462163162537791), + Pair.create(new TourStartAndDuration(8, 9, 780.0, 840.0), 0.0009357453082055104), + Pair.create(new TourStartAndDuration(8, 9, 840.0, 1080.0), 0.0006867783494497427), + Pair.create(new TourStartAndDuration(9, 10, 0.0, 30.0), 0.011836581569331607), + Pair.create(new TourStartAndDuration(9, 10, 30.0, 60.0), 0.0060475163532472224), + Pair.create(new TourStartAndDuration(9, 10, 60.0, 90.0), 0.006091033719221284), + Pair.create(new TourStartAndDuration(9, 10, 90.0, 120.0), 0.004870323217391879), + Pair.create(new TourStartAndDuration(9, 10, 120.0, 180.0), 0.009852214102720915), + Pair.create(new TourStartAndDuration(9, 10, 180.0, 240.0), 0.006649077724867284), + Pair.create(new TourStartAndDuration(9, 10, 240.0, 300.0), 0.006549809619698136), + Pair.create(new TourStartAndDuration(9, 10, 300.0, 360.0), 0.00743649188225418), + Pair.create(new TourStartAndDuration(9, 10, 360.0, 420.0), 0.008370330719772223), + Pair.create(new TourStartAndDuration(9, 10, 420.0, 480.0), 0.006055410372169952), + Pair.create(new TourStartAndDuration(9, 10, 480.0, 540.0), 0.003221026290023441), + Pair.create(new TourStartAndDuration(9, 10, 540.0, 600.0), 0.00270804359225063), + Pair.create(new TourStartAndDuration(9, 10, 600.0, 660.0), 0.0011328763880567346), + Pair.create(new TourStartAndDuration(9, 10, 660.0, 720.0), 0.0005295062815147344), + Pair.create(new TourStartAndDuration(9, 10, 720.0, 780.0), 0.0005244739409173669), + Pair.create(new TourStartAndDuration(9, 10, 780.0, 840.0), 0.00022261373811852168), + Pair.create(new TourStartAndDuration(9, 10, 840.0, 1080.0), 0.0002976820307410009), + Pair.create(new TourStartAndDuration(10, 11, 0.0, 30.0), 0.0072347359578799255), + Pair.create(new TourStartAndDuration(10, 11, 30.0, 60.0), 0.005528762818372258), + Pair.create(new TourStartAndDuration(10, 11, 60.0, 90.0), 0.004301874597910846), + Pair.create(new TourStartAndDuration(10, 11, 90.0, 120.0), 0.002706271535768685), + Pair.create(new TourStartAndDuration(10, 11, 120.0, 180.0), 0.004461225555303183), + Pair.create(new TourStartAndDuration(10, 11, 180.0, 240.0), 0.003289266637558867), + Pair.create(new TourStartAndDuration(10, 11, 240.0, 300.0), 0.004773112389257731), + Pair.create(new TourStartAndDuration(10, 11, 300.0, 360.0), 0.004153307715767419), + Pair.create(new TourStartAndDuration(10, 11, 360.0, 420.0), 0.0023002274828502435), + Pair.create(new TourStartAndDuration(10, 11, 420.0, 480.0), 0.002295722460734858), + Pair.create(new TourStartAndDuration(10, 11, 480.0, 540.0), 0.0008008191218782178), + Pair.create(new TourStartAndDuration(10, 11, 540.0, 600.0), 0.0005302938593833011), + Pair.create(new TourStartAndDuration(10, 11, 600.0, 660.0), 0.00012017333498779025), + Pair.create(new TourStartAndDuration(10, 11, 660.0, 720.0), 0.00029497120761336085), + Pair.create(new TourStartAndDuration(10, 11, 720.0, 780.0), 7.442207741095891e-05), + Pair.create(new TourStartAndDuration(10, 11, 780.0, 840.0), 7.491510042413546e-05), + Pair.create(new TourStartAndDuration(11, 12, 0.0, 30.0), 0.005979044848708125), + Pair.create(new TourStartAndDuration(11, 12, 30.0, 60.0), 0.0030727725862362003), + Pair.create(new TourStartAndDuration(11, 12, 60.0, 90.0), 0.0018328582061095421), + Pair.create(new TourStartAndDuration(11, 12, 90.0, 120.0), 0.0015730248216810105), + Pair.create(new TourStartAndDuration(11, 12, 120.0, 180.0), 0.0025909176745678485), + Pair.create(new TourStartAndDuration(11, 12, 180.0, 240.0), 0.0023584284876344117), + Pair.create(new TourStartAndDuration(11, 12, 240.0, 300.0), 0.002888683132930499), + Pair.create(new TourStartAndDuration(11, 12, 300.0, 360.0), 0.0026723295114103734), + Pair.create(new TourStartAndDuration(11, 12, 360.0, 420.0), 0.001368034507711622), + Pair.create(new TourStartAndDuration(11, 12, 420.0, 480.0), 0.001322142609646873), + Pair.create(new TourStartAndDuration(11, 12, 480.0, 540.0), 0.00014896322977011863), + Pair.create(new TourStartAndDuration(11, 12, 540.0, 600.0), 0.00036793050573151096), + Pair.create(new TourStartAndDuration(11, 12, 600.0, 660.0), 0.0003024749417379503), + Pair.create(new TourStartAndDuration(11, 12, 660.0, 720.0), 7.263766179594998e-05), + Pair.create(new TourStartAndDuration(11, 12, 720.0, 780.0), 7.737798495114381e-05), + Pair.create(new TourStartAndDuration(11, 12, 840.0, 1080.0), 7.360037219024495e-05), + Pair.create(new TourStartAndDuration(12, 13, 0.0, 30.0), 0.005442934607459622), + Pair.create(new TourStartAndDuration(12, 13, 30.0, 60.0), 0.0023099603288455053), + Pair.create(new TourStartAndDuration(12, 13, 60.0, 90.0), 0.0015476125810207045), + Pair.create(new TourStartAndDuration(12, 13, 90.0, 120.0), 0.0015690710859882222), + Pair.create(new TourStartAndDuration(12, 13, 120.0, 180.0), 0.003155552178314994), + Pair.create(new TourStartAndDuration(12, 13, 180.0, 240.0), 0.0024715148201473933), + Pair.create(new TourStartAndDuration(12, 13, 240.0, 300.0), 0.00214638868043489), + Pair.create(new TourStartAndDuration(12, 13, 300.0, 360.0), 0.0017134793037846727), + Pair.create(new TourStartAndDuration(12, 13, 360.0, 420.0), 0.0009684921868733149), + Pair.create(new TourStartAndDuration(12, 13, 420.0, 480.0), 0.0005519992558366529), + Pair.create(new TourStartAndDuration(12, 13, 480.0, 540.0), 0.0004441672064981391), + Pair.create(new TourStartAndDuration(12, 13, 540.0, 600.0), 0.00022332686365997108), + Pair.create(new TourStartAndDuration(12, 13, 600.0, 660.0), 0.00023780343565208111), + Pair.create(new TourStartAndDuration(12, 13, 660.0, 720.0), 0.00014898555439278127), + Pair.create(new TourStartAndDuration(13, 14, 0.0, 30.0), 0.0065652971880044205), + Pair.create(new TourStartAndDuration(13, 14, 30.0, 60.0), 0.0033645458423904226), + Pair.create(new TourStartAndDuration(13, 14, 60.0, 90.0), 0.002247264924524252), + Pair.create(new TourStartAndDuration(13, 14, 90.0, 120.0), 0.0021755851670695867), + Pair.create(new TourStartAndDuration(13, 14, 120.0, 180.0), 0.00292250684836152), + Pair.create(new TourStartAndDuration(13, 14, 180.0, 240.0), 0.0029939610328467135), + Pair.create(new TourStartAndDuration(13, 14, 240.0, 300.0), 0.0013771262994841458), + Pair.create(new TourStartAndDuration(13, 14, 300.0, 360.0), 0.0005929387919824101), + Pair.create(new TourStartAndDuration(13, 14, 360.0, 420.0), 0.0007299574379337656), + Pair.create(new TourStartAndDuration(13, 14, 420.0, 480.0), 0.00015161310680499916), + Pair.create(new TourStartAndDuration(13, 14, 480.0, 540.0), 0.00022326623210165028), + Pair.create(new TourStartAndDuration(13, 14, 540.0, 600.0), 0.00021908720500178134), + Pair.create(new TourStartAndDuration(14, 15, 0.0, 30.0), 0.004700575755513116), + Pair.create(new TourStartAndDuration(14, 15, 30.0, 60.0), 0.002876930233578738), + Pair.create(new TourStartAndDuration(14, 15, 60.0, 90.0), 0.0012326059557891803), + Pair.create(new TourStartAndDuration(14, 15, 90.0, 120.0), 0.001688513011030605), + Pair.create(new TourStartAndDuration(14, 15, 120.0, 180.0), 0.0024148215923521744), + Pair.create(new TourStartAndDuration(14, 15, 180.0, 240.0), 0.0009664823712470381), + Pair.create(new TourStartAndDuration(14, 15, 240.0, 300.0), 0.0008158516384741175), + Pair.create(new TourStartAndDuration(14, 15, 300.0, 360.0), 0.0005326476409500361), + Pair.create(new TourStartAndDuration(14, 15, 360.0, 420.0), 0.00037447250704764534), + Pair.create(new TourStartAndDuration(14, 15, 420.0, 480.0), 7.278074100962308e-05), + Pair.create(new TourStartAndDuration(14, 15, 480.0, 540.0), 0.00015460621875651884), + Pair.create(new TourStartAndDuration(14, 15, 540.0, 600.0), 0.00022625636961834557), + Pair.create(new TourStartAndDuration(14, 15, 840.0, 1080.0), 7.369704340227916e-05), + Pair.create(new TourStartAndDuration(15, 16, 0.0, 30.0), 0.005421542133242069), + Pair.create(new TourStartAndDuration(15, 16, 30.0, 60.0), 0.0028543297205245563), + Pair.create(new TourStartAndDuration(15, 16, 60.0, 90.0), 0.001320449445343739), + Pair.create(new TourStartAndDuration(15, 16, 90.0, 120.0), 0.0011372744623221703), + Pair.create(new TourStartAndDuration(15, 16, 120.0, 180.0), 0.0011175546229352943), + Pair.create(new TourStartAndDuration(15, 16, 180.0, 240.0), 0.0005212091408906178), + Pair.create(new TourStartAndDuration(15, 16, 240.0, 300.0), 0.00025063117439263165), + Pair.create(new TourStartAndDuration(15, 16, 300.0, 360.0), 0.0002906557976189996), + Pair.create(new TourStartAndDuration(15, 16, 360.0, 420.0), 6.934683987097806e-05), + Pair.create(new TourStartAndDuration(15, 16, 420.0, 480.0), 7.198332684426051e-05), + Pair.create(new TourStartAndDuration(16, 17, 0.0, 30.0), 0.005997678933359281), + Pair.create(new TourStartAndDuration(16, 17, 30.0, 60.0), 0.0014450238860978966), + Pair.create(new TourStartAndDuration(16, 17, 60.0, 90.0), 0.0008909835110546583), + Pair.create(new TourStartAndDuration(16, 17, 90.0, 120.0), 0.0008692603958852261), + Pair.create(new TourStartAndDuration(16, 17, 120.0, 180.0), 0.0004645626068627116), + Pair.create(new TourStartAndDuration(16, 17, 180.0, 240.0), 0.0005161866418057845), + Pair.create(new TourStartAndDuration(16, 17, 240.0, 300.0), 0.00047492492382272117), + Pair.create(new TourStartAndDuration(16, 17, 300.0, 360.0), 7.348989097075777e-05), + Pair.create(new TourStartAndDuration(16, 17, 360.0, 420.0), 0.0003000342936128893), + Pair.create(new TourStartAndDuration(17, 18, 0.0, 30.0), 0.004621906661329853), + Pair.create(new TourStartAndDuration(17, 18, 30.0, 60.0), 0.0015152391398060199), + Pair.create(new TourStartAndDuration(17, 18, 60.0, 90.0), 0.0006769045119123614), + Pair.create(new TourStartAndDuration(17, 18, 90.0, 120.0), 0.00044820275277284946), + Pair.create(new TourStartAndDuration(17, 18, 120.0, 180.0), 0.0007140653752077821), + Pair.create(new TourStartAndDuration(17, 18, 180.0, 240.0), 0.0001502672132808765), + Pair.create(new TourStartAndDuration(17, 18, 240.0, 300.0), 0.0003842231300012746), + Pair.create(new TourStartAndDuration(17, 18, 300.0, 360.0), 0.00021634404805889257), + Pair.create(new TourStartAndDuration(18, 19, 0.0, 30.0), 0.0034023082743939916), + Pair.create(new TourStartAndDuration(18, 19, 30.0, 60.0), 0.0006251774232962365), + Pair.create(new TourStartAndDuration(18, 19, 60.0, 90.0), 0.00022163965781205308), + Pair.create(new TourStartAndDuration(18, 19, 90.0, 120.0), 7.360037219024495e-05), + Pair.create(new TourStartAndDuration(18, 19, 120.0, 180.0), 0.00045934601255169126), + Pair.create(new TourStartAndDuration(18, 19, 180.0, 240.0), 7.511874968194916e-05), + Pair.create(new TourStartAndDuration(18, 19, 240.0, 300.0), 0.0001486019187134722), + Pair.create(new TourStartAndDuration(18, 19, 300.0, 360.0), 7.505084488366769e-05), + Pair.create(new TourStartAndDuration(18, 19, 420.0, 480.0), 7.594714627228585e-05), + Pair.create(new TourStartAndDuration(19, 24, 0.0, 30.0), 0.005137034953520923), + Pair.create(new TourStartAndDuration(19, 24, 30.0, 60.0), 0.0010774703023578233), + Pair.create(new TourStartAndDuration(19, 24, 60.0, 90.0), 0.00048539418673270443), + Pair.create(new TourStartAndDuration(19, 24, 90.0, 120.0), 0.0002988049182984063), + Pair.create(new TourStartAndDuration(19, 24, 120.0, 180.0), 0.00032644209078127245), + Pair.create(new TourStartAndDuration(19, 24, 180.0, 240.0), 0.0005357497395368892), + Pair.create(new TourStartAndDuration(19, 24, 240.0, 300.0), 0.0002944914928100358), + Pair.create(new TourStartAndDuration(19, 24, 300.0, 360.0), 0.00022851651374757815) + )); + + } + else if (smallScaleCommercialTrafficType.equals(SmallScaleCommercialTrafficType.goodsTraffic.toString())) { + + return new EnumeratedDistribution<>(rng, List.of( + Pair.create(new TourStartAndDuration(0, 4, 0.0, 30.0), 0.0002666800577200411), + Pair.create(new TourStartAndDuration(0, 4, 30.0, 60.0), 0.0006395055678719748), + Pair.create(new TourStartAndDuration(0, 4, 60.0, 90.0), 0.0007110769046958423), + Pair.create(new TourStartAndDuration(0, 4, 90.0, 120.0), 0.0006665961628449491), + Pair.create(new TourStartAndDuration(0, 4, 120.0, 180.0), 0.0023195866923785575), + Pair.create(new TourStartAndDuration(0, 4, 180.0, 240.0), 0.00261751319938476), + Pair.create(new TourStartAndDuration(0, 4, 240.0, 300.0), 0.0021430032453503087), + Pair.create(new TourStartAndDuration(0, 4, 300.0, 360.0), 0.0029303876579925905), + Pair.create(new TourStartAndDuration(0, 4, 360.0, 420.0), 0.00283576618143643), + Pair.create(new TourStartAndDuration(0, 4, 420.0, 480.0), 0.0027188265347502893), + Pair.create(new TourStartAndDuration(0, 4, 480.0, 540.0), 0.002597768116531099), + Pair.create(new TourStartAndDuration(0, 4, 540.0, 600.0), 0.002659151494701916), + Pair.create(new TourStartAndDuration(0, 4, 600.0, 660.0), 0.0021738406044924437), + Pair.create(new TourStartAndDuration(0, 4, 660.0, 720.0), 0.0021949848461843176), + Pair.create(new TourStartAndDuration(0, 4, 720.0, 780.0), 0.0021801193011023083), + Pair.create(new TourStartAndDuration(0, 4, 780.0, 840.0), 0.001746033717539671), + Pair.create(new TourStartAndDuration(0, 4, 840.0, 1080.0), 0.00350888397405923), + Pair.create(new TourStartAndDuration(4, 5, 0.0, 30.0), 0.0006845643884312735), + Pair.create(new TourStartAndDuration(4, 5, 30.0, 60.0), 0.0004003126952082357), + Pair.create(new TourStartAndDuration(4, 5, 60.0, 90.0), 0.0008155012585632697), + Pair.create(new TourStartAndDuration(4, 5, 90.0, 120.0), 0.0010930534970200114), + Pair.create(new TourStartAndDuration(4, 5, 120.0, 180.0), 0.0011760353713952051), + Pair.create(new TourStartAndDuration(4, 5, 180.0, 240.0), 0.0019364061980548415), + Pair.create(new TourStartAndDuration(4, 5, 240.0, 300.0), 0.002953452881036028), + Pair.create(new TourStartAndDuration(4, 5, 300.0, 360.0), 0.002589370165068672), + Pair.create(new TourStartAndDuration(4, 5, 360.0, 420.0), 0.0025604405819583055), + Pair.create(new TourStartAndDuration(4, 5, 420.0, 480.0), 0.0034319041631081476), + Pair.create(new TourStartAndDuration(4, 5, 480.0, 540.0), 0.0033480025727905907), + Pair.create(new TourStartAndDuration(4, 5, 540.0, 600.0), 0.002175717502193024), + Pair.create(new TourStartAndDuration(4, 5, 600.0, 660.0), 0.0028036478238686957), + Pair.create(new TourStartAndDuration(4, 5, 660.0, 720.0), 0.0028759635193342887), + Pair.create(new TourStartAndDuration(4, 5, 720.0, 780.0), 0.0017584406503249872), + Pair.create(new TourStartAndDuration(4, 5, 780.0, 840.0), 0.0016742001219093045), + Pair.create(new TourStartAndDuration(4, 5, 840.0, 1080.0), 0.0020658205220468245), + Pair.create(new TourStartAndDuration(5, 6, 0.0, 30.0), 0.0017247403950228777), + Pair.create(new TourStartAndDuration(5, 6, 30.0, 60.0), 0.003090998236080484), + Pair.create(new TourStartAndDuration(5, 6, 60.0, 90.0), 0.0015209554995803177), + Pair.create(new TourStartAndDuration(5, 6, 90.0, 120.0), 0.0016533392810110293), + Pair.create(new TourStartAndDuration(5, 6, 120.0, 180.0), 0.003732306124403562), + Pair.create(new TourStartAndDuration(5, 6, 180.0, 240.0), 0.004106247357091271), + Pair.create(new TourStartAndDuration(5, 6, 240.0, 300.0), 0.003188442431357427), + Pair.create(new TourStartAndDuration(5, 6, 300.0, 360.0), 0.005929370570550301), + Pair.create(new TourStartAndDuration(5, 6, 360.0, 420.0), 0.005992695595693005), + Pair.create(new TourStartAndDuration(5, 6, 420.0, 480.0), 0.006390572360276255), + Pair.create(new TourStartAndDuration(5, 6, 480.0, 540.0), 0.00993732232424166), + Pair.create(new TourStartAndDuration(5, 6, 540.0, 600.0), 0.007917613781985494), + Pair.create(new TourStartAndDuration(5, 6, 600.0, 660.0), 0.00753055040114282), + Pair.create(new TourStartAndDuration(5, 6, 660.0, 720.0), 0.004839531706746983), + Pair.create(new TourStartAndDuration(5, 6, 720.0, 780.0), 0.003571294178536547), + Pair.create(new TourStartAndDuration(5, 6, 780.0, 840.0), 0.0022261075091276465), + Pair.create(new TourStartAndDuration(5, 6, 840.0, 1080.0), 0.0020123396391017526), + Pair.create(new TourStartAndDuration(6, 7, 0.0, 30.0), 0.00553085745500388), + Pair.create(new TourStartAndDuration(6, 7, 30.0, 60.0), 0.005164301035284355), + Pair.create(new TourStartAndDuration(6, 7, 60.0, 90.0), 0.0034287284279468384), + Pair.create(new TourStartAndDuration(6, 7, 90.0, 120.0), 0.003359657704287739), + Pair.create(new TourStartAndDuration(6, 7, 120.0, 180.0), 0.005963896679549981), + Pair.create(new TourStartAndDuration(6, 7, 180.0, 240.0), 0.006376396116305889), + Pair.create(new TourStartAndDuration(6, 7, 240.0, 300.0), 0.011553162434249647), + Pair.create(new TourStartAndDuration(6, 7, 300.0, 360.0), 0.01216390369869719), + Pair.create(new TourStartAndDuration(6, 7, 360.0, 420.0), 0.015303642980241483), + Pair.create(new TourStartAndDuration(6, 7, 420.0, 480.0), 0.01894502604909179), + Pair.create(new TourStartAndDuration(6, 7, 480.0, 540.0), 0.026995818384739457), + Pair.create(new TourStartAndDuration(6, 7, 540.0, 600.0), 0.03735238580259259), + Pair.create(new TourStartAndDuration(6, 7, 600.0, 660.0), 0.02007351137947408), + Pair.create(new TourStartAndDuration(6, 7, 660.0, 720.0), 0.007579189226621267), + Pair.create(new TourStartAndDuration(6, 7, 720.0, 780.0), 0.003806896198418994), + Pair.create(new TourStartAndDuration(6, 7, 780.0, 840.0), 0.0020371212990837376), + Pair.create(new TourStartAndDuration(6, 7, 840.0, 1080.0), 0.00246729057836831), + Pair.create(new TourStartAndDuration(7, 8, 0.0, 30.0), 0.007834929725170775), + Pair.create(new TourStartAndDuration(7, 8, 30.0, 60.0), 0.007875284751511802), + Pair.create(new TourStartAndDuration(7, 8, 60.0, 90.0), 0.0056369706407995695), + Pair.create(new TourStartAndDuration(7, 8, 90.0, 120.0), 0.007252792818630801), + Pair.create(new TourStartAndDuration(7, 8, 120.0, 180.0), 0.011595289158181222), + Pair.create(new TourStartAndDuration(7, 8, 180.0, 240.0), 0.01584695155572567), + Pair.create(new TourStartAndDuration(7, 8, 240.0, 300.0), 0.019385993489144607), + Pair.create(new TourStartAndDuration(7, 8, 300.0, 360.0), 0.01804569113072999), + Pair.create(new TourStartAndDuration(7, 8, 360.0, 420.0), 0.020338168968415053), + Pair.create(new TourStartAndDuration(7, 8, 420.0, 480.0), 0.03244941203821404), + Pair.create(new TourStartAndDuration(7, 8, 480.0, 540.0), 0.046986423884473), + Pair.create(new TourStartAndDuration(7, 8, 540.0, 600.0), 0.026127574804977814), + Pair.create(new TourStartAndDuration(7, 8, 600.0, 660.0), 0.006859707180170414), + Pair.create(new TourStartAndDuration(7, 8, 660.0, 720.0), 0.004053368732850601), + Pair.create(new TourStartAndDuration(7, 8, 720.0, 780.0), 0.0017728320836715625), + Pair.create(new TourStartAndDuration(7, 8, 780.0, 840.0), 0.0008117046283836942), + Pair.create(new TourStartAndDuration(7, 8, 840.0, 1080.0), 0.0014889766393137468), + Pair.create(new TourStartAndDuration(8, 9, 0.0, 30.0), 0.008702611915372131), + Pair.create(new TourStartAndDuration(8, 9, 30.0, 60.0), 0.009703391735884857), + Pair.create(new TourStartAndDuration(8, 9, 60.0, 90.0), 0.00833249802530372), + Pair.create(new TourStartAndDuration(8, 9, 90.0, 120.0), 0.008160824294542027), + Pair.create(new TourStartAndDuration(8, 9, 120.0, 180.0), 0.014522058792957903), + Pair.create(new TourStartAndDuration(8, 9, 180.0, 240.0), 0.019189639247661674), + Pair.create(new TourStartAndDuration(8, 9, 240.0, 300.0), 0.022628081955363144), + Pair.create(new TourStartAndDuration(8, 9, 300.0, 360.0), 0.018168175275565253), + Pair.create(new TourStartAndDuration(8, 9, 360.0, 420.0), 0.01830766579908246), + Pair.create(new TourStartAndDuration(8, 9, 420.0, 480.0), 0.022414786327228577), + Pair.create(new TourStartAndDuration(8, 9, 480.0, 540.0), 0.015454698179801149), + Pair.create(new TourStartAndDuration(8, 9, 540.0, 600.0), 0.00743339793333549), + Pair.create(new TourStartAndDuration(8, 9, 600.0, 660.0), 0.0028959167218627997), + Pair.create(new TourStartAndDuration(8, 9, 660.0, 720.0), 0.0011608823477359163), + Pair.create(new TourStartAndDuration(8, 9, 720.0, 780.0), 0.0006126324367099846), + Pair.create(new TourStartAndDuration(8, 9, 780.0, 840.0), 0.0007090395380022889), + Pair.create(new TourStartAndDuration(8, 9, 840.0, 1080.0), 0.0009650931773638335), + Pair.create(new TourStartAndDuration(9, 10, 0.0, 30.0), 0.010532384705529854), + Pair.create(new TourStartAndDuration(9, 10, 30.0, 60.0), 0.010106787618396446), + Pair.create(new TourStartAndDuration(9, 10, 60.0, 90.0), 0.007305519187631069), + Pair.create(new TourStartAndDuration(9, 10, 90.0, 120.0), 0.0065298278976416635), + Pair.create(new TourStartAndDuration(9, 10, 120.0, 180.0), 0.012991661099288086), + Pair.create(new TourStartAndDuration(9, 10, 180.0, 240.0), 0.011082392048301831), + Pair.create(new TourStartAndDuration(9, 10, 240.0, 300.0), 0.013735041027849332), + Pair.create(new TourStartAndDuration(9, 10, 300.0, 360.0), 0.012921165569106639), + Pair.create(new TourStartAndDuration(9, 10, 360.0, 420.0), 0.010187951930469277), + Pair.create(new TourStartAndDuration(9, 10, 420.0, 480.0), 0.0070071162811467125), + Pair.create(new TourStartAndDuration(9, 10, 480.0, 540.0), 0.003478434072337058), + Pair.create(new TourStartAndDuration(9, 10, 540.0, 600.0), 0.002487434148850001), + Pair.create(new TourStartAndDuration(9, 10, 600.0, 660.0), 0.0007617139935295275), + Pair.create(new TourStartAndDuration(9, 10, 660.0, 720.0), 0.0004794259473854554), + Pair.create(new TourStartAndDuration(9, 10, 720.0, 780.0), 0.00011828408353297643), + Pair.create(new TourStartAndDuration(9, 10, 780.0, 840.0), 0.0009221448817170415), + Pair.create(new TourStartAndDuration(10, 11, 0.0, 30.0), 0.0053803765038808364), + Pair.create(new TourStartAndDuration(10, 11, 30.0, 60.0), 0.00748440387556175), + Pair.create(new TourStartAndDuration(10, 11, 60.0, 90.0), 0.003817044622559703), + Pair.create(new TourStartAndDuration(10, 11, 90.0, 120.0), 0.0042559767658946045), + Pair.create(new TourStartAndDuration(10, 11, 120.0, 180.0), 0.004633517730561146), + Pair.create(new TourStartAndDuration(10, 11, 180.0, 240.0), 0.0040156278424527785), + Pair.create(new TourStartAndDuration(10, 11, 240.0, 300.0), 0.004097425621422603), + Pair.create(new TourStartAndDuration(10, 11, 300.0, 360.0), 0.00534407493573042), + Pair.create(new TourStartAndDuration(10, 11, 360.0, 420.0), 0.002849425985304954), + Pair.create(new TourStartAndDuration(10, 11, 420.0, 480.0), 0.0024443772372422234), + Pair.create(new TourStartAndDuration(10, 11, 480.0, 540.0), 0.0011258612568464076), + Pair.create(new TourStartAndDuration(10, 11, 540.0, 600.0), 0.0005966047093584399), + Pair.create(new TourStartAndDuration(10, 11, 600.0, 660.0), 0.0005779388889435179), + Pair.create(new TourStartAndDuration(10, 11, 660.0, 720.0), 0.0004527621290439082), + Pair.create(new TourStartAndDuration(10, 11, 720.0, 780.0), 0.00011727646428602624), + Pair.create(new TourStartAndDuration(10, 11, 780.0, 840.0), 0.00011130198744577025), + Pair.create(new TourStartAndDuration(11, 12, 0.0, 30.0), 0.0025301846046864363), + Pair.create(new TourStartAndDuration(11, 12, 30.0, 60.0), 0.002932856090944951), + Pair.create(new TourStartAndDuration(11, 12, 60.0, 90.0), 0.0015297442159744696), + Pair.create(new TourStartAndDuration(11, 12, 90.0, 120.0), 0.0016816440829740813), + Pair.create(new TourStartAndDuration(11, 12, 120.0, 180.0), 0.0023140070407952395), + Pair.create(new TourStartAndDuration(11, 12, 180.0, 240.0), 0.0013768767086426792), + Pair.create(new TourStartAndDuration(11, 12, 240.0, 300.0), 0.0019019317686819275), + Pair.create(new TourStartAndDuration(11, 12, 300.0, 360.0), 0.0015577691125463963), + Pair.create(new TourStartAndDuration(11, 12, 360.0, 420.0), 0.001499121306916632), + Pair.create(new TourStartAndDuration(11, 12, 420.0, 480.0), 0.0007361366421130972), + Pair.create(new TourStartAndDuration(11, 12, 480.0, 540.0), 0.0007423049940853575), + Pair.create(new TourStartAndDuration(11, 12, 540.0, 600.0), 0.00011130198744577025), + Pair.create(new TourStartAndDuration(11, 12, 660.0, 720.0), 0.00024243947114654707), + Pair.create(new TourStartAndDuration(11, 12, 720.0, 780.0), 0.000261579996858755), + Pair.create(new TourStartAndDuration(12, 13, 0.0, 30.0), 0.0021669594044717543), + Pair.create(new TourStartAndDuration(12, 13, 30.0, 60.0), 0.0033993161916113994), + Pair.create(new TourStartAndDuration(12, 13, 60.0, 90.0), 0.001870484877697732), + Pair.create(new TourStartAndDuration(12, 13, 90.0, 120.0), 0.0008448185262884799), + Pair.create(new TourStartAndDuration(12, 13, 120.0, 180.0), 0.002024573233571085), + Pair.create(new TourStartAndDuration(12, 13, 180.0, 240.0), 0.0021888099857994042), + Pair.create(new TourStartAndDuration(12, 13, 240.0, 300.0), 0.0021657834323017752), + Pair.create(new TourStartAndDuration(12, 13, 300.0, 360.0), 0.0010623089332746248), + Pair.create(new TourStartAndDuration(12, 13, 360.0, 420.0), 0.0006268095760401356), + Pair.create(new TourStartAndDuration(12, 13, 420.0, 480.0), 0.0005094532977538987), + Pair.create(new TourStartAndDuration(12, 13, 480.0, 540.0), 0.0004744090926784203), + Pair.create(new TourStartAndDuration(12, 13, 540.0, 600.0), 0.00016487328572417658), + Pair.create(new TourStartAndDuration(12, 13, 660.0, 720.0), 0.0001162996982120756), + Pair.create(new TourStartAndDuration(13, 14, 0.0, 30.0), 0.0033401411497772818), + Pair.create(new TourStartAndDuration(13, 14, 30.0, 60.0), 0.002492685695459365), + Pair.create(new TourStartAndDuration(13, 14, 60.0, 90.0), 0.0027064477589805068), + Pair.create(new TourStartAndDuration(13, 14, 90.0, 120.0), 0.0018052297053924354), + Pair.create(new TourStartAndDuration(13, 14, 120.0, 180.0), 0.0027984509294891498), + Pair.create(new TourStartAndDuration(13, 14, 180.0, 240.0), 0.0022758505657711914), + Pair.create(new TourStartAndDuration(13, 14, 240.0, 300.0), 0.0003535503655144059), + Pair.create(new TourStartAndDuration(13, 14, 300.0, 360.0), 0.0005890430396050117), + Pair.create(new TourStartAndDuration(13, 14, 360.0, 420.0), 0.0002319134363595028), + Pair.create(new TourStartAndDuration(13, 14, 420.0, 480.0), 0.00011617748025141993), + Pair.create(new TourStartAndDuration(13, 14, 480.0, 540.0), 0.0003690064941818713), + Pair.create(new TourStartAndDuration(13, 14, 540.0, 600.0), 0.0001650495071007077), + Pair.create(new TourStartAndDuration(13, 14, 600.0, 660.0), 0.00023113252306835525), + Pair.create(new TourStartAndDuration(13, 14, 840.0, 1080.0), 0.00017239206443126303), + Pair.create(new TourStartAndDuration(14, 15, 0.0, 30.0), 0.003543871129770451), + Pair.create(new TourStartAndDuration(14, 15, 30.0, 60.0), 0.0018407982276338393), + Pair.create(new TourStartAndDuration(14, 15, 60.0, 90.0), 0.0010649270862293423), + Pair.create(new TourStartAndDuration(14, 15, 90.0, 120.0), 0.0009538696044712171), + Pair.create(new TourStartAndDuration(14, 15, 120.0, 180.0), 0.0021318639289119572), + Pair.create(new TourStartAndDuration(14, 15, 180.0, 240.0), 0.0019740243143620277), + Pair.create(new TourStartAndDuration(14, 15, 240.0, 300.0), 0.0006157677659961421), + Pair.create(new TourStartAndDuration(14, 15, 300.0, 360.0), 0.0004035374922773149), + Pair.create(new TourStartAndDuration(14, 15, 360.0, 420.0), 0.00011607019237524387), + Pair.create(new TourStartAndDuration(14, 15, 420.0, 480.0), 0.0003938282727195195), + Pair.create(new TourStartAndDuration(14, 15, 480.0, 540.0), 0.00011130198744577025), + Pair.create(new TourStartAndDuration(14, 15, 600.0, 660.0), 0.00011942109323430472), + Pair.create(new TourStartAndDuration(15, 16, 0.0, 30.0), 0.00254340964132742), + Pair.create(new TourStartAndDuration(15, 16, 30.0, 60.0), 0.0017847751078888892), + Pair.create(new TourStartAndDuration(15, 16, 60.0, 90.0), 0.000841891386995212), + Pair.create(new TourStartAndDuration(15, 16, 90.0, 120.0), 0.0003543852337006742), + Pair.create(new TourStartAndDuration(15, 16, 120.0, 180.0), 0.0013974221085794884), + Pair.create(new TourStartAndDuration(15, 16, 180.0, 240.0), 0.0006229273683665316), + Pair.create(new TourStartAndDuration(15, 16, 240.0, 300.0), 0.00020579571489011056), + Pair.create(new TourStartAndDuration(15, 16, 300.0, 360.0), 0.0004809214516599411), + Pair.create(new TourStartAndDuration(15, 16, 360.0, 420.0), 0.00022514291890117063), + Pair.create(new TourStartAndDuration(15, 16, 420.0, 480.0), 0.00014748146383900364), + Pair.create(new TourStartAndDuration(15, 16, 720.0, 780.0), 0.00011605559293173729), + Pair.create(new TourStartAndDuration(16, 17, 0.0, 30.0), 0.0019634787835054656), + Pair.create(new TourStartAndDuration(16, 17, 30.0, 60.0), 0.000860670737476427), + Pair.create(new TourStartAndDuration(16, 17, 60.0, 90.0), 0.0003550148096943092), + Pair.create(new TourStartAndDuration(16, 17, 90.0, 120.0), 0.000855728546868917), + Pair.create(new TourStartAndDuration(16, 17, 120.0, 180.0), 0.0009283998993093458), + Pair.create(new TourStartAndDuration(16, 17, 180.0, 240.0), 0.00022795178106384156), + Pair.create(new TourStartAndDuration(16, 17, 240.0, 300.0), 0.00024119874825349313), + Pair.create(new TourStartAndDuration(16, 17, 420.0, 480.0), 0.00023429279224671318), + Pair.create(new TourStartAndDuration(16, 17, 480.0, 540.0), 0.00011727269965059726), + Pair.create(new TourStartAndDuration(16, 17, 660.0, 720.0), 0.00011130198744577025), + Pair.create(new TourStartAndDuration(17, 18, 0.0, 30.0), 0.0017099830161073832), + Pair.create(new TourStartAndDuration(17, 18, 30.0, 60.0), 0.0006015092064895483), + Pair.create(new TourStartAndDuration(17, 18, 60.0, 90.0), 0.00011819436012345105), + Pair.create(new TourStartAndDuration(17, 18, 90.0, 120.0), 0.0002279569151752547), + Pair.create(new TourStartAndDuration(17, 18, 120.0, 180.0), 0.0006440525787748041), + Pair.create(new TourStartAndDuration(17, 18, 180.0, 240.0), 0.0003142746964600832), + Pair.create(new TourStartAndDuration(17, 18, 300.0, 360.0), 0.00022788575876606104), + Pair.create(new TourStartAndDuration(17, 18, 360.0, 420.0), 0.0004761806298753505), + Pair.create(new TourStartAndDuration(17, 18, 480.0, 540.0), 0.00011727269965059726), + Pair.create(new TourStartAndDuration(18, 19, 0.0, 30.0), 0.0020011795184968267), + Pair.create(new TourStartAndDuration(18, 19, 30.0, 60.0), 0.00023620950461199452), + Pair.create(new TourStartAndDuration(18, 19, 60.0, 90.0), 0.00011935825257957617), + Pair.create(new TourStartAndDuration(18, 19, 90.0, 120.0), 0.00011130198744577025), + Pair.create(new TourStartAndDuration(18, 19, 120.0, 180.0), 0.00012222981614916706), + Pair.create(new TourStartAndDuration(18, 19, 180.0, 240.0), 0.0002377005397786721), + Pair.create(new TourStartAndDuration(18, 19, 240.0, 300.0), 0.00026373526728965034), + Pair.create(new TourStartAndDuration(18, 19, 300.0, 360.0), 0.000256086036315955), + Pair.create(new TourStartAndDuration(18, 19, 360.0, 420.0), 0.00011394287938236544), + Pair.create(new TourStartAndDuration(19, 24, 0.0, 30.0), 0.0021116872169622083), + Pair.create(new TourStartAndDuration(19, 24, 30.0, 60.0), 0.0003681765715703113), + Pair.create(new TourStartAndDuration(19, 24, 60.0, 90.0), 0.0004137833254678062), + Pair.create(new TourStartAndDuration(19, 24, 90.0, 120.0), 0.00025108497234833097), + Pair.create(new TourStartAndDuration(19, 24, 120.0, 180.0), 0.0007576827338029722), + Pair.create(new TourStartAndDuration(19, 24, 180.0, 240.0), 0.0005180490039062906), + Pair.create(new TourStartAndDuration(19, 24, 240.0, 300.0), 0.0004944106124208977), + Pair.create(new TourStartAndDuration(19, 24, 300.0, 360.0), 0.0002278857587658224) + )); + + } else + throw new IllegalArgumentException("Unknown small scale commercial traffic type: " + smallScaleCommercialTrafficType); + } + /** * Creates the probability distribution for the duration of the services. * The values are given in [min] and have an upperBound. @@ -2096,4 +2579,7 @@ public boolean equals(Object obj) { private StopDurationGoodTrafficKey makeStopDurationGoodTrafficKey(String employeeCategory, String vehicleType) { return new StopDurationGoodTrafficKey(employeeCategory, vehicleType); } + + private record TourStartAndDuration(int hourLower, int hourUpper, double minDuration, double maxDuration) {} + } From ca38361bd2e30a1263190e795abc0f595c57335d Mon Sep 17 00:00:00 2001 From: Paul Heinrich Date: Wed, 8 May 2024 16:02:33 +0200 Subject: [PATCH 05/77] add routing test with multiple same options --- .../AbstractLeastCostPathCalculatorTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/matsim/src/test/java/org/matsim/core/router/AbstractLeastCostPathCalculatorTest.java b/matsim/src/test/java/org/matsim/core/router/AbstractLeastCostPathCalculatorTest.java index 0bb049ca193..2c59cad79d6 100644 --- a/matsim/src/test/java/org/matsim/core/router/AbstractLeastCostPathCalculatorTest.java +++ b/matsim/src/test/java/org/matsim/core/router/AbstractLeastCostPathCalculatorTest.java @@ -24,11 +24,13 @@ import javax.xml.parsers.ParserConfigurationException; +import org.apache.logging.log4j.LogManager; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; +import org.matsim.api.core.v01.Identifiable; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; @@ -92,4 +94,31 @@ void testCalcLeastCostPath_SameFromTo() throws SAXException, ParserConfiguration assertEquals(network.getNodes().get(Id.create("12", Node.class)), path.nodes.get(0)); } + @Test + void testCalcLeastCostPath_withOptions() throws SAXException, ParserConfigurationException, IOException { + Config config = utils.loadConfig((String)null); + Scenario scenario = ScenarioUtils.createScenario(config); + Network network = scenario.getNetwork(); + new MatsimNetworkReader(scenario.getNetwork()).readFile("test/scenarios/equil/network.xml"); + + //path from 1 to 13 has several options with the same travel time + Node node1 = network.getNodes().get(Id.create("1", Node.class)); + Node node13 = network.getNodes().get(Id.create("13", Node.class)); + + LeastCostPathCalculator routerAlgo = getLeastCostPathCalculator(network); + Path path = routerAlgo.calcLeastCostPath(node1, node13, 8.0*3600, null, null); + + assertEquals(5, path.nodes.size(), "number of nodes wrong."); + assertEquals(4, path.links.size(), "number of links wrong."); + assertEquals(network.getNodes().get(Id.create("1", Node.class)), path.nodes.get(0)); + assertEquals(network.getNodes().get(Id.create("2", Node.class)), path.nodes.get(1)); + assertEquals(network.getNodes().get(Id.create("3", Node.class)), path.nodes.get(2)); + assertEquals(network.getNodes().get(Id.create("12", Node.class)), path.nodes.get(3)); + assertEquals(network.getNodes().get(Id.create("13", Node.class)), path.nodes.get(4)); + assertEquals(network.getLinks().get(Id.create("1", Link.class)), path.links.get(0)); + assertEquals(network.getLinks().get(Id.create("2", Link.class)), path.links.get(1)); + assertEquals(network.getLinks().get(Id.create("11", Link.class)), path.links.get(2)); + assertEquals(network.getLinks().get(Id.create("20", Link.class)), path.links.get(3)); + } + } From 9f92c118f279844512f855f3711c220a95eeb71e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 19:34:54 +0000 Subject: [PATCH 06/77] build(deps): bump info.picocli:picocli from 4.7.5 to 4.7.6 Bumps [info.picocli:picocli](https://github.com/remkop/picocli) from 4.7.5 to 4.7.6. - [Release notes](https://github.com/remkop/picocli/releases) - [Changelog](https://github.com/remkop/picocli/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/remkop/picocli/compare/v4.7.5...v4.7.6) --- updated-dependencies: - dependency-name: info.picocli:picocli dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- contribs/application/pom.xml | 2 +- contribs/sumo/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contribs/application/pom.xml b/contribs/application/pom.xml index 95ea86036d9..c8be94e15cf 100644 --- a/contribs/application/pom.xml +++ b/contribs/application/pom.xml @@ -117,7 +117,7 @@ info.picocli picocli - 4.7.5 + 4.7.6 it.unimi.dsi diff --git a/contribs/sumo/pom.xml b/contribs/sumo/pom.xml index d55aa642bf5..da11bdf4865 100644 --- a/contribs/sumo/pom.xml +++ b/contribs/sumo/pom.xml @@ -23,7 +23,7 @@ info.picocli picocli - 4.7.5 + 4.7.6 From 4e0312173f64fe29ee35dc78cd5f87a912d6852e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 19:49:49 +0000 Subject: [PATCH 07/77] build(deps-dev): bump net.bytebuddy:byte-buddy from 1.14.14 to 1.14.15 Bumps [net.bytebuddy:byte-buddy](https://github.com/raphw/byte-buddy) from 1.14.14 to 1.14.15. - [Release notes](https://github.com/raphw/byte-buddy/releases) - [Changelog](https://github.com/raphw/byte-buddy/blob/master/release-notes.md) - [Commits](https://github.com/raphw/byte-buddy/compare/byte-buddy-1.14.14...byte-buddy-1.14.15) --- updated-dependencies: - dependency-name: net.bytebuddy:byte-buddy dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2a0c1c1c6f..d79e8231281 100644 --- a/pom.xml +++ b/pom.xml @@ -353,7 +353,7 @@ net.bytebuddy byte-buddy - 1.14.14 + 1.14.15 test From 0f8e4823ae15088e7d4ad541dd5585e974635a3a Mon Sep 17 00:00:00 2001 From: Kai Nagel Date: Thu, 9 May 2024 08:17:58 +0200 Subject: [PATCH 08/77] add javadoc comment to constructor of OTFVisLiveModule --- .../emissions/utils/EmissionsConfigGroup.java | 2 +- .../matsim/contrib/otfvis/OTFVisLiveModule.java | 11 +++++++++++ .../vsp/pt/fare/PtFareConfigGroup.java | 17 ++++++++++++----- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/contribs/emissions/src/main/java/org/matsim/contrib/emissions/utils/EmissionsConfigGroup.java b/contribs/emissions/src/main/java/org/matsim/contrib/emissions/utils/EmissionsConfigGroup.java index e5092b57568..f7107ece5f0 100644 --- a/contribs/emissions/src/main/java/org/matsim/contrib/emissions/utils/EmissionsConfigGroup.java +++ b/contribs/emissions/src/main/java/org/matsim/contrib/emissions/utils/EmissionsConfigGroup.java @@ -172,7 +172,7 @@ public URL getAverageColdEmissionFactorsFileURL(URL context) { // =============== // =============== /** - * @param detailedVsAverageLookupBehavior -- {@value #DETAILED_VS_AVERAGE_LOOKUP_BEHAVIOR_CMT} + * @param detailedVsAverageLookupBehavior -- {@value #DETAILED_VS_AVERAGE_LOOKUP_BEHAVIOR_CMT} * @noinspection JavadocReference */ @StringSetter(DETAILED_VS_AVERAGE_LOOKUP_BEHAVIOR) diff --git a/contribs/otfvis/src/main/java/org/matsim/contrib/otfvis/OTFVisLiveModule.java b/contribs/otfvis/src/main/java/org/matsim/contrib/otfvis/OTFVisLiveModule.java index 001f4a227b3..7d9cfa12823 100644 --- a/contribs/otfvis/src/main/java/org/matsim/contrib/otfvis/OTFVisLiveModule.java +++ b/contribs/otfvis/src/main/java/org/matsim/contrib/otfvis/OTFVisLiveModule.java @@ -37,6 +37,17 @@ import com.google.inject.Inject; public class OTFVisLiveModule extends AbstractModule { + + /** + * For win, one needs to add + * + * --add-exports java.base/java.lang=ALL-UNNAMED --add-exports java.desktop/sun.awt=ALL-UNNAMED --add-exports java.desktop/sun.java2d=ALL-UNNAMED + * + * as arguments to the JVM to get around module protection. + */ + public OTFVisLiveModule() { + // so I can attach javadoc to this. kai, may'24 + } @Override public void install() { diff --git a/contribs/vsp/src/main/java/playground/vsp/pt/fare/PtFareConfigGroup.java b/contribs/vsp/src/main/java/playground/vsp/pt/fare/PtFareConfigGroup.java index b463d323fc6..20c9291dc1b 100644 --- a/contribs/vsp/src/main/java/playground/vsp/pt/fare/PtFareConfigGroup.java +++ b/contribs/vsp/src/main/java/playground/vsp/pt/fare/PtFareConfigGroup.java @@ -15,6 +15,12 @@ public class PtFareConfigGroup extends ReflectiveConfigGroup { public enum PtFareCalculationModels {distanceBased} // More to come (e.g. zone based, hybrid...) + private static final String PT_FARE_CALCULATION_CMT = "PT fare calculation scheme. Current implementation: distanceBased (more to come...)"; + public static final String UPPER_BOUND_FACTOR_CMT = "When upper bound is applied, upperBound = upperBoundFactor * max Fare of the day. " + + "This value is decided by the ratio between average daily cost of a ticket subscription and the single " + + "trip ticket of the same trip. Usually this value should be somewhere between 1.0 and 2.0"; + public static final String APPLY_UPPER_BOUND_CMT = "Enable the upper bound for daily PT fare to count for ticket subscription. Input value: true or false"; + private PtFareCalculationModels ptFareCalculation = PtFareCalculationModels.distanceBased; // Use distance based calculation by default private boolean applyUpperBound = true; @PositiveOrZero @@ -27,11 +33,9 @@ public PtFareConfigGroup() { @Override public Map getComments() { Map map = super.getComments(); - map.put(PT_FARE_CALCULATION, "PT fare calculation scheme. Current implementation: distanceBased (more to come...)"); - map.put(APPLY_UPPER_BOUND, "Enable the upper bound for daily PT fare to count for ticket subscription. Input value: true or false"); - map.put(UPPER_BOUND_FACTOR, "When upper bound is applied, upperBound = upperBoundFactor * max Fare of the day. " + - "This value is decided by the ratio between average daily cost of a ticket subscription and the single " + - "trip ticket of the same trip. Usually this value should be somewhere between 1.0 and 2.0"); + map.put(PT_FARE_CALCULATION, PT_FARE_CALCULATION_CMT ); + map.put(APPLY_UPPER_BOUND, APPLY_UPPER_BOUND_CMT ); + map.put(UPPER_BOUND_FACTOR, UPPER_BOUND_FACTOR_CMT ); return map; } @@ -61,6 +65,9 @@ public double getUpperBoundFactor() { return upperBoundFactor; } + /** + * @param upperBoundFactor -- {@value #UPPER_BOUND_FACTOR_CMT} + */ @StringSetter(UPPER_BOUND_FACTOR) public void setUpperBoundFactor(double upperBoundFactor) { this.upperBoundFactor = upperBoundFactor; From 138f63a413f71190f3ac7bc93d1d9c1a8fdfefc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nico=20K=C3=BChnel?= Date: Fri, 10 May 2024 15:10:45 +0200 Subject: [PATCH 09/77] factor out drt optimization constraint params from drt config group (#3252) * factor out drt optimization constraint params from drt config group as preparatory work for service differentiation * ensure backwards compatibility with previous drt config design --- .../examples/RunJointDemandDRTExample.java | 6 +- .../edrt/run/EDrtModeOptimizerQSimModule.java | 4 +- .../extension/fiss/RunFissDrtScenarioIT.java | 10 +- .../eshifts/run/RunEShiftDrtScenarioIT.java | 12 +- .../run/RunMultiHubShiftDrtScenarioIT.java | 12 +- .../shifts/run/RunShiftDrtScenarioIT.java | 12 +- .../DrtAnalysisControlerListener.java | 6 +- .../impl/PessimisticDrtEstimator.java | 9 +- .../optimizer/DrtModeOptimizerQSimModule.java | 4 +- .../contrib/drt/routing/DrtRouteCreator.java | 6 +- .../contrib/drt/run/DrtConfigGroup.java | 138 ++++++------------ .../contrib/drt/run/DrtModeRoutingModule.java | 2 +- .../run/DrtOptimizationConstraintsParams.java | 96 ++++++++++++ .../optimizer/MaxDetourConstraintTest.java | 14 +- .../insertion/DrtPoolingParameterTest.java | 6 +- .../prebooking/ComplexUnschedulerTest.java | 2 +- .../prebooking/PrebookingTestEnvironment.java | 6 +- .../drt/routing/DrtRoutingModuleTest.java | 10 +- .../drt/run/examples/RunDrtExampleIT.java | 10 +- .../RunOldDrtConfigCompatibilityIT.java | 61 ++++++++ .../teleportation/DrtTeleportationTest.java | 12 +- .../contrib/taxi/run/MultiModeTaxiModule.java | 12 +- .../drtAndPt/PtAlongALine2Test.java | 24 +-- .../drtAndPt/PtAlongALineTest.java | 16 +- .../dvrp-grid/eight_shared_taxi_config.xml | 10 +- .../multi_mode_one_shared_taxi_config.xml | 20 ++- .../dvrp-grid/one_shared_taxi_config.xml | 10 +- .../one_taxi_and_one_shared_taxi_config.xml | 9 +- .../scenarios/kelheim/config-with-drt.xml | 40 ++--- .../scenarios/mielec/mielec_drt_config.xml | 8 +- .../scenarios/mielec/mielec_drt_config_v1.xml | 72 +++++++++ .../scenarios/mielec/mielec_edrt_config.xml | 8 +- .../mielec/mielec_multiModeEdrt_config.xml | 16 +- .../mielec_serviceArea_based_drt_config.xml | 9 +- .../mielec/mielec_stop_based_drt_config.xml | 12 +- 35 files changed, 462 insertions(+), 242 deletions(-) create mode 100644 contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java create mode 100644 contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java create mode 100644 examples/scenarios/mielec/mielec_drt_config_v1.xml diff --git a/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java b/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java index 72144a8d440..4379075dc79 100644 --- a/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java +++ b/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java @@ -141,9 +141,9 @@ private static void loadConfigGroups(Config config) { MultiModeDrtConfigGroup multiModeDrtConfigGroup = ConfigUtils.addOrGetModule(config, MultiModeDrtConfigGroup.class); DrtConfigGroup drtCfg = new DrtConfigGroup(); - drtCfg.maxWaitTime = 2 * 3600; - drtCfg.maxTravelTimeAlpha = 5; - drtCfg.maxTravelTimeBeta = 15 * 60; + drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime = 2 * 3600; + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 5; + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 15 * 60; drtCfg.stopDuration = 60; drtCfg.vehiclesFile = "jointDemand_vehicles.xml"; multiModeDrtConfigGroup.addParameterSet(drtCfg); diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java index b617a93a0d3..5333231bd6a 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java @@ -147,7 +147,7 @@ public EmptyVehicleChargingScheduler get() { bindModal(VehicleEntry.EntryFactory.class).toProvider( EDrtVehicleDataEntryFactory.EDrtVehicleDataEntryFactoryProvider.class).asEagerSingleton(); - bindModal(CostCalculationStrategy.class).to(drtCfg.rejectRequestIfMaxWaitOrTravelTimeViolated ? + bindModal(CostCalculationStrategy.class).to(drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated ? CostCalculationStrategy.RejectSoftConstraintViolations.class : CostCalculationStrategy.DiscourageSoftConstraintViolations.class).asEagerSingleton(); @@ -179,7 +179,7 @@ public EmptyVehicleRelocator get() { getter.getModal(StopTimeCalculator.class), scheduleWaitBeforeDrive))) .asEagerSingleton(); - bindModal(DefaultOfferAcceptor.class).toProvider(modalProvider(getter -> new DefaultOfferAcceptor(drtCfg.maxAllowedPickupDelay))); + bindModal(DefaultOfferAcceptor.class).toProvider(modalProvider(getter -> new DefaultOfferAcceptor(drtCfg.getDrtOptimizationConstraintsParam().maxAllowedPickupDelay))); bindModal(DrtOfferAcceptor.class).to(modalKey(DefaultOfferAcceptor.class)); bindModal(ScheduleTimingUpdater.class).toProvider(modalProvider( diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java index d9eda86cc8b..29f2a9b006d 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java @@ -53,16 +53,16 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - drtConfigGroup.maxTravelTimeAlpha = 1.5; - drtConfigGroup.maxTravelTimeBeta = 10. * 60.; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.5; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; - drtConfigGroup.maxWaitTime = 600.; - drtConfigGroup.rejectRequestIfMaxWaitOrTravelTimeViolated = true; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = 600.; + drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = true; drtConfigGroup.useModeFilteredSubnetwork = false; drtConfigGroup.vehiclesFile = fleetFile; drtConfigGroup.operationalScheme = DrtConfigGroup.OperationalScheme.door2door; drtConfigGroup.plotDetailedCustomerStats = true; - drtConfigGroup.maxWalkDistance = 1000.; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxWalkDistance = 1000.; drtConfigGroup.idleVehiclesReturnToDepots = false; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java index 2bd5fdffc27..6f4e8ceb392 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java @@ -13,6 +13,7 @@ import org.matsim.contrib.drt.optimizer.rebalancing.RebalancingParams; import org.matsim.contrib.drt.optimizer.rebalancing.mincostflow.MinCostFlowRebalancingStrategyParams; import org.matsim.contrib.drt.run.DrtConfigGroup; +import org.matsim.contrib.drt.run.DrtOptimizationConstraintsParams; import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; import org.matsim.contrib.ev.EvConfigGroup; @@ -56,16 +57,17 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - drtConfigGroup.maxTravelTimeAlpha = 1.5; - drtConfigGroup.maxTravelTimeBeta = 10. * 60.; + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + constraintsParam.maxTravelTimeAlpha = 1.5; + constraintsParam.maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; - drtConfigGroup.maxWaitTime = 600.; - drtConfigGroup.rejectRequestIfMaxWaitOrTravelTimeViolated = true; + constraintsParam.maxWaitTime = 600.; + constraintsParam.rejectRequestIfMaxWaitOrTravelTimeViolated = true; drtConfigGroup.useModeFilteredSubnetwork = false; drtConfigGroup.vehiclesFile = fleetFile; drtConfigGroup.operationalScheme = DrtConfigGroup.OperationalScheme.door2door; drtConfigGroup.plotDetailedCustomerStats = true; - drtConfigGroup.maxWalkDistance = 1000.; + constraintsParam.maxWalkDistance = 1000.; drtConfigGroup.idleVehiclesReturnToDepots = false; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java index b0b5089b81e..49033927906 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java @@ -13,6 +13,7 @@ import org.matsim.contrib.drt.optimizer.rebalancing.RebalancingParams; import org.matsim.contrib.drt.optimizer.rebalancing.mincostflow.MinCostFlowRebalancingStrategyParams; import org.matsim.contrib.drt.run.DrtConfigGroup; +import org.matsim.contrib.drt.run.DrtOptimizationConstraintsParams; import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; import org.matsim.contrib.zone.skims.DvrpTravelTimeMatrixParams; @@ -45,16 +46,17 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - drtConfigGroup.maxTravelTimeAlpha = 1.5; - drtConfigGroup.maxTravelTimeBeta = 10. * 60.; + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + constraintsParam.maxTravelTimeAlpha = 1.5; + constraintsParam.maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; - drtConfigGroup.maxWaitTime = 600.; - drtConfigGroup.rejectRequestIfMaxWaitOrTravelTimeViolated = true; + constraintsParam.maxWaitTime = 600.; + constraintsParam.rejectRequestIfMaxWaitOrTravelTimeViolated = true; drtConfigGroup.useModeFilteredSubnetwork = false; drtConfigGroup.vehiclesFile = fleetFile; drtConfigGroup.operationalScheme = DrtConfigGroup.OperationalScheme.door2door; drtConfigGroup.plotDetailedCustomerStats = true; - drtConfigGroup.maxWalkDistance = 1000.; + constraintsParam.maxWalkDistance = 1000.; drtConfigGroup.idleVehiclesReturnToDepots = false; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java index 1d85910ebec..f794e546c51 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java @@ -13,6 +13,7 @@ import org.matsim.contrib.drt.optimizer.rebalancing.RebalancingParams; import org.matsim.contrib.drt.optimizer.rebalancing.mincostflow.MinCostFlowRebalancingStrategyParams; import org.matsim.contrib.drt.run.DrtConfigGroup; +import org.matsim.contrib.drt.run.DrtOptimizationConstraintsParams; import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; import org.matsim.contrib.zone.skims.DvrpTravelTimeMatrixParams; @@ -46,16 +47,17 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - drtConfigGroup.maxTravelTimeAlpha = 1.5; - drtConfigGroup.maxTravelTimeBeta = 10. * 60.; + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + constraintsParam.maxTravelTimeAlpha = 1.5; + constraintsParam.maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; - drtConfigGroup.maxWaitTime = 600.; - drtConfigGroup.rejectRequestIfMaxWaitOrTravelTimeViolated = true; + constraintsParam.maxWaitTime = 600.; + constraintsParam.rejectRequestIfMaxWaitOrTravelTimeViolated = true; drtConfigGroup.useModeFilteredSubnetwork = false; drtConfigGroup.vehiclesFile = fleetFile; drtConfigGroup.operationalScheme = DrtConfigGroup.OperationalScheme.door2door; drtConfigGroup.plotDetailedCustomerStats = true; - drtConfigGroup.maxWalkDistance = 1000.; + constraintsParam.maxWalkDistance = 1000.; drtConfigGroup.idleVehiclesReturnToDepots = false; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java index edc20fb87b7..3cc19b7a938 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java @@ -400,7 +400,7 @@ private void writeAndPlotWaitTimeEstimateComparison(Collection pe if (createChart) { final JFreeChart chart2 = DensityScatterPlots.createPlot("Wait times", "Actual wait time [s]", "Initially planned wait time [s]", - times, Pair.of(0., drtCfg.maxWaitTime)); + times, Pair.of(0., drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime)); // xAxis.setLowerBound(0); // yAxis.setLowerBound(0); ChartUtils.writeChartAsPNG(new FileOutputStream(plotFileName), chart2, 1500, 1500); @@ -664,11 +664,11 @@ private static void analyseDetours(Network network, List legs, Map new DefaultOfferAcceptor(drtCfg.maxAllowedPickupDelay))); + bindModal(DefaultOfferAcceptor.class).toProvider(modalProvider(getter -> new DefaultOfferAcceptor(drtCfg.getDrtOptimizationConstraintsParam().maxAllowedPickupDelay))); bindModal(DrtOfferAcceptor.class).to(modalKey(DefaultOfferAcceptor.class)); bindModal(ScheduleTimingUpdater.class).toProvider(modalProvider( diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java index 15f9bb77530..c19a631ac44 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java @@ -61,7 +61,7 @@ public DrtRouteCreator(DrtConfigGroup drtCfg, Network modalNetwork, * @return maximum travel time */ static double getMaxTravelTime(DrtConfigGroup drtCfg, double unsharedRideTime) { - return drtCfg.maxTravelTimeAlpha * unsharedRideTime + drtCfg.maxTravelTimeBeta; + return drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha * unsharedRideTime + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta; } /** @@ -72,7 +72,7 @@ static double getMaxTravelTime(DrtConfigGroup drtCfg, double unsharedRideTime) { * @return maximum ride time */ static double getMaxRideTime(DrtConfigGroup drtCfg, double unsharedRideTime) { - return Math.min(unsharedRideTime + drtCfg.maxAbsoluteDetour, drtCfg.maxDetourAlpha * unsharedRideTime + drtCfg.maxDetourBeta); + return Math.min(unsharedRideTime + drtCfg.getDrtOptimizationConstraintsParam().maxAbsoluteDetour, drtCfg.getDrtOptimizationConstraintsParam().maxDetourAlpha * unsharedRideTime + drtCfg.getDrtOptimizationConstraintsParam().maxDetourBeta); } public Route createRoute(double departureTime, Link accessActLink, Link egressActLink, Person person, @@ -89,7 +89,7 @@ public Route createRoute(double departureTime, Link accessActLink, Link egressAc route.setTravelTime(maxTravelTime); route.setMaxRideTime(maxRideDuration); route.setDirectRideTime(unsharedRideTime); - route.setMaxWaitTime(drtCfg.maxWaitTime); + route.setMaxWaitTime(drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime); if (this.drtCfg.storeUnsharedPath) { route.setUnsharedPath(unsharedPath); diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java index 2e1923688c6..687b48b16fc 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java @@ -19,17 +19,15 @@ package org.matsim.contrib.drt.run; -import static org.matsim.core.config.groups.QSimConfigGroup.EndtimeInterpretation; - -import java.util.Collection; -import java.util.Optional; - -import javax.annotation.Nullable; - +import com.google.common.base.Preconditions; +import com.google.common.base.Verify; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.checkerframework.checker.units.qual.C; import org.matsim.api.core.v01.TransportMode; +import org.matsim.contrib.common.util.ReflectiveConfigGroupWithConfigurableParameterSets; import org.matsim.contrib.drt.analysis.zonal.DrtZoneSystemParams; import org.matsim.contrib.drt.estimator.DrtEstimatorParams; import org.matsim.contrib.drt.fare.DrtFareParams; @@ -44,19 +42,15 @@ import org.matsim.contrib.drt.speedup.DrtSpeedUpParams; import org.matsim.contrib.dvrp.router.DvrpModeRoutingNetworkModule; import org.matsim.contrib.dvrp.run.Modal; -import org.matsim.contrib.common.util.ReflectiveConfigGroupWithConfigurableParameterSets; import org.matsim.core.config.Config; -import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.config.groups.RoutingConfigGroup; +import org.matsim.core.config.groups.ScoringConfigGroup; -import com.google.common.base.Preconditions; -import com.google.common.base.Verify; +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Optional; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Positive; -import jakarta.validation.constraints.PositiveOrZero; +import static org.matsim.core.config.groups.QSimConfigGroup.EndtimeInterpretation; public class DrtConfigGroup extends ReflectiveConfigGroupWithConfigurableParameterSets implements Modal { private static final Logger log = LogManager.getLogger(DrtConfigGroup.class); @@ -70,6 +64,9 @@ public static DrtConfigGroup getSingleModeDrtConfig(Config config) { return drtConfigGroups.iterator().next(); } + @NotNull + private DrtOptimizationConstraintsParams drtOptimizationConstraintsParams; + @Parameter @Comment("Mode which will be handled by PassengerEngine and VrpOptimizer (passengers'/customers' perspective)") @NotBlank @@ -88,66 +85,6 @@ public static DrtConfigGroup getSingleModeDrtConfig(Config config) { @Positive public double stopDuration = Double.NaN;// seconds - @Parameter - @Comment("Max wait time for the bus to come (optimisation constraint).") - @PositiveOrZero - public double maxWaitTime = Double.NaN;// seconds - - @Parameter - @Comment("Defines the slope of the maxTravelTime estimation function (optimisation constraint), i.e. " - + "min(unsharedRideTime + maxAbsoluteDetour, maxTravelTimeAlpha * unsharedRideTime + maxTravelTimeBeta). " - + "Alpha should not be smaller than 1.") - @DecimalMin("1.0") - public double maxTravelTimeAlpha = Double.NaN;// [-] - - @Parameter - @Comment("Defines the shift of the maxTravelTime estimation function (optimisation constraint), i.e. " - + "min(unsharedRideTime + maxAbsoluteDetour, maxTravelTimeAlpha * unsharedRideTime + maxTravelTimeBeta). " - + "Beta should not be smaller than 0.") - @PositiveOrZero - public double maxTravelTimeBeta = Double.NaN;// [s] - - @Parameter - @Comment( - "Defines the maximum allowed absolute detour in seconds. Note that the detour is computed from the latest promised pickup time. " + - "To enable the max detour constraint, maxAllowedPickupDelay has to be specified. maxAbsoluteDetour should not be smaller than 0, " - + "and should be higher than the offset maxDetourBeta. By default, this limit is disabled (i.e. set to Inf)") - @PositiveOrZero - public double maxAbsoluteDetour = Double.POSITIVE_INFINITY;// [s] - - @Parameter - @Comment( - "Defines the maximum allowed absolute detour based on the unsharedRideTime. Note that the detour is computed from the latest promised " - + "pickup time. To enable the max detour constraint, maxAllowedPickupDelay has to be specified. A linear combination similar to travel " - + "time constrain is used. This is the ratio part. By default, this limit is disabled (i.e. set to Inf, together with maxDetourBeta).") - @DecimalMin("1.0") - public double maxDetourAlpha = Double.POSITIVE_INFINITY; - - @Parameter - @Comment( - "Defines the maximum allowed absolute detour based on the unsharedRideTime. Note that the detour is computed from the latest promised " - + "pickup time. To enable the max detour constraint, maxAllowedPickupDelay has to be specified. A linear combination similar to travel " - + "time constrain is used. This is the constant part. By default, this limit is disabled (i.e. set to Inf, together with maxDetourAlpha).") - @PositiveOrZero - public double maxDetourBeta = Double.POSITIVE_INFINITY;// [s] - - @Parameter - @Comment( - "Defines the maximum delay allowed from the initial scheduled pick up time. Once the initial pickup time is offered, the latest promised" - + "pickup time is calculated based on initial scheduled pickup time + maxAllowedPickupDelay. " - + "By default, this limit is disabled. If enabled, a value between 0 and 240 is a good choice.") - @PositiveOrZero - public double maxAllowedPickupDelay = Double.POSITIVE_INFINITY;// [s] - - @Parameter - @Comment("If true, the max travel and wait times of a submitted request" - + " are considered hard constraints (the request gets rejected if one of the constraints is violated)." - + " If false, the max travel and wait times are considered soft constraints (insertion of a request that" - + " violates one of the constraints is allowed, but its cost is increased by additional penalty to make" - + " it relatively less attractive). Penalisation of insertions can be customised by injecting a customised" - + " InsertionCostCalculator.PenaltyCalculator") - public boolean rejectRequestIfMaxWaitOrTravelTimeViolated = true; - @Parameter @Comment("If true, the startLink is changed to last link in the current schedule, so the taxi starts the next " + "day at the link where it stopped operating the day before. False by default.") @@ -175,14 +112,6 @@ public enum OperationalScheme { @NotNull public OperationalScheme operationalScheme = OperationalScheme.door2door; - //TODO consider renaming maxWalkDistance to max access/egress distance (or even have 2 separate params) - @Parameter - @Comment( - "Maximum beeline distance (in meters) to next stop location in stopbased system for access/egress walk leg to/from drt." - + " If no stop can be found within this maximum distance will return null (in most cases caught by fallback routing module).") - @PositiveOrZero // used only for stopbased DRT scheme - public double maxWalkDistance = Double.MAX_VALUE;// [m]; - @Parameter @Comment("An XML file specifying the vehicle fleet." + " The file format according to dvrp_vehicles_v1.dtd" @@ -257,6 +186,10 @@ public DrtConfigGroup() { } private void initSingletonParameterSets() { + //drt optimization constraints + addDefinition(DrtOptimizationConstraintsParams.SET_NAME, DrtOptimizationConstraintsParams::new, + () -> drtOptimizationConstraintsParams, params -> drtOptimizationConstraintsParams = (DrtOptimizationConstraintsParams) params); + //rebalancing (optional) addDefinition(RebalancingParams.SET_NAME, RebalancingParams::new, () -> rebalancingParams, params -> rebalancingParams = (RebalancingParams)params); @@ -301,6 +234,27 @@ private void initSingletonParameterSets() { } + /** + * for backwards compatibility with old drt config groups + */ + public void handleAddUnknownParam(final String paramName, final String value) { + switch (paramName) { + case "maxWaitTime": + case "maxTravelTimeAlpha": + case "maxTravelTimeBeta": + case "maxAbsoluteDetour": + case "maxDetourAlpha": + case "maxDetourBeta": + case "maxAllowedPickupDelay": + case "rejectRequestIfMaxWaitOrTravelTimeViolated": + case "maxWalkDistance": + getDrtOptimizationConstraintsParam().addParam(paramName, value); + break; + default: + super.handleAddUnknownParam(paramName, value); + } + } + @Override protected void checkConsistency(Config config) { super.checkConsistency(config); @@ -315,7 +269,7 @@ protected void checkConsistency(Config config) { + "attempting to travel without vehicles being available."); } - Verify.verify(maxWaitTime >= stopDuration, "maxWaitTime must not be smaller than stopDuration"); + Verify.verify(drtOptimizationConstraintsParams.maxWaitTime >= stopDuration, "maxWaitTime must not be smaller than stopDuration"); Verify.verify(operationalScheme != OperationalScheme.stopbased || transitStopFile != null, "transitStopFile must not be null when operationalScheme is " + OperationalScheme.stopbased); @@ -344,11 +298,6 @@ protected void checkConsistency(Config config) { DvrpModeRoutingNetworkModule.checkUseModeFilteredSubnetworkAllowed(config, mode); } - if ((maxDetourAlpha != Double.POSITIVE_INFINITY && maxDetourBeta != Double.POSITIVE_INFINITY) || maxAbsoluteDetour != Double.POSITIVE_INFINITY) { - Verify.verify(maxAllowedPickupDelay != Double.POSITIVE_INFINITY, "Detour constraints are activated, " + - "maxAllowedPickupDelay must be specified! A value between 0 and 240 seconds can be a good choice for maxAllowedPickupDelay."); - } - if (simulationType == SimulationType.estimateAndTeleport) { Verify.verify(drtSpeedUpParams == null, "Simulation type is estimateAndTeleport, but drtSpeedUpParams is set. " + "Please remove drtSpeedUpParams from the config, as these two functionalities are not compatible."); @@ -360,6 +309,13 @@ public String getMode() { return mode; } + public DrtOptimizationConstraintsParams getDrtOptimizationConstraintsParam() { + if (drtOptimizationConstraintsParams == null) { + addParameterSet(new DrtOptimizationConstraintsParams()); + } + return drtOptimizationConstraintsParams; + } + public DrtInsertionSearchParams getDrtInsertionSearchParams() { return drtInsertionSearchParams; } diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java index 8d037b171dc..af5916d028a 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java @@ -104,7 +104,7 @@ public void install() { .asEagerSingleton(); case stopbased, serviceAreaBased -> { bindModal( AccessEgressFacilityFinder.class ).toProvider( modalProvider( - getter -> new ClosestAccessEgressFacilityFinder( drtCfg.maxWalkDistance, + getter -> new ClosestAccessEgressFacilityFinder( drtCfg.getDrtOptimizationConstraintsParam().maxWalkDistance, getter.get( Network.class ), QuadTrees.createQuadTree( getter.getModal( DrtStopNetwork.class ).getDrtStops().values() ) ) ) ) .asEagerSingleton(); diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java new file mode 100644 index 00000000000..f3f1e1ed5f2 --- /dev/null +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java @@ -0,0 +1,96 @@ +package org.matsim.contrib.drt.run; + +import com.google.common.base.Verify; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.PositiveOrZero; +import org.matsim.core.config.Config; +import org.matsim.core.config.ReflectiveConfigGroup; + +/** + * @author nkuehnel / MOIA + */ +public class DrtOptimizationConstraintsParams extends ReflectiveConfigGroup { + + public final static String SET_NAME = "drtOptimizationConstraints"; + + + @Parameter + @Comment("Max wait time for the bus to come (optimisation constraint).") + @PositiveOrZero + public double maxWaitTime = Double.NaN;// seconds + + @Parameter + @Comment("Defines the slope of the maxTravelTime estimation function (optimisation constraint), i.e. " + + "min(unsharedRideTime + maxAbsoluteDetour, maxTravelTimeAlpha * unsharedRideTime + maxTravelTimeBeta). " + + "Alpha should not be smaller than 1.") + @DecimalMin("1.0") + public double maxTravelTimeAlpha = Double.NaN;// [-] + + @Parameter + @Comment("Defines the shift of the maxTravelTime estimation function (optimisation constraint), i.e. " + + "min(unsharedRideTime + maxAbsoluteDetour, maxTravelTimeAlpha * unsharedRideTime + maxTravelTimeBeta). " + + "Beta should not be smaller than 0.") + @PositiveOrZero + public double maxTravelTimeBeta = Double.NaN;// [s] + + @Parameter + @Comment( + "Defines the maximum allowed absolute detour in seconds. Note that the detour is computed from the latest promised pickup time. " + + "To enable the max detour constraint, maxAllowedPickupDelay has to be specified. maxAbsoluteDetour should not be smaller than 0, " + + "and should be higher than the offset maxDetourBeta. By default, this limit is disabled (i.e. set to Inf)") + @PositiveOrZero + public double maxAbsoluteDetour = Double.POSITIVE_INFINITY;// [s] + + @Parameter + @Comment( + "Defines the maximum allowed absolute detour based on the unsharedRideTime. Note that the detour is computed from the latest promised " + + "pickup time. To enable the max detour constraint, maxAllowedPickupDelay has to be specified. A linear combination similar to travel " + + "time constrain is used. This is the ratio part. By default, this limit is disabled (i.e. set to Inf, together with maxDetourBeta).") + @DecimalMin("1.0") + public double maxDetourAlpha = Double.POSITIVE_INFINITY; + + @Parameter + @Comment( + "Defines the maximum allowed absolute detour based on the unsharedRideTime. Note that the detour is computed from the latest promised " + + "pickup time. To enable the max detour constraint, maxAllowedPickupDelay has to be specified. A linear combination similar to travel " + + "time constrain is used. This is the constant part. By default, this limit is disabled (i.e. set to Inf, together with maxDetourAlpha).") + @PositiveOrZero + public double maxDetourBeta = Double.POSITIVE_INFINITY;// [s] + + @Parameter + @Comment( + "Defines the maximum delay allowed from the initial scheduled pick up time. Once the initial pickup time is offered, the latest promised" + + "pickup time is calculated based on initial scheduled pickup time + maxAllowedPickupDelay. " + + "By default, this limit is disabled. If enabled, a value between 0 and 240 is a good choice.") + @PositiveOrZero + public double maxAllowedPickupDelay = Double.POSITIVE_INFINITY;// [s] + + @Parameter + @Comment("If true, the max travel and wait times of a submitted request" + + " are considered hard constraints (the request gets rejected if one of the constraints is violated)." + + " If false, the max travel and wait times are considered soft constraints (insertion of a request that" + + " violates one of the constraints is allowed, but its cost is increased by additional penalty to make" + + " it relatively less attractive). Penalisation of insertions can be customised by injecting a customised" + + " InsertionCostCalculator.PenaltyCalculator") + public boolean rejectRequestIfMaxWaitOrTravelTimeViolated = true;//TODO consider renaming maxWalkDistance to max access/egress distance (or even have 2 separate params) + + @Parameter + @Comment( + "Maximum beeline distance (in meters) to next stop location in stopbased system for access/egress walk leg to/from drt." + + " If no stop can be found within this maximum distance will return null (in most cases caught by fallback routing module).") + @PositiveOrZero // used only for stopbased DRT scheme + public double maxWalkDistance = Double.MAX_VALUE;// [m]; + + public DrtOptimizationConstraintsParams() { + super(SET_NAME); + } + + @Override + protected void checkConsistency(Config config) { + super.checkConsistency(config); + if ((maxDetourAlpha != Double.POSITIVE_INFINITY && maxDetourBeta != Double.POSITIVE_INFINITY) || maxAbsoluteDetour != Double.POSITIVE_INFINITY) { + Verify.verify(maxAllowedPickupDelay != Double.POSITIVE_INFINITY, "Detour constraints are activated, " + + "maxAllowedPickupDelay must be specified! A value between 0 and 240 seconds can be a good choice for maxAllowedPickupDelay."); + } + } +} \ No newline at end of file diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java index ec0e2a1f030..8722cc9e657 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java @@ -36,17 +36,17 @@ public void testMaxDetourConstraint() { DrtConfigGroup drtConfigGroup = DrtConfigGroup.getSingleModeDrtConfig(config); // Max wait time - drtConfigGroup.maxWaitTime = 300; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = 300; // Turn on the max detour constraint - drtConfigGroup.maxDetourAlpha = 1.5; - drtConfigGroup.maxDetourBeta = 300; - drtConfigGroup.maxAllowedPickupDelay = 180; - drtConfigGroup.maxAbsoluteDetour = 1200; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxDetourAlpha = 1.5; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxDetourBeta = 300; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxAllowedPickupDelay = 180; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxAbsoluteDetour = 1200; // Make the max total travel time constraints very loose (i.e., make it not active) - drtConfigGroup.maxTravelTimeAlpha = 10; - drtConfigGroup.maxTravelTimeBeta = 7200; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 10; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 7200; config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java index 8451f93b1e2..dfff04e67da 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java @@ -225,9 +225,9 @@ private PersonEnterDrtVehicleEventHandler setupAndRunScenario(double maxWaitTime MultiModeDrtConfigGroup mm = ConfigUtils.addOrGetModule(config, MultiModeDrtConfigGroup.class); mm.getModalElements().forEach(x -> { - x.maxWaitTime = maxWaitTime; - x.maxTravelTimeAlpha = maxTravelTimeAlpha; - x.maxTravelTimeBeta = maxTravelTimeBeta; + x.getDrtOptimizationConstraintsParam().maxWaitTime = maxWaitTime; + x.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = maxTravelTimeAlpha; + x.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = maxTravelTimeBeta; x.stopDuration = 1.; }); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java index 93a59a769bd..9f6b424da09 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java @@ -626,7 +626,7 @@ private class Fixture { DrtConfigGroup drtConfig = new DrtConfigGroup(); drtConfig.stopDuration = 30.0; - drtConfig.maxWaitTime = 600.0; + drtConfig.getDrtOptimizationConstraintsParam().maxWaitTime = 600.0; this.entryFactory = new VehicleDataEntryFactoryImpl(); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java index c97f2c34a81..e4cece58765 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java @@ -226,9 +226,9 @@ private void buildConfig(Config config) { DrtConfigGroup modeConfig = new DrtConfigGroup(); drtConfig.addParameterSet(modeConfig); modeConfig.mode = "drt"; - modeConfig.maxWaitTime = maximumWaitTime; - modeConfig.maxTravelTimeAlpha = detourRelative; - modeConfig.maxTravelTimeBeta = detourAbsolute; + modeConfig.getDrtOptimizationConstraintsParam().maxWaitTime = maximumWaitTime; + modeConfig.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = detourRelative; + modeConfig.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = detourAbsolute; modeConfig.stopDuration = stopDuration; modeConfig.idleVehiclesReturnToDepots = false; modeConfig.vehiclesFile = null; diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java index e4d242dabcf..f86bbeb7215 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java @@ -80,9 +80,9 @@ void testCottbusClosestAccessEgressStopFinder() { DrtConfigGroup drtCfg = DrtConfigGroup.getSingleModeDrtConfig(scenario.getConfig()); String drtMode = "DrtX"; drtCfg.mode = drtMode; - drtCfg.maxTravelTimeAlpha = 1.5; - drtCfg.maxTravelTimeBeta = 5 * 60; - drtCfg.maxWaitTime = 5 * 60; + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.5; + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5 * 60; + drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime = 5 * 60; ImmutableMap, DrtStopFacility> drtStops = scenario.getTransitSchedule() .getFacilities() @@ -91,7 +91,7 @@ void testCottbusClosestAccessEgressStopFinder() { .map(DrtStopFacilityImpl::createFromFacility) .collect(ImmutableMap.toImmutableMap(DrtStopFacility::getId, f -> f)); - AccessEgressFacilityFinder stopFinder = new ClosestAccessEgressFacilityFinder(drtCfg.maxWalkDistance, + AccessEgressFacilityFinder stopFinder = new ClosestAccessEgressFacilityFinder(drtCfg.getDrtOptimizationConstraintsParam().maxWalkDistance, scenario.getNetwork(), QuadTrees.createQuadTree(drtStops.values())); DrtRouteCreator drtRouteCreator = new DrtRouteCreator(drtCfg, scenario.getNetwork(), new SpeedyDijkstraFactory(), new FreeSpeedTravelTime(), TimeAsTravelDisutility::new); @@ -259,7 +259,7 @@ void testRouteDescriptionHandling() { private Scenario createTestScenario() { Config config = ConfigUtils.createConfig(); DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); - drtConfigGroup.maxWalkDistance = 200; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxWalkDistance = 200; drtConfigGroup.transitStopFile = utils.getClassInputDirectory() + "testCottbus/drtstops.xml.gz"; MultiModeDrtConfigGroup multiModeDrtConfigGroup = new MultiModeDrtConfigGroup(); multiModeDrtConfigGroup.addParameterSet(drtConfigGroup); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java index e1c1492fbed..6b15ba1bc9e 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java @@ -90,7 +90,7 @@ void testRunDrtExampleWithNoRejections_ExtensiveSearch() { for (var drtCfg : MultiModeDrtConfigGroup.get(config).getModalElements()) { //disable rejections - drtCfg.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; } config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); @@ -129,7 +129,7 @@ void testRunDrtExampleWithNoRejections_SelectiveSearch() { drtCfg.addParameterSet(selectiveInsertionSearchParams); //disable rejections - drtCfg.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; } config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); @@ -168,7 +168,7 @@ void testRunDrtExampleWithNoRejections_RepeatedSelectiveSearch() { drtCfg.addParameterSet(repeatedSelectiveInsertionSearchParams); //disable rejections - drtCfg.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; } config.controller().setLastIteration(3); @@ -393,7 +393,7 @@ void testRunDrtWithPrebooking() { * rejectionRate, rejections, waitAverage, inVehicleTravelTimeMean, & totalTravelTimeMean */ - private void verifyDrtCustomerStatsCloseToExpectedStats(String outputDirectory, Stats expectedStats) { + static void verifyDrtCustomerStatsCloseToExpectedStats(String outputDirectory, Stats expectedStats) { String filename = outputDirectory + "/drt_customer_stats_drt.csv"; @@ -424,7 +424,7 @@ private void verifyDrtCustomerStatsCloseToExpectedStats(String outputDirectory, assertThat(actualStats).usingRecursiveComparison().isEqualTo(expectedStats); } - private static class Stats { + static class Stats { private final double rejectionRate; private final double rejections; private final double waitAverage; diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java new file mode 100644 index 00000000000..506bb7503c2 --- /dev/null +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java @@ -0,0 +1,61 @@ +package org.matsim.contrib.drt.run.examples; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.matsim.api.core.v01.Id; +import org.matsim.contrib.common.zones.systems.grid.square.SquareGridZoneSystemParams; +import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; +import org.matsim.contrib.dvrp.run.DvrpConfigGroup; +import org.matsim.contrib.zone.skims.DvrpTravelTimeMatrixParams; +import org.matsim.core.config.Config; +import org.matsim.core.config.ConfigUtils; +import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.utils.io.IOUtils; +import org.matsim.examples.ExamplesUtils; +import org.matsim.testcases.MatsimTestUtils; +import org.matsim.vis.otfvis.OTFVisConfigGroup; + +import java.net.URL; + +/** + * + * Tests the older drt config version where optimization constraints where not stored as separate parameters + * @author nkuehnel / MOIA + */ +public class RunOldDrtConfigCompatibilityIT { + + @RegisterExtension + private MatsimTestUtils utils = new MatsimTestUtils(); + + @Test + void testRunDrtExampleWithNoRejections_ExtensiveSearch() { + Id.resetCaches(); + + DvrpConfigGroup dvrpConfigGroup = new DvrpConfigGroup(); + DvrpTravelTimeMatrixParams matrixParams = dvrpConfigGroup.getTravelTimeMatrixParams(); + matrixParams.addParameterSet(matrixParams.createParameterSet(SquareGridZoneSystemParams.SET_NAME)); + + URL configUrl = IOUtils.extendUrl(ExamplesUtils.getTestScenarioURL("mielec"), "mielec_drt_config_v1.xml"); + Config config = ConfigUtils.loadConfig(configUrl, new MultiModeDrtConfigGroup(), dvrpConfigGroup, + new OTFVisConfigGroup()); + + for (var drtCfg : MultiModeDrtConfigGroup.get(config).getModalElements()) { + //disable rejections + drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + } + + config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); + config.controller().setOutputDirectory(utils.getOutputDirectory()); + RunDrtExample.run(config, false); + + var expectedStats = RunDrtExampleIT.Stats.newBuilder() + .rejectionRate(0.0) + .rejections(0) + .waitAverage(297.19) + .inVehicleTravelTimeMean(386.78) + .totalTravelTimeMean(683.97) + .build(); + + RunDrtExampleIT.verifyDrtCustomerStatsCloseToExpectedStats(utils.getOutputDirectory(), expectedStats); + } +} diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java index 4cd79608057..27dfd190989 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java @@ -12,6 +12,7 @@ import org.matsim.contrib.drt.fare.DrtFareParams; import org.matsim.contrib.drt.run.DrtConfigGroup; import org.matsim.contrib.drt.run.DrtControlerCreator; +import org.matsim.contrib.drt.run.DrtOptimizationConstraintsParams; import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; import org.matsim.core.config.Config; @@ -45,9 +46,10 @@ void testTeleportationEngine() throws IOException { Controler controler = DrtControlerCreator.createControler(config, false); DrtConfigGroup drtConfigGroup = DrtConfigGroup.getSingleModeDrtConfig(config); - drtConfigGroup.maxTravelTimeAlpha = 1.2; - drtConfigGroup.maxTravelTimeBeta = 600; - drtConfigGroup.maxWaitTime = 300; + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + constraintsParam.maxTravelTimeAlpha = 1.2; + constraintsParam.maxTravelTimeBeta = 600; + constraintsParam.maxWaitTime = 300; DrtFareParams fareParams = new DrtFareParams(); fareParams.baseFare = 1.0; fareParams.distanceFare_m = 0.001; @@ -75,12 +77,12 @@ public void install() { double waitAvg = Double.parseDouble(row.get("wait_average")); - assertThat(waitAvg).isEqualTo(drtConfigGroup.maxWaitTime); + assertThat(waitAvg).isEqualTo(constraintsParam.maxWaitTime); double distMean = Double.parseDouble(row.get("distance_m_mean")); double directDistMean = Double.parseDouble(row.get("directDistance_m_mean")); - assertThat(distMean / directDistMean).isCloseTo(drtConfigGroup.maxTravelTimeAlpha, Offset.offset(0.0001)); + assertThat(distMean / directDistMean).isCloseTo(constraintsParam.maxTravelTimeAlpha, Offset.offset(0.0001)); } diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java b/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java index 31bf3440150..b4aa67762e0 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java @@ -66,16 +66,16 @@ public static DrtConfigGroup convertTaxiToDrtCfg(TaxiConfigGroup taxiCfg) { // Taxi optimisers do not reject, so time constraints are only used for routing plans (DrtRouteCreator). // Using some (relatively high) values as we do not know what values should be there. They can be adjusted // manually after the TaxiAsDrtConfigGroup config is created. - drtCfg.maxWaitTime = 3600; - drtCfg.maxTravelTimeAlpha = 2; - drtCfg.maxTravelTimeBeta = 3600; - drtCfg.maxAbsoluteDetour = Double.MAX_VALUE; + drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime = 3600; + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 2; + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 3600; + drtCfg.getDrtOptimizationConstraintsParam().maxAbsoluteDetour = Double.MAX_VALUE; - drtCfg.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtCfg.changeStartLinkToLastLinkInSchedule = taxiCfg.changeStartLinkToLastLinkInSchedule; drtCfg.idleVehiclesReturnToDepots = false; drtCfg.operationalScheme = DrtConfigGroup.OperationalScheme.door2door; - drtCfg.maxWalkDistance = Double.MAX_VALUE; + drtCfg.getDrtOptimizationConstraintsParam().maxWalkDistance = Double.MAX_VALUE; drtCfg.vehiclesFile = taxiCfg.taxisFile; drtCfg.transitStopFile = null; drtCfg.drtServiceAreaShapeFile = null; diff --git a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java index 3e00dd03d50..f99512782ef 100644 --- a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java +++ b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java @@ -229,11 +229,11 @@ void testPtAlongALineWithRaptorAndDrtServiceArea() { { DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); drtConfigGroup.mode = TransportMode.drt; - drtConfigGroup.maxTravelTimeAlpha = 2.0; - drtConfigGroup.maxTravelTimeBeta = 5. * 60.; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 2.0; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfigGroup.stopDuration = 60.; - drtConfigGroup.maxWaitTime = Double.MAX_VALUE; - drtConfigGroup.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfigGroup.useModeFilteredSubnetwork = true; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); @@ -243,11 +243,11 @@ void testPtAlongALineWithRaptorAndDrtServiceArea() { if (drt2) { DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); drtConfigGroup.mode = "drt2"; - drtConfigGroup.maxTravelTimeAlpha = 1.3; - drtConfigGroup.maxTravelTimeBeta = 5. * 60.; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfigGroup.stopDuration = 60.; - drtConfigGroup.maxWaitTime = Double.MAX_VALUE; - drtConfigGroup.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfigGroup.useModeFilteredSubnetwork = true; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); @@ -256,11 +256,11 @@ void testPtAlongALineWithRaptorAndDrtServiceArea() { if (drt3) { DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); drtConfigGroup.mode = "drt3"; - drtConfigGroup.maxTravelTimeAlpha = 1.3; - drtConfigGroup.maxTravelTimeBeta = 5. * 60.; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfigGroup.stopDuration = 60.; - drtConfigGroup.maxWaitTime = Double.MAX_VALUE; - drtConfigGroup.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfigGroup.useModeFilteredSubnetwork = true; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); diff --git a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java index 00c908721c0..fd92aafff84 100644 --- a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java +++ b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java @@ -110,10 +110,10 @@ void testDrtAlongALine() { DrtConfigGroup drtConfig = new DrtConfigGroup(); drtConfig.mode = "drt_A"; drtConfig.stopDuration = 60.; - drtConfig.maxWaitTime = 900.; - drtConfig.maxTravelTimeAlpha = 1.3; - drtConfig.maxTravelTimeBeta = 10. * 60.; - drtConfig.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfig.getDrtOptimizationConstraintsParam().maxWaitTime = 900.; + drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 10. * 60.; + drtConfig.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfig.changeStartLinkToLastLinkInSchedule = true; multiModeDrtCfg.addParameterSet(drtConfig); } @@ -247,11 +247,11 @@ void testPtAlongALineWithRaptorAndDrtStopFilterAttribute() { MultiModeDrtConfigGroup mm = ConfigUtils.addOrGetModule(config, MultiModeDrtConfigGroup.class); { DrtConfigGroup drtConfig = new DrtConfigGroup(); - drtConfig.maxTravelTimeAlpha = 1.3; - drtConfig.maxTravelTimeBeta = 5. * 60.; + drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfig.stopDuration = 60.; - drtConfig.maxWaitTime = Double.MAX_VALUE; - drtConfig.rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfig.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfig.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfig.mode = TransportMode.drt; mm.addParameterSet(drtConfig); } diff --git a/examples/scenarios/dvrp-grid/eight_shared_taxi_config.xml b/examples/scenarios/dvrp-grid/eight_shared_taxi_config.xml index fa26707492f..4dd451ddac4 100644 --- a/examples/scenarios/dvrp-grid/eight_shared_taxi_config.xml +++ b/examples/scenarios/dvrp-grid/eight_shared_taxi_config.xml @@ -5,10 +5,12 @@ - - - - + + + + + + diff --git a/examples/scenarios/dvrp-grid/multi_mode_one_shared_taxi_config.xml b/examples/scenarios/dvrp-grid/multi_mode_one_shared_taxi_config.xml index bb0c4beed1f..1d306865741 100644 --- a/examples/scenarios/dvrp-grid/multi_mode_one_shared_taxi_config.xml +++ b/examples/scenarios/dvrp-grid/multi_mode_one_shared_taxi_config.xml @@ -14,10 +14,12 @@ - - - - + + + + + + @@ -30,10 +32,12 @@ - - - - + + + + + + diff --git a/examples/scenarios/dvrp-grid/one_shared_taxi_config.xml b/examples/scenarios/dvrp-grid/one_shared_taxi_config.xml index 6f727d250e8..2d3b062aea6 100644 --- a/examples/scenarios/dvrp-grid/one_shared_taxi_config.xml +++ b/examples/scenarios/dvrp-grid/one_shared_taxi_config.xml @@ -13,10 +13,12 @@ - - - - + + + + + + diff --git a/examples/scenarios/dvrp-grid/one_taxi_and_one_shared_taxi_config.xml b/examples/scenarios/dvrp-grid/one_taxi_and_one_shared_taxi_config.xml index 4d953cfcf33..1f1f0a1b3fa 100644 --- a/examples/scenarios/dvrp-grid/one_taxi_and_one_shared_taxi_config.xml +++ b/examples/scenarios/dvrp-grid/one_taxi_and_one_shared_taxi_config.xml @@ -8,9 +8,12 @@ - - - + + + + + + diff --git a/examples/scenarios/kelheim/config-with-drt.xml b/examples/scenarios/kelheim/config-with-drt.xml index 7657d679502..65d678e96d3 100644 --- a/examples/scenarios/kelheim/config-with-drt.xml +++ b/examples/scenarios/kelheim/config-with-drt.xml @@ -243,15 +243,17 @@ - - - - - - - - - + + + + + + + + + + + @@ -286,15 +288,17 @@ - - - - - - - - - + + + + + + + + + + + diff --git a/examples/scenarios/mielec/mielec_drt_config.xml b/examples/scenarios/mielec/mielec_drt_config.xml index 403207359f5..6557f58136a 100644 --- a/examples/scenarios/mielec/mielec_drt_config.xml +++ b/examples/scenarios/mielec/mielec_drt_config.xml @@ -8,9 +8,11 @@ - - - + + + + + diff --git a/examples/scenarios/mielec/mielec_drt_config_v1.xml b/examples/scenarios/mielec/mielec_drt_config_v1.xml new file mode 100644 index 00000000000..403207359f5 --- /dev/null +++ b/examples/scenarios/mielec/mielec_drt_config_v1.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/scenarios/mielec/mielec_edrt_config.xml b/examples/scenarios/mielec/mielec_edrt_config.xml index 5ab35db759d..fa045f53415 100644 --- a/examples/scenarios/mielec/mielec_edrt_config.xml +++ b/examples/scenarios/mielec/mielec_edrt_config.xml @@ -13,9 +13,11 @@ - - - + + + + + diff --git a/examples/scenarios/mielec/mielec_multiModeEdrt_config.xml b/examples/scenarios/mielec/mielec_multiModeEdrt_config.xml index 2d20b7b5756..9f0ac950685 100644 --- a/examples/scenarios/mielec/mielec_multiModeEdrt_config.xml +++ b/examples/scenarios/mielec/mielec_multiModeEdrt_config.xml @@ -14,9 +14,11 @@ - - - + + + + + @@ -40,9 +42,11 @@ - - - + + + + + diff --git a/examples/scenarios/mielec/mielec_serviceArea_based_drt_config.xml b/examples/scenarios/mielec/mielec_serviceArea_based_drt_config.xml index ceb0ca0a3cb..98754db5f24 100644 --- a/examples/scenarios/mielec/mielec_serviceArea_based_drt_config.xml +++ b/examples/scenarios/mielec/mielec_serviceArea_based_drt_config.xml @@ -13,10 +13,11 @@ - - - - + + + + + diff --git a/examples/scenarios/mielec/mielec_stop_based_drt_config.xml b/examples/scenarios/mielec/mielec_stop_based_drt_config.xml index 5b9da8ef8d0..7d07ee1fd64 100644 --- a/examples/scenarios/mielec/mielec_stop_based_drt_config.xml +++ b/examples/scenarios/mielec/mielec_stop_based_drt_config.xml @@ -13,12 +13,14 @@ - - - + + + + + + + - - From fab1ed64621e70b7fde010c3e708b888026adf11 Mon Sep 17 00:00:00 2001 From: Marcel Rieser Date: Sun, 12 May 2024 22:42:56 +0200 Subject: [PATCH 10/77] add option to limit number of transfers in calcTree --- .../matsim/routing/pt/raptor/SwissRailRaptor.java | 12 ++++++------ .../routing/pt/raptor/SwissRailRaptorCore.java | 10 ++++++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java index 201d2730cc8..df57fd4a2ea 100644 --- a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java +++ b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptor.java @@ -231,13 +231,13 @@ public Map, SwissRailRaptorCore.TravelInfo> calcTree(Col for (TransitStopFacility stop : fromStops) { accessStops.add(new InitialStop(stop, 0, 0, 0, null)); } - return this.calcLeastCostTree(accessStops, departureTime, parameters, person, null); + return this.calcLeastCostTree(accessStops, departureTime, parameters, Integer.MAX_VALUE, person, null); } public Map, SwissRailRaptorCore.TravelInfo> calcTree(Facility fromFacility, double departureTime, Person person, Attributes routingAttributes) { RaptorParameters parameters = this.parametersForPerson.getRaptorParameters(person); List accessStops = findAccessStops(fromFacility, fromFacility, person, departureTime, routingAttributes, parameters); - return this.calcLeastCostTree(accessStops, departureTime, parameters, person, null); + return this.calcLeastCostTree(accessStops, departureTime, parameters, Integer.MAX_VALUE, person, null); } /** Calculates a least-cost-tree for every actual departure time between earliestDepartureTime @@ -245,7 +245,7 @@ public Map, SwissRailRaptorCore.TravelInfo> calcTree(Fac * This method returns nothing, instead users have to use the observer to collect * relevant results. */ - public void calcTreesObservable(TransitStopFacility stopFacility, double earliestDepartureTime, double latestStartTime, RaptorParameters parameters, Person person, RaptorObserver observer) { + public void calcTreesObservable(TransitStopFacility stopFacility, double earliestDepartureTime, double latestStartTime, RaptorParameters parameters, int maxTransfers, Person person, RaptorObserver observer) { if (this.data.config.getOptimization() != RaptorStaticConfig.RaptorOptimization.OneToAllRouting && !this.treeWarningShown) { log.warn("SwissRailRaptorData was not initialized with full support for tree calculations and may result in unexpected results. Use `RaptorStaticConfig.setOptimization(RaptorOptimization.OneToAllRouting)` to fix this issue."); this.treeWarningShown = true; @@ -274,14 +274,14 @@ public void calcTreesObservable(TransitStopFacility stopFacility, double earlies double lastDepTime = -1; for (double departureTime : departureTimes) { if (departureTime > lastDepTime) { - calcLeastCostTree(accessStops, departureTime, parameters, person, observer); + calcLeastCostTree(accessStops, departureTime, parameters, maxTransfers, person, observer); lastDepTime = departureTime; } } } - private Map, SwissRailRaptorCore.TravelInfo> calcLeastCostTree(Collection accessStops, double departureTime, RaptorParameters parameters, Person person, RaptorObserver observer) { - return this.raptor.calcLeastCostTree(departureTime, accessStops, parameters, person, observer); + private Map, SwissRailRaptorCore.TravelInfo> calcLeastCostTree(Collection accessStops, double departureTime, RaptorParameters parameters, int maxTransfers, Person person, RaptorObserver observer) { + return this.raptor.calcLeastCostTree(departureTime, accessStops, parameters, maxTransfers, person, observer); } public SwissRailRaptorData getUnderlyingData() { diff --git a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java index 8a2393aba97..a4212bea85c 100644 --- a/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java +++ b/matsim/src/main/java/ch/sbb/matsim/routing/pt/raptor/SwissRailRaptorCore.java @@ -487,10 +487,10 @@ private List filterRoutes(List allRoutes) { } public Map, TravelInfo> calcLeastCostTree(double depTime, Collection startStops, RaptorParameters parameters, Person person) { - return this.calcLeastCostTree(depTime, startStops, parameters, person, null); + return this.calcLeastCostTree(depTime, startStops, parameters, Integer.MAX_VALUE, person, null); } - public Map, TravelInfo> calcLeastCostTree(double depTime, Collection startStops, RaptorParameters parameters, Person person, RaptorObserver observer) { + public Map, TravelInfo> calcLeastCostTree(double depTime, Collection startStops, RaptorParameters parameters, int maxTransfers, Person person, RaptorObserver observer) { reset(); BitSet initialRouteStopIndices = new BitSet(); @@ -514,6 +514,7 @@ public Map, TravelInfo> calcLeastCostTree(double depTime } // the main loop + int transfers = 0; while (true) { // first stage (according to paper) is to set earliestArrivalTime_k(stop) = earliestArrivalTime_k-1(stop) // but because we re-use the earliestArrivalTime-array, we don't have to do anything. @@ -532,8 +533,13 @@ public Map, TravelInfo> calcLeastCostTree(double depTime initialStopIndices = null; } + if (transfers >= maxTransfers) { + break; + } + // third stage (according to paper): handle footpaths / transfers handleTransfers(true, parameters); + transfers++; // final stage: check stop criterion if (this.improvedRouteStopIndices.isEmpty()) { From f2ef7a2b9e039ad20cb8187b924b238738362608 Mon Sep 17 00:00:00 2001 From: rakow Date: Mon, 13 May 2024 10:02:12 +0200 Subject: [PATCH 11/77] add python script to analysis kid data --- .../src/main/python/analyze_kid.py | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 contribs/small-scale-traffic-generation/src/main/python/analyze_kid.py diff --git a/contribs/small-scale-traffic-generation/src/main/python/analyze_kid.py b/contribs/small-scale-traffic-generation/src/main/python/analyze_kid.py new file mode 100644 index 00000000000..61e8bd32be1 --- /dev/null +++ b/contribs/small-scale-traffic-generation/src/main/python/analyze_kid.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +from datetime import timedelta + +import matplotlib.pyplot as plt +import matplotlib.ticker as ticker +import numpy as np +import pandas as pd +import seaborn as sns + +# %% + +sns.set_style("ticks") +sns.set_context("paper", font_scale=1.2, rc={"grid.linewidth": 1, "lines.linewidth": 2}) +# sns.set_palette("Set2") + +plt.rcParams['figure.dpi'] = 350 +plt.rcParams['pdf.fonttype'] = 42 +plt.rcParams['ps.fonttype'] = 42 +plt.rcParams['font.family'] = 'Arial' + +palette = sns.color_palette("Set2") + +# %% + +d = "/Users/rakow/Development/shared-svn/studies/countries/de/KiD_2002/Daten/" + +Fahrten = pd.read_csv(d + "KiD_2002_(Einzel)Fahrten-Datei.txt", delimiter="\t", encoding="ISO-8859-1") +Ketten = pd.read_csv(d + "KiD_2002_Fahrtenketten-Datei.txt", delimiter="\t", encoding="ISO-8859-1") +Fahrzeug = pd.read_csv(d + "KiD_2002_Fahrzeug-Datei.txt", delimiter="\t", encoding="ISO-8859-1") + +# %% + +Fahrten["start"] = pd.to_datetime(Fahrten["F04"], errors="coerce") +Fahrten["end"] = pd.to_datetime(Fahrten["F10a"], errors="coerce") + +# %% + +# Filter commercial trips +df = Fahrten[Fahrten["F07b"] == 1] + +df = df.merge(Fahrzeug, on="K00") +df = df.rename(columns={"K91": "w", "F14": "dist"}) + +df["type"] = df["F07a"].map( + {1: "goodsTraffic", 2: "commercialPersonTraffic", 3: "commercialPersonTraffic", 4: "commercialPersonTraffic", + 5: "returnDepot"}) +df = df[["K00", "F00", "start", "end", "w", "dist", "type"]] + +df["start"] = df["start"].dt.hour * 60 + df["start"].dt.minute +df["end"] = df["end"].dt.hour * 60 + df["end"].dt.minute + +# Filter valid ranges +df = df[df.start <= df.end] + +df["duration"] = df.end - df.start + +df = df.dropna() + +purpose = df.groupby("K00").apply( + lambda x: "goodsTraffic" if "goodsTraffic" in set(x["type"]) else "commercialPersonTraffic") + +# %% + +durations = [0, 10, 20, 30, 40, 50, 60, 75, 90, 105, 120, 150, 180, 240, 300, 420, 540, 660, np.inf] + +df["dur_group"] = pd.cut(df.duration, durations) + +starts = [0, 4 * 60, 5 * 60, 6 * 60, 7 * 60, 8 * 60, 9 * 60, 10 * 60, 11 * 60, 12 * 60, 13 * 60, 14 * 60, 15 * 60, + 16 * 60, 17 * 60, 18 * 60, 19 * 60, np.inf] +start_labels = ["0-4", "4-5", "5-6", "6-7", "7-8", "8-9", "9-10", "10-11", "11-12", "12-13", "13-14", "14-15", "15-16", + "16-17", "17-18", "18-19", "19-24"] + +df["start_group"] = pd.cut(df.start, starts) + +# %% + +x = np.arange(start=0, stop=24 * 60, step=15, dtype=np.float64) + +# %% + +y = np.zeros_like(x) + +for t in df.itertuples(): + idx = np.searchsorted(x, [t.start, t.end]) + idx[1] += 1 + + y[slice(*idx)] += t.w + +y /= np.max(y / 1000) + +# %% + +fig, ax = plt.subplots(figsize=(8, 4)) + +sns.lineplot(x=x, y=y, ax=ax) + +sns.despine() + +ax.xaxis.set_major_locator(ticker.FixedLocator(np.arange(start=0, stop=24 * 60, step=120, dtype=np.float64))) +ax.xaxis.set_major_formatter(lambda x, y: str(timedelta(minutes=x))[:-3]) + +# %% + + +sns.histplot(data=df, x="duration", bins=durations) + +# %% + +# Only commercial tours + +Ketten["start"] = pd.to_datetime(Ketten["T04"], errors="coerce") + +tf = Ketten[Ketten.T07 == 1] + +tf = tf.merge(Fahrzeug, on="K00").set_index("K00") +tf["type"] = purpose + +tf["start"] = tf["start"].dt.hour * 60 + tf["start"].dt.minute + +tf = tf.rename(columns={"K91": "w", "T01": "duration", "T05": "dist", "K03": "vWeight"}) + +tf = tf[tf.duration > 0] + +tf = tf[["start", "w", "duration", "dist", "vWeight", "type"]] + +tf = tf.dropna() + +# %% + +vehicles = [0, 2800, 3500, 7500, 12000, 100000] + +tf["vClass"] = pd.cut(tf.vWeight, vehicles, labels=["vehType1", "vehType2", "vehType3", "vehType4", "vehType5"]) + +t_durations = np.hstack(([0, 30, 60, 90], np.arange(120, 15 * 60, step=60, dtype=np.float64), [18 * 60])) + +tf["dur_group"] = pd.cut(tf.duration, t_durations) +tf["start_group"] = pd.cut(tf.start, starts, labels=start_labels) + +tf = tf.dropna() + +# %% + +aggr = tf.groupby(["type", "start_group", "dur_group"]).agg(p=("w", "sum")) + +for group in ("goodsTraffic", "commercialPersonTraffic"): + sub = aggr.loc[group, :] + sub.p /= sub.p.sum() + +aggr = aggr.reset_index() + +target = "goodsTraffic" +for a in aggr.itertuples(): + + if a.type != target or a.p <= 0: + continue + + f, t = a.start_group.split("-") + lower, upper = a.dur_group.left, a.dur_group.right + + print(f"Pair.create(new TourStartAndDuration({f}, {t}, {lower}, {upper}), {a.p}),") + +# %% + +fig, ax = plt.subplots(figsize=(8, 4)) + +sns.histplot(data=tf, x="start", bins=starts, ax=ax) + +sns.despine() + +ax.xaxis.set_major_locator(ticker.FixedLocator(np.arange(start=0, stop=24 * 60, step=120, dtype=np.float64))) +ax.xaxis.set_major_formatter(lambda x, y: str(timedelta(minutes=x))[:-3]) + +# %% + +fig, ax = plt.subplots(figsize=(8, 4)) + +sns.histplot(data=tf, x="duration", bins=t_durations, ax=ax) +sns.despine() + +ax.xaxis.set_major_formatter(lambda x, y: int(x // 60)) +ax.xaxis.set_major_locator(ticker.FixedLocator(np.arange(start=0, stop=24 * 60, step=60, dtype=np.float64))) + +# %% + +grid = sns.FacetGrid(tf, col="start_group", col_wrap=6, palette="tab20c") + +grid.map_dataframe(sns.histplot, x="duration", bins=t_durations, stat="percent") + +# %% From 37774518eafb1304eb2cfefd82f277974fc84846 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Mon, 13 May 2024 13:00:28 +0200 Subject: [PATCH 12/77] add new events for new times distribution --- .../test.output_events.xml.gz | Bin 34733 -> 34108 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/contribs/small-scale-traffic-generation/test/input/org/matsim/smallScaleCommercialTrafficGeneration/test.output_events.xml.gz b/contribs/small-scale-traffic-generation/test/input/org/matsim/smallScaleCommercialTrafficGeneration/test.output_events.xml.gz index 5f61199dc0b0b374094ec5ffe3f744e22f52efc8..b402920a875921cf056b3b96bd2da8b8dae7a5e3 100644 GIT binary patch literal 34108 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 X*3*om?w5Z_|0qQ+t<8V#pu_ziz_w6S literal 34733 zcmX_HWmr@1->16-X({P00qK;KuF;JkJxX$Pcc*lBcS$$WjR*s2=^T6J?|)s--t6qf zcAcGb-``Ijs%SL0|6b6u9)mhM!KD2AY6xMh_c6SNKI7IAvFR701RVq^k*9jzGqshgs+i)$77&AL!+=t?!5UOBwX9 z_!;#1!vFcEj;ao7@Gk7^4zUmNY*Gt7j0ZiO?ajiz>W7-0VOf+a{rR zdv$&OPY)+x5M;wd9P)Bm2kLowI2olH1apF(Z#ny3ZuhLZUm$zp3!o3BlMjOzuP;Z3 zpvO@v|0l?m*=snJzbAwky3+=Fs_TP1oH&WUoO?nOC0_PM`wXFfo%;Nni(jrsp|2*O z$Guw<=wN)G4%cg&Ks^+4xKj&-Lhmp0#38%06V0F<=$l+B#`NdcIun6ihk?H5vlS}n zO_?gF{za_v1p2t=1ihQAgI?9c`$HZMsX)&+_wmrPblB;iP14XI--1rvVBbmagFJP$ zVMBEnQeVuVP0;Ij=mX-d$;)39ujk249JImoP{`w6p1+Sl#1T-wx()mBGCtsR;X;?H zkxLmlkOC2tc=bS=Lp9_mIvA>V+dxb1e ziRn0Rv*+JKe~+Uz3Zg3O%n92}Q<-dEa+*aRU4tG?UhhugpV!vsfdoTT{x6fT+jq0k z2ThNMKJCq}IyLmv{% zV*!*pO!lA4Yx@qxf`eFO z@33{GY>OYt6VDSNr#KnWW-`Ix1i&{E?x%!UX=cLTB!F-EPqI3GdKiVu1N2AL)8_#x zsD542u>ZQX3+xMQ^I5~EqrZWi8MhCV0hTvZ^q3P^(+3Yi_|uYB-*KiSj+u8A@I`#a zW2a}im_5`);P6dnH@0zQzMj3*oRK-+Dcgz1R)`F;yw;ydy?IIsz)W8~4Qa(Hu~%s0 zM6Y*_R2H+eW5b*}kw)M!G#|%wU=uBY^zO@xl_cY?rA;7QKP3dPda~rsr8N?s+|m=z zN8}of9hk9VP8~^0)#kYG1`~xfVxQd5!|Tk1xYI;mQhT`)36~ze!J&75s^>DSwFP{u zzF`uh$qEY{MY(6&FaGg^=uqM(=|dPuFU?FgCy?2}&d=~$9PO>njd~`no^IQRxAo{r zu}U4a=V$-~oOhDVALN&o+>sL94zF&MzEWRaAiksjb_x0s1C_MnFu&5ATVmgq@8PlX9^x(qRA62=u3oLP#b$t@9 zX}5OVcVtwdI=;_s+t7HWRgvC$w2Xtc19{LCo)9p5oSrl?{v+$J2bEM!~tqUpjZ0HrYoK)Ktq!CjENXz7q&OjgI5ig zxOQSWI(RqS)xHTJ11k^UMBk>oAuxOdXXKP51Vtwgn@`(GpH+rL-xJny1ko!)AxPO`6P z`e8D^Esp4Pgt{IAt>|t=Pij;qa|BM#9{nf0JmQP)akFn_nND4;d#1VXtb2^W{F<^Q ziSC#ZK-+B{wn>0*UB_BeykW;mgte>^5j&2wf~Cg}PSCH}#7pUV^UP3=R}R$3>DoUX z4+X_o*AQRBAm*q@esf{yXG_H> zB&}R)WK*l@%4R<*E#}nWzxnceA-1FN*q|?W3Qsz&40Ws*m@l3TGyR}E!t)CT01H|9 zMxJay$#*WJs&2R?=Btw3B*j{2y1Ms1ivi!}8e6W67Ejh%USy?FcS8(6o2v;{uP*lN zR^q*JkQI}FFW)mh99Mrsz7zNR%c-tEIV@M=*5z4WW6b7k3SE;2&wZ&~!BAsYCk~rQo z!zpkin4@S;wXHx|wDcjWPDoLZ)>e9nt{?qY(5{sw#ZWE&AUlC;9J7Tb ziet!W zDT>qKXK*U0_-lncsnap z`u9AemRw+r73XkJ9`nATCQ0R}ZS?a}4PbWjxhGJ_Jn#E{gn(}+lsIHS&?rUKVt?-(F?K<@EvaDF*5btzLVc#2E&aD`e0X_%+S^3V z_0cG8SYOa-(2^cE9qX3r$^n~x@0+h<{?IFs|$tJAdo)=_{<9I*c~J|1S}^VMw3 z7Ag*|D;gEYh~KdAGBAzp!A5(mfj%ZQ`)~H1PmOc8dDXj*AYQ=E%Oi6GpGwa4)@a>& z(A%+)Aohk>igW`PI)FPQQFPKdQK9=(MN9?(% z7Zt5{Vbb#wA2ggh=BTyLON~VOql{L%&v_$KyKIwD_0UR&5O3{pUY{S7g>7lstWKuB zFd|kOzKi3_Ez7pw!@;!QZbi3tSPna+F7*C}Q$)vUFlIyYUFr4}VcRJ=+8s-{BrBbZ z%wvL$ji_s*qvBTHz2`Z_ZlD;OU)>MREmid4-Ze;F7QlK_))9-{fK{lXt%@)29#u|Y znB*>UV9M#kgvEk%k8vU7n+R6=!7_&^36x~Kkz}6b!I6ik9@eki;RQt!Zn;YZd5F_KkpKeM?GJwUc5nh^pu>^N^Mm)*>l{d-~3Qvdo?sR=97n%mwZB9jjzX8Oz_%|SW1BKetV(( zA9vu;*wPMRDrZU(-VmfMVvo2a4s7_LA>6EPnKNNSdxJR{bAq`jB!t%C&va-f%^3N` z%~7wfb@$mrM12a~r+?E^4v^L5%t%`+Xv}$tFWz~AwtBl(T@vVe6}$aalr9@R+gz=wWGg>f9)xwqvjnN zaw+hoe(7lezQ~{C?O?GgcR+K@Wy5xWvbYMz%Eys#KWc4wH=`5@jSx*E5cBP9H)@@? z2X4xhy#2B?5Ii-!ggV{AC%qhFRI!Ye=O&8hRlhjry*)#VRgV>=d;IPXZ08TNnks1Z zj3|BF9@kzrF8vbQT2rx^z0FqjHlUe)U~JI7L8No#=n<|S_{N^9v0>9|b`k;3P%yHh zSL51d*pbMXpoQT4k|`*NUNpM52jrk;G!9BhWn^HnHqvb2sgmCrkXp6-`rB7^f# z00Bp=6WIGaA5N-js2F{cjk*|pCFg%OMAC|!#FpXme@v$gquQ77REszY zNThaooD9>Wwz7ep17_urwA$PCM}Ch71}5%wid8pnMJ4w6hNC#3Gc7>?OiX@jaPrcs z%W+jVWUHVYL&r7d?M11K$a0dJO&_$n4IXp)OX*Fe-wLE_PtSA8)lbNsZ01@T{G<$Z zY|MjL$+YE}r(M54Mwti?${Z7wY`;64TRSmaTuWtUuw$C0ziM=Y*PcPDYhy+pFid`I zdYxPnP8U~Ai_0`aXpc)aL#UrgG($+c5h7(k{({#r;j~TP%Ofmpdn)F^$%IUj+F5%3 z_CdRZBc>o7BVahNJ?6c+!vWQUKmBTv`HL8;@p|3y;J! z$;l86F@YL?J%9QZ+!te;Rez|l$-2#IqGV9mm?J_-AHZ_2U%9dqWa{6djVl<);FKo@ zIn&YuCoy%BE^C{0{aS)Yd*bD$Xgabjbb*-|X;7o4koH@5R-$DC=^| z^lucsONNzN1>cDuyhOEOXbA3_zN63q5G+;sD#ipfrQsoam~1AR7nBhd5K9?hZruNs z)Og?dhnT+ZijfJdPI;lF-6lX+v~40JoN-8U_8r`SWWHLTEQPC;dCm@+4Y%Km%X+?g z4lP)U2O;Tag)xGpTFG$nubMI*5(q0z2}nPT20Lu=u=go*q%raCwR`A49Pc0#EFHN= z7KpeHj<&*ULAD%_2BNHH9iQ0dt!ATf*JKtmDd1VtEuuY&v>2la{ak+T;PTpT8 zln)lcRY)4G#;QE|H^|7;kHl{Y+8htL{;do_&V1W-OoGJD63SQ1b)VaZ>x+kUt2n?y zR7xw~y&}^4N@W(c&B02l{1eew#VA7Chf=!Xc)sr9G}~zY_CJsj=im)`#bI)lg2qD! z5)76uj$h8H28GIWsJL%`Y2;C;oi!o?%H#t>lvpx_IQNcdb@l9Oa+U|hhk@ojMwYk< z`#)m7J@a~HXjLb8_>7ch;oGJsIw)mL3d)7;I5J$vgyAN?nd+9IiOzehVY~m7&VZ2A zc)IaU@Tg$x5SguQ`gi&odUGV=o0eyOix_vJ_rGpxDmQf1sT56hmWJCyUn@JUwkJAh z!oC7&eH^i=WN9-#)xSz|$TyCqiH`-=B$D4jt}@v7O~qf;nT{iTH;JjQC{8F+np=(f zW?GJ}tJ>yTg(URC}E44!7qyArvf|{GrjDY*i#5(*Ma=KLr+$f16ZB(; zp*W-gvGGRE(QN3gdRf`Jtm+$O6-(ES)r9#V(@)JBr0D!nI!8YvwdE{cEwq$X&lsH{Jpm_)$L6*G|-s?=_Fl#nUwZM15*QB zz$A=f5qgteipL!s`)q$w`~2y!{Z;CCI!oqpr0#@eYn}*382_HwSbDwb8i;VNnKi&R z2Uni?jp<}0QS3Pt5LY|A1?)I#zoh=no84|$AbX$rCPp8>U zT0uwH?v}?p#K(U=$fsl#vBSC62YKNXhh8~}?^U4>OF7h`>f~d#xYpRVjL)w_($pPE z(McccNQbwx@zj6wx&BfqcWwYTCM^j3r32I6tP7jmn;L%J$!60nPg~&E^Y4rUdTgk_ zg{WtT_-^TY6y!DckMmOiQ+YiKPQ{%*~B@B9#MG*j4_P5wqcw+NjhP z$(QBBE^foS6d;fSzB-3^E}U)LQ`BiThtF%=gH%gG1s`Q8ko;<37>HdNXCz^um5^Yk z?oPd&sRfr@sqo<=!Y%*OqPeDWy64kmXZ0#uC38tw)R6mIdwa$&T``S*XGjB5f;Bs% z91Bk+`aJ<8 z>U-|k@~ipD#JLqr&X0=sm~``vTL!50L^2~NY$U+_tPefX67S2t-`F?r`hodB_CG5^ zU22}x{VK&|LE(ngJ=)Qf*Jo%^)JK+7xl>4lv@wB;$Ju303trObqCrhtjcv(}MN@O4 zxK|9#!eqX6TOukbb}FV@(8`vpvb?d%{j5-J(mb~E)6jnP9BPNSuOB_nj`v~{m zr{ZPtgtiCZ|h5q zKN`O!KI0cr;cTMeagm^DUix|V2E86AHdIdheJY3@W7<@Brt84tj3-7- z(0x6=EIl~{-pkUxTWgy4zMCSwbN667Y(zu+=;fWjMt7~KiWpJ#A=UZ>(UiW{t%C`{SsFeq>lpURre?||Ajo}auI$l(9@nq(p zW{C7IruF=R813M*C2x=Lj;39<(34akRms22>_bSOY^m|~K(I9urD0Lc z|3q4K$~vY{LIubP_QtGoK{ykB)!wlO0GeTkM6E!E`UUo;#F{t*S%k5`VVApkaQwDt z_GGnEI-&yUF);59r*p?d=esTRW{&U(*nw5`0yrSqo7Er(kUicvx1}oi zIlTcx<#n?-5eL@+UAA$fJ9C?l5CZIzb^4Q7qYDYjqlfBQY`SvVjv1ZExI&>Jw0)~R zk7&c1F5(nnLh&2Je%gsA^>PNfYR2N^@Gmqq4=I}l0@(J-eNEzTHWW94-hUM~dp9zA z{HD~Y4S25Ri-i$dmakT8bWK3BQ#To29FHcE^7pv4zg4Wy;6HR9OoF<6(A{y5hUeb8 zeY0Mz2co%ENjXxgJJ>ulDK{;;`zp_}dE6CvgsnZ9r0g-!^lc5`*vBY;yGlBuz`AzC z)KDzo>)yBDI&CBH-Ja=4K`LxuSRl{_z$M@DC|MyX|XV;V@P8$aBVI&w2f-&Az?R&T(`1^5s=| zl_E;LYSD|))o8*M4ylz8tuAM1{X^Wd#&|k07~*!-`caqu;N3E(xh?qgl=;1M9(K$} zr(LUyZMUo`u%^kDv+!)}Sw28O+jrZu?H0i(6FGA~n!9w_yb2UtJCggHaCOufq$0Az zKwElY5x}A~sW%EIY9cpPUk_WLe@LjMr1PAx)D&qCcpb?QKj2&g93>BLkWc^}c&dJ` zB9irjJj!xaofC{Bv>xxjNr`we29*te?;(I!2P;mnQ&d>yYsL8O+&w2mFs2))3*S~|*><0(maR;AQ zKO+X0;&u>z_gdG6%TkIc_HU|34u*mKJ~Owpr?po2ZVB4L@bf~%n3Kr0o{J4kREe5D z5jjcI`L5PSs~fFP6g*&lE80f!Hd*G)Yv6+EFY^sY;YekPZ4cFe&G)`yW=jsJ%oQv3 zudii}T@Bz?pO;&T*Pt1mh)FT7p7UDFYn0J_q*#~KBF@YH)w5sQjvQB6Ov zeOU_GNZ*yh^O&MjwB zH!{@~<1s-QLLXUx^1ff|SKaaBwE%&{{?2ELl$&WJ5_-o{qV;9vg)118hn|P?Aur~b;P&3&!q1$lqL@M zZ8e=6b{2xJdCw;yTRMPBis=tk|sJwK=xU!iehR$bT1JvpK(Y$PU-wOw03_5UQq_ zcjb)(NRcOl6x%($742T;)Y7l%dbc7E`bp<{olmJ<+^6cQ$z~_u{-QEKuYOSE0R?+?m zFI&H{gR2mtG6&pxpbH#Tqjn{Ms%ld3@Z+)f4I;NfiW0@gOJt7Lv!9#|=r%qC2*Amb zhY)vFe+dP~1iK5Uw={P%($%0{bI;ofFvarRN#!pp`NW z)`17KccB$$Z&`U0{d*E^v@KKP64c_}cZy zi{6co$^gE(_A_iLd35(rYch9rr4Le}2$nxs1SOAz{Zj*O>&Dx%1@KRz*(=CPxMBGf zByW4{hE7L934(pdN^{_*M=Abk@R~ra^6+ax{tZ1YHFk1~hha(XKS8wFc%tJ80LKBG z*tyEIXL$8h4M+;HK3Uq4<@*3`5#82M%8Tt8F#8&dvA$qZNlrTFd4zeJ_;lAV(knhX z&lWW9#dy19qhO6%aU5cFl6LVXvOO$Zd|_;M&*-X|n1~zRb8y`h|70VG3zy`i<>5Tv ziOi+An!?^(vr!6$IqPZc6aAX1>>;=76&;v&yzJ$0=GsA@`alC5+@qwj&JZNfM+ zL4E6In7PioWc7AEYl7M&?w)`8&wvyEDNqY}&NDaG9h=u7ZT_aahd9Cd9*(bC5hO~d zTdS02K2;*2b2@lH?5uYrYv0+MF0#&#^;?Ix%A`AVqfqH5oC2wknI8&zKbS?>>}RgT z1`?k78hSL(^4d&5@tDY~D{4*Js@4{A7tef5}u;p@Bu>qQ$MD0fIFfQeXG* zP)k|q7RSJs@gp~X4xhf-%kQ2@Df-*W;4*n>Q5Va&$PhSgS^w8I0LGNtMj;U-3ON;k zyOEu@M?^#X_(&43)8<>PYk8RpIY5b1lsXVNQDSk9ikX?}oq%FG@21{_G+W+8!yB^#aQB0lWFzB{PXYB zjqcS+6jK}cF{wNLV!19AZsF^7Q1q!zA)D_K=YBmr7SW?SAb!~FOZ;v!$77;~XV22I zaQ7TV@Ke>G*?G6FVF1%Xx>L+Umj8iW$pF`HvTxD-NZG(v zF&Y(e@$eb+~ROZHtN;W=5CJURfM@Y zJl+JEY6=D%HDAE`8EMWH{p5!&rxiEr_pC=1F=CdJQeHp&#OQuq*&HUz83ezu35R9R zSWddFnMkOGK|bVcwwZP~IHD%TN<33g7Xan3u^MJB;kb^3@NcE(_IDjl%3X^3rZoRJ zm2=ky(FXzRJ4n0nFP6BQ0z-osPx zpvJSR*4z(RXzR}Y84{wooy)%%zNxb%>d4z>whwR}6n*`B$}UzoafrgX`jI0jYRqZPlFnKgqiG9yswk>EM)tU#TT3WwkS_@S^KDdfJcu zuR>)Gw%~fOavmSuEGTRx}V<}Ww*3NLELNc{>TplfbZeGl^ct^od18k#mhC1S&Q zBobEzpl#qye)Uy2G{3}<#d!OO(~g9gZMmlk|20; z38DV4lGD}u?2PTygRrP;i|}h{xMbFeT#WHBx=QCQkZTtw)oEvA%L!<57;j@vf^NC4*@D8TWszLvTB!C;UL+?-R^`sz8O@-qlu;S%{NvZ9R z3HUnPzcFVB$U~}D#}5hnu{fmk8kzbweD{bQfC8=3|F}A3(KAb#2HbE+-p~XoqL`(o zo~cUPn2gTqR(~a!UY_6eq75+k_dzbdxVGSe!E%ub{f^H%^y>Sk6an1U+wsMJyuU)0 zJIhFIW81Bpq1;8n;BYHDKMAJrHtG25O8-8e^MC#<3#l~G{+zZ|xuuP{a$#NiXURZ2 zdNacbAZ8qxp!`1;( zz){0EWcBxFgoI-&6B5RnQ1~LVwG}P#{=k1$;^cvc<`0he`t7cj9IY!^kitf%xr2Kx z)MrKp0U!U0!Tlen_smQx&#|9}{u9YZpx5J)>HRyHNIn8d5i?r3fJER&4M5gY+HCmNf z(H0n{;C--Es|Zf)xp(00v=6s)fP1bqHRCJhDZMP+z;J6%zl;aGgQ3)qR^kja^DRs) zQ;nk$6uJEE-?o$jE$5u|qC}#gwXWyv3o@7~J=y~d1N7pFuMUy~~yU`1;+AjS$4zH@O-YChQb@aTucTaZt zbr`n^Rqw4mGW7!m?Gom%GFClEwT?ogycNZR@2EUO_bBdosC|eFt%{|jj}(5$z8ukq zaAlYx9QzUY1vD_6_8xO*sGmhcN~$50AZ}_9eB;+_8tW~1W;0Nx6iI4Ozi<~$!46nn z`0|dOq^tzg{OjG9TJ=TyiJ7BD-zDsxtGyWtokT2~Vad!-Q|}pS=btV9_4%~+uyqcf z8Dx&TMPG>7t+w{S6i}cMm(Gf4X+opG8k-gA_^H_v?wseLMbfc--zB!ZVjg^lR`JDIL-3YisD9A<>H3b;pu6pfQG}SSWn`S-w=X6%WRbg5DrFX?0{F) z*-_IJo^wh_4xRm4Xf^SonSK;R8c-!_^GG(9RlP7O)rp_XcXS>-$7XM@- zzHhvpD)>+H967*};O`x}X(kbuh#JH6B1S_{*_>}gH-r1vSHTJUHg-16EZua-Q zpFoR(xmGZnM=;j~Q~Ew<#*63#JRI{AFcRFUHP5y%9UbXN$(a2J>4tS#Ytjzl!i;%h z+@owAkN#M>;4FT(g$0z{DE6IJB)^xFEQLlj9MTPB-kO5VTd->kkjG^!H|Oc;;Om_O zFApSP%6JnHX>?DH<~3F7l5n}Ny!Xp|(k1Cyfc8D|A{g_dyFhbQ&cyM0K;F;~iw$Kz zIq(=!Dv@$7b}+p|1h_; zIHXAW=QML~%W^nQ*wNd(MELvzpDO{~#st}pf+`%Fq3J-lJ;7-^Z5b2)T9~k+X^$ut zxYaMTJIh-+GLc<6>phJ8Up+S@ub&2;3FNVI0 z8YK<3>vvDXlKRoty?r3^iB?9$*ThVpf{D(V4BiV@OO#}F66;G6m*-VJg6Oi72~=QG z1YTQ$!A78I!{&qYC`UdYDcycpxG`gw> zwTxw}nz$Ofj_YYjzJm2kt4tD+iutNA7yRLmn6Uo-Z)^cIw! z8$MC7Kq=OfLwC9hb9@YaR#i5d&dfHVlRW}^dP~2{HLo7jRJq*hux-{F-^IKbTso^ zO4Y9|#;7O0o}9P(;Sm*=J||s@?B9Q&^wyfgi5v49cM+mhQ1*>}WQ`lAEi!v}jnx^a z_WEaeS*6!H-e(I)eTqKnd7R!{uftLtyGx8d`{!~Q-DTw1e{Zj2WgJAU?ekXm-^Q@< zIa{fj8&(i?oGqxZ0A)AQE9kglicwd5J>U3cL)_Q_=yAtl3p^$hY}9Uil0;X^f0B%| z&wdt0U2Z*&h-bD^o{^ELcvX{>JnF)fAnVmas2bH>_%{|lf53^|s>nFsB59k;u<6Dz zj~wyyL&Qo^iYLSY)2SP{{cx8=GP|Pb$I8c;Db^jwDE1JMg9pzsKqq`(q+nNZ2wf)=#kU|nSaHnmYSCi4 z4ww}|$#MKbNA!J_&>%}sKIwKeDaB_=YDC(@Gd#k|-S5e|v)ET<8$!vU!xZP%+X{va z7f;W+k3wZ<=dZBgQX~)akjuBWCRctwc6QC$$p|wExOe*>cYEzU<6Rf>dBCDfeU zR&8B=2+XRfG&MJGSIa^>Y4LLX5(=}1zDrqPzGI@MdG4}6tcvQJESEvHT0lGuMYdW+ zIz%H2v-8`i@IB-IDAmSj#Cv%)A@p0bbiMOe^#Xo04kP0;ktrBUfvT}((Pw_L7g?)4 z`20Yq88w^Al}X*D!}k-+!?bxy2-PrPX`3Y(tJT_-c7xwL;NUy_6?fF|$v~6ga#ItH z6H#&Jy6H2$2!SrMi}yba1()SII^M?ts9G!-JZG8B?tX}NWWP;RTde)^FI}pY!(?I3 zmdb&Fi5c_Eo953O*E63k>~#0!jS73gA9YxSV_ZR^Ga@cZ&e>r6@KO5~@F14)#dGib zH%n)p81pZ1;^)2>6KY3L{j!U>w#*^ zuo?u>>)W2tQi`!OTk4=j4oc*J)NA)CF-!1nuNVii1nff$rK#Px?n&F3?!0c*h9-Z! z2PADM(rxV?j@9#hGUl58g!t|HLja5C`x8VVps4|qPg~EO=&v8~#g3fSY%nv-s_Ms= zJ?ZMr#2mvhDZ!;lt3&C^&BV`?rWKYUg6GdN0JHV2`83a@j+jpuZkHTaU+)ToT+0Ayc@U zU@VR_a;`%sg!R%4p-zxI-ZJSIO}~3wSmlZ;{i{7?`=H4I9=9uXXiWj=g&&!Pa@VB+ zu5vS0cc=Fgp8e-3IYn1KJAEeyv-3#@QZ8iXB_E%nd_qO=oB8^-`#6I(mkgMp)b^rf zOZGS{Q`}6@rT8RvZKq<;@Hs0*T^Av2ia`g0;CJ_ifw{<~i<6Cc(xnSkjn|>IIQq9P zRU4~YblTZ?@}E=p7-^7Qw1fA}1ZIy5sh1mn{EHa)hKYG_$~g~7son5gy6p?2787GY zc@AkDj}A+joXXCWvn&|{Bd(@NeFpBhox`Ss;-VOHwWPQ)_a_2;O(c5y7sYBCdD9S9hFW&qqI69xy7wt z0UBEh;X(5UcmW^W=Fi#{>ni@0bXnN~6X|MF5;d}yU2z-RC2k{_fnz%|I-yL%%lX1k08GjY1jw@)n$)qg z(<6^Zw0;qbi2|mB$%YjOwBm9;I(P?!3hytcc_al{4yS!F z?h@0$o^>?6B{#vbe{0`O-F70kHi8*sYT$*EyHJV>%W3qzM2Rm%LOEC|2?-{*)(mh;Yl8QOhVI>arEo{ehFiUa==tH#;sXL4{8i9@ z2+iW;7k6U+xqvw zfJ7qh`t$l8Edq<7;W)Cr(xL>GC+x5Z6+m+OG&M3gqBIqlaJ*JS!e}chB|EskETCV) zR@}D3Kzx$9{v<2EmJhMjaJ8SZ55;eswjchNOZj~7*A-M>LW9u+9nd#LJbQN4AI_bh zbbvS`zY&P6E0{?{N9W9&+;XL;83uD~( zt)cE4dn$ap&FAOswn~3KWZa*(7l(A(ni<2h#fDy@C>U6@V80z0d+WO{(Q@W6sseq;^Kd z&>gQx@ca?-27&-!&G*kpHlG_5t6=yLgL=sT%_656AC|d_hV0m+F79vqbAM4;5jn3b zL)DZMVSd?xOPqsINI^&l>}UT=C_n#8C>icgCdTLX?{qmQ7}^3_SNJv+eFyYs*)dIZN;F@oxvy`)jX^DZXC9lZTzt8TOi&pe~w8F;HB`A7GO)xt-tP^{=Mp8(-yNQPVl<)78Mi z>mR?f(U64DsB9(YQCE7?Rm-pSnLqQCla*mm#sjo9f4As4ceCzw%A?Cb`25X}UKF)? zOWR`hv|ZGy?dwdtYP{6|w)8no@oR!lNU|8+#){qs1L;@c8XX3w39aryaM~bMXVZkH za;Ase!Qe*z^9FE3V=+I#UURV?yPD;-wu_Q5MO|;~1Y@F+V;_#Jbeio-?eRF3hNq2@ z5MD62(fF@zwzA$=muzs;;<{f8gG!@V%?He~3W~KrT%yS(1qxWzn{gW7>nlZsrHNF; zw-q^)Tlx=ckIHWvd@Q7Vonp**?dC-t(ld1#(3qFH+=}w|8Nw3696CKWm$6rF{t0FB z60SEVxSuS_&Sz7z_hRCn$;|mxu&n5Aa*o%ADoyearFs=BH#aBD;bEyM_rP%w5u&a; z$YqM~s*nnb7L$TO^}hc1eODIU{wN~snW}k|2>i=_qE#JL$N!KB!}GsxY?s>`JOZxU zUXL+5&f;yFyxvvswONzphJVjf{Y{DfgTOCVI`b!M#I=*H8=gNwW9x&gq%AupHMa5| zh3=8{HmsV!L1;bqPO6c%GIQjfhTm02SQGqZRRVpDY~&A-PAX`{DnxO@dTI>DHJsT+4=hr+ahV2T1RsO>;1IzOq z$m33sN$-zn(L8rbpM3y4;i$VnYX|nsm-Df zV_eap}jI<#bBC#4{z_t^aD}kRZj0gOYm~;QJm? zzyQDRhVG{KPDvF8_$#l z{I_fWAF#)~_`(AAxR)DUPKVOs@YWT|M`kw{jj(;@4}AJc%lwzFInrw}ZZIp4Z8HiB zmJtFd6OXMn5jcK|F+*$={7;R2lCsC+jymsQ4|{bIz7xED!`6ECe>{Cs@;??KxY*kF zOsD&&dYoxZt+f^y;X_=;P_H*+e`}D+)R?>j&^*W$P*{90#gq~~x61gUlwz?g&KEY4 z9Smpn>z}6i;>wp8dDXT1yHsf=!I7N1I3+=-Xn(a#U{BeHa35Wc)daDgRGGi~E~$c6 zIcC@&Ss?oUyEMTav=MhdtSGVLBd&?S!!=9G(q+#hyxB-B28J{<@1_caj{HWk&wNSB zto%QZw#0NjBI1>on%S-qpn}eJZLucraj13jP_o$~d)*WNJ2(UntTYuRDE2au0HtQ@ zp^2%c65ImmkxJBGy)2p0YF;vbB|GA<@c*rR5)yKE8%?s4!(VRtJ6=xrx60F-c;v#% z>wA1zS7SWk65Ft955w2p_!XUQv*twCIpe}3+e5w(Km-!MuCJ*SYSi^a?y7H)fBaQKb^uc(Mxf6 z5hLt4Q|O({ZnDGOvTHn}1xG5)(PHCgGyc~GGGp(aq!$_zvY^E($)Nock@{7 zS&h$5Es>1RX5L;NvQbh&IGc9sd_aGbz5@qSD(s zmQ-Ww7TdNdX6w&^m}TuHun;tYMUvLDeLutc(P&VW?HfdAcASP+OHl@1Ba_ug84)#t z#fqyehyCvNrioulp^oq|(o-P0j9aL@?P<|(d5sIhnFY~;tG)E?QCE1qnL-5lS6 z;gZjzWrq9?bO|EM5alI4x%vPgGJ!VVsMVA6+5u~~zxg-QHj7F;Z^#}xFHq%IqG2O3 zCN2Omo7e(`)Pj>ya1Xp$zd(|?zF0grm37dW(whepI-&`Zl9AoH4MLWMive!<%G0YH zziDdiW9(+dF+}PLDOtO$T*+V;mJDR0-(6cuFww?%;wtVE`!X9i@*3PqWvV6^*X}@20qR&s0O1dpm*(-l7KqD!Iex~Y?=M_o!k1% z?=K5D>8o=IY24WFh=o1Gd%Xo^g4{(k^x5I^Y%!pPuUUvhk z>n{272USnCw>7orEkwRY-^z z2>o$HIoGb`eWbK|-WhJFrw-APeOx)#X!xmsIU>r zN3U=7`EPY*2pizDi4Yf)zL~b5wfHrRq)(-J%?p)ouU**$k?&{=X}9Ggxb}OD#`A`= z7Q*rC09x?W&?dtMKAp|YsHp=>_{5_SWVk}WmCYfb<9G97^9XFz=+j!{LcfI^*I#{t zAL~)W7eFwj+%Y_U9Xdu`A_R?HpsZEw+3cE$f4>;En9TH#9VA>p_@E$EfzF&f63X+8z^Wvwd(Qa^cset@ zndYI=|0HO*SyV4s4b*0nx1o3=XSu= ztYb+t6)Coz{8?mgG}`{%*D}Vt$cYsjOV_{Akv?-?8(3vT&&@mw>~KIfg&2eHk7yWf zyqxPNq0}Zo)(37>UvOHN(ab(q$4-M_9h`4i#RVP^j9N5~K>Y5AY;+`f?Wf(i>#%^Hj3$-_9lk0Hrr1$O5GoW5nlZCuP5+JbsenTEXnO~DI#au-}H9{)7d6j^@1#pVX zIdluu&f5CMVH_zfz5+h4M-L_invX!S1L?g7)Tv43L|H#Ip^&>a&1mXWRt#;|8GVz$ zh86V1wsoy@0b|EWWu_d8;jYMmJfAByLJv-(6=mRp!Ud3??o5bPLm+-R@)Fi4oxc1xY=hlLx%*hT zU4j|ON|-X8yTISjw>+ex?u4=))-vxm_6+A*O`r;1c<=%fT!x_}=nX5pu@DkE*NazI z<@P0f!eqMXza!a9=K3=3?-o41V2r&=qD9Y_x`E{{Xe8I4?HkVDHvhU4obSGGoSr_6 zd-puk>v!najGby$-SGWd?&~g?!+$f$xo;EsfPsBdz+|98>7uD$zE#ID&QoF&XY`Sft0CM+*oFo4NYn4bG?` z0}1dNy@2kNMPN>j>vLXn_?PnDh27@A%DOl_^u-gEaplpw`|4qzlU#mmm2h?){Xc&+UEZ|oPgQB%m zFM=rB-=}*X_BZ3VquY$w+Z8HXl8!mj6%L+G13sfk!{oR{x#02W^LJ}E9C+%NXlMV_ za!~IQuvP{nq?DezZpz|C*KW&%%-yAy8z{Yj_TNP5f>hzV3wqPrmd6}gvKrq)VSC^< zpr>g^ko~c^$voLSayfM3I?~zc#!dCww}JHeaK?DA|@_Tl_rpl zP?Wup0~@RL&zNipD3ul8|H#FDYsyey+nu@i`9^K^0o(4EX&3fl4Hs%*02`ZZ!20JO z^md@uCR95o%yOjM^O-?P(`{Ne;Jx!9McW4^62W1F>w~|NI!7p>H7o0UZ65sg?_H;< zdxhDdlDuH$FGkQt8^`RWbCmMNyG{!39l#X@DYU)|(xb{3#CGr`Ie+TqJv^0S16{qY z!H{sZ(x-}-reZAg19LZupUtDJ7P^zzW~ku4+2W9o6yc0SR2(ikp9xp?&C8WjI0ts~N9^KtAXQ4nlt=4lsRWI&|ywVDFo zs?+MIO>&KoimtG~e)fd1mpKczpK{ZJ?+>dPu;tDV1D@?9U{>*_2A*vRn8d^kDW89f zo@wdDS{uJvwy|nU7nBj09%+}U^n>o*mKy@2$O_H%lr3Z{jNzmD!l|TEX3}#*=dNa_ z?4%gtcM?6ZHNqNSlNPw{ke-FhU=G^Oze+9d=s|#vV>NJ}SF9;;3yZQm3!TGO_VhG$ z^NqV@3kFupowad_qD*j2f?_N0y5xT1vn7wU*pa`Jl@7Hd?GX2e0|-oar=yCD@=R&n z;*J$|kqVvdl4U<@N&jC9W}?*?388qqAstmg)rQ;$;UHHfXbFk zgx!|qxbf%Mj>l|&mC5MF=Wd|2z?YJ_1;^cDBweRs3U0C1i!)`zv1b!hcewx324Xwe zKl5>G`HIeOTD>-@d$3-x{#@LW6pYT$`t5kX^H=HWVv2nM)LoI8rJ~bO}CtPn;HwJkl9N&s&{c74PdO*;ZeTmdW9hm71Ukj{N&E+qoPcw}K7X5!0>dZg3pZx&09 zX@;Mr>oyt5@ja(S)X-}3e)ax^9VU)=2!0R7yRZwteQ_y0m54KGq&HUq0jP%xk#WEg zRODY=B$9-Mo~uP}qnw8|7;u~Uf6^CDE-qRSvB9%(g=m~)?vUM|lvL`5oE0_`Otd`T zz;zm6|3&xA%#MMrY#t0={zVzLe#_QYIKJXCb$v3&HOr7t*QBp66@uN|bS~XCv#K|c z2gWP2X>3~047g)qZRW9tF7yVgzDpFMhMK7>JRqo2ir$0p6Qk7AV~%Z{WD7aX0~|Ae zpq+0Zua@x5$d@7d|29C!1Cmsxb1pYQRHn-=H&EY#t%yF*d*3vbi#F4ml4XgSvw$P_ z^qLD_>_$1znYnN!ak@uZm+)sWcZSr+)gKTvc>UyVO)T+3b#^HXc44{NVxt(Y)-I_) zdHf_#VR1QS72Fno5x4z;O8y zZbNsBxY+itR}#9D-=~P0?uf;A2ZL4`LtG|aRZ2_8?XEI;)j+B)?HH=2%;LLIgAI$O zI{ssz+u3@ULIl&Ne+v5gfLHAxoL|@BNlvyf%tffuB)bG8Xp8f#mvdUn-siw zu&h;ac{zL=7LRdsX_o1pcp)cmJl)F<0mR5G_pvs=j@Y^T9P?>R$CynFL)ou_txy+Z zV&dwi?E6H%+?WVPCj8ta%{Q!D*C0vUd**6gx&tq(L7lpe?5R2gZ9 zs};mJAlLq3-TEyqF@|%&W?S0Zp)lra&#g(iH7CFEamw!~uTU(KG)>geM=d<3C-{&J z%iqcKpP2a|pvCC8BO>tQ!uJ0X@(;D2Pnm2Emp`2l<`>kBHtIq=*O*mnVPTIV!pXg` zV@|DUOT|wp=mM2<-f(|4Ld-M-Xw2sM0|0dGXR#NLlGi%IQhbmVS@=YP-+tnSYAS1? zx|dp~nl=!E{G2=}sKZ}1lfC4#`d}{yHuXkqjPxgV-9LG~!53l-KfN5w8GdpwX$*#Z z3)-jq@yt*bVWG3Xz)$u#pPx6}QkGVrTdfKR>n0xoEyQN~I*l$qv-*SXq>O=&sEYT} zRXH>%%}w1W$+L%GIOy~}(+$ziU27*ANsEG+X*&}X!P4EKq8477Z07g4l zXrjp_2JN_D^D(+$8~1@!O}HZS3X0Fhba1Mj#JCRrHPRaJ6`%SAE0hik_+wYc$X#Yz zcg&JjJ~F2&w|uod)))cbTwX!ZuR>$%c5~JK(X-2{zCCI`36`U7y2F^ifC!2L`l)km zf-5PiXhgoafPDjlYzZF0*-GHtR^irV3Bm#NAzeq?FKwLv?#YWvx#aLgk0wz>c!p8l zePG%T{yE*0jtFV*Dbiok%g|sGYSv>dnH}1v^#^JilE}p#5Zq7rZ>!6$J*y0L6eR-0 z^wbrT6U0z+4O+ZW`J<|Z_{H}w3-q(9tIKD7=kXdzNb=0r+(ysjrOF2Zw&f%eTS_FTatoT_<8aZ0Fb#2Sa>ug8q9KdV0 z+??rqcd~}QT*P#}0@vmtDbv3dJZAMz%iAwuHcGD&^nIpX9ndlt~*? zVIT(mf#Wq_-YwA~J~7|#fwIuAP&I`vHW`HSYNXh(_A4y)?AiNF-#@qO$kw{levAEn z?hw4xv)dGuD$WJt#Vab>$K|3w?mS-jOSs=!D{^?<4s^D0Wd!mxW#@ zo~=r;{xG82E0j*6xLZXz@x5J-m9-5KJ!MuMR-^U#mj}0Ng52(UhkT9$x%OQ!TKStL zt`vVVTfpYK8S^j~>qm;vG}J7q;DS#}fkV&0*hUAj^P%K+O;Xk~vlfQZ=8>lhG;+*cjcwDyb!y1s z48}XrGIJ}#%mQh@$l&EK%3jfQub!GW^=(8eMd?4k{PEc3u#mY@IhvA?9^%qQ1}xoM z=d}^`yvuHQ5ThijgwM^76Fn?It$y|ysC6R-pMr{_H5%Qu8OA?G@7j096vCI-V}cx@ z3HIyy?f}Nu8eP7o8rOOyR^V)cpjyy!)aXVRm-u}`e~{~Mamf~qv!KBZ*lVx1(5-hw zIkAyNBE3c&a-QHteUM4qLyP#?)%S{4Ac2DRdo5e~s!D9_jWe^Kl%2lskWc0n;0eNq z{QXL$N;mRi#H7x6#4m4Fwg5x2Yw>1-p->;|0PhnAuv7L(m$BB9+jQ0KE=lFf*v!xjN0M-&pfzxxr=)slATDT(lqJt1XwYVj2l63T z|7^)kwqSKSU|XHjcw3W;GxNS#C#Qi9W%s9iu^8a9Jqn%AZ3cF@qnI<%zDW_sbH%=+ zeoT&*!YgDYAcw5SNHg9V=ij$)Y@!P%^v`0Od|3lkCJTCb4%<;#@y(RRZ`6q(*Ukg@ zmJ?Uk^}9ELLD{-mru`b=D%cP94}=TxNkWnib4^f(pJw#y zH=}{=<0j8~raXcrUi4L3CQ^#Fi;_2TA8r;Jt`Aq;#pV`Dx(mOKP<|JaE2Q+!Th~ot z1?ptTV3p=P2{Dk`^#V7KhNjJVJ))kGhtJpFE~<_q_4B%6K6b8t`8KknF3-koAo@3+ zvXC)GmGmh)_3qux&m&jI&(CFOqf^fF%A3c^2y|754Ch_QVVL)Sk}{Hrc*iube;<#G z4_$PP)$ZI^Cu(c8%4w(1ei<0-`I+~51Ln((s41}6ZHLM?%)8Y1q!RRMN5M5vl#|1^ zqV{(xpbqN5Fwm*ZcOl_Y0PMHi%dh@6)4+UCofNqjaF40ufOYek@-N^X)5Ia^W+tjS z!OL~nqRWwcEzUVhOcP4f%e!oEb5sR)3dDZxNFeeDJ`JH3OT$$n<`)nV|6&l!1teg? zF-GKLQajZ_b)b@D$9Tb>uh6tK(Z4Df`bnpm6eOu2b+XU6tg(g>6Ed#Fy~zKJWk!*C z>nv$+kUv4v?@;!_2sQC#i27puk}x&;oJ2(G8b3+aG_leN$`gdzb%2j6XrM|r9#J<7 z#%a1OmLHktn~zO^5N;j%5~Yp89I29frBIQ1FGE^q<=F5TOq;_<8@bA@8NWU?2cE)6C7 z5%>&1$}+mwqz@g%%(oiV!^#oV3U|3~__&M;-bjYSOHztLqD|aBSKpAj1~dDA%~`tT z0F_YfZnOlaYTTyiU>T?RFiNwjc``SDkSrJR{G6|CVo9&pY=Mc^m#`(7*eh14L;F3F zbPfiT0StZlw?Wmmms<#9A%AIrie)LP(w=vY`MJn+0RA3ZUsYJ5shS>G zjCuQ2A-ikK97evnj+Hp~u2=OMIQx}Ew?$g)QBm)!lb%kgC_h(Bo-|Pqs>5-|@J!8{ez)LqY@@1rOEpPD4p(2i6T3LN-W}fZ-PR?!qNj`?8nJNfVv@Au$AoE%TIx<-G zy>iFi7JyDPChK#&3Tl!`gi*)#r-vQ=>I2hCL@zw`4yDn&2XPkEf)HfSsqmD_-Af>TeWN zljHAV+>ocLo?RF7r%d}QZx4S=)2~WxXWU0&fV})}ZF-@DsXDg`6<^)T&tv%u1&<2L z6#(r`uVdk^?OVCVZvwp@mAcc~I~R)^fF?4%ws+Y%yD5_%Fz6|*5WRA6^qvHzwq6hk z9&?l+PpnOV)o1xzaz7nnY+ksAejEGy-8-xHCr5pn_ewsUX!{N@z<~Z_f7SwFGRiMG zEXgXmw$tBAoUkM~r;{%TTMh9YH5)Q7lDbyNfi$H#WUkN6c^DcZiffnd z|5PU1;ZqXEzk~rebW<2H#)GM4sj0h0?qL-(?~()2g^Ikt0LIyz)+?jx{P;{0L%r6W z3uS1d2Xmey*TJHeQp-WB8O$Urcf5!C@dQpLEFJFvps3YtLpa~DV~J-(T#a`K?Z`%P zcUdCi*6=#3kEnAo$LOCGYa@@to)BpD=Le@4SYDNYiPUYmc-U?FBAdJTCV z;EA1GtMEAf^x*tS2MBlps~pO_9XWxg-PnQz1=v%ybI@vv)I_BlA3LerVh30g2o;j9 zut^Kvd%|?$G=oyYp^f6dzfX<*KSzl*y_;v~xU0hLxl{y>EYH zlMNbbO`jZlMvE2VI#UsH2~j^u^IChi`BUN6yquJ4)JJTYGQ(qCq7wKHO?DjR7C0jr zBo1|a%d-)@d1b?XhZ=-1YC#>(D^U`mTNM;*rV zgSnKckmbWc)J)y?hEBp6A!MKcm+|+O9jDPO(a%R=z6yztn7OQq()9u&TJpXgeX1+G z5c-ixJ^gUPVio<^Mr1E?z*J0T90{&hfekR9-dY>YvrHLMno^o_!0Z59Jzkg{V5@hm z%%Sr4h(b8f_UlNAK-h$YXJ+I0d$QHWnv zjyJ&NodD9!pe(@Ip$$wOhBQ{89uVml6Rr#Ve6Hm7-1%OvW*t!;w4h$X(kY`Iv9MLE14CkEgoa>>BaWAML|?q$V;S=L7PnkHDHS z{%r5^TN)g_wW>gPaA1T65je!8d|EuCtj}<)bP*%J-_s5#+FqwHMQQwd;W?|SkdF9f zRE*Ev{G4icrXg`24}@&d9pTYo?ITK8ZJn!5Q^>cf}2DvkL^(vY7_P9=-e#Pd$Axs69O<>7Gp??_M3C#ffbxWo`Rz zViMMhYfW)UjwYOhxoC}sBbs=gHhp&8tl>4O3j2%F0h_2f`_Zy?wLG*7aj5(NG1e3N z0GE89;0RQN8%_yiO=H&_!n5OfC3#~>d zaskK@W_oK+2*btW1&mRaWTZLF&P=uLoIx9f6~?sY4~N?cDlPlGkG>BmCcPkJ4zX=7 zur%AC0^4&8!#bM@;kgZ~$^En)F$SwacQqNNy5)KQhQ-&^_jkX?p32`jndu;c}c%HE8e z4zoc_6_Obi)f{V}BpM4F93}VTZ^Sqf@x$DLc?yHX&>sy`O=oG42FS28dHQNXU^DW~ z><*gaYz=OXf3#4(&l4axX{xE4?0q#cm1TMjEi_`WUbfLgtIF$@Z_P~$XnxFDIIhw; zWX_L3Ub;P4JMmDvr8P;IoiB{_%cO*lC45MR2RLWt@DrF73m{}3krFV7NC`kCNSAW* zz{qjCd#!(I0kEV}Y7MH71AfzE=E}WLE%UL*ZL1b(a!K5j9JLzubP9EzPsk0e11&Wo zmG|!fG=ONPn%ICXK=pyyIkFcrOhO7tG{v^9{ddgi=J+Ox;4j?ib8}&^5a&l(V1SV4 z!vHi?u44MofYhohu)xKvAD$h2Z1dqu>8DRfZwj4}d>b-J8Xf#Uy)NtM$qhM8Ek!G0 zbUALPJqEi1$qY>?jaQi1mBe+4CDQ~e9--SRC{&arw)6Egl#;jeQFBdO$jrn#s)dB4 z4=@TVh7(FoLZkk+m!C*yuvHbV(sPfZ80=b)1nY@{Ot$-(9IV#A05+7gL1@J?a3U=& zP>c)m2%c@OI3&58y=+hLo3Aim z$(#^kUAOR?5B|SC(&#n#9b zhGW6E{GkP}>yeD%DKDqM44GvwN<$fo_Lzcq>)grnmzjmDyrx-S#gQXANqp|2x zQC?szsEI0h!-3gvM_ADN*j->J^DaLm{Mr4M^O0__#V&K`s4NG^k7wF%$LvN)JDjC) zF(D%f?1L{oU|P6ZM9TRgzxp^!B(e6G8Wt2k^i$Bj{0lJpcq*FUPA!sB?i8)Nkj7Iz zysuS^w*xSO?)4uM#hVz1^zmSxfz8^jM$>SL0+pPtP=7V+t!4Ab?dbBv9Y}oCYTdbH zGk7~%!-qCCfpC!3pfx*4Dq2xo_u}2_oq9Yo2E4U!Vi0d_dLAGhtvWR-xobQQE@1w8 zBlmP%a=Ok}6_T8?R0tX^1t*0yng*VR(0? z$kTv8!}(d)RfwK817Q#ud4#pwA@EHB;qUi~4=WcadEkVj2nYXmOHE0}7Kg43dX#({ zIkip-msSA-l{>=PM^q?rv9357T!fmXy2XRlapW(XOOFwHr8Xl?$^6dkPRs!+ZZeJY zZ>-OR)~LHV7iU8@k0UCm!& zDzsgv%XJO=+7UflYus3gBg{Ng$BN3HL6nblBtSHbVgoBsV~<-5zYZ6nYHsr_jlW}Y zk!SJJf-3#Qo;k};#HKazZoef5LUJ<-z4>81bz zOY7D*ikr6Jpk2~aV4W;w? zBqc{Tc>*~1wggl>xQC+!0W++E?=)E-k=X1G_zUQe*a|B-mZwG)->C2gfOqL?`lWP2 za_n8`6K97dZ-DG$=a#+i+ccu>U%m7_Z5$f`i=npF%eQ)$S<>H1l|NmI2E!1TR6*~R zp2x!+;=hF<*l=TSKcs^sOqd zGnC}g+~${9Yn@aiaFxqjQR4bbY_{yq8cgQ9>!42YkJxmidHuQUI8Iysk9rSUg@*Dv z506gloPz9vDldi%`lDr!fl1X@p@LK^NczgO1L85gk$4(Ygc>BV#~ZbdDnO~26Dd`6xb1TI|*9Pg9wxSyp6R~N|m z5rkzcwW|I66^M0+w#7)N$NFRY&03xOGT(+f3=h`Yj}$2?2d zQhB0WlK`M)i;^1N(FY_RNnil`4Qwb&3rc|6YsNdHd1u4jw>^5-caC7IzGg6+xY3F}u#~=90vCOPX zgN`sV1@GGSs~ePLV{c6{Wd=v7!qxLpysi$K+>C)h_SQS$gMGF2&>6}@ZARuhYpoe~r@?sDHGsz815`NuHev#vFuU^%dkYO|TcIj*MQ z{37e{rSwH*AH^ahHdx^X@KM05`mDO|pIi;;8|>%i4zBS6RNurhDCi>i0e8M#}FZ zL&nt7Vgm^@(tW?OKYeY>^pQk5@ciL4@f0w62>cu6!fW&6dN!-zmUZ>qEWnXnY!Ue6**|9mbgX%Cf1i{t z6}VZmL+h2igT|rDY2`{^WQG9 z$qt#+ObnT{?+@)19WARV0xr4XH&5D|My+3mftV}3D22e)T$8ut%R?~aW(1n4Cx59^ zoZZFuF+!&?g}yN==F@n4yeUtvC)8x*(t17H1cg93+FF+4>cSvJ28}F6GXVaBf?fbT zuICGWgOTMMIuh-{D~2RB-CYjsYVJ4Q7|802<(SL8Odo6~91SOH0%8X5fiTI2iIWKuKuYn=jhIZB13Sf=mz1< zPuZ&bs(geUr^_~{7L8pujwWP_2pEi&`9dFwf-DoLkH?hkfQ`zosXc+QnVYK$Enjy$ zhMRaI7x_!69ky{Uc7_|~g%PVm=`6Yjxa0OG{xqiwA}{ zsLn+PC{2}J?*Zda1;2oQ`liJFJM1o(wY)hdE%_4uhzVlzv5aXR=5JDY0>!_M-QTr< z&J}4ITHdp`rrZGmtWu2bvE$0aS?70T(CYF=({F8}+v4PiO-7ZON1#Uw z0QWQSWovk};J4AF9<}O356v%Qf=cha$DH!i5l67jK)wjQz-8^DFB5}9{ljVtaJFM3 z97#i^&c{>dU0du!Z$tRpp!>)gUK+ioWgTy~iO;b(T z^{+zRv^Nz_n>f85Z+qvqgj1Q%uTv6XjL>AoTv(w2o$_e2@e|}hBG)ipE;i~`FxsT< zIT3G46rk5jM#>#2eBx~J*cobi-zgL-fesg&Y+{J+O!S$QZZy>i>&ZF_QM@rv8k7(@y)oq#8UH7r86=FnqaW^%RhlFq<5|AF0yI z;fFWcB}71xw-Bl0Wz}~bf9F7}N|b#4wm`-8_D6038(@GtTL*TF+b6(ovH5SW6+MC} zIepvr!46@|)fzkpY3-^WXuu#ci~CyI2OIjSOcP@M0=IAM3lJP`$=<7b-RYuKH%Fz# z)jRp4PPsc=`kcOf0zp5d5zFL)-C3P&01~}hx~kYSJO`)I(yh}QVHH_>Z{hG53B}Od zgP*PJZxXZlS=-9c!DL#A%Y04=4%T2RkMRpSueo@n zJM9sTCrMq&J~yv@%qAcVmm(iL=$5Jj)DGM&{nVr^e`thlz0q@O=xd9k2pB2`& zPfWInUg`=FWw?lyk>?T@M%2bAm>I=woSWT%!OGT9*=q#o6K;X%T1x=#OtxJ_b03q>3e>55wE4%r)_|?S1 z#xmuHR9aQjw}Yf=E-_B0(3F(34+-|T763fih&cV=xmz5%`GG(1Sn)1WipQ~WGBwdW zvuuwiXbo%OL-}3{ST3_AqZ<_OYk@Av+gb-;+{CM*FI?Nzqc^&wq~-1qaWt7#td#X)PfDUGonQ@8 zk7OKUYFB5507EBkwk3bFtbdBQ_NYz$Pus+#3Ksn8MSz-49FdFb0J1@QE8mzQH`q2{ zjbP)*>jQxIgpNd+rBeGsrOj(tl6l(JWzE8oUbXPvOS(HKV(eI?w*L|qx>^CT1(YNp zZ(-G%IC!dDWx}LjV0z`60G!ZeynHMJQAVb(L|?sRA|5LiP)pfhFvj_D!c@HY0T@yj|A1NWhIN9f*`x?DN^S zX2__j+RlzVdM{w7&^3AJ~QLdj|4f<%aF7LosSu`kq#5Gyx%btQ@&ExdIDK$&a(>2 zbkEa(xo*VN(apE8F>}xrhzj>ldb>n8p8fal59crLQ!Z8SFRxE^0CK#m5TSr^t#?D> zqV?bAR%49=z?#biF{0si(Ij6?Y;xi`f_a5>FMfk;bfc>0#fFuYs)18Kcv22N@@=Tt z6`fa(9$jCAX{QkFpAhDQacoWw`0l9IT?S9j)Yff^PnsH|O1s*@sXF<1V9ktQBV*)heXf^gk{QPl+ptt%Y^JpcY(nyrbpxvP+cbq#o2U)Rz z(-~(PXkIBd|LDKDFcG_ten6yw7lnvu6+y|HxXw5zqfH66C1A>#d5TH|6IiwOB&QH- z55H(ZGKodXy43WCgL^JLIT#Z$_4_)-^DuR+GlH>~;R=Gi$gO8<$U{{-HA1E4&F~4K zrRQC+qB^GatI|z{Nu)%MME;`Pb*t>h2}scyWI`KU@~CzXKD+%5Re<$cb3G=5q_ z&|}f><-+f%YjkdwVe)TS2v%qSAjw7IA6aZC1e@adxF;t530XVHQX08YBrsF{| zDVW#cDz7+0YLN#+@gc-UNJVX)##$(G%lCtX&3MR6x*0m_5?-9x{8|+GZkI>&WYJ?lFt&kX$WTw+Ga?% z2JxB*>`bABx?Sdx*w>m`9bKdBNOIbbVW4*dk8oRda5_63GKdj={qIggwJ zpsIB63vlr{jn?~! zh!|OwGo473!WWW7O&;TW_xb4vh`M!{$9*30v!S?Tc1i`6bUjviqJ0SGQ9PK$DHU`p=2e7ku$ zWIgtyG9b$;K)(|Spv-5H0m{4xSEs7jY8wyk7Z6~?(!O|PZJ(4_Y?a?I?4?TpS7)>t zupK0dEo4#bjXPyl-yW?SjQ{|bF|-c~`eSIo(`w}XLnsj|_9Fi*>DwHjmZa&y2ke6J zQcP^ak#8?dALM9Pj&Hw{T zN@+-V=`6KSdnzU4R?0LJ5Hct`TR(0%%TTXV;RsJfbP*PxljNjZI>Cpr_Vs7QO59QO zrSdE+r&L|7%Ic2UJdpX>F}{4gW};l15eat9EHPuVxr(J6#wjBl+vjJ-zA=b+t4ZJF zWd9UhT9h9kLq5fawwp~RPl92<8)$uHg1kJ_voFT1A`>#uLmY3R0UxArXMDpnd$Xe1 zDKEt5aA(}2WBTt?6Z*m1$;(6y^Ofh8iGN)NA9NO8d?Xaxbt+q{ymjSZzI<#_OxKk* zc0T%sp>uh)32ID&Z^E>wtkrVi6!~D;SZhQi_rB4v_F2>8%?2^S!Mhc#Swzl1K#)=h z%j2UXLp41vc7b)&(U5OE7*F(an@@JNjcD*Mu=dgQLrz00p!dxtcq?6&$zfZIBkdI^ zc_YHBLE`g5^p9q&GoU1NFMfYOf|(NcEX-nL21lHrIi6;VRHtRgA5$xQH}DB4 z6P=+wh&I`yQfwi=N5ZUKMB01N$@!twz1Q2oVuI3Lq%J&Q>Xm$bEAK#SxM@6 zy(&92po``2AhL5MJz>SaZnIV`K{?4_96O9+H6)mxJlIB+TKQb4n13#RQ`wk8HVohYCv31=_Mzjbx}?f-a&TQFk1L*L+Ob=UomDEW0|LV1Qxjj+>F9CE>5S1?>J6V{4@ zVh1@QNw*JCC|Xv5SL)ZKfV*B}9a+C?$?YVNP{rTt51yVKcM|S9C~vbS+xd|jz8kR20I@cQzY!;nH|oG4ypBh2}}^60s?38E-a3@*j}}{V?PF#*kWS& zER9E{Aj;Oq(UwXAm$?BR^KTtF;y}?4vo?@>xYM}2|d0{rq4{@;1%c@2YZx=;pUp$)TQb|fKgqUt6!dV-hy6}71K*!bimP*X< z1%9By39iy3OXKLNa8NG@v^7|v*ZY8s3&yF%Sccnae+sK%GNSVTl58f@Z)BPLIAI6M z!6j(eNLIaVY(4xqvzUy(mx~lH_ba((u)8-ZdpU#=T{k}3HwfAKf=oNqrAD&5H)dys zm0m8^nkv1A7@C2m=5bix-vsOuN-afwe9ngHmn)yM0-FLhqYbx)T~Q1S3@(*(6<<+= z4TTe%27tk5mGI#I3z7hB|KgU$z|A|d8X5bWVK) z>|RajcU;3aF_k^@`uHRjZr_cpv75bMQ!3lT2cXJ@7Fi8*d&$x&We)e8LX+ip9YY`| ziJn$RzPrF;+iYQxT|k=>kdWKZssoX-g`W_!wy??0Z@T{Pw($Gj_)q`wZCQW)r~e-! K#-M@(6AJ(gHp=4w From 4aa48e2452d7981a624c3505446e958c3745dffa Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Mon, 13 May 2024 13:04:09 +0200 Subject: [PATCH 13/77] add todo --- .../GenerateSmallScaleCommercialTrafficDemand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java index dc34f2d8f2f..48d8e84f073 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java @@ -94,6 +94,7 @@ * * @author Ricardo Ewert */ +//TODO: use EnumeratedDistribution for distributions with probabilities @CommandLine.Command(name = "generate-small-scale-commercial-traffic", description = "Generates plans for a small scale commercial traffic model", showDefaultValues = true) public class GenerateSmallScaleCommercialTrafficDemand implements MATSimAppCommand { // freight traffic from extern: From 0c89132bd8ae13a4932654f21b7c8db7aceb217f Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 14 May 2024 16:07:42 +0200 Subject: [PATCH 14/77] change format of list creation --- ...rateSmallScaleCommercialTrafficDemand.java | 943 +++++++++--------- 1 file changed, 470 insertions(+), 473 deletions(-) diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java index 48d8e84f073..44251e05fd7 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java @@ -1307,487 +1307,484 @@ private ValueSelectorUnderGivenProbability createTourDurationTimeDistribution(St } private EnumeratedDistribution createTourDistribution(String smallScaleCommercialTrafficType) { + List> tourDurationProbabilityDistribution = new ArrayList<>(); if (smallScaleCommercialTrafficType.equals(SmallScaleCommercialTrafficType.commercialPersonTraffic.toString())) { - return new EnumeratedDistribution<>(rng, List.of( - Pair.create(new TourStartAndDuration(0, 4, 0.0, 30.0), 0.0005917893035900173), - Pair.create(new TourStartAndDuration(0, 4, 30.0, 60.0), 0.00021859484237437887), - Pair.create(new TourStartAndDuration(0, 4, 90.0, 120.0), 0.00037490287407786324), - Pair.create(new TourStartAndDuration(0, 4, 120.0, 180.0), 0.0004337321926125666), - Pair.create(new TourStartAndDuration(0, 4, 180.0, 240.0), 0.0005834182239827621), - Pair.create(new TourStartAndDuration(0, 4, 240.0, 300.0), 0.0005116938323661723), - Pair.create(new TourStartAndDuration(0, 4, 300.0, 360.0), 0.0005027065159573272), - Pair.create(new TourStartAndDuration(0, 4, 360.0, 420.0), 0.0006719740164147071), - Pair.create(new TourStartAndDuration(0, 4, 420.0, 480.0), 0.00022375027665644004), - Pair.create(new TourStartAndDuration(0, 4, 480.0, 540.0), 0.00022103749529549306), - Pair.create(new TourStartAndDuration(0, 4, 540.0, 600.0), 0.00022119440831885122), - Pair.create(new TourStartAndDuration(0, 4, 600.0, 660.0), 0.0002732185104003396), - Pair.create(new TourStartAndDuration(0, 4, 660.0, 720.0), 7.287567629774946e-05), - Pair.create(new TourStartAndDuration(0, 4, 720.0, 780.0), 0.0005090670761685264), - Pair.create(new TourStartAndDuration(0, 4, 780.0, 840.0), 0.0002169454122557984), - Pair.create(new TourStartAndDuration(0, 4, 840.0, 1080.0), 0.0016947794402011696), - Pair.create(new TourStartAndDuration(4, 5, 0.0, 30.0), 0.00033050926084770643), - Pair.create(new TourStartAndDuration(4, 5, 30.0, 60.0), 0.0004963985976117265), - Pair.create(new TourStartAndDuration(4, 5, 60.0, 90.0), 0.0009458837608304906), - Pair.create(new TourStartAndDuration(4, 5, 90.0, 120.0), 0.0006507941771038976), - Pair.create(new TourStartAndDuration(4, 5, 120.0, 180.0), 0.0002949035696660126), - Pair.create(new TourStartAndDuration(4, 5, 180.0, 240.0), 0.0005812406149568905), - Pair.create(new TourStartAndDuration(4, 5, 240.0, 300.0), 0.00072666224822023), - Pair.create(new TourStartAndDuration(4, 5, 300.0, 360.0), 0.0006017750128936798), - Pair.create(new TourStartAndDuration(4, 5, 360.0, 420.0), 0.0007696491628020603), - Pair.create(new TourStartAndDuration(4, 5, 420.0, 480.0), 0.0006951014583380694), - Pair.create(new TourStartAndDuration(4, 5, 480.0, 540.0), 0.0006675367479652174), - Pair.create(new TourStartAndDuration(4, 5, 540.0, 600.0), 0.0009951412624367468), - Pair.create(new TourStartAndDuration(4, 5, 600.0, 660.0), 0.0006193958232902363), - Pair.create(new TourStartAndDuration(4, 5, 660.0, 720.0), 0.0005496335422364244), - Pair.create(new TourStartAndDuration(4, 5, 720.0, 780.0), 0.000963763774344583), - Pair.create(new TourStartAndDuration(4, 5, 780.0, 840.0), 0.001585152586657775), - Pair.create(new TourStartAndDuration(4, 5, 840.0, 1080.0), 0.0022779973751500433), - Pair.create(new TourStartAndDuration(5, 6, 0.0, 30.0), 0.003678291745870938), - Pair.create(new TourStartAndDuration(5, 6, 30.0, 60.0), 0.0037749680865755936), - Pair.create(new TourStartAndDuration(5, 6, 60.0, 90.0), 0.0021464058981758467), - Pair.create(new TourStartAndDuration(5, 6, 90.0, 120.0), 0.0010105726369455444), - Pair.create(new TourStartAndDuration(5, 6, 120.0, 180.0), 0.0017166729332290624), - Pair.create(new TourStartAndDuration(5, 6, 180.0, 240.0), 0.001218657902054598), - Pair.create(new TourStartAndDuration(5, 6, 240.0, 300.0), 0.0019212859349972463), - Pair.create(new TourStartAndDuration(5, 6, 300.0, 360.0), 0.0018498349748915703), - Pair.create(new TourStartAndDuration(5, 6, 360.0, 420.0), 0.0020820722844894844), - Pair.create(new TourStartAndDuration(5, 6, 420.0, 480.0), 0.0033255032578691536), - Pair.create(new TourStartAndDuration(5, 6, 480.0, 540.0), 0.004499580798913233), - Pair.create(new TourStartAndDuration(5, 6, 540.0, 600.0), 0.004508722079694882), - Pair.create(new TourStartAndDuration(5, 6, 600.0, 660.0), 0.009460453046374911), - Pair.create(new TourStartAndDuration(5, 6, 660.0, 720.0), 0.008632039128635343), - Pair.create(new TourStartAndDuration(5, 6, 720.0, 780.0), 0.005173130409039029), - Pair.create(new TourStartAndDuration(5, 6, 780.0, 840.0), 0.0021287189901771954), - Pair.create(new TourStartAndDuration(5, 6, 840.0, 1080.0), 0.002735246591728173), - Pair.create(new TourStartAndDuration(6, 7, 0.0, 30.0), 0.015534599731489868), - Pair.create(new TourStartAndDuration(6, 7, 30.0, 60.0), 0.009424737666749776), - Pair.create(new TourStartAndDuration(6, 7, 60.0, 90.0), 0.003979757502241877), - Pair.create(new TourStartAndDuration(6, 7, 90.0, 120.0), 0.0026219034509082214), - Pair.create(new TourStartAndDuration(6, 7, 120.0, 180.0), 0.004373894821911171), - Pair.create(new TourStartAndDuration(6, 7, 180.0, 240.0), 0.005349695968407728), - Pair.create(new TourStartAndDuration(6, 7, 240.0, 300.0), 0.008398668008895199), - Pair.create(new TourStartAndDuration(6, 7, 300.0, 360.0), 0.013017576110359298), - Pair.create(new TourStartAndDuration(6, 7, 360.0, 420.0), 0.013178466937493282), - Pair.create(new TourStartAndDuration(6, 7, 420.0, 480.0), 0.015799261066253244), - Pair.create(new TourStartAndDuration(6, 7, 480.0, 540.0), 0.031932993774084484), - Pair.create(new TourStartAndDuration(6, 7, 540.0, 600.0), 0.056976770375347194), - Pair.create(new TourStartAndDuration(6, 7, 600.0, 660.0), 0.03411514635058722), - Pair.create(new TourStartAndDuration(6, 7, 660.0, 720.0), 0.010952547256934878), - Pair.create(new TourStartAndDuration(6, 7, 720.0, 780.0), 0.005071677294689363), - Pair.create(new TourStartAndDuration(6, 7, 780.0, 840.0), 0.002758017802376135), - Pair.create(new TourStartAndDuration(6, 7, 840.0, 1080.0), 0.003182481371327368), - Pair.create(new TourStartAndDuration(7, 8, 0.0, 30.0), 0.018010507239762663), - Pair.create(new TourStartAndDuration(7, 8, 30.0, 60.0), 0.009246211080247332), - Pair.create(new TourStartAndDuration(7, 8, 60.0, 90.0), 0.006297103845359016), - Pair.create(new TourStartAndDuration(7, 8, 90.0, 120.0), 0.003415561088528113), - Pair.create(new TourStartAndDuration(7, 8, 120.0, 180.0), 0.010918022744746231), - Pair.create(new TourStartAndDuration(7, 8, 180.0, 240.0), 0.011371721163141522), - Pair.create(new TourStartAndDuration(7, 8, 240.0, 300.0), 0.01861910064916215), - Pair.create(new TourStartAndDuration(7, 8, 300.0, 360.0), 0.015443374909900384), - Pair.create(new TourStartAndDuration(7, 8, 360.0, 420.0), 0.020470726990450452), - Pair.create(new TourStartAndDuration(7, 8, 420.0, 480.0), 0.030727618880727087), - Pair.create(new TourStartAndDuration(7, 8, 480.0, 540.0), 0.07364088624635841), - Pair.create(new TourStartAndDuration(7, 8, 540.0, 600.0), 0.04082061588575034), - Pair.create(new TourStartAndDuration(7, 8, 600.0, 660.0), 0.012935881167590665), - Pair.create(new TourStartAndDuration(7, 8, 660.0, 720.0), 0.005469250367916343), - Pair.create(new TourStartAndDuration(7, 8, 720.0, 780.0), 0.0030030673084490513), - Pair.create(new TourStartAndDuration(7, 8, 780.0, 840.0), 0.0011042643367551329), - Pair.create(new TourStartAndDuration(7, 8, 840.0, 1080.0), 0.0011327583672022575), - Pair.create(new TourStartAndDuration(8, 9, 0.0, 30.0), 0.015589932735904798), - Pair.create(new TourStartAndDuration(8, 9, 30.0, 60.0), 0.007157798082590814), - Pair.create(new TourStartAndDuration(8, 9, 60.0, 90.0), 0.006563655710107534), - Pair.create(new TourStartAndDuration(8, 9, 90.0, 120.0), 0.004888423230467872), - Pair.create(new TourStartAndDuration(8, 9, 120.0, 180.0), 0.01261126944262904), - Pair.create(new TourStartAndDuration(8, 9, 180.0, 240.0), 0.013275311108363174), - Pair.create(new TourStartAndDuration(8, 9, 240.0, 300.0), 0.011059737216827653), - Pair.create(new TourStartAndDuration(8, 9, 300.0, 360.0), 0.00980644443311104), - Pair.create(new TourStartAndDuration(8, 9, 360.0, 420.0), 0.013476523854959467), - Pair.create(new TourStartAndDuration(8, 9, 420.0, 480.0), 0.01766932338862498), - Pair.create(new TourStartAndDuration(8, 9, 480.0, 540.0), 0.013855266610087914), - Pair.create(new TourStartAndDuration(8, 9, 540.0, 600.0), 0.006090238569895901), - Pair.create(new TourStartAndDuration(8, 9, 600.0, 660.0), 0.00326688741194661), - Pair.create(new TourStartAndDuration(8, 9, 660.0, 720.0), 0.0009742217966822537), - Pair.create(new TourStartAndDuration(8, 9, 720.0, 780.0), 0.0008462163162537791), - Pair.create(new TourStartAndDuration(8, 9, 780.0, 840.0), 0.0009357453082055104), - Pair.create(new TourStartAndDuration(8, 9, 840.0, 1080.0), 0.0006867783494497427), - Pair.create(new TourStartAndDuration(9, 10, 0.0, 30.0), 0.011836581569331607), - Pair.create(new TourStartAndDuration(9, 10, 30.0, 60.0), 0.0060475163532472224), - Pair.create(new TourStartAndDuration(9, 10, 60.0, 90.0), 0.006091033719221284), - Pair.create(new TourStartAndDuration(9, 10, 90.0, 120.0), 0.004870323217391879), - Pair.create(new TourStartAndDuration(9, 10, 120.0, 180.0), 0.009852214102720915), - Pair.create(new TourStartAndDuration(9, 10, 180.0, 240.0), 0.006649077724867284), - Pair.create(new TourStartAndDuration(9, 10, 240.0, 300.0), 0.006549809619698136), - Pair.create(new TourStartAndDuration(9, 10, 300.0, 360.0), 0.00743649188225418), - Pair.create(new TourStartAndDuration(9, 10, 360.0, 420.0), 0.008370330719772223), - Pair.create(new TourStartAndDuration(9, 10, 420.0, 480.0), 0.006055410372169952), - Pair.create(new TourStartAndDuration(9, 10, 480.0, 540.0), 0.003221026290023441), - Pair.create(new TourStartAndDuration(9, 10, 540.0, 600.0), 0.00270804359225063), - Pair.create(new TourStartAndDuration(9, 10, 600.0, 660.0), 0.0011328763880567346), - Pair.create(new TourStartAndDuration(9, 10, 660.0, 720.0), 0.0005295062815147344), - Pair.create(new TourStartAndDuration(9, 10, 720.0, 780.0), 0.0005244739409173669), - Pair.create(new TourStartAndDuration(9, 10, 780.0, 840.0), 0.00022261373811852168), - Pair.create(new TourStartAndDuration(9, 10, 840.0, 1080.0), 0.0002976820307410009), - Pair.create(new TourStartAndDuration(10, 11, 0.0, 30.0), 0.0072347359578799255), - Pair.create(new TourStartAndDuration(10, 11, 30.0, 60.0), 0.005528762818372258), - Pair.create(new TourStartAndDuration(10, 11, 60.0, 90.0), 0.004301874597910846), - Pair.create(new TourStartAndDuration(10, 11, 90.0, 120.0), 0.002706271535768685), - Pair.create(new TourStartAndDuration(10, 11, 120.0, 180.0), 0.004461225555303183), - Pair.create(new TourStartAndDuration(10, 11, 180.0, 240.0), 0.003289266637558867), - Pair.create(new TourStartAndDuration(10, 11, 240.0, 300.0), 0.004773112389257731), - Pair.create(new TourStartAndDuration(10, 11, 300.0, 360.0), 0.004153307715767419), - Pair.create(new TourStartAndDuration(10, 11, 360.0, 420.0), 0.0023002274828502435), - Pair.create(new TourStartAndDuration(10, 11, 420.0, 480.0), 0.002295722460734858), - Pair.create(new TourStartAndDuration(10, 11, 480.0, 540.0), 0.0008008191218782178), - Pair.create(new TourStartAndDuration(10, 11, 540.0, 600.0), 0.0005302938593833011), - Pair.create(new TourStartAndDuration(10, 11, 600.0, 660.0), 0.00012017333498779025), - Pair.create(new TourStartAndDuration(10, 11, 660.0, 720.0), 0.00029497120761336085), - Pair.create(new TourStartAndDuration(10, 11, 720.0, 780.0), 7.442207741095891e-05), - Pair.create(new TourStartAndDuration(10, 11, 780.0, 840.0), 7.491510042413546e-05), - Pair.create(new TourStartAndDuration(11, 12, 0.0, 30.0), 0.005979044848708125), - Pair.create(new TourStartAndDuration(11, 12, 30.0, 60.0), 0.0030727725862362003), - Pair.create(new TourStartAndDuration(11, 12, 60.0, 90.0), 0.0018328582061095421), - Pair.create(new TourStartAndDuration(11, 12, 90.0, 120.0), 0.0015730248216810105), - Pair.create(new TourStartAndDuration(11, 12, 120.0, 180.0), 0.0025909176745678485), - Pair.create(new TourStartAndDuration(11, 12, 180.0, 240.0), 0.0023584284876344117), - Pair.create(new TourStartAndDuration(11, 12, 240.0, 300.0), 0.002888683132930499), - Pair.create(new TourStartAndDuration(11, 12, 300.0, 360.0), 0.0026723295114103734), - Pair.create(new TourStartAndDuration(11, 12, 360.0, 420.0), 0.001368034507711622), - Pair.create(new TourStartAndDuration(11, 12, 420.0, 480.0), 0.001322142609646873), - Pair.create(new TourStartAndDuration(11, 12, 480.0, 540.0), 0.00014896322977011863), - Pair.create(new TourStartAndDuration(11, 12, 540.0, 600.0), 0.00036793050573151096), - Pair.create(new TourStartAndDuration(11, 12, 600.0, 660.0), 0.0003024749417379503), - Pair.create(new TourStartAndDuration(11, 12, 660.0, 720.0), 7.263766179594998e-05), - Pair.create(new TourStartAndDuration(11, 12, 720.0, 780.0), 7.737798495114381e-05), - Pair.create(new TourStartAndDuration(11, 12, 840.0, 1080.0), 7.360037219024495e-05), - Pair.create(new TourStartAndDuration(12, 13, 0.0, 30.0), 0.005442934607459622), - Pair.create(new TourStartAndDuration(12, 13, 30.0, 60.0), 0.0023099603288455053), - Pair.create(new TourStartAndDuration(12, 13, 60.0, 90.0), 0.0015476125810207045), - Pair.create(new TourStartAndDuration(12, 13, 90.0, 120.0), 0.0015690710859882222), - Pair.create(new TourStartAndDuration(12, 13, 120.0, 180.0), 0.003155552178314994), - Pair.create(new TourStartAndDuration(12, 13, 180.0, 240.0), 0.0024715148201473933), - Pair.create(new TourStartAndDuration(12, 13, 240.0, 300.0), 0.00214638868043489), - Pair.create(new TourStartAndDuration(12, 13, 300.0, 360.0), 0.0017134793037846727), - Pair.create(new TourStartAndDuration(12, 13, 360.0, 420.0), 0.0009684921868733149), - Pair.create(new TourStartAndDuration(12, 13, 420.0, 480.0), 0.0005519992558366529), - Pair.create(new TourStartAndDuration(12, 13, 480.0, 540.0), 0.0004441672064981391), - Pair.create(new TourStartAndDuration(12, 13, 540.0, 600.0), 0.00022332686365997108), - Pair.create(new TourStartAndDuration(12, 13, 600.0, 660.0), 0.00023780343565208111), - Pair.create(new TourStartAndDuration(12, 13, 660.0, 720.0), 0.00014898555439278127), - Pair.create(new TourStartAndDuration(13, 14, 0.0, 30.0), 0.0065652971880044205), - Pair.create(new TourStartAndDuration(13, 14, 30.0, 60.0), 0.0033645458423904226), - Pair.create(new TourStartAndDuration(13, 14, 60.0, 90.0), 0.002247264924524252), - Pair.create(new TourStartAndDuration(13, 14, 90.0, 120.0), 0.0021755851670695867), - Pair.create(new TourStartAndDuration(13, 14, 120.0, 180.0), 0.00292250684836152), - Pair.create(new TourStartAndDuration(13, 14, 180.0, 240.0), 0.0029939610328467135), - Pair.create(new TourStartAndDuration(13, 14, 240.0, 300.0), 0.0013771262994841458), - Pair.create(new TourStartAndDuration(13, 14, 300.0, 360.0), 0.0005929387919824101), - Pair.create(new TourStartAndDuration(13, 14, 360.0, 420.0), 0.0007299574379337656), - Pair.create(new TourStartAndDuration(13, 14, 420.0, 480.0), 0.00015161310680499916), - Pair.create(new TourStartAndDuration(13, 14, 480.0, 540.0), 0.00022326623210165028), - Pair.create(new TourStartAndDuration(13, 14, 540.0, 600.0), 0.00021908720500178134), - Pair.create(new TourStartAndDuration(14, 15, 0.0, 30.0), 0.004700575755513116), - Pair.create(new TourStartAndDuration(14, 15, 30.0, 60.0), 0.002876930233578738), - Pair.create(new TourStartAndDuration(14, 15, 60.0, 90.0), 0.0012326059557891803), - Pair.create(new TourStartAndDuration(14, 15, 90.0, 120.0), 0.001688513011030605), - Pair.create(new TourStartAndDuration(14, 15, 120.0, 180.0), 0.0024148215923521744), - Pair.create(new TourStartAndDuration(14, 15, 180.0, 240.0), 0.0009664823712470381), - Pair.create(new TourStartAndDuration(14, 15, 240.0, 300.0), 0.0008158516384741175), - Pair.create(new TourStartAndDuration(14, 15, 300.0, 360.0), 0.0005326476409500361), - Pair.create(new TourStartAndDuration(14, 15, 360.0, 420.0), 0.00037447250704764534), - Pair.create(new TourStartAndDuration(14, 15, 420.0, 480.0), 7.278074100962308e-05), - Pair.create(new TourStartAndDuration(14, 15, 480.0, 540.0), 0.00015460621875651884), - Pair.create(new TourStartAndDuration(14, 15, 540.0, 600.0), 0.00022625636961834557), - Pair.create(new TourStartAndDuration(14, 15, 840.0, 1080.0), 7.369704340227916e-05), - Pair.create(new TourStartAndDuration(15, 16, 0.0, 30.0), 0.005421542133242069), - Pair.create(new TourStartAndDuration(15, 16, 30.0, 60.0), 0.0028543297205245563), - Pair.create(new TourStartAndDuration(15, 16, 60.0, 90.0), 0.001320449445343739), - Pair.create(new TourStartAndDuration(15, 16, 90.0, 120.0), 0.0011372744623221703), - Pair.create(new TourStartAndDuration(15, 16, 120.0, 180.0), 0.0011175546229352943), - Pair.create(new TourStartAndDuration(15, 16, 180.0, 240.0), 0.0005212091408906178), - Pair.create(new TourStartAndDuration(15, 16, 240.0, 300.0), 0.00025063117439263165), - Pair.create(new TourStartAndDuration(15, 16, 300.0, 360.0), 0.0002906557976189996), - Pair.create(new TourStartAndDuration(15, 16, 360.0, 420.0), 6.934683987097806e-05), - Pair.create(new TourStartAndDuration(15, 16, 420.0, 480.0), 7.198332684426051e-05), - Pair.create(new TourStartAndDuration(16, 17, 0.0, 30.0), 0.005997678933359281), - Pair.create(new TourStartAndDuration(16, 17, 30.0, 60.0), 0.0014450238860978966), - Pair.create(new TourStartAndDuration(16, 17, 60.0, 90.0), 0.0008909835110546583), - Pair.create(new TourStartAndDuration(16, 17, 90.0, 120.0), 0.0008692603958852261), - Pair.create(new TourStartAndDuration(16, 17, 120.0, 180.0), 0.0004645626068627116), - Pair.create(new TourStartAndDuration(16, 17, 180.0, 240.0), 0.0005161866418057845), - Pair.create(new TourStartAndDuration(16, 17, 240.0, 300.0), 0.00047492492382272117), - Pair.create(new TourStartAndDuration(16, 17, 300.0, 360.0), 7.348989097075777e-05), - Pair.create(new TourStartAndDuration(16, 17, 360.0, 420.0), 0.0003000342936128893), - Pair.create(new TourStartAndDuration(17, 18, 0.0, 30.0), 0.004621906661329853), - Pair.create(new TourStartAndDuration(17, 18, 30.0, 60.0), 0.0015152391398060199), - Pair.create(new TourStartAndDuration(17, 18, 60.0, 90.0), 0.0006769045119123614), - Pair.create(new TourStartAndDuration(17, 18, 90.0, 120.0), 0.00044820275277284946), - Pair.create(new TourStartAndDuration(17, 18, 120.0, 180.0), 0.0007140653752077821), - Pair.create(new TourStartAndDuration(17, 18, 180.0, 240.0), 0.0001502672132808765), - Pair.create(new TourStartAndDuration(17, 18, 240.0, 300.0), 0.0003842231300012746), - Pair.create(new TourStartAndDuration(17, 18, 300.0, 360.0), 0.00021634404805889257), - Pair.create(new TourStartAndDuration(18, 19, 0.0, 30.0), 0.0034023082743939916), - Pair.create(new TourStartAndDuration(18, 19, 30.0, 60.0), 0.0006251774232962365), - Pair.create(new TourStartAndDuration(18, 19, 60.0, 90.0), 0.00022163965781205308), - Pair.create(new TourStartAndDuration(18, 19, 90.0, 120.0), 7.360037219024495e-05), - Pair.create(new TourStartAndDuration(18, 19, 120.0, 180.0), 0.00045934601255169126), - Pair.create(new TourStartAndDuration(18, 19, 180.0, 240.0), 7.511874968194916e-05), - Pair.create(new TourStartAndDuration(18, 19, 240.0, 300.0), 0.0001486019187134722), - Pair.create(new TourStartAndDuration(18, 19, 300.0, 360.0), 7.505084488366769e-05), - Pair.create(new TourStartAndDuration(18, 19, 420.0, 480.0), 7.594714627228585e-05), - Pair.create(new TourStartAndDuration(19, 24, 0.0, 30.0), 0.005137034953520923), - Pair.create(new TourStartAndDuration(19, 24, 30.0, 60.0), 0.0010774703023578233), - Pair.create(new TourStartAndDuration(19, 24, 60.0, 90.0), 0.00048539418673270443), - Pair.create(new TourStartAndDuration(19, 24, 90.0, 120.0), 0.0002988049182984063), - Pair.create(new TourStartAndDuration(19, 24, 120.0, 180.0), 0.00032644209078127245), - Pair.create(new TourStartAndDuration(19, 24, 180.0, 240.0), 0.0005357497395368892), - Pair.create(new TourStartAndDuration(19, 24, 240.0, 300.0), 0.0002944914928100358), - Pair.create(new TourStartAndDuration(19, 24, 300.0, 360.0), 0.00022851651374757815) - )); - + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 0.0, 30.0), 0.0005917893035900173)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 30.0, 60.0), 0.00021859484237437887)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 90.0, 120.0), 0.00037490287407786324)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 120.0, 180.0), 0.0004337321926125666)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 180.0, 240.0), 0.0005834182239827621)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 240.0, 300.0), 0.0005116938323661723)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 300.0, 360.0), 0.0005027065159573272)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 360.0, 420.0), 0.0006719740164147071)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 420.0, 480.0), 0.00022375027665644004)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 480.0, 540.0), 0.00022103749529549306)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 540.0, 600.0), 0.00022119440831885122)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 600.0, 660.0), 0.0002732185104003396)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 660.0, 720.0), 7.287567629774946e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 720.0, 780.0), 0.0005090670761685264)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 780.0, 840.0), 0.0002169454122557984)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 840.0, 1080.0), 0.0016947794402011696)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 0.0, 30.0), 0.00033050926084770643)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 30.0, 60.0), 0.0004963985976117265)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 60.0, 90.0), 0.0009458837608304906)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 90.0, 120.0), 0.0006507941771038976)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 120.0, 180.0), 0.0002949035696660126)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 180.0, 240.0), 0.0005812406149568905)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 240.0, 300.0), 0.00072666224822023)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 300.0, 360.0), 0.0006017750128936798)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 360.0, 420.0), 0.0007696491628020603)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 420.0, 480.0), 0.0006951014583380694)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 480.0, 540.0), 0.0006675367479652174)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 540.0, 600.0), 0.0009951412624367468)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 600.0, 660.0), 0.0006193958232902363)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 660.0, 720.0), 0.0005496335422364244)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 720.0, 780.0), 0.000963763774344583)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 780.0, 840.0), 0.001585152586657775)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 840.0, 1080.0), 0.0022779973751500433)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 0.0, 30.0), 0.003678291745870938)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 30.0, 60.0), 0.0037749680865755936)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 60.0, 90.0), 0.0021464058981758467)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 90.0, 120.0), 0.0010105726369455444)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 120.0, 180.0), 0.0017166729332290624)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 180.0, 240.0), 0.001218657902054598)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 240.0, 300.0), 0.0019212859349972463)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 300.0, 360.0), 0.0018498349748915703)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 360.0, 420.0), 0.0020820722844894844)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 420.0, 480.0), 0.0033255032578691536)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 480.0, 540.0), 0.004499580798913233)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 540.0, 600.0), 0.004508722079694882)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 600.0, 660.0), 0.009460453046374911)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 660.0, 720.0), 0.008632039128635343)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 720.0, 780.0), 0.005173130409039029)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 780.0, 840.0), 0.0021287189901771954)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 840.0, 1080.0), 0.002735246591728173)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 0.0, 30.0), 0.015534599731489868)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 30.0, 60.0), 0.009424737666749776)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 60.0, 90.0), 0.003979757502241877)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 90.0, 120.0), 0.0026219034509082214)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 120.0, 180.0), 0.004373894821911171)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 180.0, 240.0), 0.005349695968407728)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 240.0, 300.0), 0.008398668008895199)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 300.0, 360.0), 0.013017576110359298)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 360.0, 420.0), 0.013178466937493282)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 420.0, 480.0), 0.015799261066253244)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 480.0, 540.0), 0.031932993774084484)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 540.0, 600.0), 0.056976770375347194)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 600.0, 660.0), 0.03411514635058722)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 660.0, 720.0), 0.010952547256934878)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 720.0, 780.0), 0.005071677294689363)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 780.0, 840.0), 0.002758017802376135)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 840.0, 1080.0), 0.003182481371327368)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 0.0, 30.0), 0.018010507239762663)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 30.0, 60.0), 0.009246211080247332)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 60.0, 90.0), 0.006297103845359016)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 90.0, 120.0), 0.003415561088528113)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 120.0, 180.0), 0.010918022744746231)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 180.0, 240.0), 0.011371721163141522)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 240.0, 300.0), 0.01861910064916215)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 300.0, 360.0), 0.015443374909900384)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 360.0, 420.0), 0.020470726990450452)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 420.0, 480.0), 0.030727618880727087)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 480.0, 540.0), 0.07364088624635841)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 540.0, 600.0), 0.04082061588575034)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 600.0, 660.0), 0.012935881167590665)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 660.0, 720.0), 0.005469250367916343)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 720.0, 780.0), 0.0030030673084490513)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 780.0, 840.0), 0.0011042643367551329)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 840.0, 1080.0), 0.0011327583672022575)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 0.0, 30.0), 0.015589932735904798)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 30.0, 60.0), 0.007157798082590814)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 60.0, 90.0), 0.006563655710107534)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 90.0, 120.0), 0.004888423230467872)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 120.0, 180.0), 0.01261126944262904)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 180.0, 240.0), 0.013275311108363174)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 240.0, 300.0), 0.011059737216827653)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 300.0, 360.0), 0.00980644443311104)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 360.0, 420.0), 0.013476523854959467)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 420.0, 480.0), 0.01766932338862498)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 480.0, 540.0), 0.013855266610087914)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 540.0, 600.0), 0.006090238569895901)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 600.0, 660.0), 0.00326688741194661)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 660.0, 720.0), 0.0009742217966822537)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 720.0, 780.0), 0.0008462163162537791)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 780.0, 840.0), 0.0009357453082055104)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 840.0, 1080.0), 0.0006867783494497427)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 0.0, 30.0), 0.011836581569331607)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 30.0, 60.0), 0.0060475163532472224)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 60.0, 90.0), 0.006091033719221284)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 90.0, 120.0), 0.004870323217391879)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 120.0, 180.0), 0.009852214102720915)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 180.0, 240.0), 0.006649077724867284)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 240.0, 300.0), 0.006549809619698136)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 300.0, 360.0), 0.00743649188225418)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 360.0, 420.0), 0.008370330719772223)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 420.0, 480.0), 0.006055410372169952)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 480.0, 540.0), 0.003221026290023441)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 540.0, 600.0), 0.00270804359225063)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 600.0, 660.0), 0.0011328763880567346)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 660.0, 720.0), 0.0005295062815147344)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 720.0, 780.0), 0.0005244739409173669)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 780.0, 840.0), 0.00022261373811852168)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 840.0, 1080.0), 0.0002976820307410009)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 0.0, 30.0), 0.0072347359578799255)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 30.0, 60.0), 0.005528762818372258)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 60.0, 90.0), 0.004301874597910846)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 90.0, 120.0), 0.002706271535768685)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 120.0, 180.0), 0.004461225555303183)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 180.0, 240.0), 0.003289266637558867)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 240.0, 300.0), 0.004773112389257731)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 300.0, 360.0), 0.004153307715767419)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 360.0, 420.0), 0.0023002274828502435)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 420.0, 480.0), 0.002295722460734858)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 480.0, 540.0), 0.0008008191218782178)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 540.0, 600.0), 0.0005302938593833011)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 600.0, 660.0), 0.00012017333498779025)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 660.0, 720.0), 0.00029497120761336085)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 720.0, 780.0), 7.442207741095891e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 780.0, 840.0), 7.491510042413546e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 0.0, 30.0), 0.005979044848708125)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 30.0, 60.0), 0.0030727725862362003)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 60.0, 90.0), 0.0018328582061095421)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 90.0, 120.0), 0.0015730248216810105)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 120.0, 180.0), 0.0025909176745678485)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 180.0, 240.0), 0.0023584284876344117)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 240.0, 300.0), 0.002888683132930499)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 300.0, 360.0), 0.0026723295114103734)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 360.0, 420.0), 0.001368034507711622)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 420.0, 480.0), 0.001322142609646873)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 480.0, 540.0), 0.00014896322977011863)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 540.0, 600.0), 0.00036793050573151096)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 600.0, 660.0), 0.0003024749417379503)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 660.0, 720.0), 7.263766179594998e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 720.0, 780.0), 7.737798495114381e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 840.0, 1080.0), 7.360037219024495e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 0.0, 30.0), 0.005442934607459622)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 30.0, 60.0), 0.0023099603288455053)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 60.0, 90.0), 0.0015476125810207045)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 90.0, 120.0), 0.0015690710859882222)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 120.0, 180.0), 0.003155552178314994)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 180.0, 240.0), 0.0024715148201473933)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 240.0, 300.0), 0.00214638868043489)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 300.0, 360.0), 0.0017134793037846727)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 360.0, 420.0), 0.0009684921868733149)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 420.0, 480.0), 0.0005519992558366529)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 480.0, 540.0), 0.0004441672064981391)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 540.0, 600.0), 0.00022332686365997108)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 600.0, 660.0), 0.00023780343565208111)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 660.0, 720.0), 0.00014898555439278127)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 0.0, 30.0), 0.0065652971880044205)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 30.0, 60.0), 0.0033645458423904226)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 60.0, 90.0), 0.002247264924524252)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 90.0, 120.0), 0.0021755851670695867)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 120.0, 180.0), 0.00292250684836152)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 180.0, 240.0), 0.0029939610328467135)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 240.0, 300.0), 0.0013771262994841458)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 300.0, 360.0), 0.0005929387919824101)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 360.0, 420.0), 0.0007299574379337656)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 420.0, 480.0), 0.00015161310680499916)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 480.0, 540.0), 0.00022326623210165028)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 540.0, 600.0), 0.00021908720500178134)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 0.0, 30.0), 0.004700575755513116)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 30.0, 60.0), 0.002876930233578738)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 60.0, 90.0), 0.0012326059557891803)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 90.0, 120.0), 0.001688513011030605)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 120.0, 180.0), 0.0024148215923521744)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 180.0, 240.0), 0.0009664823712470381)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 240.0, 300.0), 0.0008158516384741175)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 300.0, 360.0), 0.0005326476409500361)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 360.0, 420.0), 0.00037447250704764534)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 420.0, 480.0), 7.278074100962308e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 480.0, 540.0), 0.00015460621875651884)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 540.0, 600.0), 0.00022625636961834557)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 840.0, 1080.0), 7.369704340227916e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 0.0, 30.0), 0.005421542133242069)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 30.0, 60.0), 0.0028543297205245563)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 60.0, 90.0), 0.001320449445343739)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 90.0, 120.0), 0.0011372744623221703)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 120.0, 180.0), 0.0011175546229352943)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 180.0, 240.0), 0.0005212091408906178)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 240.0, 300.0), 0.00025063117439263165)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 300.0, 360.0), 0.0002906557976189996)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 360.0, 420.0), 6.934683987097806e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 420.0, 480.0), 7.198332684426051e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 0.0, 30.0), 0.005997678933359281)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 30.0, 60.0), 0.0014450238860978966)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 60.0, 90.0), 0.0008909835110546583)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 90.0, 120.0), 0.0008692603958852261)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 120.0, 180.0), 0.0004645626068627116)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 180.0, 240.0), 0.0005161866418057845)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 240.0, 300.0), 0.00047492492382272117)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 300.0, 360.0), 7.348989097075777e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 360.0, 420.0), 0.0003000342936128893)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 0.0, 30.0), 0.004621906661329853)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 30.0, 60.0), 0.0015152391398060199)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 60.0, 90.0), 0.0006769045119123614)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 90.0, 120.0), 0.00044820275277284946)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 120.0, 180.0), 0.0007140653752077821)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 180.0, 240.0), 0.0001502672132808765)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 240.0, 300.0), 0.0003842231300012746)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 300.0, 360.0), 0.00021634404805889257)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 0.0, 30.0), 0.0034023082743939916)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 30.0, 60.0), 0.0006251774232962365)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 60.0, 90.0), 0.00022163965781205308)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 90.0, 120.0), 7.360037219024495e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 120.0, 180.0), 0.00045934601255169126)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 180.0, 240.0), 7.511874968194916e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 240.0, 300.0), 0.0001486019187134722)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 300.0, 360.0), 7.505084488366769e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 420.0, 480.0), 7.594714627228585e-05)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 0.0, 30.0), 0.005137034953520923)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 30.0, 60.0), 0.0010774703023578233)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 60.0, 90.0), 0.00048539418673270443)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 90.0, 120.0), 0.0002988049182984063)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 120.0, 180.0), 0.00032644209078127245)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 180.0, 240.0), 0.0005357497395368892)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 240.0, 300.0), 0.0002944914928100358)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 300.0, 360.0), 0.00022851651374757815)); } else if (smallScaleCommercialTrafficType.equals(SmallScaleCommercialTrafficType.goodsTraffic.toString())) { - return new EnumeratedDistribution<>(rng, List.of( - Pair.create(new TourStartAndDuration(0, 4, 0.0, 30.0), 0.0002666800577200411), - Pair.create(new TourStartAndDuration(0, 4, 30.0, 60.0), 0.0006395055678719748), - Pair.create(new TourStartAndDuration(0, 4, 60.0, 90.0), 0.0007110769046958423), - Pair.create(new TourStartAndDuration(0, 4, 90.0, 120.0), 0.0006665961628449491), - Pair.create(new TourStartAndDuration(0, 4, 120.0, 180.0), 0.0023195866923785575), - Pair.create(new TourStartAndDuration(0, 4, 180.0, 240.0), 0.00261751319938476), - Pair.create(new TourStartAndDuration(0, 4, 240.0, 300.0), 0.0021430032453503087), - Pair.create(new TourStartAndDuration(0, 4, 300.0, 360.0), 0.0029303876579925905), - Pair.create(new TourStartAndDuration(0, 4, 360.0, 420.0), 0.00283576618143643), - Pair.create(new TourStartAndDuration(0, 4, 420.0, 480.0), 0.0027188265347502893), - Pair.create(new TourStartAndDuration(0, 4, 480.0, 540.0), 0.002597768116531099), - Pair.create(new TourStartAndDuration(0, 4, 540.0, 600.0), 0.002659151494701916), - Pair.create(new TourStartAndDuration(0, 4, 600.0, 660.0), 0.0021738406044924437), - Pair.create(new TourStartAndDuration(0, 4, 660.0, 720.0), 0.0021949848461843176), - Pair.create(new TourStartAndDuration(0, 4, 720.0, 780.0), 0.0021801193011023083), - Pair.create(new TourStartAndDuration(0, 4, 780.0, 840.0), 0.001746033717539671), - Pair.create(new TourStartAndDuration(0, 4, 840.0, 1080.0), 0.00350888397405923), - Pair.create(new TourStartAndDuration(4, 5, 0.0, 30.0), 0.0006845643884312735), - Pair.create(new TourStartAndDuration(4, 5, 30.0, 60.0), 0.0004003126952082357), - Pair.create(new TourStartAndDuration(4, 5, 60.0, 90.0), 0.0008155012585632697), - Pair.create(new TourStartAndDuration(4, 5, 90.0, 120.0), 0.0010930534970200114), - Pair.create(new TourStartAndDuration(4, 5, 120.0, 180.0), 0.0011760353713952051), - Pair.create(new TourStartAndDuration(4, 5, 180.0, 240.0), 0.0019364061980548415), - Pair.create(new TourStartAndDuration(4, 5, 240.0, 300.0), 0.002953452881036028), - Pair.create(new TourStartAndDuration(4, 5, 300.0, 360.0), 0.002589370165068672), - Pair.create(new TourStartAndDuration(4, 5, 360.0, 420.0), 0.0025604405819583055), - Pair.create(new TourStartAndDuration(4, 5, 420.0, 480.0), 0.0034319041631081476), - Pair.create(new TourStartAndDuration(4, 5, 480.0, 540.0), 0.0033480025727905907), - Pair.create(new TourStartAndDuration(4, 5, 540.0, 600.0), 0.002175717502193024), - Pair.create(new TourStartAndDuration(4, 5, 600.0, 660.0), 0.0028036478238686957), - Pair.create(new TourStartAndDuration(4, 5, 660.0, 720.0), 0.0028759635193342887), - Pair.create(new TourStartAndDuration(4, 5, 720.0, 780.0), 0.0017584406503249872), - Pair.create(new TourStartAndDuration(4, 5, 780.0, 840.0), 0.0016742001219093045), - Pair.create(new TourStartAndDuration(4, 5, 840.0, 1080.0), 0.0020658205220468245), - Pair.create(new TourStartAndDuration(5, 6, 0.0, 30.0), 0.0017247403950228777), - Pair.create(new TourStartAndDuration(5, 6, 30.0, 60.0), 0.003090998236080484), - Pair.create(new TourStartAndDuration(5, 6, 60.0, 90.0), 0.0015209554995803177), - Pair.create(new TourStartAndDuration(5, 6, 90.0, 120.0), 0.0016533392810110293), - Pair.create(new TourStartAndDuration(5, 6, 120.0, 180.0), 0.003732306124403562), - Pair.create(new TourStartAndDuration(5, 6, 180.0, 240.0), 0.004106247357091271), - Pair.create(new TourStartAndDuration(5, 6, 240.0, 300.0), 0.003188442431357427), - Pair.create(new TourStartAndDuration(5, 6, 300.0, 360.0), 0.005929370570550301), - Pair.create(new TourStartAndDuration(5, 6, 360.0, 420.0), 0.005992695595693005), - Pair.create(new TourStartAndDuration(5, 6, 420.0, 480.0), 0.006390572360276255), - Pair.create(new TourStartAndDuration(5, 6, 480.0, 540.0), 0.00993732232424166), - Pair.create(new TourStartAndDuration(5, 6, 540.0, 600.0), 0.007917613781985494), - Pair.create(new TourStartAndDuration(5, 6, 600.0, 660.0), 0.00753055040114282), - Pair.create(new TourStartAndDuration(5, 6, 660.0, 720.0), 0.004839531706746983), - Pair.create(new TourStartAndDuration(5, 6, 720.0, 780.0), 0.003571294178536547), - Pair.create(new TourStartAndDuration(5, 6, 780.0, 840.0), 0.0022261075091276465), - Pair.create(new TourStartAndDuration(5, 6, 840.0, 1080.0), 0.0020123396391017526), - Pair.create(new TourStartAndDuration(6, 7, 0.0, 30.0), 0.00553085745500388), - Pair.create(new TourStartAndDuration(6, 7, 30.0, 60.0), 0.005164301035284355), - Pair.create(new TourStartAndDuration(6, 7, 60.0, 90.0), 0.0034287284279468384), - Pair.create(new TourStartAndDuration(6, 7, 90.0, 120.0), 0.003359657704287739), - Pair.create(new TourStartAndDuration(6, 7, 120.0, 180.0), 0.005963896679549981), - Pair.create(new TourStartAndDuration(6, 7, 180.0, 240.0), 0.006376396116305889), - Pair.create(new TourStartAndDuration(6, 7, 240.0, 300.0), 0.011553162434249647), - Pair.create(new TourStartAndDuration(6, 7, 300.0, 360.0), 0.01216390369869719), - Pair.create(new TourStartAndDuration(6, 7, 360.0, 420.0), 0.015303642980241483), - Pair.create(new TourStartAndDuration(6, 7, 420.0, 480.0), 0.01894502604909179), - Pair.create(new TourStartAndDuration(6, 7, 480.0, 540.0), 0.026995818384739457), - Pair.create(new TourStartAndDuration(6, 7, 540.0, 600.0), 0.03735238580259259), - Pair.create(new TourStartAndDuration(6, 7, 600.0, 660.0), 0.02007351137947408), - Pair.create(new TourStartAndDuration(6, 7, 660.0, 720.0), 0.007579189226621267), - Pair.create(new TourStartAndDuration(6, 7, 720.0, 780.0), 0.003806896198418994), - Pair.create(new TourStartAndDuration(6, 7, 780.0, 840.0), 0.0020371212990837376), - Pair.create(new TourStartAndDuration(6, 7, 840.0, 1080.0), 0.00246729057836831), - Pair.create(new TourStartAndDuration(7, 8, 0.0, 30.0), 0.007834929725170775), - Pair.create(new TourStartAndDuration(7, 8, 30.0, 60.0), 0.007875284751511802), - Pair.create(new TourStartAndDuration(7, 8, 60.0, 90.0), 0.0056369706407995695), - Pair.create(new TourStartAndDuration(7, 8, 90.0, 120.0), 0.007252792818630801), - Pair.create(new TourStartAndDuration(7, 8, 120.0, 180.0), 0.011595289158181222), - Pair.create(new TourStartAndDuration(7, 8, 180.0, 240.0), 0.01584695155572567), - Pair.create(new TourStartAndDuration(7, 8, 240.0, 300.0), 0.019385993489144607), - Pair.create(new TourStartAndDuration(7, 8, 300.0, 360.0), 0.01804569113072999), - Pair.create(new TourStartAndDuration(7, 8, 360.0, 420.0), 0.020338168968415053), - Pair.create(new TourStartAndDuration(7, 8, 420.0, 480.0), 0.03244941203821404), - Pair.create(new TourStartAndDuration(7, 8, 480.0, 540.0), 0.046986423884473), - Pair.create(new TourStartAndDuration(7, 8, 540.0, 600.0), 0.026127574804977814), - Pair.create(new TourStartAndDuration(7, 8, 600.0, 660.0), 0.006859707180170414), - Pair.create(new TourStartAndDuration(7, 8, 660.0, 720.0), 0.004053368732850601), - Pair.create(new TourStartAndDuration(7, 8, 720.0, 780.0), 0.0017728320836715625), - Pair.create(new TourStartAndDuration(7, 8, 780.0, 840.0), 0.0008117046283836942), - Pair.create(new TourStartAndDuration(7, 8, 840.0, 1080.0), 0.0014889766393137468), - Pair.create(new TourStartAndDuration(8, 9, 0.0, 30.0), 0.008702611915372131), - Pair.create(new TourStartAndDuration(8, 9, 30.0, 60.0), 0.009703391735884857), - Pair.create(new TourStartAndDuration(8, 9, 60.0, 90.0), 0.00833249802530372), - Pair.create(new TourStartAndDuration(8, 9, 90.0, 120.0), 0.008160824294542027), - Pair.create(new TourStartAndDuration(8, 9, 120.0, 180.0), 0.014522058792957903), - Pair.create(new TourStartAndDuration(8, 9, 180.0, 240.0), 0.019189639247661674), - Pair.create(new TourStartAndDuration(8, 9, 240.0, 300.0), 0.022628081955363144), - Pair.create(new TourStartAndDuration(8, 9, 300.0, 360.0), 0.018168175275565253), - Pair.create(new TourStartAndDuration(8, 9, 360.0, 420.0), 0.01830766579908246), - Pair.create(new TourStartAndDuration(8, 9, 420.0, 480.0), 0.022414786327228577), - Pair.create(new TourStartAndDuration(8, 9, 480.0, 540.0), 0.015454698179801149), - Pair.create(new TourStartAndDuration(8, 9, 540.0, 600.0), 0.00743339793333549), - Pair.create(new TourStartAndDuration(8, 9, 600.0, 660.0), 0.0028959167218627997), - Pair.create(new TourStartAndDuration(8, 9, 660.0, 720.0), 0.0011608823477359163), - Pair.create(new TourStartAndDuration(8, 9, 720.0, 780.0), 0.0006126324367099846), - Pair.create(new TourStartAndDuration(8, 9, 780.0, 840.0), 0.0007090395380022889), - Pair.create(new TourStartAndDuration(8, 9, 840.0, 1080.0), 0.0009650931773638335), - Pair.create(new TourStartAndDuration(9, 10, 0.0, 30.0), 0.010532384705529854), - Pair.create(new TourStartAndDuration(9, 10, 30.0, 60.0), 0.010106787618396446), - Pair.create(new TourStartAndDuration(9, 10, 60.0, 90.0), 0.007305519187631069), - Pair.create(new TourStartAndDuration(9, 10, 90.0, 120.0), 0.0065298278976416635), - Pair.create(new TourStartAndDuration(9, 10, 120.0, 180.0), 0.012991661099288086), - Pair.create(new TourStartAndDuration(9, 10, 180.0, 240.0), 0.011082392048301831), - Pair.create(new TourStartAndDuration(9, 10, 240.0, 300.0), 0.013735041027849332), - Pair.create(new TourStartAndDuration(9, 10, 300.0, 360.0), 0.012921165569106639), - Pair.create(new TourStartAndDuration(9, 10, 360.0, 420.0), 0.010187951930469277), - Pair.create(new TourStartAndDuration(9, 10, 420.0, 480.0), 0.0070071162811467125), - Pair.create(new TourStartAndDuration(9, 10, 480.0, 540.0), 0.003478434072337058), - Pair.create(new TourStartAndDuration(9, 10, 540.0, 600.0), 0.002487434148850001), - Pair.create(new TourStartAndDuration(9, 10, 600.0, 660.0), 0.0007617139935295275), - Pair.create(new TourStartAndDuration(9, 10, 660.0, 720.0), 0.0004794259473854554), - Pair.create(new TourStartAndDuration(9, 10, 720.0, 780.0), 0.00011828408353297643), - Pair.create(new TourStartAndDuration(9, 10, 780.0, 840.0), 0.0009221448817170415), - Pair.create(new TourStartAndDuration(10, 11, 0.0, 30.0), 0.0053803765038808364), - Pair.create(new TourStartAndDuration(10, 11, 30.0, 60.0), 0.00748440387556175), - Pair.create(new TourStartAndDuration(10, 11, 60.0, 90.0), 0.003817044622559703), - Pair.create(new TourStartAndDuration(10, 11, 90.0, 120.0), 0.0042559767658946045), - Pair.create(new TourStartAndDuration(10, 11, 120.0, 180.0), 0.004633517730561146), - Pair.create(new TourStartAndDuration(10, 11, 180.0, 240.0), 0.0040156278424527785), - Pair.create(new TourStartAndDuration(10, 11, 240.0, 300.0), 0.004097425621422603), - Pair.create(new TourStartAndDuration(10, 11, 300.0, 360.0), 0.00534407493573042), - Pair.create(new TourStartAndDuration(10, 11, 360.0, 420.0), 0.002849425985304954), - Pair.create(new TourStartAndDuration(10, 11, 420.0, 480.0), 0.0024443772372422234), - Pair.create(new TourStartAndDuration(10, 11, 480.0, 540.0), 0.0011258612568464076), - Pair.create(new TourStartAndDuration(10, 11, 540.0, 600.0), 0.0005966047093584399), - Pair.create(new TourStartAndDuration(10, 11, 600.0, 660.0), 0.0005779388889435179), - Pair.create(new TourStartAndDuration(10, 11, 660.0, 720.0), 0.0004527621290439082), - Pair.create(new TourStartAndDuration(10, 11, 720.0, 780.0), 0.00011727646428602624), - Pair.create(new TourStartAndDuration(10, 11, 780.0, 840.0), 0.00011130198744577025), - Pair.create(new TourStartAndDuration(11, 12, 0.0, 30.0), 0.0025301846046864363), - Pair.create(new TourStartAndDuration(11, 12, 30.0, 60.0), 0.002932856090944951), - Pair.create(new TourStartAndDuration(11, 12, 60.0, 90.0), 0.0015297442159744696), - Pair.create(new TourStartAndDuration(11, 12, 90.0, 120.0), 0.0016816440829740813), - Pair.create(new TourStartAndDuration(11, 12, 120.0, 180.0), 0.0023140070407952395), - Pair.create(new TourStartAndDuration(11, 12, 180.0, 240.0), 0.0013768767086426792), - Pair.create(new TourStartAndDuration(11, 12, 240.0, 300.0), 0.0019019317686819275), - Pair.create(new TourStartAndDuration(11, 12, 300.0, 360.0), 0.0015577691125463963), - Pair.create(new TourStartAndDuration(11, 12, 360.0, 420.0), 0.001499121306916632), - Pair.create(new TourStartAndDuration(11, 12, 420.0, 480.0), 0.0007361366421130972), - Pair.create(new TourStartAndDuration(11, 12, 480.0, 540.0), 0.0007423049940853575), - Pair.create(new TourStartAndDuration(11, 12, 540.0, 600.0), 0.00011130198744577025), - Pair.create(new TourStartAndDuration(11, 12, 660.0, 720.0), 0.00024243947114654707), - Pair.create(new TourStartAndDuration(11, 12, 720.0, 780.0), 0.000261579996858755), - Pair.create(new TourStartAndDuration(12, 13, 0.0, 30.0), 0.0021669594044717543), - Pair.create(new TourStartAndDuration(12, 13, 30.0, 60.0), 0.0033993161916113994), - Pair.create(new TourStartAndDuration(12, 13, 60.0, 90.0), 0.001870484877697732), - Pair.create(new TourStartAndDuration(12, 13, 90.0, 120.0), 0.0008448185262884799), - Pair.create(new TourStartAndDuration(12, 13, 120.0, 180.0), 0.002024573233571085), - Pair.create(new TourStartAndDuration(12, 13, 180.0, 240.0), 0.0021888099857994042), - Pair.create(new TourStartAndDuration(12, 13, 240.0, 300.0), 0.0021657834323017752), - Pair.create(new TourStartAndDuration(12, 13, 300.0, 360.0), 0.0010623089332746248), - Pair.create(new TourStartAndDuration(12, 13, 360.0, 420.0), 0.0006268095760401356), - Pair.create(new TourStartAndDuration(12, 13, 420.0, 480.0), 0.0005094532977538987), - Pair.create(new TourStartAndDuration(12, 13, 480.0, 540.0), 0.0004744090926784203), - Pair.create(new TourStartAndDuration(12, 13, 540.0, 600.0), 0.00016487328572417658), - Pair.create(new TourStartAndDuration(12, 13, 660.0, 720.0), 0.0001162996982120756), - Pair.create(new TourStartAndDuration(13, 14, 0.0, 30.0), 0.0033401411497772818), - Pair.create(new TourStartAndDuration(13, 14, 30.0, 60.0), 0.002492685695459365), - Pair.create(new TourStartAndDuration(13, 14, 60.0, 90.0), 0.0027064477589805068), - Pair.create(new TourStartAndDuration(13, 14, 90.0, 120.0), 0.0018052297053924354), - Pair.create(new TourStartAndDuration(13, 14, 120.0, 180.0), 0.0027984509294891498), - Pair.create(new TourStartAndDuration(13, 14, 180.0, 240.0), 0.0022758505657711914), - Pair.create(new TourStartAndDuration(13, 14, 240.0, 300.0), 0.0003535503655144059), - Pair.create(new TourStartAndDuration(13, 14, 300.0, 360.0), 0.0005890430396050117), - Pair.create(new TourStartAndDuration(13, 14, 360.0, 420.0), 0.0002319134363595028), - Pair.create(new TourStartAndDuration(13, 14, 420.0, 480.0), 0.00011617748025141993), - Pair.create(new TourStartAndDuration(13, 14, 480.0, 540.0), 0.0003690064941818713), - Pair.create(new TourStartAndDuration(13, 14, 540.0, 600.0), 0.0001650495071007077), - Pair.create(new TourStartAndDuration(13, 14, 600.0, 660.0), 0.00023113252306835525), - Pair.create(new TourStartAndDuration(13, 14, 840.0, 1080.0), 0.00017239206443126303), - Pair.create(new TourStartAndDuration(14, 15, 0.0, 30.0), 0.003543871129770451), - Pair.create(new TourStartAndDuration(14, 15, 30.0, 60.0), 0.0018407982276338393), - Pair.create(new TourStartAndDuration(14, 15, 60.0, 90.0), 0.0010649270862293423), - Pair.create(new TourStartAndDuration(14, 15, 90.0, 120.0), 0.0009538696044712171), - Pair.create(new TourStartAndDuration(14, 15, 120.0, 180.0), 0.0021318639289119572), - Pair.create(new TourStartAndDuration(14, 15, 180.0, 240.0), 0.0019740243143620277), - Pair.create(new TourStartAndDuration(14, 15, 240.0, 300.0), 0.0006157677659961421), - Pair.create(new TourStartAndDuration(14, 15, 300.0, 360.0), 0.0004035374922773149), - Pair.create(new TourStartAndDuration(14, 15, 360.0, 420.0), 0.00011607019237524387), - Pair.create(new TourStartAndDuration(14, 15, 420.0, 480.0), 0.0003938282727195195), - Pair.create(new TourStartAndDuration(14, 15, 480.0, 540.0), 0.00011130198744577025), - Pair.create(new TourStartAndDuration(14, 15, 600.0, 660.0), 0.00011942109323430472), - Pair.create(new TourStartAndDuration(15, 16, 0.0, 30.0), 0.00254340964132742), - Pair.create(new TourStartAndDuration(15, 16, 30.0, 60.0), 0.0017847751078888892), - Pair.create(new TourStartAndDuration(15, 16, 60.0, 90.0), 0.000841891386995212), - Pair.create(new TourStartAndDuration(15, 16, 90.0, 120.0), 0.0003543852337006742), - Pair.create(new TourStartAndDuration(15, 16, 120.0, 180.0), 0.0013974221085794884), - Pair.create(new TourStartAndDuration(15, 16, 180.0, 240.0), 0.0006229273683665316), - Pair.create(new TourStartAndDuration(15, 16, 240.0, 300.0), 0.00020579571489011056), - Pair.create(new TourStartAndDuration(15, 16, 300.0, 360.0), 0.0004809214516599411), - Pair.create(new TourStartAndDuration(15, 16, 360.0, 420.0), 0.00022514291890117063), - Pair.create(new TourStartAndDuration(15, 16, 420.0, 480.0), 0.00014748146383900364), - Pair.create(new TourStartAndDuration(15, 16, 720.0, 780.0), 0.00011605559293173729), - Pair.create(new TourStartAndDuration(16, 17, 0.0, 30.0), 0.0019634787835054656), - Pair.create(new TourStartAndDuration(16, 17, 30.0, 60.0), 0.000860670737476427), - Pair.create(new TourStartAndDuration(16, 17, 60.0, 90.0), 0.0003550148096943092), - Pair.create(new TourStartAndDuration(16, 17, 90.0, 120.0), 0.000855728546868917), - Pair.create(new TourStartAndDuration(16, 17, 120.0, 180.0), 0.0009283998993093458), - Pair.create(new TourStartAndDuration(16, 17, 180.0, 240.0), 0.00022795178106384156), - Pair.create(new TourStartAndDuration(16, 17, 240.0, 300.0), 0.00024119874825349313), - Pair.create(new TourStartAndDuration(16, 17, 420.0, 480.0), 0.00023429279224671318), - Pair.create(new TourStartAndDuration(16, 17, 480.0, 540.0), 0.00011727269965059726), - Pair.create(new TourStartAndDuration(16, 17, 660.0, 720.0), 0.00011130198744577025), - Pair.create(new TourStartAndDuration(17, 18, 0.0, 30.0), 0.0017099830161073832), - Pair.create(new TourStartAndDuration(17, 18, 30.0, 60.0), 0.0006015092064895483), - Pair.create(new TourStartAndDuration(17, 18, 60.0, 90.0), 0.00011819436012345105), - Pair.create(new TourStartAndDuration(17, 18, 90.0, 120.0), 0.0002279569151752547), - Pair.create(new TourStartAndDuration(17, 18, 120.0, 180.0), 0.0006440525787748041), - Pair.create(new TourStartAndDuration(17, 18, 180.0, 240.0), 0.0003142746964600832), - Pair.create(new TourStartAndDuration(17, 18, 300.0, 360.0), 0.00022788575876606104), - Pair.create(new TourStartAndDuration(17, 18, 360.0, 420.0), 0.0004761806298753505), - Pair.create(new TourStartAndDuration(17, 18, 480.0, 540.0), 0.00011727269965059726), - Pair.create(new TourStartAndDuration(18, 19, 0.0, 30.0), 0.0020011795184968267), - Pair.create(new TourStartAndDuration(18, 19, 30.0, 60.0), 0.00023620950461199452), - Pair.create(new TourStartAndDuration(18, 19, 60.0, 90.0), 0.00011935825257957617), - Pair.create(new TourStartAndDuration(18, 19, 90.0, 120.0), 0.00011130198744577025), - Pair.create(new TourStartAndDuration(18, 19, 120.0, 180.0), 0.00012222981614916706), - Pair.create(new TourStartAndDuration(18, 19, 180.0, 240.0), 0.0002377005397786721), - Pair.create(new TourStartAndDuration(18, 19, 240.0, 300.0), 0.00026373526728965034), - Pair.create(new TourStartAndDuration(18, 19, 300.0, 360.0), 0.000256086036315955), - Pair.create(new TourStartAndDuration(18, 19, 360.0, 420.0), 0.00011394287938236544), - Pair.create(new TourStartAndDuration(19, 24, 0.0, 30.0), 0.0021116872169622083), - Pair.create(new TourStartAndDuration(19, 24, 30.0, 60.0), 0.0003681765715703113), - Pair.create(new TourStartAndDuration(19, 24, 60.0, 90.0), 0.0004137833254678062), - Pair.create(new TourStartAndDuration(19, 24, 90.0, 120.0), 0.00025108497234833097), - Pair.create(new TourStartAndDuration(19, 24, 120.0, 180.0), 0.0007576827338029722), - Pair.create(new TourStartAndDuration(19, 24, 180.0, 240.0), 0.0005180490039062906), - Pair.create(new TourStartAndDuration(19, 24, 240.0, 300.0), 0.0004944106124208977), - Pair.create(new TourStartAndDuration(19, 24, 300.0, 360.0), 0.0002278857587658224) - )); - + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 0.0, 30.0), 0.0002666800577200411)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 30.0, 60.0), 0.0006395055678719748)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 60.0, 90.0), 0.0007110769046958423)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 90.0, 120.0), 0.0006665961628449491)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 120.0, 180.0), 0.0023195866923785575)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 180.0, 240.0), 0.00261751319938476)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 240.0, 300.0), 0.0021430032453503087)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 300.0, 360.0), 0.0029303876579925905)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 360.0, 420.0), 0.00283576618143643)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 420.0, 480.0), 0.0027188265347502893)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 480.0, 540.0), 0.002597768116531099)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 540.0, 600.0), 0.002659151494701916)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 600.0, 660.0), 0.0021738406044924437)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 660.0, 720.0), 0.0021949848461843176)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 720.0, 780.0), 0.0021801193011023083)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 780.0, 840.0), 0.001746033717539671)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(0, 4, 840.0, 1080.0), 0.00350888397405923)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 0.0, 30.0), 0.0006845643884312735)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 30.0, 60.0), 0.0004003126952082357)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 60.0, 90.0), 0.0008155012585632697)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 90.0, 120.0), 0.0010930534970200114)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 120.0, 180.0), 0.0011760353713952051)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 180.0, 240.0), 0.0019364061980548415)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 240.0, 300.0), 0.002953452881036028)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 300.0, 360.0), 0.002589370165068672)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 360.0, 420.0), 0.0025604405819583055)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 420.0, 480.0), 0.0034319041631081476)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 480.0, 540.0), 0.0033480025727905907)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 540.0, 600.0), 0.002175717502193024)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 600.0, 660.0), 0.0028036478238686957)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 660.0, 720.0), 0.0028759635193342887)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 720.0, 780.0), 0.0017584406503249872)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 780.0, 840.0), 0.0016742001219093045)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(4, 5, 840.0, 1080.0), 0.0020658205220468245)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 0.0, 30.0), 0.0017247403950228777)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 30.0, 60.0), 0.003090998236080484)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 60.0, 90.0), 0.0015209554995803177)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 90.0, 120.0), 0.0016533392810110293)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 120.0, 180.0), 0.003732306124403562)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 180.0, 240.0), 0.004106247357091271)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 240.0, 300.0), 0.003188442431357427)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 300.0, 360.0), 0.005929370570550301)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 360.0, 420.0), 0.005992695595693005)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 420.0, 480.0), 0.006390572360276255)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 480.0, 540.0), 0.00993732232424166)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 540.0, 600.0), 0.007917613781985494)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 600.0, 660.0), 0.00753055040114282)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 660.0, 720.0), 0.004839531706746983)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 720.0, 780.0), 0.003571294178536547)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 780.0, 840.0), 0.0022261075091276465)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(5, 6, 840.0, 1080.0), 0.0020123396391017526)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 0.0, 30.0), 0.00553085745500388)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 30.0, 60.0), 0.005164301035284355)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 60.0, 90.0), 0.0034287284279468384)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 90.0, 120.0), 0.003359657704287739)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 120.0, 180.0), 0.005963896679549981)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 180.0, 240.0), 0.006376396116305889)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 240.0, 300.0), 0.011553162434249647)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 300.0, 360.0), 0.01216390369869719)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 360.0, 420.0), 0.015303642980241483)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 420.0, 480.0), 0.01894502604909179)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 480.0, 540.0), 0.026995818384739457)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 540.0, 600.0), 0.03735238580259259)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 600.0, 660.0), 0.02007351137947408)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 660.0, 720.0), 0.007579189226621267)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 720.0, 780.0), 0.003806896198418994)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 780.0, 840.0), 0.0020371212990837376)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(6, 7, 840.0, 1080.0), 0.00246729057836831)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 0.0, 30.0), 0.007834929725170775)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 30.0, 60.0), 0.007875284751511802)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 60.0, 90.0), 0.0056369706407995695)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 90.0, 120.0), 0.007252792818630801)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 120.0, 180.0), 0.011595289158181222)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 180.0, 240.0), 0.01584695155572567)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 240.0, 300.0), 0.019385993489144607)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 300.0, 360.0), 0.01804569113072999)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 360.0, 420.0), 0.020338168968415053)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 420.0, 480.0), 0.03244941203821404)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 480.0, 540.0), 0.046986423884473)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 540.0, 600.0), 0.026127574804977814)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 600.0, 660.0), 0.006859707180170414)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 660.0, 720.0), 0.004053368732850601)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 720.0, 780.0), 0.0017728320836715625)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 780.0, 840.0), 0.0008117046283836942)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(7, 8, 840.0, 1080.0), 0.0014889766393137468)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 0.0, 30.0), 0.008702611915372131)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 30.0, 60.0), 0.009703391735884857)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 60.0, 90.0), 0.00833249802530372)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 90.0, 120.0), 0.008160824294542027)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 120.0, 180.0), 0.014522058792957903)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 180.0, 240.0), 0.019189639247661674)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 240.0, 300.0), 0.022628081955363144)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 300.0, 360.0), 0.018168175275565253)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 360.0, 420.0), 0.01830766579908246)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 420.0, 480.0), 0.022414786327228577)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 480.0, 540.0), 0.015454698179801149)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 540.0, 600.0), 0.00743339793333549)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 600.0, 660.0), 0.0028959167218627997)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 660.0, 720.0), 0.0011608823477359163)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 720.0, 780.0), 0.0006126324367099846)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 780.0, 840.0), 0.0007090395380022889)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(8, 9, 840.0, 1080.0), 0.0009650931773638335)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 0.0, 30.0), 0.010532384705529854)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 30.0, 60.0), 0.010106787618396446)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 60.0, 90.0), 0.007305519187631069)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 90.0, 120.0), 0.0065298278976416635)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 120.0, 180.0), 0.012991661099288086)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 180.0, 240.0), 0.011082392048301831)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 240.0, 300.0), 0.013735041027849332)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 300.0, 360.0), 0.012921165569106639)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 360.0, 420.0), 0.010187951930469277)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 420.0, 480.0), 0.0070071162811467125)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 480.0, 540.0), 0.003478434072337058)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 540.0, 600.0), 0.002487434148850001)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 600.0, 660.0), 0.0007617139935295275)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 660.0, 720.0), 0.0004794259473854554)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 720.0, 780.0), 0.00011828408353297643)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(9, 10, 780.0, 840.0), 0.0009221448817170415)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 0.0, 30.0), 0.0053803765038808364)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 30.0, 60.0), 0.00748440387556175)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 60.0, 90.0), 0.003817044622559703)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 90.0, 120.0), 0.0042559767658946045)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 120.0, 180.0), 0.004633517730561146)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 180.0, 240.0), 0.0040156278424527785)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 240.0, 300.0), 0.004097425621422603)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 300.0, 360.0), 0.00534407493573042)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 360.0, 420.0), 0.002849425985304954)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 420.0, 480.0), 0.0024443772372422234)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 480.0, 540.0), 0.0011258612568464076)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 540.0, 600.0), 0.0005966047093584399)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 600.0, 660.0), 0.0005779388889435179)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 660.0, 720.0), 0.0004527621290439082)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 720.0, 780.0), 0.00011727646428602624)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(10, 11, 780.0, 840.0), 0.00011130198744577025)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 0.0, 30.0), 0.0025301846046864363)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 30.0, 60.0), 0.002932856090944951)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 60.0, 90.0), 0.0015297442159744696)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 90.0, 120.0), 0.0016816440829740813)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 120.0, 180.0), 0.0023140070407952395)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 180.0, 240.0), 0.0013768767086426792)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 240.0, 300.0), 0.0019019317686819275)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 300.0, 360.0), 0.0015577691125463963)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 360.0, 420.0), 0.001499121306916632)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 420.0, 480.0), 0.0007361366421130972)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 480.0, 540.0), 0.0007423049940853575)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 540.0, 600.0), 0.00011130198744577025)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 660.0, 720.0), 0.00024243947114654707)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(11, 12, 720.0, 780.0), 0.000261579996858755)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 0.0, 30.0), 0.0021669594044717543)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 30.0, 60.0), 0.0033993161916113994)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 60.0, 90.0), 0.001870484877697732)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 90.0, 120.0), 0.0008448185262884799)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 120.0, 180.0), 0.002024573233571085)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 180.0, 240.0), 0.0021888099857994042)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 240.0, 300.0), 0.0021657834323017752)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 300.0, 360.0), 0.0010623089332746248)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 360.0, 420.0), 0.0006268095760401356)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 420.0, 480.0), 0.0005094532977538987)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 480.0, 540.0), 0.0004744090926784203)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 540.0, 600.0), 0.00016487328572417658)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(12, 13, 660.0, 720.0), 0.0001162996982120756)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 0.0, 30.0), 0.0033401411497772818)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 30.0, 60.0), 0.002492685695459365)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 60.0, 90.0), 0.0027064477589805068)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 90.0, 120.0), 0.0018052297053924354)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 120.0, 180.0), 0.0027984509294891498)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 180.0, 240.0), 0.0022758505657711914)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 240.0, 300.0), 0.0003535503655144059)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 300.0, 360.0), 0.0005890430396050117)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 360.0, 420.0), 0.0002319134363595028)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 420.0, 480.0), 0.00011617748025141993)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 480.0, 540.0), 0.0003690064941818713)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 540.0, 600.0), 0.0001650495071007077)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 600.0, 660.0), 0.00023113252306835525)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(13, 14, 840.0, 1080.0), 0.00017239206443126303)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 0.0, 30.0), 0.003543871129770451)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 30.0, 60.0), 0.0018407982276338393)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 60.0, 90.0), 0.0010649270862293423)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 90.0, 120.0), 0.0009538696044712171)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 120.0, 180.0), 0.0021318639289119572)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 180.0, 240.0), 0.0019740243143620277)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 240.0, 300.0), 0.0006157677659961421)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 300.0, 360.0), 0.0004035374922773149)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 360.0, 420.0), 0.00011607019237524387)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 420.0, 480.0), 0.0003938282727195195)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 480.0, 540.0), 0.00011130198744577025)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(14, 15, 600.0, 660.0), 0.00011942109323430472)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 0.0, 30.0), 0.00254340964132742)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 30.0, 60.0), 0.0017847751078888892)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 60.0, 90.0), 0.000841891386995212)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 90.0, 120.0), 0.0003543852337006742)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 120.0, 180.0), 0.0013974221085794884)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 180.0, 240.0), 0.0006229273683665316)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 240.0, 300.0), 0.00020579571489011056)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 300.0, 360.0), 0.0004809214516599411)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 360.0, 420.0), 0.00022514291890117063)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 420.0, 480.0), 0.00014748146383900364)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(15, 16, 720.0, 780.0), 0.00011605559293173729)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 0.0, 30.0), 0.0019634787835054656)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 30.0, 60.0), 0.000860670737476427)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 60.0, 90.0), 0.0003550148096943092)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 90.0, 120.0), 0.000855728546868917)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 120.0, 180.0), 0.0009283998993093458)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 180.0, 240.0), 0.00022795178106384156)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 240.0, 300.0), 0.00024119874825349313)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 420.0, 480.0), 0.00023429279224671318)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 480.0, 540.0), 0.00011727269965059726)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(16, 17, 660.0, 720.0), 0.00011130198744577025)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 0.0, 30.0), 0.0017099830161073832)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 30.0, 60.0), 0.0006015092064895483)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 60.0, 90.0), 0.00011819436012345105)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 90.0, 120.0), 0.0002279569151752547)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 120.0, 180.0), 0.0006440525787748041)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 180.0, 240.0), 0.0003142746964600832)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 300.0, 360.0), 0.00022788575876606104)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 360.0, 420.0), 0.0004761806298753505)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(17, 18, 480.0, 540.0), 0.00011727269965059726)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 0.0, 30.0), 0.0020011795184968267)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 30.0, 60.0), 0.00023620950461199452)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 60.0, 90.0), 0.00011935825257957617)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 90.0, 120.0), 0.00011130198744577025)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 120.0, 180.0), 0.00012222981614916706)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 180.0, 240.0), 0.0002377005397786721)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 240.0, 300.0), 0.00026373526728965034)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 300.0, 360.0), 0.000256086036315955)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(18, 19, 360.0, 420.0), 0.00011394287938236544)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 0.0, 30.0), 0.0021116872169622083)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 30.0, 60.0), 0.0003681765715703113)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 60.0, 90.0), 0.0004137833254678062)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 90.0, 120.0), 0.00025108497234833097)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 120.0, 180.0), 0.0007576827338029722)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 180.0, 240.0), 0.0005180490039062906)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 240.0, 300.0), 0.0004944106124208977)); + tourDurationProbabilityDistribution.add(Pair.create(new TourStartAndDuration(19, 24, 300.0, 360.0), 0.0002278857587658224)); } else throw new IllegalArgumentException("Unknown small scale commercial traffic type: " + smallScaleCommercialTrafficType); + + return new EnumeratedDistribution<>(rng, tourDurationProbabilityDistribution); } /** From d7ad71df84e69cf8ba9a5e4a7916abda5ec25ef9 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 14 May 2024 16:31:25 +0200 Subject: [PATCH 15/77] make output files of the class configurable --- ...CreateDataDistributionOfStructureData.java | 18 ++++---- .../prepare/LanduseBuildingAnalysis.java | 8 ++-- .../TrafficVolumeGenerationTest.java | 44 +++++++++---------- .../TripDistributionMatrixTest.java | 20 ++++----- .../prepare/LanduseBuildingAnalysisTest.java | 12 ++--- ...teDataDistributionOfStructureDataTest.java | 3 +- 6 files changed, 54 insertions(+), 51 deletions(-) diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java index c9ce08fe9b3..70352d923dc 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java @@ -35,8 +35,11 @@ private enum LanduseConfiguration { useOnlyOSMLanduse, useOSMBuildingsAndLanduse } - @CommandLine.Option(names = "--pathOutput", description = "Path for the output", defaultValue = "output/TestDistributionClass") - private Path output; + @CommandLine.Option(names = "--outputFacilityFile", description = "Path for the outputFacilityFile", defaultValue = "output/TestDistributionClass/commercialFacilities.xml.gz") + private Path outputFacilityFile; + + @CommandLine.Option(names = "--outputDataDistributionFile", description = "Path for the outputDataDistributionFile", defaultValue = "output/TestDistributionClass/dataDistributionPerZone.csv") + private Path outputDataDistributionFile; @CommandLine.Option(names = "--landuseConfiguration", description = "Set option of used OSM data. Options: useOnlyOSMLanduse, useOSMBuildingsAndLanduse, useExistingDataDistribution", defaultValue = "useOSMBuildingsAndLanduse") private LanduseConfiguration usedLanduseConfiguration; @@ -112,13 +115,13 @@ public Integer call() throws Exception { ShpOptions.Index indexInvestigationAreaRegions = SmallScaleCommercialTrafficUtils.getIndexRegions(shapeFileRegionsPath, shapeCRS, regionsShapeRegionColumn); - if(Files.notExists(output)) - new File(output.toString()).mkdir(); + if(Files.notExists(outputFacilityFile.getParent())) + new File(outputFacilityFile.toString()).mkdir(); landuseCategoriesAndDataConnection = landuseDataConnectionCreator.createLanduseDataConnection(); Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration.toString(), indexLanduse, indexZones, indexBuildings, indexInvestigationAreaRegions, shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); @@ -127,11 +130,10 @@ public Integer call() throws Exception { ActivityFacilitiesFactory facilitiesFactory = facilities.getFactory(); calculateAreaSharesOfTheFacilities(facilities, facilitiesFactory); - Path facilityOutput = output.resolve("commercialFacilities.xml.gz"); - log.info("Created {} facilities, writing to {}", facilities.getFacilities().size(), facilityOutput); + log.info("Created {} facilities, writing to {}", facilities.getFacilities().size(), outputFacilityFile); FacilitiesWriter writer = new FacilitiesWriter(facilities); - writer.write(facilityOutput.toString()); + writer.write(outputFacilityFile.toString()); return 0; } diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java index d26f95bde07..aad6ad43804 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java @@ -57,19 +57,19 @@ public class LanduseBuildingAnalysis { * Creates a distribution of the given input data for each zone based on the * used OSM data. */ - public static Map> createInputDataDistribution(Path output, + public static Map> createInputDataDistribution(Path outputDataDistributionFile, Map> landuseCategoriesAndDataConnection, String usedLanduseConfiguration, Index indexLanduse, Index indexZones, Index indexBuildings, Index indexInvestigationAreaRegions, String shapeFileZoneNameColumn, Map>> buildingsPerZone, - Path pathToInvestigationAreaData, String shapeFileBuildingTypeColumn) + Path pathToInvestigationAreaData, + String shapeFileBuildingTypeColumn) throws IOException { Map> resultingDataPerZone = new HashMap<>(); Map zoneIdRegionConnection = new HashMap<>(); - Path outputFileInOutputFolder = output.resolve("dataDistributionPerZone.csv"); log.info("New analyze for data distribution is started. The used method is: {}", usedLanduseConfiguration); Map> landuseCategoriesPerZone = new HashMap<>(); @@ -83,7 +83,7 @@ public static Map> createInputDataDistribution( createResultingDataForLanduseInZones(landuseCategoriesPerZone, investigationAreaData, resultingDataPerZone, landuseCategoriesAndDataConnection, zoneIdRegionConnection); - writeResultOfDataDistribution(resultingDataPerZone, outputFileInOutputFolder, + writeResultOfDataDistribution(resultingDataPerZone, outputDataDistributionFile, zoneIdRegionConnection); diff --git a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java index fc0bbe878cf..7b843362a20 100644 --- a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java +++ b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java @@ -59,8 +59,8 @@ void testTrafficVolumeGenerationCommercialPersonTraffic() throws IOException { Map>> buildingsPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String shapeFileZoneNameColumn = "name"; @@ -70,7 +70,7 @@ void testTrafficVolumeGenerationCommercialPersonTraffic() throws IOException { Map> landuseCategoriesAndDataConnection = landuseDataConnectionCreator.createLanduseDataConnection(); Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, SCTUtils.getIndexLanduse(inputDataDirectory), SCTUtils.getZoneIndex(inputDataDirectory), SCTUtils.getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); @@ -83,9 +83,9 @@ void testTrafficVolumeGenerationCommercialPersonTraffic() throws IOException { TrafficVolumeGeneration.setInputParameters(usedTrafficType); Map> trafficVolumePerTypeAndZone_start = TrafficVolumeGeneration - .createTrafficVolume_start(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_start(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map> trafficVolumePerTypeAndZone_stop = TrafficVolumeGeneration - .createTrafficVolume_stop(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_stop(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Assertions.assertEquals(3, trafficVolumePerTypeAndZone_start.size()); Assertions.assertEquals(3, trafficVolumePerTypeAndZone_stop.size()); @@ -138,9 +138,9 @@ void testTrafficVolumeGenerationCommercialPersonTraffic() throws IOException { //test with different sample sample = 0.25; trafficVolumePerTypeAndZone_start = TrafficVolumeGeneration - .createTrafficVolume_start(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_start(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); trafficVolumePerTypeAndZone_stop = TrafficVolumeGeneration - .createTrafficVolume_stop(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_stop(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Assertions.assertEquals(3, trafficVolumePerTypeAndZone_start.size()); Assertions.assertEquals(3, trafficVolumePerTypeAndZone_stop.size()); @@ -190,8 +190,8 @@ void testTrafficVolumeGenerationGoodsTraffic() throws IOException { Map>> buildingsPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String shapeFileZoneNameColumn = "name"; @@ -201,7 +201,7 @@ void testTrafficVolumeGenerationGoodsTraffic() throws IOException { Map> landuseCategoriesAndDataConnection = landuseDataConnectionCreator.createLanduseDataConnection(); Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, SCTUtils.getIndexLanduse(inputDataDirectory), SCTUtils.getZoneIndex(inputDataDirectory), SCTUtils.getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); @@ -213,9 +213,9 @@ void testTrafficVolumeGenerationGoodsTraffic() throws IOException { TrafficVolumeGeneration.setInputParameters(usedTrafficType); Map> trafficVolumePerTypeAndZone_start = TrafficVolumeGeneration - .createTrafficVolume_start(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_start(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map> trafficVolumePerTypeAndZone_stop = TrafficVolumeGeneration - .createTrafficVolume_stop(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_stop(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Assertions.assertEquals(15, trafficVolumePerTypeAndZone_start.size()); Assertions.assertEquals(15, trafficVolumePerTypeAndZone_stop.size()); @@ -514,8 +514,8 @@ void testAddingExistingScenariosWithSample() throws Exception { void testReducingDemandAfterAddingExistingScenarios_goods() throws Exception { Map>> buildingsPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String networkPath = "https://raw.githubusercontent.com/matsim-org/matsim-libs/master/examples/scenarios/freight-chessboard-9x9/grid9x9.xml"; @@ -542,15 +542,15 @@ void testReducingDemandAfterAddingExistingScenarios_goods() throws Exception { Map>> facilitiesPerZone = new HashMap<>(); Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, SCTUtils.getIndexLanduse(inputDataDirectory), SCTUtils.getZoneIndex(inputDataDirectory), SCTUtils.getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); Map> trafficVolumePerTypeAndZone_start = TrafficVolumeGeneration - .createTrafficVolume_start(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_start(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map> trafficVolumePerTypeAndZone_stop = TrafficVolumeGeneration - .createTrafficVolume_stop(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_stop(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map, Link>> linksPerZone = GenerateSmallScaleCommercialTrafficDemand .filterLinksForZones(scenario, SCTUtils.getZoneIndex(inputDataDirectory), facilitiesPerZone, shapeFileZoneNameColumn); @@ -680,8 +680,8 @@ void testReducingDemandAfterAddingExistingScenarios_commercialPersonTraffic() th Map>> buildingsPerZone = new HashMap<>(); Map>> facilitiesPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String networkPath = "https://raw.githubusercontent.com/matsim-org/matsim-libs/master/examples/scenarios/freight-chessboard-9x9/grid9x9.xml"; @@ -708,15 +708,15 @@ void testReducingDemandAfterAddingExistingScenarios_commercialPersonTraffic() th Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, SCTUtils.getIndexLanduse(inputDataDirectory), SCTUtils.getZoneIndex(inputDataDirectory), SCTUtils.getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); Map> trafficVolumePerTypeAndZone_start = TrafficVolumeGeneration - .createTrafficVolume_start(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_start(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map> trafficVolumePerTypeAndZone_stop = TrafficVolumeGeneration - .createTrafficVolume_stop(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_stop(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map, Link>> regionLinksMap = GenerateSmallScaleCommercialTrafficDemand .filterLinksForZones(scenario, SCTUtils.getZoneIndex(inputDataDirectory), facilitiesPerZone, shapeFileZoneNameColumn); diff --git a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java index 90870d2ceff..278e2b06f1b 100644 --- a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java +++ b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java @@ -54,8 +54,8 @@ void testTripDistributionCommercialPersonTrafficTraffic() throws IOException { Map> landuseCategoriesAndDataConnection = new HashMap<>(); Map>> buildingsPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String networkLocation = "https://raw.githubusercontent.com/matsim-org/matsim-libs/master/examples/scenarios/freight-chessboard-9x9/grid9x9.xml"; @@ -65,7 +65,7 @@ void testTripDistributionCommercialPersonTrafficTraffic() throws IOException { Path pathToInvestigationAreaData = Path.of(utils.getPackageInputDirectory()).resolve("investigationAreaData.csv"); Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, getIndexLanduse(inputDataDirectory), getZoneIndex(inputDataDirectory), getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); @@ -78,9 +78,9 @@ void testTripDistributionCommercialPersonTrafficTraffic() throws IOException { TrafficVolumeGeneration.setInputParameters(usedTrafficType); Map> trafficVolumePerTypeAndZone_start = TrafficVolumeGeneration - .createTrafficVolume_start(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_start(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map> trafficVolumePerTypeAndZone_stop = TrafficVolumeGeneration - .createTrafficVolume_stop(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_stop(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); ArrayList listOfZones = new ArrayList<>( List.of("area1", "area2", "area3")); final TripDistributionMatrix odMatrix = TripDistributionMatrix.Builder .newInstance(getZoneIndex(inputDataDirectory), trafficVolumePerTypeAndZone_start, trafficVolumePerTypeAndZone_stop, usedTrafficType, @@ -146,8 +146,8 @@ void testTripDistributionGoodsTraffic() throws IOException { Map> landuseCategoriesAndDataConnection = new HashMap<>(); Map>> buildingsPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String networkLocation = "https://raw.githubusercontent.com/matsim-org/matsim-libs/master/examples/scenarios/freight-chessboard-9x9/grid9x9.xml"; @@ -157,7 +157,7 @@ void testTripDistributionGoodsTraffic() throws IOException { Path pathToInvestigationAreaData = Path.of(utils.getPackageInputDirectory()).resolve("investigationAreaData.csv"); Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, getIndexLanduse(inputDataDirectory), getZoneIndex(inputDataDirectory), getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); @@ -173,9 +173,9 @@ void testTripDistributionGoodsTraffic() throws IOException { TrafficVolumeGeneration.setInputParameters(usedTrafficType); Map> trafficVolumePerTypeAndZone_start = TrafficVolumeGeneration - .createTrafficVolume_start(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_start(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); Map> trafficVolumePerTypeAndZone_stop = TrafficVolumeGeneration - .createTrafficVolume_stop(resultingDataPerZone, output, sample, modesORvehTypes, usedTrafficType); + .createTrafficVolume_stop(resultingDataPerZone, outputDataDistributionFile.getParent(), sample, modesORvehTypes, usedTrafficType); final TripDistributionMatrix odMatrix = TripDistributionMatrix.Builder .newInstance(getZoneIndex(inputDataDirectory), trafficVolumePerTypeAndZone_start, trafficVolumePerTypeAndZone_stop, usedTrafficType, listOfZones).build(); diff --git a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java index d380e832ddb..812d282e5ec 100644 --- a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java +++ b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java @@ -47,8 +47,8 @@ public class LanduseBuildingAnalysisTest { void testReadOfDataDistributionPerZoneAndBuildingAnalysis() throws IOException { Map>> buildingsPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()).getParent(); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String shapeFileZoneNameColumn = "name"; @@ -59,7 +59,7 @@ void testReadOfDataDistributionPerZoneAndBuildingAnalysis() throws IOException { // Test if the reading of the existing data distribution works correctly Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, SCTUtils.getIndexLanduse(inputDataDirectory), SCTUtils.getZoneIndex(inputDataDirectory), SCTUtils.getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); @@ -241,8 +241,8 @@ void testReadOfDataDistributionPerZoneAndBuildingAnalysis() throws IOException { void testLanduseDistribution() throws IOException { Map>> buildingsPerZone = new HashMap<>(); - Path output = Path.of(utils.getOutputDirectory()); - assert(new File(output.resolve("calculatedData").toString()).mkdir()); + Path outputDataDistributionFile = Path.of(utils.getOutputDirectory()).resolve("dataDistributionPerZone.csv"); + assert(new File(outputDataDistributionFile.getParent().resolve("calculatedData").toString()).mkdir()); Path inputDataDirectory = Path.of(utils.getPackageInputDirectory()).getParent(); String usedLanduseConfiguration = "useOSMBuildingsAndLanduse"; String shapeFileZoneNameColumn = "name"; @@ -253,7 +253,7 @@ void testLanduseDistribution() throws IOException { // Analyze resultingData per zone Map> resultingDataPerZone = LanduseBuildingAnalysis - .createInputDataDistribution(output, landuseCategoriesAndDataConnection, + .createInputDataDistribution(outputDataDistributionFile, landuseCategoriesAndDataConnection, usedLanduseConfiguration, SCTUtils.getIndexLanduse(inputDataDirectory), SCTUtils.getZoneIndex(inputDataDirectory), SCTUtils.getIndexBuildings(inputDataDirectory), SCTUtils.getIndexRegions(inputDataDirectory), shapeFileZoneNameColumn, buildingsPerZone, pathToInvestigationAreaData, shapeFileBuildingTypeColumn); diff --git a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/RunCreateDataDistributionOfStructureDataTest.java b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/RunCreateDataDistributionOfStructureDataTest.java index 1953bec4914..d24ee4b31bb 100644 --- a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/RunCreateDataDistributionOfStructureDataTest.java +++ b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/RunCreateDataDistributionOfStructureDataTest.java @@ -37,7 +37,8 @@ void testDataDistributionOfStructureData() throws MalformedURLException { String investigationAreaData = Path.of(utils.getPackageInputDirectory()).getParent().resolve("investigationAreaData.csv").toString(); new CreateDataDistributionOfStructureData().execute( - "--pathOutput", utils.getOutputDirectory(), + "--outputFacilityFile", utils.getOutputDirectory() + "/commercialFacilities.xml.gz", + "--outputDataDistributionFile", utils.getOutputDirectory() + "/dataDistributionPerZone.csv", "--landuseConfiguration", useOSMBuildingsAndLanduse, "--regionsShapeFileName", regionsShapeFileName, "--regionsShapeRegionColumn", regionsShapeRegionColumn, From f6233227f015090f0fb8f76961b365c9aa236c30 Mon Sep 17 00:00:00 2001 From: simei94 <67737999+simei94@users.noreply.github.com> Date: Wed, 15 May 2024 09:47:55 +0200 Subject: [PATCH 16/77] add trip filter for trip start OR end in shp area (#3269) --- .../java/org/matsim/simwrapper/SimWrapper.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contribs/simwrapper/src/main/java/org/matsim/simwrapper/SimWrapper.java b/contribs/simwrapper/src/main/java/org/matsim/simwrapper/SimWrapper.java index 028d6d6949f..19a8717ba7e 100644 --- a/contribs/simwrapper/src/main/java/org/matsim/simwrapper/SimWrapper.java +++ b/contribs/simwrapper/src/main/java/org/matsim/simwrapper/SimWrapper.java @@ -120,6 +120,15 @@ boolean hasDashboard(Class d, String context) { * Generate the dashboards specification and writes .yaml files to {@code dir}. */ public void generate(Path dir) throws IOException { + generate(dir, false); + } + + /** + * Generate the dashboards specification and writes .yaml files to {@code dir}. + * @param dir target directory + * @param append if true, existing dashboards will not be overwritten + */ + public void generate(Path dir, boolean append) throws IOException { ObjectMapper mapper = new ObjectMapper(new YAMLFactory() .disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER) @@ -157,6 +166,11 @@ public void generate(Path dir) throws IOException { yaml.subtabs = layout.getTabs(); Path out = dir.resolve("dashboard-" + i + ".yaml"); + + while (append && Files.exists(out)) { + out = dir.resolve("dashboard-" + ++i + ".yaml"); + } + writer.writeValue(out.toFile(), yaml); i++; From 1a75b4d9995a32bc67ad671c333e156c7c214b57 Mon Sep 17 00:00:00 2001 From: simei94 <67737999+simei94@users.noreply.github.com> Date: Wed, 15 May 2024 19:15:01 +0200 Subject: [PATCH 17/77] read first 5 lines of csv to check delimiter (#3271) --- .../application/options/CsvOptions.java | 54 +++++++++++++------ .../application/options/CsvOptionsTest.java | 4 +- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/contribs/application/src/main/java/org/matsim/application/options/CsvOptions.java b/contribs/application/src/main/java/org/matsim/application/options/CsvOptions.java index 1b2d6575450..74c25f3a96b 100644 --- a/contribs/application/src/main/java/org/matsim/application/options/CsvOptions.java +++ b/contribs/application/src/main/java/org/matsim/application/options/CsvOptions.java @@ -23,7 +23,7 @@ public final class CsvOptions { @CommandLine.Option(names = "--csv-format", description = "CSV Format", defaultValue = "Default") private CSVFormat.Predefined csvFormat; - @CommandLine.Option(names = "--csv-delimiter", description = "CSV Delimiter", required = false) + @CommandLine.Option(names = "--csv-delimiter", description = "CSV Delimiter") private Character csvDelimiter; @CommandLine.Option(names = "--csv-charset", description = "CSV input encoding", defaultValue = "UTF8") @@ -56,24 +56,48 @@ public CsvOptions(CSVFormat.Predefined csvFormat, Character csvDelimiter, Charse */ public static Character detectDelimiter(String path) throws IOException { try (BufferedReader reader = IOUtils.getBufferedReader(path)) { - String firstLine = reader.readLine(); + int[] comma = new int[5]; + int[] semicolon = new int[5]; + int[] tab = new int[5]; + String[] lines = new String[5]; + +// check five first lines for separator chars. It might be that the csv file has additional info in the first x lines (e.g. EPSG) + for (int i = 0; i < 5; i++) { + lines[i] = reader.readLine(); + if (lines[i] == null) { + comma[i] = 0; + semicolon[i] = 0; + tab[i] = 0; + } else { + comma[i] = StringUtils.countMatches(lines[i], ","); + semicolon[i] = StringUtils.countMatches(lines[i], ";"); + tab[i] = StringUtils.countMatches(lines[i], "\t"); + } + } - int comma = StringUtils.countMatches(firstLine, ","); - int semicolon = StringUtils.countMatches(firstLine, ";"); - int tab = StringUtils.countMatches(firstLine, "\t"); + Integer index = null; - if (comma == 0 && semicolon == 0 && tab == 0) { - throw new IllegalArgumentException("No delimiter found in the first line of the file."); + for (int i = 0; i < comma.length - 1; i++) { +// only check next index if line with separators was not found + if (index == null) { + if (!(comma[i] == 0 && semicolon[i] == 0 && tab[i] == 0)) { + index = i; + } + } } - // Comma is preferred as the more likely format - if (comma >= semicolon && comma >= tab) { - return ','; - } else if (tab >= semicolon) - return '\t'; - else - return ';'; - } + if (index == null) { + throw new IllegalArgumentException("No delimiter found in the first line of the file."); + } else { + // Comma is preferred as the more likely format + if (comma[index] >= semicolon[index] && comma[index] >= tab[index]) { + return ','; + } else if (tab[index] >= semicolon[index]) + return '\t'; + else + return ';'; + } + } } /** diff --git a/contribs/application/src/test/java/org/matsim/application/options/CsvOptionsTest.java b/contribs/application/src/test/java/org/matsim/application/options/CsvOptionsTest.java index a406deca398..70452d23138 100644 --- a/contribs/application/src/test/java/org/matsim/application/options/CsvOptionsTest.java +++ b/contribs/application/src/test/java/org/matsim/application/options/CsvOptionsTest.java @@ -37,10 +37,12 @@ void output() throws IOException { printer.printRecord("header", "column"); printer.printRecord("1", "2"); + printer.printRecord("3", "4"); + printer.printRecord("5", "6"); printer.close(); assertThat(tmp) - .hasContent("header" + delimiter + "column\n1" + delimiter + "2"); + .hasContent("header" + delimiter + "column\n1" + delimiter + "2" + "\n3" + delimiter + "4" + "\n5" + delimiter + "6"); assertThat(delimiter).isEqualTo(CsvOptions.detectDelimiter(tmp.toString()).toString()); } From a9cdc5b4d77d3b3211ed9567f63ae2ae2111fc46 Mon Sep 17 00:00:00 2001 From: Paul Heinrich Date: Thu, 16 May 2024 15:22:07 +0200 Subject: [PATCH 18/77] inline abstract module attributes and get rid of them --- .../matsim/core/controler/AbstractModule.java | 53 +++++++------------ 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/matsim/src/main/java/org/matsim/core/controler/AbstractModule.java b/matsim/src/main/java/org/matsim/core/controler/AbstractModule.java index d6d3eb94efa..fcf5feeefa8 100644 --- a/matsim/src/main/java/org/matsim/core/controler/AbstractModule.java +++ b/matsim/src/main/java/org/matsim/core/controler/AbstractModule.java @@ -76,25 +76,10 @@ public abstract class AbstractModule implements Module { private Binder binder; - private Multibinder eventHandlerMultibinder; - private Multibinder controlerListenerMultibinder; - - /** - * Contents retrieved (I think) by injected method QSim#addQueueSimulationListeners(...). Is not public, and therefore cannot be referenced from here. - *
- * I think that that method will be called every time the mobsim will be constructed. If the injected classes are singletons, they will - * presumably be re-used, otherwise they will be newly constructed. - */ - private Multibinder mobsimListenerMultibinder; - - private Multibinder snapshotWriterMultibinder; - private MapBinder, AttributeConverter> attributeConverterMapBinder; - private Multibinder qsimModulesMultibinder; @Inject com.google.inject.Injector bootstrapInjector; private Config config; - private Multibinder qsimOverridingModulesMultibinder; public AbstractModule() { // config will be injected later @@ -121,17 +106,13 @@ public final void configure(Binder binder) { private void initializeMultibinders() { // We do need to make these calls here in order to register the multi binders. Otherwise, guice doesn't know, that they exist. In particular, // if none of the corresponding addXXXBinding methods was called, the set binder would not be registered, and guice would complain. - this.mobsimListenerMultibinder = Multibinder.newSetBinder(this.binder, MobsimListener.class); - this.snapshotWriterMultibinder = Multibinder.newSetBinder(this.binder, SnapshotWriter.class); - this.eventHandlerMultibinder = Multibinder.newSetBinder(this.binder, EventHandler.class); - this.controlerListenerMultibinder = Multibinder.newSetBinder(this.binder, ControlerListener.class); - this.attributeConverterMapBinder = - MapBinder.newMapBinder( - this.binder, - new TypeLiteral>(){}, - new TypeLiteral>() {} ); - this.qsimModulesMultibinder = Multibinder.newSetBinder(this.binder, AbstractQSimModule.class); - this.qsimOverridingModulesMultibinder = Multibinder.newSetBinder( this.binder, AbstractQSimModule.class, Names.named( "overridesFromAbstractModule" ) ); + Multibinder.newSetBinder(this.binder, MobsimListener.class); + Multibinder.newSetBinder(this.binder, SnapshotWriter.class); + Multibinder.newSetBinder(this.binder, EventHandler.class); + Multibinder.newSetBinder(this.binder, ControlerListener.class); + MapBinder.newMapBinder(this.binder, new TypeLiteral>(){}, new TypeLiteral>() {} ); + Multibinder.newSetBinder(this.binder, AbstractQSimModule.class); + Multibinder.newSetBinder( this.binder, AbstractQSimModule.class, Names.named( "overridesFromAbstractModule" ) ); } public abstract void install(); @@ -146,21 +127,21 @@ protected final void install(Module module) { } protected final LinkedBindingBuilder addEventHandlerBinding() { - return eventHandlerMultibinder.addBinding(); + return Multibinder.newSetBinder(this.binder, EventHandler.class).addBinding(); } protected final void installQSimModule(AbstractQSimModule qsimModule) { - qsimModulesMultibinder.addBinding().toInstance(qsimModule); + Multibinder.newSetBinder(this.binder, AbstractQSimModule.class).addBinding().toInstance(qsimModule); } protected final void installOverridingQSimModule(AbstractQSimModule qsimModule) { - qsimOverridingModulesMultibinder.addBinding().toInstance(qsimModule); + Multibinder.newSetBinder( this.binder, AbstractQSimModule.class, Names.named( "overridesFromAbstractModule" ) ).addBinding().toInstance(qsimModule); } /** * @see ControlerListener */ protected final LinkedBindingBuilder addControlerListenerBinding() { - return controlerListenerMultibinder.addBinding(); + return Multibinder.newSetBinder(this.binder, ControlerListener.class).addBinding(); } /** @@ -182,16 +163,22 @@ protected final com.google.inject.binder.LinkedBindingBuilder + * I think that that method will be called every time the mobsim will be constructed. If the injected classes are singletons, they will + * presumably be re-used, otherwise they will be newly constructed. + */ protected final com.google.inject.binder.LinkedBindingBuilder addMobsimListenerBinding() { - return mobsimListenerMultibinder.addBinding(); + return Multibinder.newSetBinder(this.binder, MobsimListener.class).addBinding(); } protected final com.google.inject.binder.LinkedBindingBuilder addSnapshotWriterBinding() { - return snapshotWriterMultibinder.addBinding(); + return Multibinder.newSetBinder(this.binder, SnapshotWriter.class).addBinding(); } protected final LinkedBindingBuilder> addAttributeConverterBinding(final Class clazz ) { - return attributeConverterMapBinder.addBinding( clazz ); + return MapBinder.newMapBinder(this.binder, new TypeLiteral>(){}, new TypeLiteral>() {} ).addBinding( clazz ); } /** * @deprecated better use {@link #addTravelDisutilityFactoryBinding(String)}. From 48bda59fc768c761bd7cc53cac3523e7c5e3e56e Mon Sep 17 00:00:00 2001 From: marecabo <23156476+marecabo@users.noreply.github.com> Date: Thu, 16 May 2024 16:55:44 +0200 Subject: [PATCH 19/77] Allow for storing multiple DrtOptimizationConstraintsParams --- .../examples/RunJointDemandDRTExample.java | 6 +- .../edrt/run/EDrtModeOptimizerQSimModule.java | 7 +- .../extension/fiss/RunFissDrtScenarioIT.java | 10 +-- .../eshifts/run/RunEShiftDrtScenarioIT.java | 2 +- .../run/RunMultiHubShiftDrtScenarioIT.java | 2 +- .../shifts/run/RunShiftDrtScenarioIT.java | 2 +- .../DrtAnalysisControlerListener.java | 8 ++- .../impl/PessimisticDrtEstimator.java | 2 +- .../optimizer/DrtModeOptimizerQSimModule.java | 7 +- .../contrib/drt/routing/DrtRouteCreator.java | 9 ++- .../contrib/drt/run/DrtConfigGroup.java | 64 +++++++++++++------ .../contrib/drt/run/DrtModeRoutingModule.java | 3 +- .../run/DrtOptimizationConstraintsParams.java | 8 ++- .../optimizer/MaxDetourConstraintTest.java | 14 ++-- .../insertion/DrtPoolingParameterTest.java | 6 +- .../prebooking/ComplexUnschedulerTest.java | 2 +- .../prebooking/PrebookingTestEnvironment.java | 6 +- .../drt/routing/DrtRoutingModuleTest.java | 11 ++-- .../drt/run/examples/RunDrtExampleIT.java | 6 +- .../RunOldDrtConfigCompatibilityIT.java | 2 +- .../teleportation/DrtTeleportationTest.java | 2 +- .../contrib/taxi/run/MultiModeTaxiModule.java | 12 ++-- .../drtAndPt/PtAlongALine2Test.java | 27 ++++---- .../drtAndPt/PtAlongALineTest.java | 16 ++--- 24 files changed, 141 insertions(+), 93 deletions(-) diff --git a/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java b/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java index 4379075dc79..4888f4fc1c7 100644 --- a/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java +++ b/contribs/commercialTrafficApplications/src/main/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/examples/RunJointDemandDRTExample.java @@ -141,9 +141,9 @@ private static void loadConfigGroups(Config config) { MultiModeDrtConfigGroup multiModeDrtConfigGroup = ConfigUtils.addOrGetModule(config, MultiModeDrtConfigGroup.class); DrtConfigGroup drtCfg = new DrtConfigGroup(); - drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime = 2 * 3600; - drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 5; - drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 15 * 60; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = 2 * 3600; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 5; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 15 * 60; drtCfg.stopDuration = 60; drtCfg.vehiclesFile = "jointDemand_vehicles.xml"; multiModeDrtConfigGroup.addParameterSet(drtCfg); diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java index 5333231bd6a..2ddc571d467 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/EDrtModeOptimizerQSimModule.java @@ -147,7 +147,9 @@ public EmptyVehicleChargingScheduler get() { bindModal(VehicleEntry.EntryFactory.class).toProvider( EDrtVehicleDataEntryFactory.EDrtVehicleDataEntryFactoryProvider.class).asEagerSingleton(); - bindModal(CostCalculationStrategy.class).to(drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated ? + bindModal(CostCalculationStrategy.class) + .to(drtCfg.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated + ? CostCalculationStrategy.RejectSoftConstraintViolations.class : CostCalculationStrategy.DiscourageSoftConstraintViolations.class).asEagerSingleton(); @@ -179,7 +181,8 @@ public EmptyVehicleRelocator get() { getter.getModal(StopTimeCalculator.class), scheduleWaitBeforeDrive))) .asEagerSingleton(); - bindModal(DefaultOfferAcceptor.class).toProvider(modalProvider(getter -> new DefaultOfferAcceptor(drtCfg.getDrtOptimizationConstraintsParam().maxAllowedPickupDelay))); + bindModal(DefaultOfferAcceptor.class).toProvider(modalProvider(getter -> new DefaultOfferAcceptor( + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxAllowedPickupDelay))); bindModal(DrtOfferAcceptor.class).to(modalKey(DefaultOfferAcceptor.class)); bindModal(ScheduleTimingUpdater.class).toProvider(modalProvider( diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java index 29f2a9b006d..2e464f161a7 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/fiss/RunFissDrtScenarioIT.java @@ -53,16 +53,16 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.5; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 10. * 60.; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.5; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = 600.; - drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = true; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = 600.; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = true; drtConfigGroup.useModeFilteredSubnetwork = false; drtConfigGroup.vehiclesFile = fleetFile; drtConfigGroup.operationalScheme = DrtConfigGroup.OperationalScheme.door2door; drtConfigGroup.plotDetailedCustomerStats = true; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxWalkDistance = 1000.; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxWalkDistance = 1000.; drtConfigGroup.idleVehiclesReturnToDepots = false; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java index 6f4e8ceb392..b4648770172 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/eshifts/run/RunEShiftDrtScenarioIT.java @@ -57,7 +57,7 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDefaultDrtOptimizationConstraintsParam(); constraintsParam.maxTravelTimeAlpha = 1.5; constraintsParam.maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java index 49033927906..053211ec458 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunMultiHubShiftDrtScenarioIT.java @@ -46,7 +46,7 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDefaultDrtOptimizationConstraintsParam(); constraintsParam.maxTravelTimeAlpha = 1.5; constraintsParam.maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java index f794e546c51..e9674eb0d29 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunShiftDrtScenarioIT.java @@ -47,7 +47,7 @@ void test() { DrtConfigGroup drtConfigGroup = drtWithShiftsConfigGroup; drtConfigGroup.mode = TransportMode.drt; - DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDefaultDrtOptimizationConstraintsParam(); constraintsParam.maxTravelTimeAlpha = 1.5; constraintsParam.maxTravelTimeBeta = 10. * 60.; drtConfigGroup.stopDuration = 30.; diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java index 3cc19b7a938..8cb77352196 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtAnalysisControlerListener.java @@ -400,7 +400,7 @@ private void writeAndPlotWaitTimeEstimateComparison(Collection pe if (createChart) { final JFreeChart chart2 = DensityScatterPlots.createPlot("Wait times", "Actual wait time [s]", "Initially planned wait time [s]", - times, Pair.of(0., drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime)); + times, Pair.of(0., drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWaitTime)); // xAxis.setLowerBound(0); // yAxis.setLowerBound(0); ChartUtils.writeChartAsPNG(new FileOutputStream(plotFileName), chart2, 1500, 1500); @@ -664,11 +664,13 @@ private static void analyseDetours(Network network, List legs, Map new DefaultOfferAcceptor(drtCfg.getDrtOptimizationConstraintsParam().maxAllowedPickupDelay))); + bindModal(DefaultOfferAcceptor.class).toProvider(modalProvider(getter -> new DefaultOfferAcceptor( + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxAllowedPickupDelay))); bindModal(DrtOfferAcceptor.class).to(modalKey(DefaultOfferAcceptor.class)); bindModal(ScheduleTimingUpdater.class).toProvider(modalProvider( diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java index c19a631ac44..12c757f1ea0 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DrtRouteCreator.java @@ -61,7 +61,8 @@ public DrtRouteCreator(DrtConfigGroup drtCfg, Network modalNetwork, * @return maximum travel time */ static double getMaxTravelTime(DrtConfigGroup drtCfg, double unsharedRideTime) { - return drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha * unsharedRideTime + drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta; + return drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha * unsharedRideTime + + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta; } /** @@ -72,7 +73,9 @@ static double getMaxTravelTime(DrtConfigGroup drtCfg, double unsharedRideTime) { * @return maximum ride time */ static double getMaxRideTime(DrtConfigGroup drtCfg, double unsharedRideTime) { - return Math.min(unsharedRideTime + drtCfg.getDrtOptimizationConstraintsParam().maxAbsoluteDetour, drtCfg.getDrtOptimizationConstraintsParam().maxDetourAlpha * unsharedRideTime + drtCfg.getDrtOptimizationConstraintsParam().maxDetourBeta); + return Math.min(unsharedRideTime + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxAbsoluteDetour, + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxDetourAlpha * unsharedRideTime + + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxDetourBeta); } public Route createRoute(double departureTime, Link accessActLink, Link egressActLink, Person person, @@ -89,7 +92,7 @@ public Route createRoute(double departureTime, Link accessActLink, Link egressAc route.setTravelTime(maxTravelTime); route.setMaxRideTime(maxRideDuration); route.setDirectRideTime(unsharedRideTime); - route.setMaxWaitTime(drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime); + route.setMaxWaitTime(drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWaitTime); if (this.drtCfg.storeUnsharedPath) { route.setUnsharedPath(unsharedPath); diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java index 687b48b16fc..f8fa7690a0b 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtConfigGroup.java @@ -19,11 +19,12 @@ package org.matsim.contrib.drt.run; -import com.google.common.base.Preconditions; -import com.google.common.base.Verify; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Positive; +import java.util.Collection; +import java.util.List; +import java.util.Optional; + +import javax.annotation.Nullable; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.TransportMode; @@ -43,14 +44,16 @@ import org.matsim.contrib.dvrp.router.DvrpModeRoutingNetworkModule; import org.matsim.contrib.dvrp.run.Modal; import org.matsim.core.config.Config; +import org.matsim.core.config.groups.QSimConfigGroup.EndtimeInterpretation; import org.matsim.core.config.groups.RoutingConfigGroup; import org.matsim.core.config.groups.ScoringConfigGroup; -import javax.annotation.Nullable; -import java.util.Collection; -import java.util.Optional; +import com.google.common.base.Preconditions; +import com.google.common.base.Verify; -import static org.matsim.core.config.groups.QSimConfigGroup.EndtimeInterpretation; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; public class DrtConfigGroup extends ReflectiveConfigGroupWithConfigurableParameterSets implements Modal { private static final Logger log = LogManager.getLogger(DrtConfigGroup.class); @@ -64,9 +67,6 @@ public static DrtConfigGroup getSingleModeDrtConfig(Config config) { return drtConfigGroups.iterator().next(); } - @NotNull - private DrtOptimizationConstraintsParams drtOptimizationConstraintsParams; - @Parameter @Comment("Mode which will be handled by PassengerEngine and VrpOptimizer (passengers'/customers' perspective)") @NotBlank @@ -187,8 +187,7 @@ public DrtConfigGroup() { private void initSingletonParameterSets() { //drt optimization constraints - addDefinition(DrtOptimizationConstraintsParams.SET_NAME, DrtOptimizationConstraintsParams::new, - () -> drtOptimizationConstraintsParams, params -> drtOptimizationConstraintsParams = (DrtOptimizationConstraintsParams) params); + getDefaultDrtOptimizationConstraintsParam(); //rebalancing (optional) addDefinition(RebalancingParams.SET_NAME, RebalancingParams::new, () -> rebalancingParams, @@ -248,7 +247,7 @@ public void handleAddUnknownParam(final String paramName, final String value) { case "maxAllowedPickupDelay": case "rejectRequestIfMaxWaitOrTravelTimeViolated": case "maxWalkDistance": - getDrtOptimizationConstraintsParam().addParam(paramName, value); + getDefaultDrtOptimizationConstraintsParam().addParam(paramName, value); break; default: super.handleAddUnknownParam(paramName, value); @@ -269,7 +268,11 @@ protected void checkConsistency(Config config) { + "attempting to travel without vehicles being available."); } - Verify.verify(drtOptimizationConstraintsParams.maxWaitTime >= stopDuration, "maxWaitTime must not be smaller than stopDuration"); + List drtOptimizationConstraintsParams = getDrtOptimizationConstraintsParams(); + for (DrtOptimizationConstraintsParams params : drtOptimizationConstraintsParams) { + Verify.verify(params.maxWaitTime >= stopDuration, + "maxWaitTime must not be smaller than stopDuration"); + } Verify.verify(operationalScheme != OperationalScheme.stopbased || transitStopFile != null, "transitStopFile must not be null when operationalScheme is " + OperationalScheme.stopbased); @@ -302,6 +305,17 @@ protected void checkConsistency(Config config) { Verify.verify(drtSpeedUpParams == null, "Simulation type is estimateAndTeleport, but drtSpeedUpParams is set. " + "Please remove drtSpeedUpParams from the config, as these two functionalities are not compatible."); } + + Verify.verify(!drtOptimizationConstraintsParams.isEmpty(), + "At least one DrtOptimizationConstraintsParams is required."); + Verify.verify(drtOptimizationConstraintsParams.stream() + .anyMatch(params -> DrtOptimizationConstraintsParams.DEFAULT_PARAMS_NAME.equals(params.name)), + "Default DrtOptimizationConstraintsParams is required."); + Verify.verify(drtOptimizationConstraintsParams.stream() + .map(params -> params.name) + .distinct() + .count() == drtOptimizationConstraintsParams.size(), + "Cannot have DrtOptimizationConstraintsParams with identical names."); } @Override @@ -309,11 +323,23 @@ public String getMode() { return mode; } - public DrtOptimizationConstraintsParams getDrtOptimizationConstraintsParam() { - if (drtOptimizationConstraintsParams == null) { + public List getDrtOptimizationConstraintsParams() { + return getParameterSets(DrtOptimizationConstraintsParams.SET_NAME).stream() + .filter(DrtOptimizationConstraintsParams.class::isInstance) + .map(DrtOptimizationConstraintsParams.class::cast) + .toList(); + } + + public DrtOptimizationConstraintsParams getDefaultDrtOptimizationConstraintsParam() { + Optional drtOptParams = getDrtOptimizationConstraintsParams().stream() + .filter(params -> DrtOptimizationConstraintsParams.DEFAULT_PARAMS_NAME.equals(params.name)) + .findAny(); + if (drtOptParams.isEmpty()) { addParameterSet(new DrtOptimizationConstraintsParams()); } - return drtOptimizationConstraintsParams; + return getDrtOptimizationConstraintsParams().stream() + .filter(params -> DrtOptimizationConstraintsParams.DEFAULT_PARAMS_NAME.equals(params.name)) + .findAny().orElseThrow(); } public DrtInsertionSearchParams getDrtInsertionSearchParams() { diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java index af5916d028a..c57ae9c9eda 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtModeRoutingModule.java @@ -104,7 +104,8 @@ public void install() { .asEagerSingleton(); case stopbased, serviceAreaBased -> { bindModal( AccessEgressFacilityFinder.class ).toProvider( modalProvider( - getter -> new ClosestAccessEgressFacilityFinder( drtCfg.getDrtOptimizationConstraintsParam().maxWalkDistance, + getter -> new ClosestAccessEgressFacilityFinder( + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWalkDistance, getter.get( Network.class ), QuadTrees.createQuadTree( getter.getModal( DrtStopNetwork.class ).getDrtStops().values() ) ) ) ) .asEagerSingleton(); diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java index f3f1e1ed5f2..5b1393bd7fb 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/run/DrtOptimizationConstraintsParams.java @@ -2,6 +2,7 @@ import com.google.common.base.Verify; import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.PositiveOrZero; import org.matsim.core.config.Config; import org.matsim.core.config.ReflectiveConfigGroup; @@ -11,8 +12,13 @@ */ public class DrtOptimizationConstraintsParams extends ReflectiveConfigGroup { - public final static String SET_NAME = "drtOptimizationConstraints"; + public static final String SET_NAME = "drtOptimizationConstraints"; + public static final String DEFAULT_PARAMS_NAME = "default"; + @Parameter + @Comment("name of optimization params") + @NotBlank + public String name = DEFAULT_PARAMS_NAME; @Parameter @Comment("Max wait time for the bus to come (optimisation constraint).") diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java index 8722cc9e657..78777108bd2 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/MaxDetourConstraintTest.java @@ -36,17 +36,17 @@ public void testMaxDetourConstraint() { DrtConfigGroup drtConfigGroup = DrtConfigGroup.getSingleModeDrtConfig(config); // Max wait time - drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = 300; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = 300; // Turn on the max detour constraint - drtConfigGroup.getDrtOptimizationConstraintsParam().maxDetourAlpha = 1.5; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxDetourBeta = 300; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxAllowedPickupDelay = 180; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxAbsoluteDetour = 1200; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxDetourAlpha = 1.5; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxDetourBeta = 300; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxAllowedPickupDelay = 180; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxAbsoluteDetour = 1200; // Make the max total travel time constraints very loose (i.e., make it not active) - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 10; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 7200; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 10; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 7200; config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java index dfff04e67da..00f14a225ee 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/optimizer/insertion/DrtPoolingParameterTest.java @@ -225,9 +225,9 @@ private PersonEnterDrtVehicleEventHandler setupAndRunScenario(double maxWaitTime MultiModeDrtConfigGroup mm = ConfigUtils.addOrGetModule(config, MultiModeDrtConfigGroup.class); mm.getModalElements().forEach(x -> { - x.getDrtOptimizationConstraintsParam().maxWaitTime = maxWaitTime; - x.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = maxTravelTimeAlpha; - x.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = maxTravelTimeBeta; + x.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = maxWaitTime; + x.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = maxTravelTimeAlpha; + x.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = maxTravelTimeBeta; x.stopDuration = 1.; }); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java index 9f6b424da09..a15ccbbdc2b 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/ComplexUnschedulerTest.java @@ -626,7 +626,7 @@ private class Fixture { DrtConfigGroup drtConfig = new DrtConfigGroup(); drtConfig.stopDuration = 30.0; - drtConfig.getDrtOptimizationConstraintsParam().maxWaitTime = 600.0; + drtConfig.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = 600.0; this.entryFactory = new VehicleDataEntryFactoryImpl(); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java index e4cece58765..3ae97d93604 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTestEnvironment.java @@ -226,9 +226,9 @@ private void buildConfig(Config config) { DrtConfigGroup modeConfig = new DrtConfigGroup(); drtConfig.addParameterSet(modeConfig); modeConfig.mode = "drt"; - modeConfig.getDrtOptimizationConstraintsParam().maxWaitTime = maximumWaitTime; - modeConfig.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = detourRelative; - modeConfig.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = detourAbsolute; + modeConfig.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = maximumWaitTime; + modeConfig.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = detourRelative; + modeConfig.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = detourAbsolute; modeConfig.stopDuration = stopDuration; modeConfig.idleVehiclesReturnToDepots = false; modeConfig.vehiclesFile = null; diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java index f86bbeb7215..79baf22f08b 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/routing/DrtRoutingModuleTest.java @@ -80,9 +80,9 @@ void testCottbusClosestAccessEgressStopFinder() { DrtConfigGroup drtCfg = DrtConfigGroup.getSingleModeDrtConfig(scenario.getConfig()); String drtMode = "DrtX"; drtCfg.mode = drtMode; - drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.5; - drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5 * 60; - drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime = 5 * 60; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.5; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5 * 60; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = 5 * 60; ImmutableMap, DrtStopFacility> drtStops = scenario.getTransitSchedule() .getFacilities() @@ -91,7 +91,8 @@ void testCottbusClosestAccessEgressStopFinder() { .map(DrtStopFacilityImpl::createFromFacility) .collect(ImmutableMap.toImmutableMap(DrtStopFacility::getId, f -> f)); - AccessEgressFacilityFinder stopFinder = new ClosestAccessEgressFacilityFinder(drtCfg.getDrtOptimizationConstraintsParam().maxWalkDistance, + AccessEgressFacilityFinder stopFinder = new ClosestAccessEgressFacilityFinder( + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWalkDistance, scenario.getNetwork(), QuadTrees.createQuadTree(drtStops.values())); DrtRouteCreator drtRouteCreator = new DrtRouteCreator(drtCfg, scenario.getNetwork(), new SpeedyDijkstraFactory(), new FreeSpeedTravelTime(), TimeAsTravelDisutility::new); @@ -259,7 +260,7 @@ void testRouteDescriptionHandling() { private Scenario createTestScenario() { Config config = ConfigUtils.createConfig(); DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); - drtConfigGroup.getDrtOptimizationConstraintsParam().maxWalkDistance = 200; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxWalkDistance = 200; drtConfigGroup.transitStopFile = utils.getClassInputDirectory() + "testCottbus/drtstops.xml.gz"; MultiModeDrtConfigGroup multiModeDrtConfigGroup = new MultiModeDrtConfigGroup(); multiModeDrtConfigGroup.addParameterSet(drtConfigGroup); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java index 6b15ba1bc9e..75f0556d2be 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunDrtExampleIT.java @@ -90,7 +90,7 @@ void testRunDrtExampleWithNoRejections_ExtensiveSearch() { for (var drtCfg : MultiModeDrtConfigGroup.get(config).getModalElements()) { //disable rejections - drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; } config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); @@ -129,7 +129,7 @@ void testRunDrtExampleWithNoRejections_SelectiveSearch() { drtCfg.addParameterSet(selectiveInsertionSearchParams); //disable rejections - drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; } config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); @@ -168,7 +168,7 @@ void testRunDrtExampleWithNoRejections_RepeatedSelectiveSearch() { drtCfg.addParameterSet(repeatedSelectiveInsertionSearchParams); //disable rejections - drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; } config.controller().setLastIteration(3); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java index 506bb7503c2..bdf57656729 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/examples/RunOldDrtConfigCompatibilityIT.java @@ -41,7 +41,7 @@ void testRunDrtExampleWithNoRejections_ExtensiveSearch() { for (var drtCfg : MultiModeDrtConfigGroup.get(config).getModalElements()) { //disable rejections - drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; } config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.deleteDirectoryIfExists); diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java index 27dfd190989..716135d2c76 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/teleportation/DrtTeleportationTest.java @@ -46,7 +46,7 @@ void testTeleportationEngine() throws IOException { Controler controler = DrtControlerCreator.createControler(config, false); DrtConfigGroup drtConfigGroup = DrtConfigGroup.getSingleModeDrtConfig(config); - DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDrtOptimizationConstraintsParam(); + DrtOptimizationConstraintsParams constraintsParam = drtConfigGroup.getDefaultDrtOptimizationConstraintsParam(); constraintsParam.maxTravelTimeAlpha = 1.2; constraintsParam.maxTravelTimeBeta = 600; constraintsParam.maxWaitTime = 300; diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java b/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java index b4aa67762e0..d2330013b48 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/taxi/run/MultiModeTaxiModule.java @@ -66,16 +66,16 @@ public static DrtConfigGroup convertTaxiToDrtCfg(TaxiConfigGroup taxiCfg) { // Taxi optimisers do not reject, so time constraints are only used for routing plans (DrtRouteCreator). // Using some (relatively high) values as we do not know what values should be there. They can be adjusted // manually after the TaxiAsDrtConfigGroup config is created. - drtCfg.getDrtOptimizationConstraintsParam().maxWaitTime = 3600; - drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 2; - drtCfg.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 3600; - drtCfg.getDrtOptimizationConstraintsParam().maxAbsoluteDetour = Double.MAX_VALUE; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = 3600; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 2; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 3600; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxAbsoluteDetour = Double.MAX_VALUE; - drtCfg.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtCfg.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtCfg.changeStartLinkToLastLinkInSchedule = taxiCfg.changeStartLinkToLastLinkInSchedule; drtCfg.idleVehiclesReturnToDepots = false; drtCfg.operationalScheme = DrtConfigGroup.OperationalScheme.door2door; - drtCfg.getDrtOptimizationConstraintsParam().maxWalkDistance = Double.MAX_VALUE; + drtCfg.getDefaultDrtOptimizationConstraintsParam().maxWalkDistance = Double.MAX_VALUE; drtCfg.vehiclesFile = taxiCfg.taxisFile; drtCfg.transitStopFile = null; drtCfg.drtServiceAreaShapeFile = null; diff --git a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java index f99512782ef..e6f7e5d08ba 100644 --- a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java +++ b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALine2Test.java @@ -229,11 +229,12 @@ void testPtAlongALineWithRaptorAndDrtServiceArea() { { DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); drtConfigGroup.mode = TransportMode.drt; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 2.0; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 2.0; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfigGroup.stopDuration = 60.; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; - drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfigGroup + .getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfigGroup.useModeFilteredSubnetwork = true; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); @@ -243,11 +244,12 @@ void testPtAlongALineWithRaptorAndDrtServiceArea() { if (drt2) { DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); drtConfigGroup.mode = "drt2"; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfigGroup.stopDuration = 60.; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; - drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfigGroup + .getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfigGroup.useModeFilteredSubnetwork = true; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); @@ -256,11 +258,12 @@ void testPtAlongALineWithRaptorAndDrtServiceArea() { if (drt3) { DrtConfigGroup drtConfigGroup = new DrtConfigGroup(); drtConfigGroup.mode = "drt3"; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfigGroup.stopDuration = 60.; - drtConfigGroup.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; - drtConfigGroup.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfigGroup.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfigGroup + .getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfigGroup.useModeFilteredSubnetwork = true; drtConfigGroup.addParameterSet(new ExtensiveInsertionSearchParams()); diff --git a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java index fd92aafff84..0a57b27bcde 100644 --- a/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java +++ b/contribs/vsp/src/test/java/org/matsim/integration/drtAndPt/PtAlongALineTest.java @@ -110,10 +110,10 @@ void testDrtAlongALine() { DrtConfigGroup drtConfig = new DrtConfigGroup(); drtConfig.mode = "drt_A"; drtConfig.stopDuration = 60.; - drtConfig.getDrtOptimizationConstraintsParam().maxWaitTime = 900.; - drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; - drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 10. * 60.; - drtConfig.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfig.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = 900.; + drtConfig.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfig.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 10. * 60.; + drtConfig.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfig.changeStartLinkToLastLinkInSchedule = true; multiModeDrtCfg.addParameterSet(drtConfig); } @@ -247,11 +247,11 @@ void testPtAlongALineWithRaptorAndDrtStopFilterAttribute() { MultiModeDrtConfigGroup mm = ConfigUtils.addOrGetModule(config, MultiModeDrtConfigGroup.class); { DrtConfigGroup drtConfig = new DrtConfigGroup(); - drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; - drtConfig.getDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; + drtConfig.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeAlpha = 1.3; + drtConfig.getDefaultDrtOptimizationConstraintsParam().maxTravelTimeBeta = 5. * 60.; drtConfig.stopDuration = 60.; - drtConfig.getDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; - drtConfig.getDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; + drtConfig.getDefaultDrtOptimizationConstraintsParam().maxWaitTime = Double.MAX_VALUE; + drtConfig.getDefaultDrtOptimizationConstraintsParam().rejectRequestIfMaxWaitOrTravelTimeViolated = false; drtConfig.mode = TransportMode.drt; mm.addParameterSet(drtConfig); } From 543191c141470c862a7f36ba9bd02c60859e7c24 Mon Sep 17 00:00:00 2001 From: rakow Date: Thu, 16 May 2024 18:38:15 +0200 Subject: [PATCH 20/77] recognize EPSG:4326 as equal to WGS84 when using special coordinate transformations (#3276) --- .../prepare/network/CreateGeoJsonNetwork.java | 2 +- .../geometry/transformations/TransformationFactory.java | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/network/CreateGeoJsonNetwork.java b/contribs/application/src/main/java/org/matsim/application/prepare/network/CreateGeoJsonNetwork.java index cad4484624b..42eb4408fe9 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/network/CreateGeoJsonNetwork.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/network/CreateGeoJsonNetwork.java @@ -82,7 +82,7 @@ public Integer call() throws Exception { json.put("type", "FeatureCollection"); // Default CRS assumed to be 4326 - if (!networkCrs.equalsIgnoreCase("epsg:4326")) { + if (!crs.getTargetCRS().equalsIgnoreCase("epsg:4326")) { ObjectNode crs = json.putObject("crs"); putCrs(crs, networkCrs); } diff --git a/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/TransformationFactory.java b/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/TransformationFactory.java index 861a1c1f3cc..5398a117794 100644 --- a/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/TransformationFactory.java +++ b/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/TransformationFactory.java @@ -31,6 +31,7 @@ public abstract class TransformationFactory { public final static String WGS84 = "WGS84"; + public final static String EPSG4326 = "EPSG:4326"; public final static String ATLANTIS = "Atlantis"; public final static String CH1903_LV03 = "CH1903_LV03"; // switzerland public final static String CH1903_LV03_Plus = "CH1903_LV03_Plus"; // switzerland new @@ -40,7 +41,7 @@ public abstract class TransformationFactory { public final static String WGS84_UTM35S = "WGS84_UTM35S"; // South Africa (Gauteng) public final static String WGS84_UTM36S = "WGS84_UTM36S"; // South Africa (eThekwini, Kwazulu-Natal) public final static String WGS84_Albers = "WGS84_Albers"; // South Africa (Africa Albers Equal Conic) - public final static String WGS84_SA_Albers = "WGS84_SA_Albers"; // South Africa (Adapted version of Africa Albers Equal) + public final static String WGS84_SA_Albers = "WGS84_SA_Albers"; // South Africa (Adapted version of Africa Albers Equal) public final static String HARTEBEESTHOEK94_LO19 = "SA_Lo19"; // South Africa adaption of Transverse Mercator. Cape Town public final static String HARTEBEESTHOEK94_LO25 = "SA_Lo25"; // South Africa adaption of Transverse Mercator. Nelson Mandela Bay Metropolitan public final static String HARTEBEESTHOEK94_LO29 = "SA_Lo29"; // South Africa adaption of Transverse Mercator. General for SA as a whole, and Gauteng @@ -57,7 +58,7 @@ public abstract class TransformationFactory { public static final String WGS84_TM = "WGS84_TM"; //Singapore3 public static final String PCS_ITRF2000_TM_UOS = "PCS_ITRF2000_TM_UOS"; // South Korea - but used by University of Seoul - probably a wrong one... public static final String DHDN_SoldnerBerlin = "DHDN_SoldnerBerlin"; // Berlin - + /** * Returns a coordinate transformation to transform coordinates from one * coordinate system to another one. @@ -68,12 +69,12 @@ public abstract class TransformationFactory { */ public static CoordinateTransformation getCoordinateTransformation(final String fromSystem, final String toSystem) { if (fromSystem.equals(toSystem)) return new IdentityTransformation(); - if (WGS84.equals(fromSystem)) { + if (WGS84.equals(fromSystem) || EPSG4326.equalsIgnoreCase(fromSystem)) { if (CH1903_LV03.equals(toSystem)) return new WGS84toCH1903LV03(); if (CH1903_LV03_Plus.equals(toSystem)) return new WGS84toCH1903LV03Plus(); if (ATLANTIS.equals(toSystem)) return new WGS84toAtlantis(); } - if (WGS84.equals(toSystem)) { + if (WGS84.equals(toSystem) || EPSG4326.equalsIgnoreCase(toSystem)) { if (CH1903_LV03.equals(fromSystem)) return new CH1903LV03toWGS84(); if (CH1903_LV03_Plus.equals(fromSystem)) return new CH1903LV03PlustoWGS84(); if (GK4.equals(fromSystem)) return new GK4toWGS84(); From 07ba389d033dac2eb5b750f4fcfd0cf344d4fa1e Mon Sep 17 00:00:00 2001 From: marecabo <23156476+marecabo@users.noreply.github.com> Date: Fri, 17 May 2024 09:19:22 +0200 Subject: [PATCH 21/77] Add test --- .../contrib/drt/run/DrtConfigGroupTest.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 contribs/drt/src/test/java/org/matsim/contrib/drt/run/DrtConfigGroupTest.java diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/run/DrtConfigGroupTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/DrtConfigGroupTest.java new file mode 100644 index 00000000000..66187a54683 --- /dev/null +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/run/DrtConfigGroupTest.java @@ -0,0 +1,54 @@ +package org.matsim.contrib.drt.run; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.matsim.core.config.Config; +import org.matsim.core.config.ConfigUtils; + +import com.google.common.base.VerifyException; + +class DrtConfigGroupTest { + + @Test + void testHasDefaultDrtOptimizationConstraintsParam() { + Config config = ConfigUtils.createConfig(); + DrtConfigGroup drtConfig = new DrtConfigGroup(); + config.addModule(drtConfig); + + // get DrtOptimizationConstraintsParams + DrtOptimizationConstraintsParams params = drtConfig.getDefaultDrtOptimizationConstraintsParam(); + + Assertions.assertEquals(DrtOptimizationConstraintsParams.DEFAULT_PARAMS_NAME, params.name); + Assertions.assertDoesNotThrow(() -> drtConfig.checkConsistency(config)); + } + + @Test + void testMultipleDrtOptimizationConstraintsParams() { + Config config = ConfigUtils.createConfig(); + DrtConfigGroup drtConfig = new DrtConfigGroup(); + config.addModule(drtConfig); + + // add second DrtOptimizationConstraintsParams + DrtOptimizationConstraintsParams params = new DrtOptimizationConstraintsParams(); + params.name = "test"; + drtConfig.addParameterSet(params); + + Assertions.assertEquals(2, drtConfig.getDrtOptimizationConstraintsParams().size()); + Assertions.assertDoesNotThrow(() -> drtConfig.checkConsistency(config)); + } + + @Test + void testNoDuplicateDrtDrtOptimizationConstraintsParams() { + Config config = ConfigUtils.createConfig(); + DrtConfigGroup drtConfig = new DrtConfigGroup(); + config.addModule(drtConfig); + + // add second DrtOptimizationConstraintsParams with same name + DrtOptimizationConstraintsParams params = new DrtOptimizationConstraintsParams(); + params.name = DrtOptimizationConstraintsParams.DEFAULT_PARAMS_NAME; + drtConfig.addParameterSet(params); + + Assertions.assertEquals(2, drtConfig.getDrtOptimizationConstraintsParams().size()); + Assertions.assertThrows(VerifyException.class, () -> drtConfig.checkConsistency(config)); + } +} From e9e8ce08ad97b3c56e3db3d7a1afe874e056ab21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nico=20K=C3=BChnel?= Date: Fri, 17 May 2024 10:50:24 +0200 Subject: [PATCH 22/77] update to geotools 31 (resolve transitive dependency conflicts) (#3272) * update to geotools 31 * update geotools import statements * remove gt-opengis as it is discontinued --- .../accessibility/AccessibilityUtils.java | 2 +- .../contrib/accessibility/FeatureSHP.java | 8 ++++---- .../contrib/accessibility/GridUtils.java | 1 - .../contrib/accessibility/VoronoiExample.java | 2 +- .../accessibility/VoronoiGeometryUtils.java | 4 ++-- .../contrib/accessibility/gis/CRSUtils.java | 18 +++++++++--------- .../contrib/accessibility/gis/ZoneLayer.java | 6 +++--- .../accessibility/osm/CombinedOsmSink.java | 4 ++-- .../accessibility/osm/LandUseBuildingSink.java | 8 ++++---- .../accessibility/utils/GeoserverUpdater.java | 10 +++++----- .../AccidentsNetworkModification.java | 8 ++++---- .../analysis/christoph/TravelTimesWriter.java | 4 ++-- .../matsim/application/options/ShpOptions.java | 9 +++++---- .../application/prepare/CreateLandUseShp.java | 12 ++++++------ .../prepare/ShapeFileTextLookup.java | 4 ++-- .../prepare/counts/NetworkIndex.java | 4 ++-- .../dataProcessing/GenerateLookupTable.java | 2 +- .../GermanNutsTransformation.java | 2 +- .../DetermineAverageTruckLoad.java | 2 +- .../CarrierReaderFromCSV.java | 2 +- .../DemandReaderFromCSV.java | 2 +- .../application/options/ShpOptionsTest.java | 2 +- .../DemandReaderFromCSVTest.java | 2 +- .../bicycle/network/ElevationDataParser.java | 8 ++++---- .../config/FreefloatingAreasReader.java | 2 +- .../carsharing/qsim/FreefloatingAreas.java | 2 +- .../CarsharingVehicleRelocationContainer.java | 2 +- .../infrastructure/RelocationZone.java | 2 +- .../utils/RelocationZonesReader.java | 2 +- .../contrib/common/zones/ZoneSystemUtils.java | 4 ++-- .../contrib/common/zones/io/ZoneShpReader.java | 2 +- .../contrib/common/zones/io/ZoneShpWriter.java | 4 ++-- .../common/zones/util/SubzoneUtils.java | 2 +- .../constraints/ShapeFileConstraint.java | 8 ++++---- .../dashboards/DrtAnalysisPostProcessing.java | 10 +++++----- contribs/drt/pom.xml | 6 ------ .../zonal/DrtZonalWaitTimesAnalyzer.java | 2 +- .../TestWarmEmissionAnalysisModule.java | 1 - .../discharging/LTHDriveEnergyConsumption.java | 1 - .../contrib/minibus/schedule/CreatePStops.java | 2 +- ...nJunctionApproachesAndBetweenJunctions.java | 2 +- .../org/matsim/contrib/noise/DEMContext.java | 5 +++-- .../matsim/contrib/noise/DEMContextImpl.java | 7 ++++--- .../noise/FeatureNoiseBarriersReader.java | 10 +++++----- .../contrib/noise/RLS19NoiseEmission.java | 12 ++++++------ .../drawer/SimpleBackgroundFeatureDrawer.java | 4 ++-- .../analysis/RegionModeshareAnalyzer.java | 2 +- .../parkingproxy/run/RunAreaAnalysis.java | 2 +- .../analysis/skims/CalculateSkimMatrices.java | 2 +- .../matsim/analysis/skims/MatricesToXY.java | 2 +- .../utils/WriteStationShapefile.java | 4 ++-- ...erateSmallScaleCommercialTrafficDemand.java | 2 +- .../TripDistributionMatrix.java | 2 +- .../CreateDataDistributionOfStructureData.java | 2 +- .../prepare/LanduseBuildingAnalysis.java | 2 +- .../TrafficVolumeGenerationTest.java | 2 +- .../TripDistributionMatrixTest.java | 2 +- .../prepare/LanduseBuildingAnalysisTest.java | 2 +- .../vsp/analysis/DefaultAnalysis.java | 2 +- .../act2mode/ActivityToModeAnalysis.java | 2 +- .../networkAnalysis/NetworkAnalyzer.java | 2 +- .../utils/PtAccesShapeWriter.java | 4 ++-- .../utils/PtAccessMapShapeWriter.java | 4 ++-- .../ptPaxVolumes/PtPaxVolumesAnalyzer.java | 2 +- .../TransitSchedule2Shp.java | 4 ++-- .../TransitVehicleVolumeAnalyzer.java | 4 ++-- .../vsp/analysis/utils/heatMap/HeatMap.java | 4 ++-- .../andreas/utils/ana/RouteAllModesAsCar.java | 4 ++-- ...LinksstatsPolygonBasedFeatureGenerator.java | 4 ++-- .../LinkstatsStringBasedFeatureGenerator.java | 4 ++-- .../compareLinkStats/NetworkAndMore2ESRI.java | 2 +- ...VehOnLinksPolygonBasedFeatureGenerator.java | 4 ++-- ...tVehOnLinksStringBasedFeatureGenerator.java | 4 ++-- .../utils/ana/countVehOnLinks/PackageMain.java | 2 +- .../WorkHomeShapeCounter.java | 4 ++-- .../utils/pop/FilterPopulationByShape.java | 2 +- .../transitSchedule2shape/DaShapeWriter.java | 2 +- .../CORINELandCoverCoordsModifier.java | 2 +- .../corineLandcover/CorineLandCoverData.java | 2 +- .../CommuterDemandWriter.java | 6 +++--- .../CommuterGenerator.java | 6 +++--- .../commuterDemandCottbus/DgLanduseReader.java | 6 +++--- .../DgPopulation2ShapeWriter.java | 8 ++++---- .../vsp/demandde/counts/TSBASt2Count.java | 2 +- .../demandde/pendlermatrix/GVPlanReader.java | 2 +- .../pendlermatrix/PendlerMatrixReader.java | 4 ++-- .../demandde/pendlermatrix/Verschmierer.java | 2 +- .../prognose2025/DemandMatrixReader.java | 4 ++-- .../cemdap/input/SynPopCreator.java | 2 +- .../cemdap/input/SynPopCreatorChildren.java | 2 +- .../cemdap/input/ZoneAndLOSGeneratorV2.java | 3 +-- .../cemdap/output/Cemdap2MatsimUtils.java | 2 +- .../CemdapOutput2MatsimPlansConverter.java | 2 +- .../TransitRouteTrimmerUtils.java | 10 +++++----- .../pt/stop2stop/PtStop2StopAnalysis2Shp.java | 2 +- ...etworkTeleatlasAddManeuverRestrictions.java | 4 ++-- .../network/io/NetworkReaderTeleatlas.java | 6 +++--- .../core/utils/geometry/GeometryUtils.java | 2 +- .../core/utils/geometry/geotools/MGC.java | 4 ++-- .../GeotoolsTransformation.java | 8 ++++---- .../matsim/core/utils/gis/GeoFileReader.java | 15 +++++---------- .../matsim/core/utils/gis/GeoFileWriter.java | 14 +++++++------- .../core/utils/gis/PointFeatureFactory.java | 6 +++--- .../core/utils/gis/PolygonFeatureFactory.java | 6 +++--- .../core/utils/gis/PolylineFeatureFactory.java | 6 +++--- .../matsim/core/utils/gis/ShapeFileReader.java | 13 ++++++------- .../matsim/core/utils/gis/ShapeFileWriter.java | 3 ++- .../matsim2esri/network/FeatureGenerator.java | 2 +- .../network/FeatureGeneratorBuilderImpl.java | 2 +- .../LineStringBasedFeatureGenerator.java | 4 ++-- .../matsim2esri/network/Links2ESRIShape.java | 4 ++-- .../matsim2esri/network/Nodes2ESRIShape.java | 4 ++-- .../network/PolygonFeatureGenerator.java | 4 ++-- .../plans/SelectedPlans2ESRIShape.java | 4 ++-- .../core/utils/gis/GeoFileReaderTest.java | 2 +- .../core/utils/gis/GeoFileWriterTest.java | 6 +++--- .../network/Network2ESRIShapeTest.java | 4 ++-- .../plans/SelectedPlans2ESRIShapeTest.java | 4 ++-- pom.xml | 2 +- 119 files changed, 244 insertions(+), 256 deletions(-) diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/AccessibilityUtils.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/AccessibilityUtils.java index 43420197e8e..1ed755c12b6 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/AccessibilityUtils.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/AccessibilityUtils.java @@ -20,6 +20,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -41,7 +42,6 @@ import org.matsim.core.utils.geometry.CoordUtils; import org.matsim.core.utils.gis.GeoFileReader; import org.matsim.facilities.*; -import org.opengis.feature.simple.SimpleFeature; import java.util.*; import java.util.concurrent.ConcurrentHashMap; diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/FeatureSHP.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/FeatureSHP.java index 9ff4d3711ed..2e5cee46039 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/FeatureSHP.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/FeatureSHP.java @@ -24,11 +24,11 @@ import java.util.HashSet; import java.util.Set; -import org.geotools.data.DataStore; -import org.geotools.data.FileDataStoreFinder; +import org.geotools.api.data.DataStore; +import org.geotools.api.data.FileDataStoreFinder; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; -import org.opengis.feature.simple.SimpleFeature; /** * Utility class for reading shape (.shp) files. diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/GridUtils.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/GridUtils.java index b8cfc04417f..6e5aa187364 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/GridUtils.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/GridUtils.java @@ -20,7 +20,6 @@ import org.matsim.facilities.ActivityFacility; import org.matsim.facilities.FacilitiesUtils; import org.matsim.utils.gis.shp2matsim.ShpGeometryUtils; -import org.opengis.feature.simple.SimpleFeature; public final class GridUtils { // used from outside, e.g. in vsp playgrounds diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiExample.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiExample.java index 382e13b68f7..d1fe1df43d7 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiExample.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiExample.java @@ -22,6 +22,7 @@ import java.util.Collection; import java.util.List; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -29,7 +30,6 @@ import org.locationtech.jts.triangulate.VoronoiDiagramBuilder; import org.matsim.contrib.matrixbasedptrouter.utils.BoundingBox; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; /** * @author dziemke diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiGeometryUtils.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiGeometryUtils.java index 76e7273fd87..bcf0edc7b73 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiGeometryUtils.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/VoronoiGeometryUtils.java @@ -27,6 +27,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -40,8 +42,6 @@ import org.matsim.core.utils.geometry.CoordUtils; import org.matsim.facilities.ActivityFacilities; import org.matsim.facilities.ActivityFacility; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; /** * @author dziemke diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/CRSUtils.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/CRSUtils.java index a7171739b6a..92f3d94c5b8 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/CRSUtils.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/CRSUtils.java @@ -24,18 +24,18 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.metadata.Identifier; +import org.geotools.api.referencing.FactoryException; +import org.geotools.api.referencing.NoSuchAuthorityCodeException; +import org.geotools.api.referencing.crs.CRSAuthorityFactory; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; +import org.geotools.api.referencing.operation.MathTransform; +import org.geotools.api.referencing.operation.TransformException; import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; -import org.opengis.metadata.Identifier; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.NoSuchAuthorityCodeException; -import org.opengis.referencing.crs.CRSAuthorityFactory; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.MathTransform; -import org.opengis.referencing.operation.TransformException; /** * Utility-class providing functionality related to coordinate reference @@ -94,7 +94,7 @@ public static int getSRID(CoordinateReferenceSystem crs) { /* * Randomly get one identifier. */ - Identifier identifier = (Identifier) (crs.getIdentifiers().iterator().next()); + Identifier identifier = crs.getIdentifiers().iterator().next(); if (identifier == null) { return 0; } else { @@ -118,7 +118,7 @@ public static MathTransform findTransform(Geometry source, Geometry target) { CoordinateReferenceSystem targetCRS = getCRS(target.getSRID()); try { - return CRS.findMathTransform(sourceCRS, targetCRS); + return CRS.findMathTransform(sourceCRS, targetCRS); } catch (FactoryException e) { e.printStackTrace(); return null; diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/ZoneLayer.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/ZoneLayer.java index c39948b714f..28bc2c41059 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/ZoneLayer.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/gis/ZoneLayer.java @@ -24,13 +24,13 @@ import java.util.List; import java.util.Set; +import org.geotools.api.referencing.FactoryException; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; +import org.geotools.api.referencing.operation.MathTransform; import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Point; import org.locationtech.jts.index.SpatialIndex; import org.locationtech.jts.index.quadtree.Quadtree; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.MathTransform; /** * Representation of a spatial index containing zones backed by a quadtree. diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/CombinedOsmSink.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/CombinedOsmSink.java index f7e39f4b588..7c5c1bcf2d2 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/CombinedOsmSink.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/CombinedOsmSink.java @@ -22,6 +22,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -41,7 +42,6 @@ import org.matsim.facilities.ActivityOption; import org.matsim.facilities.FacilitiesUtils; import org.matsim.utils.objectattributes.ObjectAttributes; -import org.opengis.feature.simple.SimpleFeature; import org.openstreetmap.osmosis.core.container.v0_6.BoundContainer; import org.openstreetmap.osmosis.core.container.v0_6.EntityContainer; import org.openstreetmap.osmosis.core.container.v0_6.EntityProcessor; @@ -89,7 +89,7 @@ class CombinedOsmSink implements Sink { private Map typeCount = new HashMap<>(); - private List landUseAreas = new ArrayList (); + private List landUseAreas = new ArrayList<>(); private int featureErrorCounter = 0; private int buildingErrorCounter = 0; diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/LandUseBuildingSink.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/LandUseBuildingSink.java index 0a5989ad5e8..3b55793e0d6 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/LandUseBuildingSink.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/osm/LandUseBuildingSink.java @@ -22,6 +22,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -40,7 +41,6 @@ import org.matsim.facilities.ActivityOption; import org.matsim.facilities.FacilitiesUtils; import org.matsim.utils.objectattributes.ObjectAttributes; -import org.opengis.feature.simple.SimpleFeature; import org.openstreetmap.osmosis.core.container.v0_6.BoundContainer; import org.openstreetmap.osmosis.core.container.v0_6.EntityContainer; import org.openstreetmap.osmosis.core.container.v0_6.EntityProcessor; @@ -69,11 +69,11 @@ class LandUseBuildingSink implements Sink { private Map relationMap; private ActivityFacilities facilities; private ObjectAttributes facilityAttributes; - private Map landUseTypeMap = new HashMap<>(); - private Map buildingTypeMap = new HashMap<>(); + private final Map landUseTypeMap; + private Map buildingTypeMap; private Map typeCount = new HashMap<>(); - private List features = new ArrayList (); + private List features = new ArrayList<>(); private double buildingTypeFromVicinityRange; private String[] tagsToIgnoreBuildings; diff --git a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/utils/GeoserverUpdater.java b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/utils/GeoserverUpdater.java index a5799e30983..d489d7ca811 100644 --- a/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/utils/GeoserverUpdater.java +++ b/contribs/accessibility/src/main/java/org/matsim/contrib/accessibility/utils/GeoserverUpdater.java @@ -28,9 +28,11 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.geotools.data.DataStore; -import org.geotools.data.DataStoreFinder; -import org.geotools.data.simple.SimpleFeatureStore; +import org.geotools.api.data.DataStore; +import org.geotools.api.data.DataStoreFinder; +import org.geotools.api.data.SimpleFeatureStore; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; import org.geotools.feature.DefaultFeatureCollection; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; @@ -49,8 +51,6 @@ import org.matsim.core.utils.geometry.transformations.TransformationFactory; import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.facilities.ActivityFacility; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; public class GeoserverUpdater implements FacilityDataExchangeInterface { diff --git a/contribs/accidents/src/main/java/org/matsim/contrib/accidents/runExample/AccidentsNetworkModification.java b/contribs/accidents/src/main/java/org/matsim/contrib/accidents/runExample/AccidentsNetworkModification.java index 7388ce718d5..0cd56b5fd7f 100644 --- a/contribs/accidents/src/main/java/org/matsim/contrib/accidents/runExample/AccidentsNetworkModification.java +++ b/contribs/accidents/src/main/java/org/matsim/contrib/accidents/runExample/AccidentsNetworkModification.java @@ -28,10 +28,11 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.geotools.data.DataStore; -import org.geotools.data.FileDataStoreFinder; +import org.geotools.api.data.DataStore; +import org.geotools.api.data.FileDataStoreFinder; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -45,7 +46,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.geometry.transformations.TransformationFactory; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; /** * @author mmayobre, ikaddoura diff --git a/contribs/analysis/src/main/java/org/matsim/contrib/analysis/christoph/TravelTimesWriter.java b/contribs/analysis/src/main/java/org/matsim/contrib/analysis/christoph/TravelTimesWriter.java index c1f1f9ea36e..12b9efdcffb 100644 --- a/contribs/analysis/src/main/java/org/matsim/contrib/analysis/christoph/TravelTimesWriter.java +++ b/contribs/analysis/src/main/java/org/matsim/contrib/analysis/christoph/TravelTimesWriter.java @@ -28,6 +28,8 @@ import java.util.Map; import java.util.Map.Entry; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.locationtech.jts.geom.Coordinate; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.network.Link; @@ -43,8 +45,6 @@ import org.matsim.core.utils.gis.PolylineFeatureFactory; import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.core.utils.io.IOUtils; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * Analyzes the average link travel times and writes them to files (absolute and diff --git a/contribs/application/src/main/java/org/matsim/application/options/ShpOptions.java b/contribs/application/src/main/java/org/matsim/application/options/ShpOptions.java index 359eedb0db4..985db84bba7 100644 --- a/contribs/application/src/main/java/org/matsim/application/options/ShpOptions.java +++ b/contribs/application/src/main/java/org/matsim/application/options/ShpOptions.java @@ -3,6 +3,11 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.data.*; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; +import org.geotools.api.referencing.FactoryException; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.data.*; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; @@ -21,10 +26,6 @@ import org.matsim.core.utils.geometry.transformations.TransformationFactory; import org.matsim.core.utils.gis.GeoFileReader; import org.matsim.core.utils.io.IOUtils; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import picocli.CommandLine; import javax.annotation.Nullable; diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/CreateLandUseShp.java b/contribs/application/src/main/java/org/matsim/application/prepare/CreateLandUseShp.java index 4f10c61e745..a4cec737419 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/CreateLandUseShp.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/CreateLandUseShp.java @@ -2,12 +2,14 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.geotools.data.DataStore; -import org.geotools.data.FileDataStore; -import org.geotools.data.FileDataStoreFactorySpi; +import org.geotools.api.data.DataStore; +import org.geotools.api.data.FileDataStore; +import org.geotools.api.data.FileDataStoreFactorySpi; +import org.geotools.api.data.SimpleFeatureStore; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; import org.geotools.data.collection.ListFeatureCollection; import org.geotools.data.shapefile.ShapefileDataStoreFactory; -import org.geotools.data.simple.SimpleFeatureStore; import org.geotools.data.store.ReprojectingFeatureCollection; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.referencing.CRS; @@ -15,8 +17,6 @@ import org.locationtech.jts.index.strtree.STRtree; import org.matsim.application.MATSimAppCommand; import org.matsim.application.options.CrsOptions; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; import picocli.CommandLine; import java.nio.file.FileSystem; diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/ShapeFileTextLookup.java b/contribs/application/src/main/java/org/matsim/application/prepare/ShapeFileTextLookup.java index 1be1a71eed1..e6b768e9ae8 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/ShapeFileTextLookup.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/ShapeFileTextLookup.java @@ -6,11 +6,11 @@ import org.apache.commons.text.similarity.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.type.AttributeDescriptor; import org.matsim.application.MATSimAppCommand; import org.matsim.application.options.CsvOptions; import org.matsim.application.options.ShpOptions; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.type.AttributeDescriptor; import picocli.CommandLine; import java.nio.file.Files; diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/counts/NetworkIndex.java b/contribs/application/src/main/java/org/matsim/application/prepare/counts/NetworkIndex.java index da00479b097..f44409de03b 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/counts/NetworkIndex.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/counts/NetworkIndex.java @@ -3,6 +3,8 @@ import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; +import org.geotools.api.referencing.operation.MathTransform; +import org.geotools.api.referencing.operation.TransformException; import org.geotools.geometry.jts.JTS; import org.locationtech.jts.algorithm.distance.DiscreteHausdorffDistance; import org.locationtech.jts.geom.*; @@ -13,8 +15,6 @@ import org.matsim.api.core.v01.network.Network; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.io.IOUtils; -import org.opengis.referencing.operation.MathTransform; -import org.opengis.referencing.operation.TransformException; import javax.annotation.Nullable; import java.io.IOException; diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GenerateLookupTable.java b/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GenerateLookupTable.java index b6a8f99d22f..c86a773cc28 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GenerateLookupTable.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GenerateLookupTable.java @@ -4,12 +4,12 @@ import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.matsim.api.core.v01.Coord; import org.matsim.application.MATSimAppCommand; import org.matsim.application.options.ShpOptions; import org.matsim.core.utils.geometry.geotools.MGC; -import org.opengis.feature.simple.SimpleFeature; import picocli.CommandLine; import java.io.FileWriter; diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GermanNutsTransformation.java b/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GermanNutsTransformation.java index eabeedb1c89..a659692739d 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GermanNutsTransformation.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/freight/dataProcessing/GermanNutsTransformation.java @@ -1,5 +1,6 @@ package org.matsim.application.prepare.freight.dataProcessing; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; @@ -7,7 +8,6 @@ import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.geometry.transformations.GeotoolsTransformation; -import org.opengis.feature.simple.SimpleFeature; import java.nio.charset.StandardCharsets; import java.nio.file.Path; diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/freight/optimization/DetermineAverageTruckLoad.java b/contribs/application/src/main/java/org/matsim/application/prepare/freight/optimization/DetermineAverageTruckLoad.java index b89303a23bb..f82c2a885d6 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/freight/optimization/DetermineAverageTruckLoad.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/freight/optimization/DetermineAverageTruckLoad.java @@ -6,6 +6,7 @@ import org.apache.commons.csv.CSVRecord; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Identifiable; @@ -27,7 +28,6 @@ import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.core.utils.geometry.transformations.TransformationFactory; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; import picocli.CommandLine; import java.io.FileWriter; diff --git a/contribs/application/src/main/java/org/matsim/freightDemandGeneration/CarrierReaderFromCSV.java b/contribs/application/src/main/java/org/matsim/freightDemandGeneration/CarrierReaderFromCSV.java index 7939a9dab9a..19dc604a32c 100644 --- a/contribs/application/src/main/java/org/matsim/freightDemandGeneration/CarrierReaderFromCSV.java +++ b/contribs/application/src/main/java/org/matsim/freightDemandGeneration/CarrierReaderFromCSV.java @@ -24,6 +24,7 @@ import org.apache.commons.csv.CSVRecord; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.network.Link; @@ -33,7 +34,6 @@ import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; -import org.opengis.feature.simple.SimpleFeature; import java.io.IOException; import java.nio.file.Files; diff --git a/contribs/application/src/main/java/org/matsim/freightDemandGeneration/DemandReaderFromCSV.java b/contribs/application/src/main/java/org/matsim/freightDemandGeneration/DemandReaderFromCSV.java index d991eaa9a6f..a301fe8dcf1 100644 --- a/contribs/application/src/main/java/org/matsim/freightDemandGeneration/DemandReaderFromCSV.java +++ b/contribs/application/src/main/java/org/matsim/freightDemandGeneration/DemandReaderFromCSV.java @@ -24,6 +24,7 @@ import org.apache.commons.csv.CSVRecord; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; @@ -36,7 +37,6 @@ import org.matsim.core.router.TripStructureUtils; import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.freight.carriers.*; -import org.opengis.feature.simple.SimpleFeature; import java.io.IOException; import java.nio.file.Files; diff --git a/contribs/application/src/test/java/org/matsim/application/options/ShpOptionsTest.java b/contribs/application/src/test/java/org/matsim/application/options/ShpOptionsTest.java index bc13baad71f..e28ec92193f 100644 --- a/contribs/application/src/test/java/org/matsim/application/options/ShpOptionsTest.java +++ b/contribs/application/src/test/java/org/matsim/application/options/ShpOptionsTest.java @@ -1,13 +1,13 @@ package org.matsim.application.options; import org.assertj.core.data.Offset; +import org.geotools.api.feature.simple.SimpleFeature; import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.locationtech.jts.geom.Geometry; import org.matsim.api.core.v01.Coord; import org.matsim.testcases.MatsimTestUtils; -import org.opengis.feature.simple.SimpleFeature; import java.nio.file.Files; import java.nio.file.Path; diff --git a/contribs/application/src/test/java/org/matsim/freightDemandGeneration/DemandReaderFromCSVTest.java b/contribs/application/src/test/java/org/matsim/freightDemandGeneration/DemandReaderFromCSVTest.java index c9133b6b56b..9d672b4a461 100644 --- a/contribs/application/src/test/java/org/matsim/freightDemandGeneration/DemandReaderFromCSVTest.java +++ b/contribs/application/src/test/java/org/matsim/freightDemandGeneration/DemandReaderFromCSVTest.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Set; +import org.geotools.api.feature.simple.SimpleFeature; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -27,7 +28,6 @@ import org.matsim.freightDemandGeneration.CarrierReaderFromCSV.CarrierInformationElement; import org.matsim.freightDemandGeneration.DemandReaderFromCSV.DemandInformationElement; import org.matsim.testcases.MatsimTestUtils; -import org.opengis.feature.simple.SimpleFeature; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; diff --git a/contribs/bicycle/src/main/java/org/matsim/contrib/bicycle/network/ElevationDataParser.java b/contribs/bicycle/src/main/java/org/matsim/contrib/bicycle/network/ElevationDataParser.java index a1a34d8fb76..73643505aa1 100644 --- a/contribs/bicycle/src/main/java/org/matsim/contrib/bicycle/network/ElevationDataParser.java +++ b/contribs/bicycle/src/main/java/org/matsim/contrib/bicycle/network/ElevationDataParser.java @@ -21,18 +21,18 @@ import java.awt.image.Raster; import java.io.IOException; +import org.geotools.api.data.DataSourceException; +import org.geotools.api.referencing.operation.TransformException; import org.geotools.coverage.grid.GridCoordinates2D; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.coverage.grid.GridGeometry2D; import org.geotools.coverage.grid.InvalidGridGeometryException; -import org.geotools.data.DataSourceException; import org.geotools.gce.geotiff.GeoTiffReader; -import org.geotools.geometry.DirectPosition2D; +import org.geotools.geometry.Position2D; import org.matsim.api.core.v01.Coord; import org.matsim.core.utils.geometry.CoordUtils; import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.core.utils.geometry.transformations.TransformationFactory; -import org.opengis.referencing.operation.TransformException; /** * @author smetzler, dziemke @@ -101,7 +101,7 @@ public double getElevation(Coord coord) { GridCoordinates2D posGrid = null; try { - posGrid = gg.worldToGrid(new DirectPosition2D(transformedCoord.getX(), transformedCoord.getY())); + posGrid = gg.worldToGrid(new Position2D(transformedCoord.getX(), transformedCoord.getY())); } catch (InvalidGridGeometryException e) { e.printStackTrace(); } catch (TransformException e) { diff --git a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/config/FreefloatingAreasReader.java b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/config/FreefloatingAreasReader.java index 8230aaf2296..3b796eb74d5 100644 --- a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/config/FreefloatingAreasReader.java +++ b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/config/FreefloatingAreasReader.java @@ -5,13 +5,13 @@ import java.util.Map; import java.util.Stack; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.matsim.api.core.v01.Coord; import org.matsim.contrib.carsharing.qsim.FreefloatingAreas; import org.matsim.core.utils.gis.PolygonFeatureFactory; import org.matsim.core.utils.io.MatsimXmlParser; import org.matsim.core.utils.misc.Counter; -import org.opengis.feature.simple.SimpleFeature; import org.xml.sax.Attributes; public class FreefloatingAreasReader extends MatsimXmlParser { diff --git a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/qsim/FreefloatingAreas.java b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/qsim/FreefloatingAreas.java index 6de9769e920..cda26560ab0 100644 --- a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/qsim/FreefloatingAreas.java +++ b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/qsim/FreefloatingAreas.java @@ -2,6 +2,7 @@ import java.util.ArrayList; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.MultiPolygon; @@ -9,7 +10,6 @@ import org.locationtech.jts.operation.distance.DistanceOp; import org.matsim.api.core.v01.Coord; import org.matsim.core.utils.gis.PointFeatureFactory; -import org.opengis.feature.simple.SimpleFeature; public class FreefloatingAreas { private PointFeatureFactory pointFeatureFactory; diff --git a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/demand/CarsharingVehicleRelocationContainer.java b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/demand/CarsharingVehicleRelocationContainer.java index dae3bd0386d..ea102e0f25c 100644 --- a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/demand/CarsharingVehicleRelocationContainer.java +++ b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/demand/CarsharingVehicleRelocationContainer.java @@ -9,6 +9,7 @@ import java.util.Map.Entry; import java.util.TreeMap; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Point; @@ -28,7 +29,6 @@ import org.matsim.contrib.carsharing.relocation.utils.RelocationZonesReader; import org.matsim.core.network.NetworkUtils; import org.matsim.core.utils.gis.PointFeatureFactory; -import org.opengis.feature.simple.SimpleFeature; public class CarsharingVehicleRelocationContainer { private Scenario scenario; diff --git a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/infrastructure/RelocationZone.java b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/infrastructure/RelocationZone.java index 97a7f6f3ddd..6e3e2eed9e5 100644 --- a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/infrastructure/RelocationZone.java +++ b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/infrastructure/RelocationZone.java @@ -7,13 +7,13 @@ import java.util.Map; import java.util.TreeMap; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Identifiable; import org.matsim.api.core.v01.network.Link; -import org.opengis.feature.simple.SimpleFeature; public class RelocationZone implements Identifiable { diff --git a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/utils/RelocationZonesReader.java b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/utils/RelocationZonesReader.java index 07df9ed165b..d7649f97d62 100644 --- a/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/utils/RelocationZonesReader.java +++ b/contribs/carsharing/src/main/java/org/matsim/contrib/carsharing/relocation/utils/RelocationZonesReader.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Stack; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; @@ -15,7 +16,6 @@ import org.matsim.core.utils.gis.PolygonFeatureFactory; import org.matsim.core.utils.io.MatsimXmlParser; import org.matsim.core.utils.misc.Counter; -import org.opengis.feature.simple.SimpleFeature; import org.xml.sax.Attributes; public class RelocationZonesReader extends MatsimXmlParser { diff --git a/contribs/common/src/main/java/org/matsim/contrib/common/zones/ZoneSystemUtils.java b/contribs/common/src/main/java/org/matsim/contrib/common/zones/ZoneSystemUtils.java index 725a9bb3a41..7352cd74278 100644 --- a/contribs/common/src/main/java/org/matsim/contrib/common/zones/ZoneSystemUtils.java +++ b/contribs/common/src/main/java/org/matsim/contrib/common/zones/ZoneSystemUtils.java @@ -4,6 +4,8 @@ import one.util.streamex.EntryStream; import one.util.streamex.StreamEx; import org.apache.commons.lang3.tuple.Pair; +import org.geotools.api.feature.Property; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygonal; import org.locationtech.jts.geom.prep.PreparedGeometry; @@ -28,8 +30,6 @@ import org.matsim.core.config.ConfigGroup; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.Property; -import org.opengis.feature.simple.SimpleFeature; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpReader.java b/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpReader.java index 46e6978a184..1aea45726f1 100644 --- a/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpReader.java +++ b/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpReader.java @@ -19,13 +19,13 @@ package org.matsim.contrib.common.zones.io; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.prep.PreparedPolygon; import org.matsim.api.core.v01.Id; import org.matsim.contrib.common.zones.Zone; import org.matsim.contrib.common.zones.ZoneImpl; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; import java.net.URL; import java.util.Collection; diff --git a/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpWriter.java b/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpWriter.java index 68ae03a7b6d..7068c2518ac 100644 --- a/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpWriter.java +++ b/contribs/common/src/main/java/org/matsim/contrib/common/zones/io/ZoneShpWriter.java @@ -19,14 +19,14 @@ package org.matsim.contrib.common.zones.io; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.locationtech.jts.geom.prep.PreparedGeometry; import org.matsim.api.core.v01.Id; import org.matsim.contrib.common.zones.Zone; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.core.utils.gis.PolygonFeatureFactory; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import java.util.ArrayList; import java.util.List; diff --git a/contribs/common/src/main/java/org/matsim/contrib/common/zones/util/SubzoneUtils.java b/contribs/common/src/main/java/org/matsim/contrib/common/zones/util/SubzoneUtils.java index 01b9a80c6ee..d864f49b6ca 100644 --- a/contribs/common/src/main/java/org/matsim/contrib/common/zones/util/SubzoneUtils.java +++ b/contribs/common/src/main/java/org/matsim/contrib/common/zones/util/SubzoneUtils.java @@ -19,6 +19,7 @@ package org.matsim.contrib.common.zones.util; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.geometry.jts.GeometryCollector; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Polygon; @@ -27,7 +28,6 @@ import org.locationtech.jts.geom.util.PolygonExtracter; import org.matsim.api.core.v01.Id; import org.matsim.contrib.common.zones.Zone; -import org.opengis.feature.simple.SimpleFeature; import java.util.Collection; import java.util.HashMap; diff --git a/contribs/discrete_mode_choice/src/main/java/org/matsim/contribs/discrete_mode_choice/components/constraints/ShapeFileConstraint.java b/contribs/discrete_mode_choice/src/main/java/org/matsim/contribs/discrete_mode_choice/components/constraints/ShapeFileConstraint.java index fff197c1ec2..742b7d930ce 100644 --- a/contribs/discrete_mode_choice/src/main/java/org/matsim/contribs/discrete_mode_choice/components/constraints/ShapeFileConstraint.java +++ b/contribs/discrete_mode_choice/src/main/java/org/matsim/contribs/discrete_mode_choice/components/constraints/ShapeFileConstraint.java @@ -8,11 +8,12 @@ import java.util.List; import java.util.Set; -import org.geotools.data.DataStore; -import org.geotools.data.DataStoreFinder; +import org.geotools.api.data.DataStore; +import org.geotools.api.data.DataStoreFinder; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -26,7 +27,6 @@ import org.matsim.contribs.discrete_mode_choice.model.trip_based.TripConstraint; import org.matsim.contribs.discrete_mode_choice.model.trip_based.TripConstraintFactory; import org.matsim.contribs.discrete_mode_choice.model.trip_based.candidates.TripCandidate; -import org.opengis.feature.simple.SimpleFeature; /** * This constraint decides whether a mode is allowed for a certain trip by diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/dashboards/DrtAnalysisPostProcessing.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/dashboards/DrtAnalysisPostProcessing.java index 34ce02553dc..a8f9e8eabb0 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/dashboards/DrtAnalysisPostProcessing.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/dashboards/DrtAnalysisPostProcessing.java @@ -4,14 +4,16 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; +import org.geotools.api.data.FileDataStoreFactorySpi; +import org.geotools.api.data.SimpleFeatureStore; +import org.geotools.api.data.Transaction; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; import org.geotools.data.DataUtilities; import org.geotools.data.DefaultTransaction; -import org.geotools.data.FileDataStoreFactorySpi; -import org.geotools.data.Transaction; import org.geotools.data.collection.ListFeatureCollection; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; -import org.geotools.data.simple.SimpleFeatureStore; import org.geotools.feature.SchemaException; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.geometry.jts.JTSFactoryFinder; @@ -34,8 +36,6 @@ import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.pt.transitSchedule.api.TransitScheduleReader; import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; import picocli.CommandLine; import tech.tablesaw.api.ColumnType; import tech.tablesaw.api.DoubleColumn; diff --git a/contribs/drt/pom.xml b/contribs/drt/pom.xml index 5ae4b7b984c..eda34a832d3 100644 --- a/contribs/drt/pom.xml +++ b/contribs/drt/pom.xml @@ -51,12 +51,6 @@ ${geotools.version}
- - org.geotools - gt-opengis - ${geotools.version} - - org.locationtech.jts jts-core diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/zonal/DrtZonalWaitTimesAnalyzer.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/zonal/DrtZonalWaitTimesAnalyzer.java index f86d7759e37..d16a0cd8e0a 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/zonal/DrtZonalWaitTimesAnalyzer.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/zonal/DrtZonalWaitTimesAnalyzer.java @@ -23,6 +23,7 @@ import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Geometry; @@ -43,7 +44,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.core.utils.io.IOUtils; -import org.opengis.feature.simple.SimpleFeature; import java.io.BufferedWriter; import java.io.IOException; diff --git a/contribs/emissions/src/test/java/org/matsim/contrib/emissions/TestWarmEmissionAnalysisModule.java b/contribs/emissions/src/test/java/org/matsim/contrib/emissions/TestWarmEmissionAnalysisModule.java index cd88c087a65..30b456f1455 100644 --- a/contribs/emissions/src/test/java/org/matsim/contrib/emissions/TestWarmEmissionAnalysisModule.java +++ b/contribs/emissions/src/test/java/org/matsim/contrib/emissions/TestWarmEmissionAnalysisModule.java @@ -20,7 +20,6 @@ package org.matsim.contrib.emissions; -import org.geotools.metadata.iso.quality.TemporalAccuracyImpl; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/discharging/LTHDriveEnergyConsumption.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/discharging/LTHDriveEnergyConsumption.java index ea20f84a484..f055b3f49e2 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/discharging/LTHDriveEnergyConsumption.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/discharging/LTHDriveEnergyConsumption.java @@ -24,7 +24,6 @@ import org.apache.commons.math3.analysis.interpolation.PiecewiseBicubicSplineInterpolatingFunction; import org.apache.commons.math3.analysis.interpolation.PiecewiseBicubicSplineInterpolator; import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.network.Link; import org.matsim.contrib.ev.EvUnits; import org.matsim.contrib.ev.fleet.ElectricVehicle; diff --git a/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStops.java b/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStops.java index 52c5a6fe36d..a26e8d6e1be 100644 --- a/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStops.java +++ b/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStops.java @@ -31,6 +31,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -49,7 +50,6 @@ import org.matsim.pt.transitSchedule.TransitScheduleFactoryImpl; import org.matsim.pt.transitSchedule.api.TransitSchedule; import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.opengis.feature.simple.SimpleFeature; /** * Create one TransitStopFacility for each car mode link of the network diff --git a/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStopsOnJunctionApproachesAndBetweenJunctions.java b/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStopsOnJunctionApproachesAndBetweenJunctions.java index f2303896615..73d31f3c30f 100644 --- a/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStopsOnJunctionApproachesAndBetweenJunctions.java +++ b/contribs/minibus/src/main/java/org/matsim/contrib/minibus/schedule/CreatePStopsOnJunctionApproachesAndBetweenJunctions.java @@ -32,6 +32,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -60,7 +61,6 @@ import org.matsim.pt.transitSchedule.TransitScheduleFactoryImpl; import org.matsim.pt.transitSchedule.api.TransitSchedule; import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.opengis.feature.simple.SimpleFeature; /** * Create one TransitStopFacility for each car mode link of the network diff --git a/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContext.java b/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContext.java index e55dd2dd43a..c82ee7010a1 100644 --- a/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContext.java +++ b/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContext.java @@ -1,12 +1,13 @@ package org.matsim.contrib.noise; -import org.opengis.geometry.DirectPosition; + +import org.geotools.api.geometry.Position; public interface DEMContext { /** * Returns the elevation at the given position. */ - float getElevation(DirectPosition position); + float getElevation(Position position); } diff --git a/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContextImpl.java b/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContextImpl.java index 1737c23dc58..9df8c41de65 100644 --- a/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContextImpl.java +++ b/contribs/noise/src/main/java/org/matsim/contrib/noise/DEMContextImpl.java @@ -1,11 +1,12 @@ package org.matsim.contrib.noise; +import org.geotools.api.geometry.Position; import org.geotools.coverage.grid.GridCoverage2D; import org.geotools.gce.geotiff.GeoTiffReader; import org.geotools.util.factory.Hints; +import org.locationtech.jts.geom.Point; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; -import org.opengis.geometry.DirectPosition; import jakarta.inject.Inject; import java.io.File; @@ -33,8 +34,8 @@ public class DEMContextImpl implements DEMContext { } @Override - public float getElevation(DirectPosition position) { - float[] sample = (float[])coverage.evaluate(position); + public float getElevation(Position point) { + float[] sample = (float[])coverage.evaluate(point); return sample[0]; } } diff --git a/contribs/noise/src/main/java/org/matsim/contrib/noise/FeatureNoiseBarriersReader.java b/contribs/noise/src/main/java/org/matsim/contrib/noise/FeatureNoiseBarriersReader.java index 419af93a267..30f56b6f90b 100644 --- a/contribs/noise/src/main/java/org/matsim/contrib/noise/FeatureNoiseBarriersReader.java +++ b/contribs/noise/src/main/java/org/matsim/contrib/noise/FeatureNoiseBarriersReader.java @@ -7,6 +7,11 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.FactoryException; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; +import org.geotools.api.referencing.operation.MathTransform; +import org.geotools.api.referencing.operation.TransformException; import org.geotools.feature.FeatureCollection; import org.geotools.feature.FeatureIterator; import org.geotools.geojson.GeoJSONUtil; @@ -16,11 +21,6 @@ import org.locationtech.jts.geom.*; import org.matsim.api.core.v01.Id; import org.matsim.core.utils.misc.Counter; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.MathTransform; -import org.opengis.referencing.operation.TransformException; /** * @author nkuehnel diff --git a/contribs/noise/src/main/java/org/matsim/contrib/noise/RLS19NoiseEmission.java b/contribs/noise/src/main/java/org/matsim/contrib/noise/RLS19NoiseEmission.java index 296f05273b2..c6074e50226 100644 --- a/contribs/noise/src/main/java/org/matsim/contrib/noise/RLS19NoiseEmission.java +++ b/contribs/noise/src/main/java/org/matsim/contrib/noise/RLS19NoiseEmission.java @@ -2,7 +2,10 @@ import com.google.common.collect.Range; import com.google.inject.Inject; -import org.geotools.geometry.DirectPosition2D; +import org.geotools.api.geometry.Position; +import org.geotools.api.referencing.FactoryException; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; +import org.geotools.geometry.Position2D; import org.geotools.referencing.CRS; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Scenario; @@ -10,9 +13,6 @@ import org.matsim.api.core.v01.network.Network; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; -import org.opengis.geometry.DirectPosition; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import static org.matsim.contrib.noise.RLS19VehicleType.*; @@ -164,8 +164,8 @@ public double calculateSingleVehicleLevel(NoiseVehicleType type, NoiseLink noise Coord to = matsimLink.getToNode().getCoord(); //MATSim coord's x/y are inversed to geotools/jts - DirectPosition positionFrom = new DirectPosition2D(crs, from.getY(), from.getX()); - DirectPosition positionTo = new DirectPosition2D(crs, to.getY(), to.getX()); + Position positionFrom = new Position2D(crs, from.getY(), from.getX()); + Position positionTo = new Position2D(crs, to.getY(), to.getX()); float elevationFrom = demContext.getElevation(positionFrom); float elevationTo = demContext.getElevation(positionTo); diff --git a/contribs/otfvis/src/main/java/org/matsim/vis/otfvis/opengl/drawer/SimpleBackgroundFeatureDrawer.java b/contribs/otfvis/src/main/java/org/matsim/vis/otfvis/opengl/drawer/SimpleBackgroundFeatureDrawer.java index 0fc455c6c04..2423b74db12 100644 --- a/contribs/otfvis/src/main/java/org/matsim/vis/otfvis/opengl/drawer/SimpleBackgroundFeatureDrawer.java +++ b/contribs/otfvis/src/main/java/org/matsim/vis/otfvis/opengl/drawer/SimpleBackgroundFeatureDrawer.java @@ -24,8 +24,9 @@ import java.util.ArrayList; import java.util.List; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -34,7 +35,6 @@ import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; -import org.opengis.feature.simple.SimpleFeature; import com.jogamp.opengl.GL; import com.jogamp.opengl.GL2; diff --git a/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/analysis/RegionModeshareAnalyzer.java b/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/analysis/RegionModeshareAnalyzer.java index e63ad0929ff..aaa3da60ad5 100644 --- a/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/analysis/RegionModeshareAnalyzer.java +++ b/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/analysis/RegionModeshareAnalyzer.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.matsim.api.core.v01.population.Activity; import org.matsim.api.core.v01.population.Leg; @@ -35,7 +36,6 @@ import org.matsim.api.core.v01.population.PlanElement; import org.matsim.core.population.algorithms.AbstractPersonAlgorithm; import org.matsim.core.utils.geometry.geotools.MGC; -import org.opengis.feature.simple.SimpleFeature; import gnu.trove.map.TObjectIntMap; import gnu.trove.map.hash.TObjectIntHashMap; diff --git a/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/run/RunAreaAnalysis.java b/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/run/RunAreaAnalysis.java index 7643b4ea3b4..ed759e9b356 100644 --- a/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/run/RunAreaAnalysis.java +++ b/contribs/parking/src/main/java/org/matsim/contrib/parking/parkingproxy/run/RunAreaAnalysis.java @@ -23,13 +23,13 @@ import java.nio.file.Paths; import java.util.Collection; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.contrib.parking.parkingproxy.analysis.RegionModeshareAnalyzer; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.population.io.StreamingPopulationReader; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; public class RunAreaAnalysis { 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 2684832db0a..f65f15224ac 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 @@ -41,6 +41,7 @@ import java.util.function.ToDoubleFunction; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; @@ -80,7 +81,6 @@ import org.matsim.pt.transitSchedule.api.TransitLine; import org.matsim.pt.transitSchedule.api.TransitRoute; import org.matsim.pt.transitSchedule.api.TransitScheduleReader; -import org.opengis.feature.simple.SimpleFeature; /** * Main class to calculate skim matrices. Provides a main-method to be directly started from the command line, but the main-method also acts as a template for custom code using the skims calculation. diff --git a/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/MatricesToXY.java b/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/MatricesToXY.java index 405cdb0be00..e617db66b0b 100644 --- a/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/MatricesToXY.java +++ b/contribs/sbb-extensions/src/main/java/ch/sbb/matsim/analysis/skims/MatricesToXY.java @@ -27,11 +27,11 @@ import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.matsim.core.utils.gis.GeoFileReader; import org.matsim.core.utils.io.IOUtils; -import org.opengis.feature.simple.SimpleFeature; /** * Creates a huge csv file with the data of all the matrices combined. Zones are identified by their identifier as well as one random coordinate per zone. Given the from-/to-coordinates for each diff --git a/contribs/shared_mobility/src/main/java/org/matsim/contrib/shared_mobility/utils/WriteStationShapefile.java b/contribs/shared_mobility/src/main/java/org/matsim/contrib/shared_mobility/utils/WriteStationShapefile.java index 5edcf65eb29..3f78b4251d4 100644 --- a/contribs/shared_mobility/src/main/java/org/matsim/contrib/shared_mobility/utils/WriteStationShapefile.java +++ b/contribs/shared_mobility/src/main/java/org/matsim/contrib/shared_mobility/utils/WriteStationShapefile.java @@ -3,6 +3,8 @@ import java.util.ArrayList; import java.util.Collection; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.locationtech.jts.geom.Coordinate; import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; @@ -17,8 +19,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.PointFeatureFactory; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; public class WriteStationShapefile { static public void main(String[] args) throws ConfigurationException { diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java index 44251e05fd7..026c853a5be 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/GenerateSmallScaleCommercialTrafficDemand.java @@ -30,6 +30,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.core.config.Configurator; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; @@ -75,7 +76,6 @@ import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import org.opengis.feature.simple.SimpleFeature; import picocli.CommandLine; import java.io.File; diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrix.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrix.java index 82be8708c6d..0b10c6a3d95 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrix.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrix.java @@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.objects.Object2DoubleOpenHashMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Id; @@ -39,7 +40,6 @@ import org.matsim.smallScaleCommercialTrafficGeneration.TrafficVolumeGeneration.TrafficVolumeKey; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import org.opengis.feature.simple.SimpleFeature; import java.io.BufferedWriter; import java.io.IOException; diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java index 70352d923dc..477231505c1 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/CreateDataDistributionOfStructureData.java @@ -3,6 +3,7 @@ import it.unimi.dsi.fastutil.objects.Object2DoubleMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; @@ -11,7 +12,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.facilities.*; import org.matsim.smallScaleCommercialTrafficGeneration.SmallScaleCommercialTrafficUtils; -import org.opengis.feature.simple.SimpleFeature; import picocli.CommandLine; import java.io.File; diff --git a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java index aad6ad43804..9b917eb006d 100644 --- a/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java +++ b/contribs/small-scale-traffic-generation/src/main/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysis.java @@ -27,13 +27,13 @@ import org.apache.commons.csv.CSVRecord; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; import org.matsim.application.options.ShpOptions.Index; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.io.IOUtils; -import org.opengis.feature.simple.SimpleFeature; import java.io.BufferedWriter; import java.io.IOException; diff --git a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java index 7b843362a20..ce0aeda6610 100644 --- a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java +++ b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TrafficVolumeGenerationTest.java @@ -20,6 +20,7 @@ package org.matsim.smallScaleCommercialTrafficGeneration; import it.unimi.dsi.fastutil.objects.Object2DoubleMap; +import org.geotools.api.feature.simple.SimpleFeature; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -38,7 +39,6 @@ import org.matsim.smallScaleCommercialTrafficGeneration.prepare.LanduseDataConnectionCreator; import org.matsim.smallScaleCommercialTrafficGeneration.prepare.LanduseDataConnectionCreatorForOSM_Data; import org.matsim.testcases.MatsimTestUtils; -import org.opengis.feature.simple.SimpleFeature; import java.io.File; import java.io.IOException; diff --git a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java index 278e2b06f1b..7109fbbede2 100644 --- a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java +++ b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/TripDistributionMatrixTest.java @@ -20,6 +20,7 @@ package org.matsim.smallScaleCommercialTrafficGeneration; import it.unimi.dsi.fastutil.objects.Object2DoubleMap; +import org.geotools.api.feature.simple.SimpleFeature; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -30,7 +31,6 @@ import org.matsim.smallScaleCommercialTrafficGeneration.TrafficVolumeGeneration.TrafficVolumeKey; import org.matsim.smallScaleCommercialTrafficGeneration.prepare.LanduseBuildingAnalysis; import org.matsim.testcases.MatsimTestUtils; -import org.opengis.feature.simple.SimpleFeature; import java.io.File; import java.io.IOException; diff --git a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java index 812d282e5ec..a44b17581e2 100644 --- a/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java +++ b/contribs/small-scale-traffic-generation/src/test/java/org/matsim/smallScaleCommercialTrafficGeneration/prepare/LanduseBuildingAnalysisTest.java @@ -20,12 +20,12 @@ package org.matsim.smallScaleCommercialTrafficGeneration.prepare; import it.unimi.dsi.fastutil.objects.Object2DoubleMap; +import org.geotools.api.feature.simple.SimpleFeature; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.smallScaleCommercialTrafficGeneration.SCTUtils; import org.matsim.testcases.MatsimTestUtils; -import org.opengis.feature.simple.SimpleFeature; import java.io.File; import java.io.IOException; diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/DefaultAnalysis.java b/contribs/vsp/src/main/java/playground/vsp/analysis/DefaultAnalysis.java index 1f4c3b97a44..dd7a01db2db 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/DefaultAnalysis.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/DefaultAnalysis.java @@ -26,13 +26,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.Scenario; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.events.EventsReaderXMLv1; import org.matsim.core.events.EventsUtils; import org.matsim.core.events.handler.EventHandler; import org.matsim.core.gbl.Gbl; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.AbstractAnalysisModule; import playground.vsp.analysis.modules.legModeDistanceDistribution.LegModeDistanceDistribution; diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/act2mode/ActivityToModeAnalysis.java b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/act2mode/ActivityToModeAnalysis.java index 12055885daa..43c250265e7 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/act2mode/ActivityToModeAnalysis.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/act2mode/ActivityToModeAnalysis.java @@ -27,6 +27,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.matsim.api.core.v01.Id; @@ -36,7 +37,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.PointFeatureFactory; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.AbstractAnalysisModule; diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/networkAnalysis/NetworkAnalyzer.java b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/networkAnalysis/NetworkAnalyzer.java index 4e41f3ae95f..ebb01d0b4a2 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/networkAnalysis/NetworkAnalyzer.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/networkAnalysis/NetworkAnalyzer.java @@ -16,6 +16,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -44,7 +45,6 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.AbstractAnalysisModule; import playground.vsp.analysis.modules.networkAnalysis.utils.AccessibilityCalc; diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccesShapeWriter.java b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccesShapeWriter.java index f21e092ba84..170eab02e6d 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccesShapeWriter.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccesShapeWriter.java @@ -28,6 +28,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.MultiPolygon; import org.matsim.api.core.v01.Coord; @@ -35,7 +36,6 @@ import org.matsim.core.utils.gis.PointFeatureFactory; import org.matsim.core.utils.gis.PolygonFeatureFactory; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.ptAccessibility.activity.ActivityLocation; import playground.vsp.analysis.modules.ptAccessibility.activity.LocationMap; @@ -59,7 +59,7 @@ public static void writeMultiPolygons(Map mps, String file setName(name). addAttribute("name", String.class). create(); - Collection features = new ArrayList(); + Collection features = new ArrayList<>(); Object[] featureAttribs; for(Entry e: mps.entrySet()){ diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccessMapShapeWriter.java b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccessMapShapeWriter.java index 615512e0fe6..49f9b6d7449 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccessMapShapeWriter.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptAccessibility/utils/PtAccessMapShapeWriter.java @@ -26,13 +26,13 @@ import java.util.Map.Entry; import java.util.ServiceConfigurationError; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.MultiPolygon; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.ptAccessibility.stops.PtStopMap; @@ -135,7 +135,7 @@ private static void writeGeometries(String outputFolderAndFileName, HashMap> distance2mode2bufferEntry : distance2mode2buffer.entrySet()) { - bufferFeatures = new ArrayList(); + bufferFeatures = new ArrayList<>(); HashMap mode2buffer = distance2mode2bufferEntry.getValue(); for (Entry mode2BufferEntry : mode2buffer.entrySet()) { bufferFeatureAttribs = new Object[2]; diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptPaxVolumes/PtPaxVolumesAnalyzer.java b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptPaxVolumes/PtPaxVolumesAnalyzer.java index b921fa27a53..c15ca89613d 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptPaxVolumes/PtPaxVolumesAnalyzer.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/ptPaxVolumes/PtPaxVolumesAnalyzer.java @@ -27,6 +27,7 @@ import java.util.Map.Entry; import java.util.ServiceConfigurationError; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -39,7 +40,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.pt.transitSchedule.api.TransitLine; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.AbstractAnalysisModule; diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitSchedule2Shp/TransitSchedule2Shp.java b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitSchedule2Shp/TransitSchedule2Shp.java index 8423b07bc67..f0b2a77841d 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitSchedule2Shp/TransitSchedule2Shp.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitSchedule2Shp/TransitSchedule2Shp.java @@ -25,6 +25,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -43,7 +44,6 @@ import org.matsim.pt.transitSchedule.api.TransitLine; import org.matsim.pt.transitSchedule.api.TransitRoute; import org.matsim.pt.transitSchedule.api.TransitSchedule; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.AbstractAnalysisModule; @@ -82,7 +82,7 @@ public void postProcessData() { @Override public void writeResults(String outputFolder) { - Collection features = new ArrayList(); + Collection features = new ArrayList<>(); // write a shape per line for(TransitLine transitLine: this.schedule.getTransitLines().values()){ if(transitLine.getRoutes().isEmpty()){ diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitVehicleVolume/TransitVehicleVolumeAnalyzer.java b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitVehicleVolume/TransitVehicleVolumeAnalyzer.java index 22093aa08e6..d279b86c492 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitVehicleVolume/TransitVehicleVolumeAnalyzer.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/modules/transitVehicleVolume/TransitVehicleVolumeAnalyzer.java @@ -29,6 +29,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -44,7 +45,6 @@ import org.matsim.counts.Count; import org.matsim.counts.Counts; import org.matsim.counts.Volume; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.analysis.modules.AbstractAnalysisModule; @@ -127,7 +127,7 @@ private void writeModeShape(String name, Counts counts, Map mo } SimpleFeatureBuilder builder = new SimpleFeatureBuilder(b.buildFeatureType()); - Collection features = new ArrayList(); + Collection features = new ArrayList<>(); Object[] featureAttribs; for(Count c: counts.getCounts().values()){ diff --git a/contribs/vsp/src/main/java/playground/vsp/analysis/utils/heatMap/HeatMap.java b/contribs/vsp/src/main/java/playground/vsp/analysis/utils/heatMap/HeatMap.java index f8441de40be..c35342f7403 100644 --- a/contribs/vsp/src/main/java/playground/vsp/analysis/utils/heatMap/HeatMap.java +++ b/contribs/vsp/src/main/java/playground/vsp/analysis/utils/heatMap/HeatMap.java @@ -25,6 +25,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -36,7 +37,6 @@ import org.matsim.core.utils.collections.Tuple; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; /** * @author droeder @@ -185,7 +185,7 @@ public static void writeHeatMapShape(String name, HeatMap heatmap, String file, b.add("count", Double.class); SimpleFeatureBuilder builder = new SimpleFeatureBuilder(b.buildFeatureType()); - Collection features = new ArrayList(); + Collection features = new ArrayList<>(); Object[] featureAttribs; int i = 0; diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/RouteAllModesAsCar.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/RouteAllModesAsCar.java index 28ddbf7ab00..11baea3d7d3 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/RouteAllModesAsCar.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/RouteAllModesAsCar.java @@ -28,6 +28,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -56,7 +57,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.pt.PtConstants; -import org.opengis.feature.simple.SimpleFeature; /** * Routes all modes of transport (except for transit_walk) as car modes and counts the number of trips per link. @@ -118,7 +118,7 @@ private void writeAsShape(String outputDir, String targetCoordinateSystem) { SimpleFeatureBuilder builder = new SimpleFeatureBuilder(typeBuilder.buildFeatureType()); - Collection features = new ArrayList(); + Collection features = new ArrayList<>(); Object[] featureAttribs; diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinksstatsPolygonBasedFeatureGenerator.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinksstatsPolygonBasedFeatureGenerator.java index 8cc5021b57c..82bda0a2832 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinksstatsPolygonBasedFeatureGenerator.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinksstatsPolygonBasedFeatureGenerator.java @@ -23,14 +23,14 @@ import java.util.HashMap; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.locationtech.jts.geom.Coordinate; import org.matsim.api.core.v01.network.Link; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.PolygonFeatureFactory; import org.matsim.utils.gis.matsim2esri.network.FeatureGenerator; import org.matsim.utils.gis.matsim2esri.network.WidthCalculator; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; public class LinksstatsPolygonBasedFeatureGenerator implements FeatureGenerator{ diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinkstatsStringBasedFeatureGenerator.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinkstatsStringBasedFeatureGenerator.java index f88e52dd9e2..7853077dfa1 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinkstatsStringBasedFeatureGenerator.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/LinkstatsStringBasedFeatureGenerator.java @@ -24,6 +24,8 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.locationtech.jts.geom.Coordinate; import org.matsim.api.core.v01.network.Link; import org.matsim.core.network.NetworkUtils; @@ -31,8 +33,6 @@ import org.matsim.core.utils.gis.PolylineFeatureFactory; import org.matsim.utils.gis.matsim2esri.network.FeatureGenerator; import org.matsim.utils.gis.matsim2esri.network.WidthCalculator; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; public class LinkstatsStringBasedFeatureGenerator implements FeatureGenerator{ diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/NetworkAndMore2ESRI.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/NetworkAndMore2ESRI.java index 06049bc5b48..abb8c3c3c11 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/NetworkAndMore2ESRI.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/compareLinkStats/NetworkAndMore2ESRI.java @@ -21,6 +21,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.scenario.MutableScenario; import org.matsim.core.scenario.ScenarioUtils; @@ -31,7 +32,6 @@ import org.matsim.utils.gis.matsim2esri.network.FeatureGeneratorBuilderImpl; import org.matsim.utils.gis.matsim2esri.network.LanesBasedWidthCalculator; import org.matsim.utils.gis.matsim2esri.network.Links2ESRIShape; -import org.opengis.referencing.crs.CoordinateReferenceSystem; public class NetworkAndMore2ESRI extends Links2ESRIShape{ diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksPolygonBasedFeatureGenerator.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksPolygonBasedFeatureGenerator.java index 102634cd53d..5f22adde1f8 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksPolygonBasedFeatureGenerator.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksPolygonBasedFeatureGenerator.java @@ -22,14 +22,14 @@ import java.util.HashMap; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.locationtech.jts.geom.Coordinate; import org.matsim.api.core.v01.network.Link; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.PolygonFeatureFactory; import org.matsim.utils.gis.matsim2esri.network.FeatureGenerator; import org.matsim.utils.gis.matsim2esri.network.WidthCalculator; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; public class CountVehOnLinksPolygonBasedFeatureGenerator implements FeatureGenerator{ diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksStringBasedFeatureGenerator.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksStringBasedFeatureGenerator.java index 3bd65d714a4..c94c9e5db74 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksStringBasedFeatureGenerator.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/CountVehOnLinksStringBasedFeatureGenerator.java @@ -23,6 +23,8 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.locationtech.jts.geom.Coordinate; import org.matsim.api.core.v01.network.Link; import org.matsim.core.network.NetworkUtils; @@ -30,8 +32,6 @@ import org.matsim.core.utils.gis.PolylineFeatureFactory; import org.matsim.utils.gis.matsim2esri.network.FeatureGenerator; import org.matsim.utils.gis.matsim2esri.network.WidthCalculator; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; public class CountVehOnLinksStringBasedFeatureGenerator implements FeatureGenerator{ diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/PackageMain.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/PackageMain.java index ecda8472e30..d49960a9084 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/PackageMain.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/countVehOnLinks/PackageMain.java @@ -21,6 +21,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.matsim.api.core.v01.network.Network; import org.matsim.core.config.ConfigUtils; import org.matsim.core.network.io.MatsimNetworkReader; @@ -31,7 +32,6 @@ import org.matsim.utils.gis.matsim2esri.network.FeatureGeneratorBuilderImpl; import org.matsim.utils.gis.matsim2esri.network.LanesBasedWidthCalculator; import org.matsim.utils.gis.matsim2esri.network.Links2ESRIShape; -import org.opengis.referencing.crs.CoordinateReferenceSystem; public class PackageMain extends Links2ESRIShape{ diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/filterActsPerShape/WorkHomeShapeCounter.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/filterActsPerShape/WorkHomeShapeCounter.java index c7489566966..fde71b63868 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/filterActsPerShape/WorkHomeShapeCounter.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/ana/filterActsPerShape/WorkHomeShapeCounter.java @@ -27,8 +27,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Polygon; import org.matsim.api.core.v01.Coord; @@ -40,7 +41,6 @@ import org.matsim.core.population.algorithms.AbstractPersonAlgorithm; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; public class WorkHomeShapeCounter extends AbstractPersonAlgorithm{ diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pop/FilterPopulationByShape.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pop/FilterPopulationByShape.java index 63fede8cee6..d346fae1a03 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pop/FilterPopulationByShape.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pop/FilterPopulationByShape.java @@ -26,6 +26,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.MultiPolygon; @@ -53,7 +54,6 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; /** * Filters a given Population by a given shape - includes all routed modes diff --git a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pt/transitSchedule2shape/DaShapeWriter.java b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pt/transitSchedule2shape/DaShapeWriter.java index 600ff620232..7408cde20fb 100644 --- a/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pt/transitSchedule2shape/DaShapeWriter.java +++ b/contribs/vsp/src/main/java/playground/vsp/andreas/utils/pt/transitSchedule2shape/DaShapeWriter.java @@ -30,6 +30,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -49,7 +50,6 @@ import org.matsim.pt.transitSchedule.api.TransitRouteStop; import org.matsim.pt.transitSchedule.api.TransitSchedule; import org.matsim.pt.transitSchedule.api.TransitStopFacility; -import org.opengis.feature.simple.SimpleFeature; /** * diff --git a/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CORINELandCoverCoordsModifier.java b/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CORINELandCoverCoordsModifier.java index d16d17d4ada..99fe02269c7 100644 --- a/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CORINELandCoverCoordsModifier.java +++ b/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CORINELandCoverCoordsModifier.java @@ -26,6 +26,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; @@ -40,7 +41,6 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.openberlinscenario.cemdap.output.Cemdap2MatsimUtils; import playground.vsp.openberlinscenario.cemdap.output.CemdapOutput2MatsimPlansConverter; diff --git a/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CorineLandCoverData.java b/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CorineLandCoverData.java index d8b0584a210..267ef739180 100644 --- a/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CorineLandCoverData.java +++ b/contribs/vsp/src/main/java/playground/vsp/corineLandcover/CorineLandCoverData.java @@ -27,12 +27,12 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; import org.matsim.core.gbl.Gbl; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; /** * Created by amit on 31.07.17. diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterDemandWriter.java b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterDemandWriter.java index 10f4c106725..0c931ed13c1 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterDemandWriter.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterDemandWriter.java @@ -29,6 +29,9 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; +import org.geotools.api.referencing.operation.MathTransform; import org.geotools.geometry.jts.JTS; import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Coordinate; @@ -52,9 +55,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.misc.Time; import org.matsim.core.utils.timing.TimeInterpretation; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.MathTransform; /** * @author jbischoff diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterGenerator.java b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterGenerator.java index 41c2466c84d..17f4de617b0 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterGenerator.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/CommuterGenerator.java @@ -24,6 +24,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.population.PopulationWriter; import org.matsim.core.config.Config; @@ -34,8 +36,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.geometry.transformations.TransformationFactory; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * @author jbischoff @@ -85,7 +85,7 @@ public static void main(String[] args) throws Exception { //landuse if (useLanduse){ DgLanduseReader landuseReader = new DgLanduseReader(); - Tuple,CoordinateReferenceSystem> homeLanduse = landuseReader.readLanduseDataHome(); + Tuple, CoordinateReferenceSystem> homeLanduse = landuseReader.readLanduseDataHome(); Tuple,CoordinateReferenceSystem> workLanduse = landuseReader.readLanduseDataWork(); cdw.addLanduse("home", homeLanduse); cdw.addLanduse("work", workLanduse); diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgLanduseReader.java b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgLanduseReader.java index 6a7b47969d3..8ee88afb6d4 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgLanduseReader.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgLanduseReader.java @@ -22,10 +22,10 @@ import java.util.Collection; import java.util.HashSet; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.matsim.core.utils.collections.Tuple; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** @@ -60,7 +60,7 @@ public class DgLanduseReader { // private static final String[] landuse_files_work = {INDUSTRIE_GEWERBEGEBIETE}; - public Tuple,CoordinateReferenceSystem> readLanduseDataHome(){ + public Tuple, CoordinateReferenceSystem> readLanduseDataHome(){ return this.readLanduseData(landuse_files_home); } diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgPopulation2ShapeWriter.java b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgPopulation2ShapeWriter.java index 943f51c177f..4a3c67112c3 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgPopulation2ShapeWriter.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/commuterDemandCottbus/DgPopulation2ShapeWriter.java @@ -22,6 +22,9 @@ import java.util.ArrayList; import java.util.List; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; +import org.geotools.api.referencing.operation.MathTransform; import org.geotools.geometry.jts.JTS; import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Coordinate; @@ -33,9 +36,6 @@ import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.PointFeatureFactory; import org.matsim.core.utils.gis.GeoFileWriter; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.MathTransform; /** @@ -67,7 +67,7 @@ public void write(String activityType, String filename, CoordinateReferenceSyste addAttribute("end_time", Double.class). create(); - List features = new ArrayList(); + List features = new ArrayList<>(); SimpleFeature f = null; for (Person p : this.pop.getPersons().values()){ Plan plan = p.getSelectedPlan(); diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/counts/TSBASt2Count.java b/contribs/vsp/src/main/java/playground/vsp/demandde/counts/TSBASt2Count.java index 6796e013723..8c652ff8248 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/counts/TSBASt2Count.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/counts/TSBASt2Count.java @@ -11,12 +11,12 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.referencing.FactoryException; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; import org.matsim.counts.Count; import org.matsim.counts.Counts; import org.matsim.counts.CountsWriter; -import org.opengis.referencing.FactoryException; import playground.vsp.demandde.counts.BastHourlyCountData.Day; diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/GVPlanReader.java b/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/GVPlanReader.java index 113c347994a..82d2c4e4026 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/GVPlanReader.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/GVPlanReader.java @@ -21,6 +21,7 @@ import java.util.Collection; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -33,7 +34,6 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.geometry.transformations.TransformationFactory; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.pipeline.PopulationReaderTask; import playground.vsp.pipeline.PopulationWriterTask; diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/PendlerMatrixReader.java b/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/PendlerMatrixReader.java index 1d53d1a7aa4..c084f138bc1 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/PendlerMatrixReader.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/PendlerMatrixReader.java @@ -26,6 +26,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; @@ -45,7 +46,6 @@ import org.matsim.facilities.ActivityFacility; import org.matsim.facilities.ActivityOption; import org.matsim.facilities.Facility; -import org.opengis.feature.simple.SimpleFeature; public class PendlerMatrixReader { @@ -81,7 +81,7 @@ public void run() { private void readShape() { Collection landkreise = GeoFileReader.getAllFeatures(this.shapeFile); - ActivityFacilitiesFactory factory = ((MutableScenario)this.sc).getActivityFacilities().getFactory(); + ActivityFacilitiesFactory factory = this.sc.getActivityFacilities().getFactory(); for (SimpleFeature landkreis : landkreise) { Integer gemeindeschluessel = Integer.parseInt((String) landkreis.getAttribute("gemeindesc")); Geometry geo = (Geometry) landkreis.getDefaultGeometry(); diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/Verschmierer.java b/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/Verschmierer.java index 4ccba3644f7..d01ca26ce36 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/Verschmierer.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/pendlermatrix/Verschmierer.java @@ -23,6 +23,7 @@ import java.util.Map; import java.util.Random; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; @@ -30,7 +31,6 @@ import org.matsim.api.core.v01.Coord; import org.matsim.core.utils.geometry.geotools.MGC; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; public class Verschmierer { diff --git a/contribs/vsp/src/main/java/playground/vsp/demandde/prognose2025/DemandMatrixReader.java b/contribs/vsp/src/main/java/playground/vsp/demandde/prognose2025/DemandMatrixReader.java index ba6cd54148d..967e7628e1d 100644 --- a/contribs/vsp/src/main/java/playground/vsp/demandde/prognose2025/DemandMatrixReader.java +++ b/contribs/vsp/src/main/java/playground/vsp/demandde/prognose2025/DemandMatrixReader.java @@ -26,6 +26,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Point; @@ -49,7 +50,6 @@ import org.matsim.facilities.ActivityFacility; import org.matsim.facilities.ActivityOption; import org.matsim.facilities.Facility; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.demandde.pendlermatrix.TripFlowSink; @@ -158,7 +158,7 @@ public void startRow(String[] row) { private void readShape() { Collection landkreise = GeoFileReader.getAllFeatures(this.shapeFile); - final ActivityFacilitiesFactory factory = ((MutableScenario)this.sc).getActivityFacilities().getFactory(); + final ActivityFacilitiesFactory factory = this.sc.getActivityFacilities().getFactory(); for (SimpleFeature landkreis : landkreise) { Integer gemeindeschluessel = Integer.parseInt((String) landkreis.getAttribute("gemeindesc")); Geometry geo = (Geometry) landkreis.getDefaultGeometry(); diff --git a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreator.java b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreator.java index 3ec676d187d..d457bb7dec9 100644 --- a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreator.java +++ b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreator.java @@ -30,6 +30,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.population.Person; import org.matsim.api.core.v01.population.Plan; @@ -45,7 +46,6 @@ import org.matsim.households.HouseholdImpl; import org.matsim.utils.objectattributes.ObjectAttributes; import org.matsim.utils.objectattributes.attributable.Attributes; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.openberlinscenario.Gender; import playground.vsp.openberlinscenario.cemdap.LogToOutputSaver; diff --git a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreatorChildren.java b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreatorChildren.java index 71cec77ea8a..5369dd74f6c 100644 --- a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreatorChildren.java +++ b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/SynPopCreatorChildren.java @@ -20,6 +20,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.population.Person; import org.matsim.api.core.v01.population.Plan; @@ -31,7 +32,6 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.gis.GeoFileReader; import org.matsim.utils.objectattributes.ObjectAttributes; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.openberlinscenario.Gender; import playground.vsp.openberlinscenario.cemdap.LogToOutputSaver; diff --git a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/ZoneAndLOSGeneratorV2.java b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/ZoneAndLOSGeneratorV2.java index c97a9b2cbf6..dde91a38d73 100644 --- a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/ZoneAndLOSGeneratorV2.java +++ b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/input/ZoneAndLOSGeneratorV2.java @@ -33,12 +33,11 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.matsim.api.core.v01.Coord; import org.matsim.core.utils.gis.GeoFileReader; import org.matsim.core.utils.io.IOUtils; -import org.opengis.feature.simple.SimpleFeature; - import playground.vsp.openberlinscenario.cemdap.LogToOutputSaver; /** diff --git a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/Cemdap2MatsimUtils.java b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/Cemdap2MatsimUtils.java index 6298091c81a..97d160c368d 100644 --- a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/Cemdap2MatsimUtils.java +++ b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/Cemdap2MatsimUtils.java @@ -21,6 +21,7 @@ import java.util.Random; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Geometry; @@ -28,7 +29,6 @@ import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; import org.matsim.core.gbl.MatsimRandom; -import org.opengis.feature.simple.SimpleFeature; /** * @author dziemke diff --git a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/CemdapOutput2MatsimPlansConverter.java b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/CemdapOutput2MatsimPlansConverter.java index b8be4c3a3a8..5049ac72cb1 100644 --- a/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/CemdapOutput2MatsimPlansConverter.java +++ b/contribs/vsp/src/main/java/playground/vsp/openberlinscenario/cemdap/output/CemdapOutput2MatsimPlansConverter.java @@ -28,6 +28,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.locationtech.jts.geom.Geometry; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; @@ -42,7 +43,6 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.gis.GeoFileReader; import org.matsim.utils.objectattributes.ObjectAttributes; -import org.opengis.feature.simple.SimpleFeature; import playground.vsp.corineLandcover.CorineLandCoverData; import playground.vsp.corineLandcover.GeometryUtils; diff --git a/contribs/vsp/src/main/java/playground/vsp/pt/transitRouteTrimmer/TransitRouteTrimmerUtils.java b/contribs/vsp/src/main/java/playground/vsp/pt/transitRouteTrimmer/TransitRouteTrimmerUtils.java index f8aadd7ee15..99239b29fd1 100644 --- a/contribs/vsp/src/main/java/playground/vsp/pt/transitRouteTrimmer/TransitRouteTrimmerUtils.java +++ b/contribs/vsp/src/main/java/playground/vsp/pt/transitRouteTrimmer/TransitRouteTrimmerUtils.java @@ -22,15 +22,17 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.data.SimpleFeatureStore; +import org.geotools.api.data.Transaction; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; import org.geotools.data.DataUtilities; import org.geotools.data.DefaultTransaction; -import org.geotools.data.Transaction; import org.geotools.data.collection.ListFeatureCollection; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.data.simple.SimpleFeatureCollection; -import org.geotools.data.simple.SimpleFeatureSource; -import org.geotools.data.simple.SimpleFeatureStore; import org.geotools.feature.SchemaException; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.geometry.jts.JTSFactoryFinder; @@ -43,8 +45,6 @@ import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.pt.transitSchedule.api.*; import org.matsim.utils.gis.shp2matsim.ShpGeometryUtils; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; import java.io.File; import java.io.IOException; diff --git a/matsim/src/main/java/org/matsim/analysis/pt/stop2stop/PtStop2StopAnalysis2Shp.java b/matsim/src/main/java/org/matsim/analysis/pt/stop2stop/PtStop2StopAnalysis2Shp.java index 99eeb4c0b20..1599a5ba979 100644 --- a/matsim/src/main/java/org/matsim/analysis/pt/stop2stop/PtStop2StopAnalysis2Shp.java +++ b/matsim/src/main/java/org/matsim/analysis/pt/stop2stop/PtStop2StopAnalysis2Shp.java @@ -23,6 +23,7 @@ import org.apache.commons.csv.CSVPrinter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -35,7 +36,6 @@ import org.matsim.core.utils.gis.GeoFileWriter; import org.matsim.core.utils.io.IOUtils; import org.matsim.pt.transitSchedule.api.TransitLine; -import org.opengis.feature.simple.SimpleFeature; import java.io.IOException; import java.util.*; diff --git a/matsim/src/main/java/org/matsim/core/network/algorithms/NetworkTeleatlasAddManeuverRestrictions.java b/matsim/src/main/java/org/matsim/core/network/algorithms/NetworkTeleatlasAddManeuverRestrictions.java index b88e16c0a2b..f9a20978221 100644 --- a/matsim/src/main/java/org/matsim/core/network/algorithms/NetworkTeleatlasAddManeuverRestrictions.java +++ b/matsim/src/main/java/org/matsim/core/network/algorithms/NetworkTeleatlasAddManeuverRestrictions.java @@ -28,9 +28,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.data.shapefile.dbf.DbaseFileReader; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; @@ -41,7 +42,6 @@ import org.matsim.core.utils.collections.Tuple; import org.matsim.core.utils.gis.GeoFileReader; import org.matsim.core.utils.io.IOUtils; -import org.opengis.feature.simple.SimpleFeature; /** * Adds maneuver restrictions to a MATSim {@link Network network} created diff --git a/matsim/src/main/java/org/matsim/core/network/io/NetworkReaderTeleatlas.java b/matsim/src/main/java/org/matsim/core/network/io/NetworkReaderTeleatlas.java index c4416bb5531..4c947ad52fa 100644 --- a/matsim/src/main/java/org/matsim/core/network/io/NetworkReaderTeleatlas.java +++ b/matsim/src/main/java/org/matsim/core/network/io/NetworkReaderTeleatlas.java @@ -24,8 +24,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.geometry.BoundingBox; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; @@ -34,8 +36,6 @@ import org.matsim.core.api.internal.MatsimSomeReader; import org.matsim.core.network.NetworkUtils; import org.matsim.core.utils.gis.GeoFileReader; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.geometry.BoundingBox; /** * A reader for TeleAtlas network description files. The reader is based on diff --git a/matsim/src/main/java/org/matsim/core/utils/geometry/GeometryUtils.java b/matsim/src/main/java/org/matsim/core/utils/geometry/GeometryUtils.java index b407c794b2b..1c8fc0ac6e7 100644 --- a/matsim/src/main/java/org/matsim/core/utils/geometry/GeometryUtils.java +++ b/matsim/src/main/java/org/matsim/core/utils/geometry/GeometryUtils.java @@ -28,6 +28,7 @@ import java.util.Map.Entry; import java.util.Random; +import org.geotools.api.feature.simple.SimpleFeature; import org.geotools.geometry.jts.GeometryBuilder; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; @@ -40,7 +41,6 @@ import org.matsim.api.core.v01.network.Network; import org.matsim.core.gbl.Gbl; import org.matsim.core.utils.geometry.geotools.MGC; -import org.opengis.feature.simple.SimpleFeature; /** * @author kainagel diff --git a/matsim/src/main/java/org/matsim/core/utils/geometry/geotools/MGC.java b/matsim/src/main/java/org/matsim/core/utils/geometry/geotools/MGC.java index cf50c6938c0..3667bf7aa80 100644 --- a/matsim/src/main/java/org/matsim/core/utils/geometry/geotools/MGC.java +++ b/matsim/src/main/java/org/matsim/core/utils/geometry/geotools/MGC.java @@ -25,14 +25,14 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.geotools.api.referencing.FactoryException; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; import org.matsim.core.utils.geometry.transformations.TransformationFactory; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * Converter factory for various conversion from Geotools to MATSim and vice versa. diff --git a/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/GeotoolsTransformation.java b/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/GeotoolsTransformation.java index 531383ac9e9..5d6b414394d 100644 --- a/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/GeotoolsTransformation.java +++ b/matsim/src/main/java/org/matsim/core/utils/geometry/transformations/GeotoolsTransformation.java @@ -20,6 +20,10 @@ package org.matsim.core.utils.geometry.transformations; +import org.geotools.api.referencing.FactoryException; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; +import org.geotools.api.referencing.operation.MathTransform; +import org.geotools.api.referencing.operation.TransformException; import org.geotools.geometry.jts.JTS; import org.geotools.referencing.CRS; import org.locationtech.jts.geom.Point; @@ -27,10 +31,6 @@ import org.matsim.core.utils.geometry.CoordUtils; import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.core.utils.geometry.geotools.MGC; -import org.opengis.referencing.FactoryException; -import org.opengis.referencing.crs.CoordinateReferenceSystem; -import org.opengis.referencing.operation.MathTransform; -import org.opengis.referencing.operation.TransformException; /** * A transformation factory for various coordinate systems using the GeoTools. diff --git a/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileReader.java b/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileReader.java index 80fe6650150..c08aa5f79b2 100644 --- a/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileReader.java +++ b/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileReader.java @@ -22,24 +22,19 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.geotools.data.DataStore; -import org.geotools.data.DataStoreFinder; -import org.geotools.data.FileDataStore; -import org.geotools.data.FileDataStoreFinder; +import org.geotools.api.data.*; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; +import org.geotools.api.feature.type.Name; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureIterator; -import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.geopkg.GeoPkgDataStoreFactory; import org.geotools.jdbc.JDBCDataStore; import org.matsim.core.api.internal.MatsimSomeReader; import org.matsim.core.gbl.Gbl; import org.matsim.core.utils.misc.Counter; -import org.opengis.feature.Feature; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; -import org.opengis.feature.type.Name; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import java.io.File; import java.io.IOException; diff --git a/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileWriter.java b/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileWriter.java index 26296281c56..c0bd720f77a 100644 --- a/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileWriter.java +++ b/matsim/src/main/java/org/matsim/core/utils/gis/GeoFileWriter.java @@ -22,19 +22,19 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.geotools.data.DataStore; -import org.geotools.data.DataStoreFinder; -import org.geotools.data.FileDataStore; +import org.geotools.api.data.DataStore; +import org.geotools.api.data.DataStoreFinder; +import org.geotools.api.data.FileDataStore; +import org.geotools.api.data.SimpleFeatureStore; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; +import org.geotools.api.feature.type.Name; import org.geotools.data.shapefile.ShapefileDataStore; -import org.geotools.data.simple.SimpleFeatureStore; import org.geotools.feature.DefaultFeatureCollection; import org.geotools.feature.NameImpl; import org.geotools.geopkg.GeoPkgDataStoreFactory; import org.geotools.jdbc.JDBCDataStoreFactory; import org.matsim.core.api.internal.MatsimSomeWriter; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; -import org.opengis.feature.type.Name; import java.io.File; import java.io.IOException; diff --git a/matsim/src/main/java/org/matsim/core/utils/gis/PointFeatureFactory.java b/matsim/src/main/java/org/matsim/core/utils/gis/PointFeatureFactory.java index e8b3cd008ef..30844e5e672 100644 --- a/matsim/src/main/java/org/matsim/core/utils/gis/PointFeatureFactory.java +++ b/matsim/src/main/java/org/matsim/core/utils/gis/PointFeatureFactory.java @@ -23,15 +23,15 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.matsim.api.core.v01.Coord; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * @author mrieser / senozon diff --git a/matsim/src/main/java/org/matsim/core/utils/gis/PolygonFeatureFactory.java b/matsim/src/main/java/org/matsim/core/utils/gis/PolygonFeatureFactory.java index 90138d648da..a6389d0af0f 100644 --- a/matsim/src/main/java/org/matsim/core/utils/gis/PolygonFeatureFactory.java +++ b/matsim/src/main/java/org/matsim/core/utils/gis/PolygonFeatureFactory.java @@ -23,6 +23,9 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; @@ -31,9 +34,6 @@ import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Polygon; import org.matsim.api.core.v01.Coord; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * @author mrieser / senozon diff --git a/matsim/src/main/java/org/matsim/core/utils/gis/PolylineFeatureFactory.java b/matsim/src/main/java/org/matsim/core/utils/gis/PolylineFeatureFactory.java index 745b7d4aee0..dac6691065f 100644 --- a/matsim/src/main/java/org/matsim/core/utils/gis/PolylineFeatureFactory.java +++ b/matsim/src/main/java/org/matsim/core/utils/gis/PolylineFeatureFactory.java @@ -23,15 +23,15 @@ import java.util.LinkedHashMap; import java.util.Map; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.LineString; import org.locationtech.jts.geom.MultiLineString; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * @author mrieser / senozon diff --git a/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileReader.java b/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileReader.java index d3ddd7a6c8c..26defd23bbe 100644 --- a/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileReader.java +++ b/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileReader.java @@ -20,16 +20,15 @@ package org.matsim.core.utils.gis; -import org.geotools.data.DataStore; -import org.geotools.data.FileDataStore; +import org.geotools.api.data.DataStore; +import org.geotools.api.data.FileDataStore; +import org.geotools.api.data.SimpleFeatureSource; +import org.geotools.api.feature.simple.SimpleFeature; +import org.geotools.api.feature.simple.SimpleFeatureType; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.geotools.data.simple.SimpleFeatureCollection; -import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.geometry.jts.ReferencedEnvelope; import org.matsim.core.api.internal.MatsimSomeReader; -import org.opengis.feature.Feature; -import org.opengis.feature.simple.SimpleFeature; -import org.opengis.feature.simple.SimpleFeatureType; -import org.opengis.referencing.crs.CoordinateReferenceSystem; import java.io.IOException; import java.io.UncheckedIOException; diff --git a/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileWriter.java b/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileWriter.java index c0ea83390e9..b789ee0bb10 100644 --- a/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileWriter.java +++ b/matsim/src/main/java/org/matsim/core/utils/gis/ShapeFileWriter.java @@ -20,10 +20,11 @@ package org.matsim.core.utils.gis; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.core.api.internal.MatsimSomeWriter; -import org.opengis.feature.simple.SimpleFeature; import java.util.Collection; + /** * This is a simple utility class that provides methods to write Feature instances * of the geotools framework to an ESRI shape file. diff --git a/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGenerator.java b/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGenerator.java index 0b2a180eb58..5f06d853f38 100755 --- a/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGenerator.java +++ b/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGenerator.java @@ -20,8 +20,8 @@ package org.matsim.utils.gis.matsim2esri.network; +import org.geotools.api.feature.simple.SimpleFeature; import org.matsim.api.core.v01.network.Link; -import org.opengis.feature.simple.SimpleFeature; public interface FeatureGenerator { diff --git a/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGeneratorBuilderImpl.java b/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGeneratorBuilderImpl.java index 89351a8efb9..dc1f174ee04 100755 --- a/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGeneratorBuilderImpl.java +++ b/matsim/src/main/java/org/matsim/utils/gis/matsim2esri/network/FeatureGeneratorBuilderImpl.java @@ -23,9 +23,9 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import org.geotools.api.referencing.crs.CoordinateReferenceSystem; import org.matsim.api.core.v01.network.Network; import org.matsim.core.utils.geometry.geotools.MGC; -import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * Design thoughts: