From f16ab0aac4f334ad4943293c7970df5d3deda5b2 Mon Sep 17 00:00:00 2001 From: rakow Date: Wed, 8 May 2024 09:44:57 +0200 Subject: [PATCH 01/33] 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 02/33] 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 03/33] 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 04/33] 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 05/33] 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 06/33] 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 f2ef7a2b9e039ad20cb8187b924b238738362608 Mon Sep 17 00:00:00 2001 From: rakow Date: Mon, 13 May 2024 10:02:12 +0200 Subject: [PATCH 07/33] 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 08/33] 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 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 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 09/33] 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 10/33] 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 11/33] 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 12/33] 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 13/33] 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 14/33] 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 15/33] 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 16/33] 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 17/33] 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 18/33] 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: