From 05146bca0174e6ff717a5fda95e385f6480e1abc Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Wed, 27 Nov 2024 13:13:22 +0100 Subject: [PATCH 01/51] Add a CarrierJob interface and put CarrierService and CarrierShipment behind it. --- .../matsim/freight/carriers/CarrierJob.java | 19 +++++++++++++++++++ .../freight/carriers/CarrierService.java | 2 +- .../freight/carriers/CarrierShipment.java | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java new file mode 100644 index 00000000000..3654fbff36a --- /dev/null +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java @@ -0,0 +1,19 @@ +package org.matsim.freight.carriers; + +import org.matsim.utils.objectattributes.attributable.Attributable; + +/** + * A job that a {@link Carrier} can do. + *

+ * In a first step this is more or less a marker interface. + *

+ * In the next steps it will be extended, as follows + * 1) existing common methods of {@link CarrierShipment} and {@link + * CarrierService} where moved up here + * 2) some similiar, but differently named methods of {@link + * CarrierShipment} and {@link CarrierService} were renamed to the same name and moved up here + * ... + * future) It maybe gets generalized in way, that we only have one job definition with 1 or 2 + * location(s). This then defines, if jsprit takes the job as a service or as a shipment. + */ +public interface CarrierJob extends Attributable {} diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java index b7106fa6de9..7500b10887d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java @@ -28,7 +28,7 @@ import org.matsim.utils.objectattributes.attributable.AttributesImpl; -public final class CarrierService implements Attributable { +public final class CarrierService implements CarrierJob { public static class Builder { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java index 9472ffaac91..489657ba54e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java @@ -36,7 +36,7 @@ * @author sschroeder * */ -public final class CarrierShipment implements Attributable { +public final class CarrierShipment implements CarrierJob { /** * A builder that builds shipments. From bb8ee1c410eec6501ef59a9f6bc240da8402df06 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Fri, 29 Nov 2024 14:33:17 +0100 Subject: [PATCH 02/51] first steps of cleanup --- .../chessboard/InitialCarrierPlanCreator.java | 2 -- .../freight/carriers/CarrierModuleTest.java | 2 +- .../CarrierVehicleTypeLoaderTest.java | 12 +++++----- .../CarrierVehicleTypeReaderTest.java | 7 ++++-- .../carriers/jsprit/FixedCostsTest.java | 16 ++++---------- .../utils/CarrierControllerUtilsIT.java | 11 ++-------- .../utils/CarrierControllerUtilsTest.java | 7 ------ .../vehicleTypes.xml | 22 ------------------- .../freight/carriers/vehicleTypes_v2.xml | 8 +++---- 9 files changed, 23 insertions(+), 64 deletions(-) delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest/vehicleTypes.xml diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java index fb2979e4be1..917f2e94f3c 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java @@ -166,8 +166,6 @@ public static void main(String[] args) { Carriers carriers = new Carriers(); new CarrierPlanXmlReader(carriers, types ).readFile("input/usecases/chessboard/freight/carrierPlansWithoutRoutes_10minTW.xml" ); - new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(types); - for(Carrier carrier : carriers.getCarriers().values()){ CarrierPlan plan = new InitialCarrierPlanCreator(scenario.getNetwork()).createPlan(carrier); carrier.addPlan(plan); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java index 49dc173dd05..9996b452b6f 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java @@ -69,7 +69,7 @@ public void setUp(){ config.plans().setInputFile( testUtils.getClassInputDirectory() + "plans100.xml" ); config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles); config.controller().setWritePlansInterval(1); - config.controller().setCreateGraphs(false); + config.controller().setCreateGraphsInterval(0); freightCarriersConfigGroup = ConfigUtils.addOrGetModule( config, FreightCarriersConfigGroup.class ) ; freightCarriersConfigGroup.setCarriersFile( testUtils.getClassInputDirectory() + "carrierPlansEquils.xml"); freightCarriersConfigGroup.setCarriersVehicleTypesFile( testUtils.getClassInputDirectory() + "vehicleTypes.xml"); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java index 97954bb151d..7c26f0ca6f0 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java @@ -31,6 +31,8 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; +import java.nio.file.Path; + public class CarrierVehicleTypeLoaderTest { @RegisterExtension @@ -42,14 +44,14 @@ public class CarrierVehicleTypeLoaderTest { @BeforeEach public void setUp() { types = new CarrierVehicleTypes(); - new CarrierVehicleTypeReader(types).readFile(utils.getClassInputDirectory() + "vehicleTypes.xml"); + new CarrierVehicleTypeReader(types).readFile(Path.of(utils.getClassInputDirectory()).getParent().resolve("vehicleTypes_v2.xml").toString()); carriers = new Carriers(); new CarrierPlanXmlReader(carriers, types ).readFile(utils.getClassInputDirectory() + "carrierPlansEquils.xml" ); } @Test void test_whenLoadingTypes_allAssignmentsInLightVehicleAreCorrectly(){ - new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(types); +// new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(types); Carrier testCarrier = carriers.getCarriers().get(Id.create("testCarrier", Carrier.class)); CarrierVehicle v = CarriersUtils.getCarrierVehicle(testCarrier,Id.createVehicleId("lightVehicle")); @@ -62,13 +64,13 @@ void test_whenLoadingTypes_allAssignmentsInLightVehicleAreCorrectly(){ Assertions.assertEquals(0.35, vehicleTypeLoaded.getCostInformation().getCostsPerMeter(), MatsimTestUtils.EPSILON); Assertions.assertEquals(30, vehicleTypeLoaded.getCostInformation().getCostsPerSecond(), MatsimTestUtils.EPSILON); - Assertions.assertEquals("gasoline", vehicleTypeLoaded.getEngineInformation().getFuelType().toString()); + Assertions.assertEquals("gasoline", VehicleUtils.getHbefaTechnology(vehicleTypeLoaded.getEngineInformation())); Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumption(vehicleTypeLoaded), MatsimTestUtils.EPSILON); } @Test void test_whenLoadingTypes_allAssignmentsInMediumVehicleAreCorrectly(){ - new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(types); +// new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(types); Carrier testCarrier = carriers.getCarriers().get(Id.create("testCarrier", Carrier.class)); CarrierVehicle v = CarriersUtils.getCarrierVehicle(testCarrier,Id.createVehicleId("mediumVehicle")); @@ -81,7 +83,7 @@ void test_whenLoadingTypes_allAssignmentsInMediumVehicleAreCorrectly(){ Assertions.assertEquals(0.4, vehicleTypeLoaded.getCostInformation().getCostsPerMeter(), MatsimTestUtils.EPSILON); Assertions.assertEquals(30, vehicleTypeLoaded.getCostInformation().getCostsPerSecond(), MatsimTestUtils.EPSILON); - Assertions.assertEquals("gasoline", vehicleTypeLoaded.getEngineInformation().getFuelType().toString()); + Assertions.assertEquals("gasoline", VehicleUtils.getHbefaTechnology(vehicleTypeLoaded.getEngineInformation())); Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumption(vehicleTypeLoaded), MatsimTestUtils.EPSILON); } diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java index 3a2f5a5648e..3c2a489e0d2 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java @@ -29,6 +29,9 @@ import org.matsim.api.core.v01.Id; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.VehicleType; +import org.matsim.vehicles.VehicleUtils; + +import java.nio.file.Path; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -83,8 +86,8 @@ void test_whenReadingTypeMedium_itReadsCostInfoCorrectly(){ @Test void test_whenReadingTypeMedium_itReadsEngineInfoCorrectly(){ VehicleType medium = types.getVehicleTypes().get(Id.create("medium", org.matsim.vehicles.VehicleType.class ) ); - assertEquals(0.02, medium.getEngineInformation().getFuelConsumption(),0.01); - assertEquals("gasoline", medium.getEngineInformation().getFuelType().toString()); + assertEquals(0.02, VehicleUtils.getFuelConsumption(medium), 0.01); + assertEquals("gasoline", VehicleUtils.getHbefaTechnology(medium.getEngineInformation())); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java index 7e0e4bbe12e..6370f69d320 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java @@ -91,8 +91,8 @@ public void setUp() { VehicleType carrierVehType_A = VehicleUtils.getFactory().createVehicleType( vehicleTypeId ); { EngineInformation engineInformation1 = carrierVehType_A.getEngineInformation(); - engineInformation1.setFuelType( EngineInformation.FuelType.diesel ); - engineInformation1.setFuelConsumption( 0.015 ); + VehicleUtils.setFuelConsumption(carrierVehType_A, 0.015); + VehicleUtils.setHbefaTechnology(engineInformation1, "diesel"); carrierVehType_A.getCapacity().setOther( 1. ); carrierVehType_A.getCostInformation().setFixedCost( 0. ).setCostsPerMeter( 0.001 ).setCostsPerSecond( 0.0 ); carrierVehType_A.setMaximumVelocity( 10 ); @@ -106,8 +106,8 @@ public void setUp() { VehicleType carrierVehType_B = VehicleUtils.getFactory().createVehicleType( vehicleTypeId1 ); { EngineInformation engineInformation = carrierVehType_B.getEngineInformation(); - engineInformation.setFuelType( EngineInformation.FuelType.diesel ); - engineInformation.setFuelConsumption( 0.015 ); + VehicleUtils.setFuelConsumption(carrierVehType_A, 0.015); + VehicleUtils.setHbefaTechnology(engineInformation, "diesel"); carrierVehType_B.getCapacity().setOther( 1. ); carrierVehType_B.getCostInformation().setFixedCost( 10. ).setCostsPerMeter( 0.00001 ).setCostsPerSecond( 0. ) ; carrierVehType_B.setMaximumVelocity( 10. ); @@ -118,7 +118,6 @@ public void setUp() { //carrier1: only vehicles of Type A (no fixed costs, variable costs: 1 EUR/km) CarrierCapabilities cc1 = CarrierCapabilities.Builder.newInstance() - .addType(carrierVehType_A) .addVehicle(carrierVehicle_A) .setFleetSize(CarrierCapabilities.FleetSize.INFINITE) .build(); @@ -127,7 +126,6 @@ public void setUp() { //carrier2: only vehicles of Type B (fixed costs of 10 EUR/vehicle, no variable costs) CarrierCapabilities cc2 = CarrierCapabilities.Builder.newInstance() - .addType(carrierVehType_B) .addVehicle(carrierVehicle_B) .setFleetSize(CarrierCapabilities.FleetSize.INFINITE) .build(); @@ -136,8 +134,6 @@ public void setUp() { //carrier3: has both vehicles of Type A (no fixed costs, variable costs: 1 EUR/km) and Type B (fixed costs of 10 EUR/vehicle, no variable costs) CarrierCapabilities cc3 = CarrierCapabilities.Builder.newInstance() - .addType(carrierVehType_A) - .addType(carrierVehType_B) .addVehicle(carrierVehicle_A) .addVehicle(carrierVehicle_B) .setFleetSize(CarrierCapabilities.FleetSize.INFINITE) @@ -145,10 +141,6 @@ public void setUp() { carrier3.setCarrierCapabilities(cc3); carriers.addCarrier(carrier3); - - // assign vehicle types to the carriers - new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(vehicleTypes) ; - //load Network and build netbasedCosts for jsprit URL context = org.matsim.examples.ExamplesUtils.getTestScenarioURL( "freight-chessboard-9x9" ); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java index 76738a411a9..15037efa88d 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java @@ -89,8 +89,8 @@ public void setUp() { final Id vehTypeId = Id.create( "gridType", VehicleType.class ); VehicleType carrierVehType = VehicleUtils.getFactory().createVehicleType( vehTypeId ); EngineInformation engineInformation = carrierVehType.getEngineInformation() ; - engineInformation.setFuelType( FuelType.diesel ); - engineInformation.setFuelConsumption( 0.015 ); + VehicleUtils.setHbefaTechnology(engineInformation, "diesel"); + VehicleUtils.setFuelConsumption(carrierVehType, 0.015); VehicleCapacity capacity = carrierVehType.getCapacity() ; capacity.setOther( 3. ) ; CostInformation costInfo = carrierVehType.getCostInformation(); @@ -106,7 +106,6 @@ public void setUp() { CarrierVehicle carrierVehicle = CarrierVehicle.Builder.newInstance(Id.create("gridVehicle", org.matsim.vehicles.Vehicle.class), Id.createLinkId("i(6,0)"), carrierVehType ).setEarliestStart(0.0 ).setLatestEnd(36000.0 ).build(); CarrierCapabilities.Builder ccBuilder = CarrierCapabilities.Builder.newInstance() - .addType(carrierVehType) .addVehicle(carrierVehicle) .setFleetSize(FleetSize.INFINITE); carrierWServices.setCarrierCapabilities(ccBuilder.build()); @@ -116,9 +115,6 @@ public void setUp() { carriersWithServicesAndShpiments.addCarrier(carrierWServices); carriersWithServicesAndShpiments.addCarrier(carrierWShipments); - // assign vehicle types to the carriers - new CarrierVehicleTypeLoader(carriersWithServicesAndShpiments).loadVehicleTypes(vehicleTypes) ; - //load Network and build netbasedCosts for jsprit Network network = NetworkUtils.createNetwork(); new MatsimNetworkReader(network).readFile(testUtils.getPackageInputDirectory() + "grid-network.xml"); @@ -151,9 +147,6 @@ public void setUp() { Carriers carriersWithShipmentsOnly = CarriersUtils.createShipmentVRPCarrierFromServiceVRPSolution( carriersWithServicesAndShpiments ); - // assign vehicle types to the carriers - new CarrierVehicleTypeLoader(carriersWithShipmentsOnly).loadVehicleTypes(vehicleTypes) ; - for (Carrier carrier : carriersWithShipmentsOnly.getCarriers().values()) { //Build VRP VehicleRoutingProblem.Builder vrpBuilder = MatsimJspritFactory.createRoutingProblemBuilder(carrier, network); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java index 87ac86ec9b3..c378bd4acf7 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java @@ -115,7 +115,6 @@ public void setUp() { CarrierVehicle carrierVehicle = CarrierVehicle.Builder.newInstance(Id.create("gridVehicle", org.matsim.vehicles.Vehicle.class), Id.createLinkId("i(6,0)"), carrierVehType ).setEarliestStart(0.0 ).setLatestEnd(36000.0 ).build(); CarrierCapabilities.Builder ccBuilder = CarrierCapabilities.Builder.newInstance() - .addType(carrierVehType) .addVehicle(carrierVehicle) .setFleetSize(FleetSize.INFINITE); carrierWServices.setCarrierCapabilities(ccBuilder.build()); @@ -125,9 +124,6 @@ public void setUp() { carriersWithServicesAndShpiments.addCarrier(carrierWServices); carriersWithServicesAndShpiments.addCarrier(carrierWShipments); - // assign vehicle types to the carriers - new CarrierVehicleTypeLoader(carriersWithServicesAndShpiments).loadVehicleTypes(vehicleTypes) ; - //load Network and build netbasedCosts for jsprit Network network = NetworkUtils.createNetwork(); new MatsimNetworkReader(network).readFile(testUtils.getPackageInputDirectory() + "grid-network.xml"); @@ -159,9 +155,6 @@ public void setUp() { Carriers carriersWithShipmentsOnly = CarriersUtils.createShipmentVRPCarrierFromServiceVRPSolution(carriersWithServicesAndShpiments); carrierWShipmentsOnlyFromCarrierWServices = carriersWithShipmentsOnly.getCarriers().get(CARRIER_SERVICES_ID); //with converted Service carrierWShipmentsOnlyFromCarrierWShipments = carriersWithShipmentsOnly.getCarriers().get(CARRIER_SHIPMENTS_ID); //with copied Shipments - - // assign vehicle types to the carriers - new CarrierVehicleTypeLoader(carriersWithShipmentsOnly).loadVehicleTypes(vehicleTypes) ; } diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest/vehicleTypes.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest/vehicleTypes.xml deleted file mode 100644 index 4913dba6c79..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest/vehicleTypes.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - Medium Vehicle - - 30 - - - - - Light Vehicle - 15 - - - - - Heavy Vehicle - 15 - - - - diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml b/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml index c9b487b48b9..442ad345d70 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml +++ b/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml @@ -13,7 +13,7 @@ 0.02 - gasoline + gasoline @@ -35,7 +35,7 @@ 0.02 - gasoline + gasoline @@ -57,7 +57,7 @@ 0.03 - gasoline + gasoline @@ -79,7 +79,7 @@ 0.03 - gasoline + gasoline From 8562c48ad46ef584204e36833b44a591c0563d02 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Sun, 1 Dec 2024 22:58:50 +0100 Subject: [PATCH 03/51] Correct misspelled CarrierControler... to CarrierController... ; Use Controller instead of Controler --- .../FreightDemandGeneration.java | 4 +- .../freight/carriers/CarriersUtils.java | 2 +- .../CarrierAgent.java | 2 +- .../CarrierAgentTracker.java | 2 +- .../CarrierControllerListener.java} | 9 ++-- .../CarrierControllerUtils.java} | 4 +- .../CarrierDriverAgent.java | 2 +- .../CarrierModule.java | 6 +-- .../CarrierReRouteVehicles.java | 2 +- .../CarrierScoringFunctionFactory.java | 2 +- .../CarrierStrategyManager.java | 2 +- .../CarrierStrategyManagerImpl.java | 2 +- .../CarrierTimeAllocationMutator.java | 2 +- .../CarrierTimeAndSpaceTourRouter.java | 2 +- .../CarrierVehicleReRouter.java | 3 +- .../FreightActivity.java | 2 +- .../FreightAgentSource.java | 2 +- .../WithinDayActivityReScheduling.java | 2 +- .../carriers/jsprit/NetworkRouter.java | 2 +- .../CarrierScoringFunctionFactoryImpl.java | 4 +- .../usecases/chessboard/RunChessboard.java | 16 +++---- .../RunPassengerAlongWithCarriers.java | 19 ++++---- ...stener.java => LSPControllerListener.java} | 8 ++-- .../org/matsim/freight/logistics/LSPImpl.java | 2 +- .../matsim/freight/logistics/LSPModule.java | 6 +-- ...chedulingOfTransportChainHubsVsDirect.java | 20 ++++----- .../initialPlans/ExampleTestOutput.java | 8 ++-- .../initialPlans/ExampleTwoEchelonGrid.java | 32 +++++++------- .../ExampleTwoEchelonGrid_NR.java | 44 +++++++++---------- .../initialPlans/MyCarrierScorer.java | 2 +- .../MyEventBasedCarrierScorer.java | 2 +- .../lspScoring/ExampleLSPScoring.java | 12 ++--- .../ExampleMobsimOfSimpleLSP.java | 12 ++--- .../ExampleMobsimOfTransportChain.java | 12 ++--- ...ventBasedCarrierScorer4MultipleChains.java | 2 +- ...dCarrierScorer4MultipleChainsInclToll.java | 2 +- .../ExampleGroceryDeliveryMultipleChains.java | 24 +++++----- .../ExampleMultipleMixedEchelonChains.java | 24 +++++----- .../ExampleMultipleOneEchelonChains.java | 24 +++++----- ...pleMultipleOneEchelonChainsReplanning.java | 24 +++++----- ...pleMultipleTwoEchelonChainsReplanning.java | 24 +++++----- ...eTwoLspsGroceryDeliveryMultipleChains.java | 30 ++++++------- ...GroceryDeliveryMultipleChainsWithToll.java | 36 +++++++-------- .../freight/carriers/CarrierModuleTest.java | 8 ++-- .../EquilWithCarrierWithPersonsIT.java | 2 +- .../EquilWithCarrierWithoutPersonsIT.java | 2 +- ...istanceScoringFunctionFactoryForTests.java | 2 +- .../ScoringFunctionFactoryForTests.java | 2 +- .../StrategyManagerFactoryForTests.java | 8 ++-- .../TimeScoringFunctionFactoryForTests.java | 2 +- .../utils/CarrierControllerUtilsTest.java | 6 ++- .../CollectionLSPReplanningTest.java | 19 ++++---- .../lspScoring/CollectionLSPScoringTest.java | 12 ++--- .../lspScoring/ExampleLSPScoringTest.java | 7 +-- ...pleIterationsCollectionLSPScoringTest.java | 18 ++++---- .../MultipleChainsReplanningTest.java | 24 +++++----- .../multipleChains/WorstPlanSelectorTest.java | 24 +++++----- .../CollectionTrackerTest.java | 10 +++-- .../CollectionLSPMobsimTest.java | 12 ++--- .../lspMobsimTests/CompleteLSPMobsimTest.java | 10 +++-- .../FirstAndSecondReloadLSPMobsimTest.java | 10 +++-- .../FirstReloadLSPMobsimTest.java | 10 +++-- .../lspMobsimTests/MainRunLSPMobsimTest.java | 10 +++-- .../MainRunOnlyLSPMobsimTest.java | 10 +++-- ...ipleIterationsCollectionLSPMobsimTest.java | 18 ++++---- ...ltipleIterationsCompleteLSPMobsimTest.java | 24 +++++----- ...ionsFirstAndSecondReloadLSPMobsimTest.java | 18 ++++---- ...pleIterationsFirstReloadLSPMobsimTest.java | 18 ++++---- ...ultipleIterationsMainRunLSPMobsimTest.java | 24 +++++----- ...tipleShipmentsCollectionLSPMobsimTest.java | 10 +++-- ...ultipleShipmentsCompleteLSPMobsimTest.java | 26 ++++++----- ...entsFirstAndSecondReloadLSPMobsimTest.java | 18 ++++---- ...ipleShipmentsFirstReloadLSPMobsimTest.java | 16 ++++--- ...MultipleShipmentsMainRunLSPMobsimTest.java | 16 ++++--- ...ultipleShipmentsCompleteLSPMobsimTest.java | 10 +++-- ...UsecasesCarrierScoringFunctionFactory.java | 4 +- .../replanning/ReceiverStrategyManager.java | 2 +- ...rateSmallScaleCommercialTrafficDemand.java | 4 +- 78 files changed, 440 insertions(+), 419 deletions(-) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierAgent.java (99%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierAgentTracker.java (99%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler/CarrierControlerListener.java => controller/CarrierControllerListener.java} (92%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler/CarrierControlerUtils.java => controller/CarrierControllerUtils.java} (94%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierDriverAgent.java (99%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierModule.java (97%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierReRouteVehicles.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierScoringFunctionFactory.java (96%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierStrategyManager.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierStrategyManagerImpl.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierTimeAllocationMutator.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierTimeAndSpaceTourRouter.java (99%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/CarrierVehicleReRouter.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/FreightActivity.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/FreightAgentSource.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/carriers/{controler => controller}/WithinDayActivityReScheduling.java (98%) rename contribs/freight/src/main/java/org/matsim/freight/logistics/{LSPControlerListener.java => LSPControllerListener.java} (98%) rename contribs/freight/src/test/java/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithPersonsIT.java (99%) rename contribs/freight/src/test/java/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithoutPersonsIT.java (99%) diff --git a/contribs/application/src/main/java/org/matsim/freightDemandGeneration/FreightDemandGeneration.java b/contribs/application/src/main/java/org/matsim/freightDemandGeneration/FreightDemandGeneration.java index ac3c44cb5a6..d01a6226691 100644 --- a/contribs/application/src/main/java/org/matsim/freightDemandGeneration/FreightDemandGeneration.java +++ b/contribs/application/src/main/java/org/matsim/freightDemandGeneration/FreightDemandGeneration.java @@ -37,8 +37,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.geometry.CoordinateTransformation; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierModule; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierModule; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.freight.carriers.usecases.chessboard.CarrierScoringFunctionFactoryImpl; import picocli.CommandLine; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java index 7c8e7220e3e..c868457972f 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java @@ -338,7 +338,7 @@ public static Carriers getOrCreateCarriers(Scenario scenario) { public static Carriers addOrGetCarriers(Scenario scenario) { // I have separated getOrCreateCarriers and getCarriers, since when the - // controler is started, it is better to fail if the carriers are not found. + // controller is started, it is better to fail if the carriers are not found. // kai, oct'19 Carriers carriers = (Carriers) scenario.getScenarioElement(CARRIERS); if (carriers == null) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierAgent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgent.java similarity index 99% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierAgent.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgent.java index da31ae5637d..5be81661579 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgent.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierAgentTracker.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgentTracker.java similarity index 99% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierAgentTracker.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgentTracker.java index 09c4036d92f..8474ba0b8c7 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierAgentTracker.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgentTracker.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import com.google.inject.Inject; import org.apache.logging.log4j.LogManager; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierControlerListener.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerListener.java similarity index 92% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierControlerListener.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerListener.java index f8a103bcbe5..9754f54c130 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierControlerListener.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerListener.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import jakarta.inject.Inject; import org.apache.logging.log4j.LogManager; @@ -46,13 +46,13 @@ * // not sure if this _should_ be public, but current LSP design makes this necessary. kai, sep'20 */ -public class CarrierControlerListener implements ScoringListener, ReplanningListener { +public class CarrierControllerListener implements ScoringListener, ReplanningListener { // not sure if this _should_ be public, but current LSP design makes this necessary. // It is done analogue to CarrierAgentTracker. kmt oct'22 @SuppressWarnings("unused") - private static final Logger log = LogManager.getLogger( CarrierControlerListener.class ) ; + private static final Logger log = LogManager.getLogger( CarrierControllerListener.class ) ; private final CarrierStrategyManager strategyManager; private final CarrierAgentTracker carrierAgentTracker; @@ -62,7 +62,8 @@ public class CarrierControlerListener implements ScoringListener, ReplanningList /** * Constructs a controller with a set of carriers, re-planning capabilities and scoring-functions. */ - @Inject CarrierControlerListener( @Nullable CarrierStrategyManager strategyManager, CarrierAgentTracker carrierAgentTracker ) { + @Inject + CarrierControllerListener(@Nullable CarrierStrategyManager strategyManager, CarrierAgentTracker carrierAgentTracker ) { // The current default is bind( CarrierStrategyManager.class ).toProvider( () -> null ); this.strategyManager = strategyManager; this.carrierAgentTracker = carrierAgentTracker; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierControlerUtils.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerUtils.java similarity index 94% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierControlerUtils.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerUtils.java index fe19207bfcc..5d15a6821f0 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierControlerUtils.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerUtils.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; /** * Utils class for (package-private) content of freight.carriers.controler - package; @@ -27,7 +27,7 @@ * @author kturner * */ -public class CarrierControlerUtils { +public class CarrierControllerUtils { public static CarrierStrategyManager createDefaultCarrierStrategyManager() { return new CarrierStrategyManagerImpl(); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java similarity index 99% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java index c7f030f3457..e0de8c3ca82 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierModule.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierModule.java similarity index 97% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierModule.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierModule.java index e2b9e1d8354..5a3a45c6035 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierModule.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierModule.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import com.google.inject.Inject; import com.google.inject.Provider; @@ -49,8 +49,8 @@ public final class CarrierModule extends AbstractModule { bind(Carriers.class).toProvider( new CarrierProvider() ).asEagerSingleton(); // needs to be eager since it is still scenario construction. kai, oct'19 // this is probably ok - bind(CarrierControlerListener.class).in( Singleton.class ); - addControlerListenerBinding().to(CarrierControlerListener.class); + bind(CarrierControllerListener.class).in( Singleton.class ); + addControlerListenerBinding().to(CarrierControllerListener.class); bind(CarrierAgentTracker.class).in( Singleton.class ); addEventHandlerBinding().to( CarrierAgentTracker.class ); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierReRouteVehicles.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierReRouteVehicles.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierReRouteVehicles.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierReRouteVehicles.java index f59ba81c930..daf94e0e147 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierReRouteVehicles.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierReRouteVehicles.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierScoringFunctionFactory.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierScoringFunctionFactory.java similarity index 96% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierScoringFunctionFactory.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierScoringFunctionFactory.java index c73a41b3008..79338a48884 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierScoringFunctionFactory.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierScoringFunctionFactory.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.matsim.core.scoring.ScoringFunction; import org.matsim.freight.carriers.Carrier; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierStrategyManager.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManager.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierStrategyManager.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManager.java index f1d6d06e84e..8a7a3cfa263 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierStrategyManager.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManager.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import com.google.inject.Provider; import org.matsim.core.replanning.GenericStrategyManager; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierStrategyManagerImpl.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManagerImpl.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierStrategyManagerImpl.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManagerImpl.java index 5bcad45b183..6e56807737d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierStrategyManagerImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManagerImpl.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.matsim.api.core.v01.population.HasPlansAndId; import org.matsim.core.replanning.GenericPlanStrategy; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierTimeAllocationMutator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAllocationMutator.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierTimeAllocationMutator.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAllocationMutator.java index 3b7fc83af01..b7c58ef8e84 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierTimeAllocationMutator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAllocationMutator.java @@ -18,7 +18,7 @@ * *********************************************************************** * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.replanning.ReplanningContext; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierTimeAndSpaceTourRouter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java similarity index 99% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierTimeAndSpaceTourRouter.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java index 0a6a7399c9f..8c2362252df 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierTimeAndSpaceTourRouter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierVehicleReRouter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierVehicleReRouter.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierVehicleReRouter.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierVehicleReRouter.java index cd03cb5fd94..e169c6cd001 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierVehicleReRouter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierVehicleReRouter.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm; import com.graphhopper.jsprit.core.algorithm.state.StateManager; @@ -45,7 +45,6 @@ import org.matsim.freight.carriers.CarrierVehicleTypes; import org.matsim.freight.carriers.jsprit.MatsimJspritFactory; import org.matsim.freight.carriers.jsprit.NetworkBasedTransportCosts; -import org.matsim.freight.carriers.jsprit.VehicleTypeDependentRoadPricingCalculator; import java.util.Collection; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/FreightActivity.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightActivity.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/FreightActivity.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightActivity.java index 42cd58ae587..ee3f0e65afc 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/FreightActivity.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightActivity.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/FreightAgentSource.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightAgentSource.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/FreightAgentSource.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightAgentSource.java index f5613f1a961..7af83457a4b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/FreightAgentSource.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightAgentSource.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import com.google.inject.Inject; import org.apache.logging.log4j.LogManager; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/WithinDayActivityReScheduling.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/WithinDayActivityReScheduling.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/carriers/controler/WithinDayActivityReScheduling.java rename to contribs/freight/src/main/java/org/matsim/freight/carriers/controller/WithinDayActivityReScheduling.java index 285939a7174..fee97256f5d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/WithinDayActivityReScheduling.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/WithinDayActivityReScheduling.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import com.google.inject.Inject; import org.apache.logging.log4j.LogManager; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkRouter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkRouter.java index 7dac94a1c8c..2388801503b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkRouter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkRouter.java @@ -22,7 +22,7 @@ import org.matsim.freight.carriers.CarrierPlan; import org.matsim.freight.carriers.ScheduledTour; -import org.matsim.freight.carriers.controler.CarrierTimeAndSpaceTourRouter; +import org.matsim.freight.carriers.controller.CarrierTimeAndSpaceTourRouter; /** * Router that routes {@link CarrierPlan}. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java index 759b3da5890..a08cc97c960 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java @@ -36,8 +36,8 @@ import org.matsim.core.scoring.ScoringFunction; import org.matsim.core.scoring.SumScoringFunction; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.FreightActivity; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.FreightActivity; import org.matsim.freight.carriers.jsprit.VehicleTypeDependentRoadPricingCalculator; import org.matsim.vehicles.Vehicle; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java index e8f7887cfea..16779812e59 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java @@ -28,9 +28,7 @@ import org.matsim.api.core.v01.network.Network; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.controler.events.IterationEndsEvent; import org.matsim.core.controler.listener.IterationEndsListener; import org.matsim.core.replanning.GenericPlanStrategyImpl; @@ -46,7 +44,7 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.*; +import org.matsim.freight.carriers.controller.*; import org.matsim.freight.carriers.usecases.analysis.CarrierScoreStats; import org.matsim.freight.carriers.usecases.analysis.LegHistogram; @@ -74,11 +72,11 @@ public static void main(String[] args){ Carriers carriers = CarriersUtils.addOrGetCarriers( scenario ); CarrierVehicleTypes types = CarriersUtils.getCarrierVehicleTypes( scenario ); - Controler controler = new Controler( scenario); + Controller controller = ControllerUtils.createController( scenario ); - controler.addOverridingModule(new CarrierModule() ); + controller.addOverridingModule(new CarrierModule() ); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { @@ -113,7 +111,7 @@ public void install() { } }); - controler.run(); + controller.run(); } @@ -139,7 +137,7 @@ private static class MyCarrierPlanStrategyManagerProvider implements Provider strategy = new GenericPlanStrategyImpl<>( new ExpBetaPlanChanger.Factory().build() ); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java index 40a49ecf40c..de2e7d3eb5e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java @@ -29,10 +29,7 @@ import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.MatsimServices; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.controler.listener.IterationEndsListener; import org.matsim.core.gbl.Gbl; import org.matsim.core.replanning.GenericPlanStrategyImpl; @@ -47,7 +44,7 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.*; +import org.matsim.freight.carriers.controller.*; import org.matsim.freight.carriers.usecases.analysis.CarrierScoreStats; import org.matsim.freight.carriers.usecases.analysis.LegHistogram; @@ -67,7 +64,7 @@ public void run() { Scenario scenario = prepareScenario(config); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); CarrierVehicleTypes types = new CarrierVehicleTypes(); new CarrierVehicleTypeReader(types).readURL( IOUtils.extendUrl(url, "vehicleTypes.xml" ) ); @@ -75,9 +72,9 @@ public void run() { final Carriers carriers = new Carriers(); new CarrierPlanXmlReader(carriers, types ).readURL( IOUtils.extendUrl(url, "carrierPlans.xml" ) ); - controler.addOverridingModule( new CarrierModule() ); + controller.addOverridingModule( new CarrierModule() ); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ this.bind( CarrierStrategyManager.class ).toProvider( new MyCarrierPlanStrategyManagerFactory(types) ); this.bind( CarrierScoringFunctionFactory.class ).toInstance(carrier -> { @@ -91,9 +88,9 @@ public void run() { } ); - prepareFreightOutputDataAndStats(scenario, controler.getEvents(), controler, carriers); + prepareFreightOutputDataAndStats(scenario, controller.getEvents(), controller, carriers); - controler.run(); + controller.run(); } @@ -154,7 +151,7 @@ public MyCarrierPlanStrategyManagerFactory(CarrierVehicleTypes types) { final TravelDisutility travelDisutility = CarrierTravelDisutilities.createBaseDisutility(types, modeTravelTimes.get(TransportMode.car ) ); final LeastCostPathCalculator router = leastCostPathCalculatorFactory.createPathCalculator(network, travelDisutility, modeTravelTimes.get(TransportMode.car)); - final CarrierStrategyManager carrierStrategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + final CarrierStrategyManager carrierStrategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); carrierStrategyManager.setMaxPlansPerAgent(5); carrierStrategyManager.addStrategy(new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 0.95); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControlerListener.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControllerListener.java similarity index 98% rename from contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControlerListener.java rename to contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControllerListener.java index e3c864be9bb..54e7040f67b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControlerListener.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControllerListener.java @@ -41,11 +41,11 @@ import org.matsim.freight.carriers.CarrierPlanWriter; import org.matsim.freight.carriers.Carriers; import org.matsim.freight.carriers.CarriersUtils; -import org.matsim.freight.carriers.controler.CarrierAgentTracker; +import org.matsim.freight.carriers.controller.CarrierAgentTracker; import org.matsim.freight.logistics.io.LSPPlanXmlWriter; import org.matsim.freight.logistics.shipment.LspShipment; -class LSPControlerListener +class LSPControllerListener implements StartupListener, BeforeMobsimListener, AfterMobsimListener, @@ -54,7 +54,7 @@ class LSPControlerListener IterationStartsListener, IterationEndsListener, ShutdownListener { - private static final Logger log = LogManager.getLogger(LSPControlerListener.class); + private static final Logger log = LogManager.getLogger(LSPControllerListener.class); private final Scenario scenario; private final List registeredHandlers = new ArrayList<>(); @@ -70,7 +70,7 @@ class LSPControlerListener @Inject - LSPControlerListener(Scenario scenario) { + LSPControllerListener(Scenario scenario) { this.scenario = scenario; } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPImpl.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPImpl.java index 54840359388..d25cbfb043a 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPImpl.java @@ -71,7 +71,7 @@ public static LSPPlan copyPlan(LSPPlan plan2copy) { } /** - * This is used from {@link LSPControlerListener} and not meant to be used from user code. Users + * This is used from {@link LSPControllerListener} and not meant to be used from user code. Users * should bind {@link LSPScorerFactory}. */ /* package-private */ void setScorer(LSPScorer scorer) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPModule.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPModule.java index 2eb4085ec56..520aead053b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPModule.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPModule.java @@ -37,7 +37,7 @@ import org.matsim.core.replanning.ReplanningContext; import org.matsim.core.replanning.selectors.PlanSelector; import org.matsim.freight.carriers.FreightCarriersConfigGroup; -import org.matsim.freight.carriers.controler.*; +import org.matsim.freight.carriers.controller.*; import org.matsim.freight.logistics.analysis.LspScoreStatsModule; public class LSPModule extends AbstractModule { @@ -48,8 +48,8 @@ public void install() { FreightCarriersConfigGroup freightConfig = ConfigUtils.addOrGetModule(getConfig(), FreightCarriersConfigGroup.class); - bind(LSPControlerListener.class).in(Singleton.class); - addControlerListenerBinding().to(LSPControlerListener.class); + bind(LSPControllerListener.class).in(Singleton.class); + addControlerListenerBinding().to(LSPControllerListener.class); install(new CarrierModule()); install(new LspScoreStatsModule()); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java index b9ef4efa4eb..8daef42c974 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java @@ -33,16 +33,14 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.RandomPlanSelector; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.carriers.events.CarrierServiceEndEvent; import org.matsim.freight.carriers.events.CarrierTourEndEvent; import org.matsim.freight.carriers.events.eventhandler.CarrierServiceEndEventHandler; @@ -133,16 +131,16 @@ public static void main(String[] args) { log.info("schedule the LSP with the shipments and according to the scheduler of the Resource"); lsp.scheduleLogisticChains(); - log.info("Set up simulation controler and LSPModule"); + log.info("Set up simulation controller and LSPModule"); LSPUtils.addLSPs(scenario, new LSPs(Collections.singletonList(lsp))); // @KMT: LSPModule ist vom Design her nur im Zusammenhang mit dem Controler sinnvoll. Damit kann // man dann auch vollständig auf // Injection setzen. - Controler controler = new Controler(scenario); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -164,7 +162,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; @@ -174,7 +172,7 @@ public void install() { log.info("Run MATSim"); - controler.run(); + controller.run(); // print the schedules for the assigned LSPShipments log.info("print the schedules for the assigned LSPShipments"); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java index 8a0fbd8ce12..b4aee003ecf 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java @@ -26,6 +26,8 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.io.IOUtils; @@ -47,14 +49,14 @@ public static void main(String[] args) { Scenario scenario = ScenarioUtils.loadScenario(config); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); } } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid.java index a776131e925..b289d95c39a 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid.java @@ -33,9 +33,7 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; @@ -43,9 +41,9 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.shipment.LspShipment; @@ -97,8 +95,8 @@ public static void main(String[] args) { Scenario scenario = prepareScenario(config); log.info("Prepare Controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -106,7 +104,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -119,7 +117,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -141,22 +139,22 @@ public void install() { // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); log.info("Some results ...."); - for (LSP lsp : LSPUtils.getLSPs(controler.getScenario()).getLSPs().values()) { - ResourceImplementationUtils.printScores(controler.getControlerIO().getOutputPath(), lsp); + for (LSP lsp : LSPUtils.getLSPs(controller.getScenario()).getLSPs().values()) { + ResourceImplementationUtils.printScores(controller.getControlerIO().getOutputPath(), lsp); ResourceImplementationUtils.printShipmentsOfLSP( - controler.getControlerIO().getOutputPath(), lsp); + controller.getControlerIO().getOutputPath(), lsp); ResourceImplementationUtils.printResults_shipmentPlan( - controler.getControlerIO().getOutputPath(), lsp); + controller.getControlerIO().getOutputPath(), lsp); ResourceImplementationUtils.printResults_shipmentLog( - controler.getControlerIO().getOutputPath(), lsp); + controller.getControlerIO().getOutputPath(), lsp); } log.info("Done."); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid_NR.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid_NR.java index 18525885ce7..ffaf4c0aa48 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid_NR.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGrid_NR.java @@ -33,9 +33,7 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; @@ -43,9 +41,9 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.io.LSPPlanXmlReader; import org.matsim.freight.logistics.io.LSPPlanXmlWriter; @@ -123,8 +121,8 @@ public static void main(String[] args) { Scenario scenario = prepareScenario(config); log.info("Prepare Controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -132,7 +130,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -145,7 +143,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -166,31 +164,31 @@ public void install() { log.warn("Runs settings were: Demand: {}\n CarrierCosts: {}\n HubCosts: " + HUBCOSTS_FIX + "\n tollValue: " + TOLL_VALUE, demandSetting, costSetting); // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); // Ggf. muss der Ordner noch erstellt werden (?) - new LSPPlanXmlWriter(LSPUtils.getLSPs(controler.getScenario())) - .write(controler.getConfig().controller().getOutputDirectory() + "/lsps.xml"); + new LSPPlanXmlWriter(LSPUtils.getLSPs(controller.getScenario())) + .write(controller.getConfig().controller().getOutputDirectory() + "/lsps.xml"); new LSPPlanXmlReader( - LSPUtils.getLSPs(controler.getScenario()), - CarriersUtils.getCarriers(controler.getScenario())); - new CarrierPlanWriter(CarriersUtils.getCarriers(controler.getScenario())) - .write(controler.getConfig().controller().getOutputDirectory() + "/carriers.xml"); + LSPUtils.getLSPs(controller.getScenario()), + CarriersUtils.getCarriers(controller.getScenario())); + new CarrierPlanWriter(CarriersUtils.getCarriers(controller.getScenario())) + .write(controller.getConfig().controller().getOutputDirectory() + "/carriers.xml"); log.info("Some results ...."); - for (LSP lsp : LSPUtils.getLSPs(controler.getScenario()).getLSPs().values()) { - ResourceImplementationUtils.printScores(controler.getControlerIO().getOutputPath(), lsp); + for (LSP lsp : LSPUtils.getLSPs(controller.getScenario()).getLSPs().values()) { + ResourceImplementationUtils.printScores(controller.getControlerIO().getOutputPath(), lsp); ResourceImplementationUtils.printShipmentsOfLSP( - controler.getControlerIO().getOutputPath(), lsp); + controller.getControlerIO().getOutputPath(), lsp); ResourceImplementationUtils.printResults_shipmentPlan( - controler.getControlerIO().getOutputPath(), lsp); + controller.getControlerIO().getOutputPath(), lsp); ResourceImplementationUtils.printResults_shipmentLog( - controler.getControlerIO().getOutputPath(), lsp); + controller.getControlerIO().getOutputPath(), lsp); } log.info("Done."); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyCarrierScorer.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyCarrierScorer.java index 7ee4a9f4d74..83b1fa4dc3a 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyCarrierScorer.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyCarrierScorer.java @@ -24,7 +24,7 @@ import org.matsim.core.scoring.ScoringFunction; import org.matsim.core.scoring.SumScoringFunction; import org.matsim.freight.carriers.Carrier; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; /** * @author Kai Martins-Turner (kturner) diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java index da264c45ca1..846ecf3b5fe 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java @@ -34,7 +34,7 @@ import org.matsim.core.scoring.SumScoringFunction; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.Tour; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.freight.carriers.events.CarrierTourEndEvent; import org.matsim.freight.carriers.events.CarrierTourStartEvent; import org.matsim.freight.logistics.examples.ExampleConstants; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java index d857da8727f..0d3d9fcb155 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java @@ -34,6 +34,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; @@ -177,18 +179,18 @@ public static void main(String[] args) { } } - static Controler prepareControler(Scenario scenario) { + static Controller prepareControler(Scenario scenario) { // Start the Mobsim one iteration is sufficient for scoring - Controler controler = new Controler(scenario); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { bind(LSPScorerFactory.class).toInstance(TipScorer::new); } }); - return controler; + return controller; } static Scenario prepareScenario(Config config) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java index 74a5990c7a0..bdbd71224f8 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java @@ -35,6 +35,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.scenario.ScenarioUtils; @@ -80,7 +82,7 @@ public static void main(String[] args) { // schedule the LSP with the lspShipments and according to the scheduler of the Resource lsp.scheduleLogisticChains(); - // set up simulation controler and LSPModule + // set up simulation controller and LSPModule ArrayList lspList = new ArrayList<>(); lspList.add(lsp); LSPs lsps = new LSPs(lspList); @@ -90,8 +92,8 @@ public static void main(String[] args) { config.controller().setLastIteration(0); config.controller().setOverwriteFileSetting(OverwriteFileSetting.overwriteExistingFiles); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -100,11 +102,11 @@ public void install() { }); // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); for (LspShipment lspShipment : lsp.getLspShipments()) { System.out.println("LspShipment: " + lspShipment.getId()); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java index 1e81d985419..ee58841c0a6 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java @@ -34,6 +34,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.scenario.ScenarioUtils; @@ -341,14 +343,14 @@ public static void main(String[] args) { // schedule the LSP with the lspShipments and according to the scheduler of the Resource lsp.scheduleLogisticChains(); - // set up simulation controler and LSPModule + // set up simulation controller and LSPModule ArrayList lspList = new ArrayList<>(); lspList.add(lsp); LSPs lsps = new LSPs(lspList); LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -363,11 +365,11 @@ public void install() { config.network().setInputFile("scenarios/2regions/2regions-network.xml"); // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); for (LspShipment lspShipment : lsp.getLspShipments()) { System.out.println("Shipment: " + lspShipment.getId()); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java index d0932dc1753..5469d53b508 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java @@ -33,7 +33,7 @@ import org.matsim.core.scoring.SumScoringFunction; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.Tour; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.freight.carriers.events.CarrierTourEndEvent; import org.matsim.freight.carriers.events.CarrierTourStartEvent; import org.matsim.freight.logistics.analysis.Vehicle2CarrierEventHandler; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java index 91e60ea2b8e..292c95e72c2 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java @@ -35,7 +35,7 @@ import org.matsim.core.scoring.SumScoringFunction.ArbitraryEventScoring; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.Tour; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.freight.carriers.events.CarrierTourEndEvent; import org.matsim.freight.carriers.events.CarrierTourStartEvent; import org.matsim.freight.logistics.analysis.Driver2VehicleEventHandler; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleGroceryDeliveryMultipleChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleGroceryDeliveryMultipleChains.java index b4dee499b34..e2bb5db2bc0 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleGroceryDeliveryMultipleChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleGroceryDeliveryMultipleChains.java @@ -35,18 +35,16 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; import org.matsim.core.replanning.selectors.ExpBetaPlanSelector; import org.matsim.core.replanning.selectors.GenericWorstPlanForRemovalSelector; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.ExampleConstants; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -71,9 +69,9 @@ public static void main(String[] args) { log.info("Prepare scenario"); Scenario scenario = prepareScenario(config); - log.info("Prepare controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + log.info("Prepare controller"); + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -81,7 +79,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -96,7 +94,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -118,11 +116,11 @@ public void install() { // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); log.info("Done."); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleMixedEchelonChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleMixedEchelonChains.java index 5a1a0090fbd..fcf31169400 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleMixedEchelonChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleMixedEchelonChains.java @@ -32,9 +32,7 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; @@ -42,9 +40,9 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.ExampleConstants; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -96,9 +94,9 @@ public static void main(String[] args) { log.info("Prepare scenario"); Scenario scenario = prepareScenario(config); - log.info("Prepare controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + log.info("Prepare controller"); + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -106,7 +104,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -121,7 +119,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -141,11 +139,11 @@ public void install() { // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); log.info("Done."); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChains.java index 2e107c961db..6e01b0e38ac 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChains.java @@ -35,18 +35,16 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.shipment.LspShipment; @@ -97,9 +95,9 @@ public static void main(String[] args) { log.info("Prepare scenario"); Scenario scenario = prepareScenario(config); - log.info("Prepare controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + log.info("Prepare controller"); + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -107,7 +105,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -119,7 +117,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -139,11 +137,11 @@ public void install() { // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); log.info("Done."); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChainsReplanning.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChainsReplanning.java index 58aa47a74ab..4012855405c 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChainsReplanning.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleOneEchelonChainsReplanning.java @@ -36,9 +36,7 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; import org.matsim.core.replanning.selectors.ExpBetaPlanSelector; @@ -47,9 +45,9 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.shipment.LspShipment; @@ -100,9 +98,9 @@ public static void main(String[] args) { log.info("Prepare scenario"); Scenario scenario = prepareScenario(config); - log.info("Prepare controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + log.info("Prepare controller"); + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -110,7 +108,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -122,7 +120,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -155,11 +153,11 @@ public void install() { // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); log.info("Done."); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleTwoEchelonChainsReplanning.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleTwoEchelonChainsReplanning.java index 0b36343790d..a0204e7fb36 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleTwoEchelonChainsReplanning.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleMultipleTwoEchelonChainsReplanning.java @@ -36,9 +36,7 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; import org.matsim.core.replanning.selectors.ExpBetaPlanSelector; @@ -47,9 +45,9 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.shipment.LspShipment; @@ -102,9 +100,9 @@ public static void main(String[] args) { log.info("Prepare scenario"); Scenario scenario = prepareScenario(config); - log.info("Prepare controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + log.info("Prepare controller"); + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -113,7 +111,7 @@ public void install() { }); // @formatter:off - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -121,7 +119,7 @@ public void install() { bind(CarrierScoringFunctionFactory.class).toInstance(carrierScorer); bind(LSPScorerFactory.class).toInstance(MyLSPScorer::new); bind(CarrierStrategyManager.class).toProvider( () -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; }); @@ -141,11 +139,11 @@ public void install() { // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); log.info("Done."); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java index 57231be2dc1..e6b9e33265b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java @@ -55,9 +55,7 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; import org.matsim.core.replanning.selectors.ExpBetaPlanSelector; @@ -65,9 +63,9 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.analysis.RunFreightAnalysisEventBased; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.ExampleConstants; import org.matsim.freight.logistics.resourceImplementations.CarrierSchedulerUtils; @@ -132,13 +130,13 @@ public static void main(String[] args) { lsps.add(createLspWithDirectChain(scenario, "Kaufland_DIRECT", MultipleChainsUtils.createLSPShipmentsFromCarrierShipments(carrierKaufland), getDepotLinkFromVehicle(carrierKaufland), vehicleTypes)); LSPUtils.addLSPs(scenario, new LSPs(lsps)); - Controler controler = prepareControler(scenario); + Controller controller = prepareController(scenario); log.info("Run MATSim"); - controler.run(); + controller.run(); - runCarrierAnalysis(controler.getControlerIO().getOutputPath(), config); + runCarrierAnalysis(controller.getControlerIO().getOutputPath(), config); log.info("Done."); } @@ -170,10 +168,10 @@ private static Config prepareConfig(String[] args) { return config; } - private static Controler prepareControler(Scenario scenario) { - log.info("Prepare controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + private static Controller prepareController(Scenario scenario) { + log.info("Prepare controller"); + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -181,7 +179,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -196,7 +194,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -213,7 +211,7 @@ public void install() { }); } }); - return controler; + return controller; } private static void runCarrierAnalysis(String outputPath, Config config) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java index e27b2e27a4b..01dd11e9435 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java @@ -36,9 +36,7 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; import org.matsim.core.replanning.selectors.ExpBetaPlanSelector; @@ -47,9 +45,9 @@ import org.matsim.core.utils.misc.Time; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.analysis.RunFreightAnalysisEventBased; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.ExampleConstants; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -118,19 +116,19 @@ public static void main(String[] args) { LSPUtils.addLSPs(scenario, new LSPs(lsps)); - Controler controler = prepareControler(scenario, rpScheme); + Controller controller = prepareController(scenario, rpScheme); log.info("Run MATSim"); // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); - runCarrierAnalysis(controler.getControlerIO().getOutputPath(), config); + runCarrierAnalysis(controller.getControlerIO().getOutputPath(), config); log.info("Done."); } @@ -158,10 +156,10 @@ private static Config prepareConfig(String[] args) { return config; } - private static Controler prepareControler(Scenario scenario, RoadPricingScheme rpScheme) { - log.info("Prepare controler"); - Controler controler = new Controler(scenario); - controler.addOverridingModule( + private static Controller prepareController(Scenario scenario, RoadPricingScheme rpScheme) { + log.info("Prepare controller"); + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -170,7 +168,7 @@ public void install() { } }); - controler.addOverridingModule( + controller.addOverridingModule( new AbstractModule() { @Override public void install() { @@ -180,7 +178,7 @@ public void install() { .toProvider( () -> { CarrierStrategyManager strategyManager = - CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy( new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; @@ -198,10 +196,10 @@ public void install() { } }); if (!rpScheme.getTolledLinkIds().isEmpty()) { - // RoadPricing.configure(controler); - controler.addOverridingModule( new RoadPricingModule(rpScheme) ); + // RoadPricing.configure(controller); + controller.addOverridingModule( new RoadPricingModule(rpScheme) ); } - return controler; + return controller; } /* diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java index 49dc173dd05..c722c3e7936 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java @@ -33,11 +33,9 @@ import org.matsim.core.controler.Controler; import org.matsim.core.controler.OutputDirectoryHierarchy; import org.matsim.core.scenario.ScenarioUtils; -import org.matsim.freight.carriers.CarriersUtils; -import org.matsim.freight.carriers.FreightCarriersConfigGroup; -import org.matsim.freight.carriers.controler.CarrierModule; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierModule; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.carriers.mobsim.DistanceScoringFunctionFactoryForTests; import org.matsim.freight.carriers.mobsim.StrategyManagerFactoryForTests; import org.matsim.testcases.MatsimTestUtils; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java similarity index 99% rename from contribs/freight/src/test/java/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT.java rename to contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java index 75800bfd34d..be381fc83a7 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Assertions; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java similarity index 99% rename from contribs/freight/src/test/java/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT.java rename to contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java index 70b01111b10..6b29b060161 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java @@ -19,7 +19,7 @@ * */ -package org.matsim.freight.carriers.controler; +package org.matsim.freight.carriers.controller; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java index 81ad7c6e577..f86e4fa825b 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java @@ -40,7 +40,7 @@ import org.matsim.freight.carriers.CarrierConstants; import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.CarrierVehicle; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.vehicles.Vehicle; import java.util.HashSet; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java index 68dbf0bc7ab..460c0e0d735 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java @@ -39,7 +39,7 @@ import org.matsim.freight.carriers.CarrierConstants; import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.CarrierVehicle; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.vehicles.Vehicle; import java.util.HashSet; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java index 680ef4e1953..fb774d2d9e2 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java @@ -36,9 +36,9 @@ import org.matsim.core.router.util.TravelTime; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.CarrierPlan; -import org.matsim.freight.carriers.controler.CarrierReRouteVehicles; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; +import org.matsim.freight.carriers.controller.CarrierReRouteVehicles; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; import org.matsim.vehicles.Vehicle; import java.util.Map; @@ -83,7 +83,7 @@ public CarrierStrategyManager get() { GenericPlanStrategyImpl planStrat_reRoutePlan = new GenericPlanStrategyImpl<>( new BestPlanSelector<>() ); planStrat_reRoutePlan.addStrategyModule(new CarrierReRouteVehicles.Factory(router, network, travelTimes.get(TransportMode.car )).build() ); - CarrierStrategyManager stratManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager stratManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); stratManager.addStrategy(planStrat_reRoutePlan, null, 1.0); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java index a8cc127ba93..e5bdc0b131a 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java @@ -40,7 +40,7 @@ import org.matsim.freight.carriers.CarrierConstants; import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.CarrierVehicle; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.vehicles.Vehicle; import java.util.HashSet; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java index 87ac86ec9b3..24968c4d1e6 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java @@ -42,6 +42,8 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.PlansConfigGroup; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.network.NetworkUtils; import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.scenario.ScenarioUtils; @@ -426,7 +428,7 @@ void testRunJsprit_allInformationGiven(){ Scenario scenario = ScenarioUtils.loadScenario(config); CarriersUtils.loadCarriersAccordingToFreightConfig(scenario ); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); try { CarriersUtils.runJsprit(scenario); @@ -435,7 +437,7 @@ void testRunJsprit_allInformationGiven(){ Assertions.fail(); } - Assertions.assertEquals(vraFile, ConfigUtils.addOrGetModule( controler.getConfig(), FreightCarriersConfigGroup.class ).getVehicleRoutingAlgorithmFile()); + Assertions.assertEquals(vraFile, ConfigUtils.addOrGetModule( controller.getConfig(), FreightCarriersConfigGroup.class ).getVehicleRoutingAlgorithmFile()); } /** diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java index c3600d60c10..ea611a35edc 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java @@ -36,7 +36,8 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.replanning.GenericPlanStrategy; @@ -45,8 +46,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils.CollectionCarrierResourceBuilder; @@ -194,11 +195,11 @@ public void initialize() { LSPUtils.addLSPs(scenario, new LSPs(Collections.singletonList(collectionLSP))); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule(new LSPModule() ); + controller.addOverridingModule(new LSPModule() ); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule(new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toProvider(() -> { LSPStrategyManager manager = new LSPStrategyManagerImpl(); @@ -211,7 +212,7 @@ public void initialize() { }); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -223,8 +224,8 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java index 2e06a80c4cf..e0dd95c3fad 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java @@ -40,6 +40,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; @@ -156,10 +158,10 @@ public void initialize() { LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule( new LSPModule() ); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule( new LSPModule() ); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPScorerFactory.class ).toInstance(ExampleLSPScoring.TipScorer::new); } @@ -170,8 +172,8 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java index 78f968387b9..2e5f813c721 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java @@ -27,6 +27,7 @@ import org.matsim.core.config.Config; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; import org.matsim.freight.logistics.LSP; import org.matsim.freight.logistics.LSPUtils; import org.matsim.testcases.MatsimTestUtils; @@ -44,11 +45,11 @@ public void testMain() { Scenario scenario = ExampleLSPScoring.prepareScenario(config); - Controler controler = ExampleLSPScoring.prepareControler(scenario); + Controller controller = ExampleLSPScoring.prepareControler(scenario); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); for (LSP lsp : LSPUtils.getLSPs(scenario).getLSPs().values()) { Assertions.assertEquals(13.245734044444207, lsp.getSelectedPlan().getScore(), Double.MIN_VALUE); diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java index ee94945117d..cd73679404e 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java @@ -38,6 +38,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.replanning.GenericPlanStrategyImpl; @@ -45,8 +47,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.shipment.LspShipment; @@ -169,16 +171,16 @@ public void initialize() { lspList.add(collectionLSP); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule( new LSPModule() ); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule( new LSPModule() ); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPScorerFactory.class ).toInstance(ExampleLSPScoring.TipScorer::new); bind( LSPStrategyManager.class ).toInstance( new LSPModule.LSPStrategyManagerEmptyImpl() ); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -189,8 +191,8 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java index 501e710b12f..6b815ecf943 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java @@ -37,18 +37,16 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.shipment.LspShipment; @@ -225,22 +223,22 @@ public void initialize() { Scenario scenario = prepareScenario(config); - Controler controler = new Controler(scenario); - controler.addOverridingModule(new AbstractModule() { + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); } }); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { final EventBasedCarrierScorer4MultipleChains carrierScorer = new EventBasedCarrierScorer4MultipleChains(); bind(CarrierScoringFunctionFactory.class).toInstance(carrierScorer); bind(LSPScorerFactory.class).toInstance(MyLSPScorer::new); bind(CarrierStrategyManager.class).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; }); @@ -252,14 +250,14 @@ public void install() { } }); - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - LSP lsp = LSPUtils.getLSPs(controler.getScenario()).getLSPs().values().iterator().next(); + LSP lsp = LSPUtils.getLSPs(controller.getScenario()).getLSPs().values().iterator().next(); initialPlanCount = lsp.getPlans().size(); initialPlanShipmentPlanCount = lsp.getPlans().getFirst().getShipmentPlans().size(); - controler.run(); + controller.run(); updatedPlanCount = lsp.getPlans().size(); innovatedPlanShipmentPlanCount = lsp.getPlans().get(1).getShipmentPlans().size(); diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/WorstPlanSelectorTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/WorstPlanSelectorTest.java index fccfa68e09d..7556c24f8c6 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/WorstPlanSelectorTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/WorstPlanSelectorTest.java @@ -36,9 +36,7 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; -import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.*; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.replanning.GenericPlanStrategyImpl; import org.matsim.core.replanning.selectors.BestPlanSelector; @@ -48,9 +46,9 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.shipment.LspShipment; @@ -248,15 +246,15 @@ public void initialize() { Scenario scenario = prepareScenario(config); - Controler controler = new Controler(scenario); - controler.addOverridingModule(new AbstractModule() { + Controller controller = ControllerUtils.createController(scenario); + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); } }); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { final EventBasedCarrierScorer4MultipleChains carrierScorer = new EventBasedCarrierScorer4MultipleChains(); @@ -264,7 +262,7 @@ public void install() { bind(CarrierScoringFunctionFactory.class).toInstance(carrierScorer); bind(LSPScorerFactory.class).toInstance(MyLSPScorer::new); bind(CarrierStrategyManager.class).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new BestPlanSelector<>()), null, 1); return strategyManager; }); @@ -279,10 +277,10 @@ public void install() { } }); - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); - this.lsp = LSPUtils.getLSPs(controler.getScenario()).getLSPs().values().iterator().next(); + this.lsp = LSPUtils.getLSPs(controller.getScenario()).getLSPs().values().iterator().next(); } private Config prepareConfig() { diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java index b6695f5377d..9858cddf1a3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java @@ -37,6 +37,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.events.handler.EventHandler; import org.matsim.core.network.io.MatsimNetworkReader; @@ -185,9 +187,9 @@ public void initialize() { LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -199,8 +201,8 @@ public void install() { // config.network().setInputFile("scenarios/2regions/2regions-network.xml"); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java index c97220d04f1..c7fcfa27c7f 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java @@ -43,6 +43,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.events.handler.BasicEventHandler; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.scenario.ScenarioUtils; @@ -182,10 +184,10 @@ public void initialize() { lspList.add(collectionLSP); lsps = new LSPs(lspList); } - Controler controler = new Controler(scenario); - controler.getEvents().addHandler((BasicEventHandler) event -> log.warn(event)); + Controller controller = ControllerUtils.createController(scenario); + controller.getEvents().addHandler((BasicEventHandler) event -> log.warn(event)); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -194,8 +196,8 @@ public void install() { LSPUtils.addLSPs(scenario, lsps); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java index aff14551751..4d6983fb661 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java @@ -36,6 +36,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.network.io.MatsimNetworkReader; import org.matsim.core.scenario.ScenarioUtils; @@ -284,9 +286,9 @@ public void initialize() { LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -300,8 +302,8 @@ public void install() { config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java index de67d12221c..eec97b8a5d1 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -258,9 +260,9 @@ public void initialize() { LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -271,8 +273,8 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java index f32adf076fa..a23d4eca1e5 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -203,9 +205,9 @@ public void initialize() { LSPs lsps = new LSPs(lspList); LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -216,8 +218,8 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java index 0717249ee6f..cf0e4895fd7 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -234,9 +236,9 @@ public void initialize() { LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -247,8 +249,8 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java index 2ddbb434170..282b578270f 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -182,9 +184,9 @@ public void initialize() { LSPUtils.addLSPs(scenario, lsps); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -195,8 +197,8 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java index 703861839c5..af1c3f08741 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -47,8 +49,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils.CollectionCarrierResourceBuilder; @@ -169,20 +171,20 @@ public void initialize() { lspList.add(collectionLSP); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); } }); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toInstance( new LSPModule.LSPStrategyManagerEmptyImpl() ); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -193,8 +195,8 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java index 8c914933a58..eeb0d34dce8 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -47,8 +49,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.lspReplanning.AssignmentStrategyFactory; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -296,11 +298,11 @@ public void initialize() { lspList.add(completeLSP); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toProvider(() -> { LSPStrategyManager strategyManager = new LSPStrategyManagerImpl(); @@ -308,7 +310,7 @@ public void initialize() { return strategyManager; }); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -319,12 +321,12 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); - for (LSP lsp : LSPUtils.getLSPs(controler.getScenario()).getLSPs().values()) { - ResourceImplementationUtils.printResults_shipmentPlan(controler.getControlerIO().getOutputPath(), lsp); - ResourceImplementationUtils.printResults_shipmentLog(controler.getControlerIO().getOutputPath(), lsp); + for (LSP lsp : LSPUtils.getLSPs(controller.getScenario()).getLSPs().values()) { + ResourceImplementationUtils.printResults_shipmentPlan(controller.getControlerIO().getOutputPath(), lsp); + ResourceImplementationUtils.printResults_shipmentLog(controller.getControlerIO().getOutputPath(), lsp); } } diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java index 0741c46ea6d..4edcebb8a13 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -47,8 +49,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.lspReplanning.AssignmentStrategyFactory; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -262,11 +264,11 @@ public void initialize() { lspList.add(lsp); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toProvider(() -> { LSPStrategyManager strategyManager = new LSPStrategyManagerImpl(); @@ -274,7 +276,7 @@ public void initialize() { return strategyManager; }); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -285,8 +287,8 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java index 30c1ca58a93..f0167615a8c 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -47,8 +49,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.lspReplanning.AssignmentStrategyFactory; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -206,11 +208,11 @@ public void initialize() { lspList.add(lsp); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toProvider(() -> { LSPStrategyManager strategyManager = new LSPStrategyManagerImpl(); @@ -218,7 +220,7 @@ public void initialize() { return strategyManager; }); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -229,8 +231,8 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java index 1046eefc491..741b2838909 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -47,8 +49,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.lspReplanning.AssignmentStrategyFactory; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -241,11 +243,11 @@ public void initialize() { lspList.add(lsp); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toProvider(() -> { LSPStrategyManager strategyManager = new LSPStrategyManagerImpl(); @@ -253,7 +255,7 @@ public void initialize() { return strategyManager; }); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -264,12 +266,12 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); - for (LSP lsp : LSPUtils.getLSPs(controler.getScenario()).getLSPs().values()) { - ResourceImplementationUtils.printResults_shipmentPlan(controler.getControlerIO().getOutputPath(), lsp); - ResourceImplementationUtils.printResults_shipmentLog(controler.getControlerIO().getOutputPath(), lsp); + for (LSP lsp : LSPUtils.getLSPs(controller.getScenario()).getLSPs().values()) { + ResourceImplementationUtils.printResults_shipmentPlan(controller.getControlerIO().getOutputPath(), lsp); + ResourceImplementationUtils.printResults_shipmentLog(controller.getControlerIO().getOutputPath(), lsp); } } diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java index c0a54bf98d3..b68714fd639 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -164,10 +166,10 @@ public void initialize() { lspList.add(collectionLSP); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -178,8 +180,8 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java index c15ce76cb22..b4553664f91 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java @@ -41,6 +41,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -49,8 +51,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.lspReplanning.AssignmentStrategyFactory; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -65,7 +67,7 @@ import org.matsim.vehicles.VehicleUtils; public class MultipleShipmentsCompleteLSPMobsimTest { - + private static final Logger log = LogManager.getLogger(MultipleShipmentsCompleteLSPMobsimTest.class); @RegisterExtension public final MatsimTestUtils utils = new MatsimTestUtils(); @@ -299,11 +301,11 @@ public void initialize() { lspList.add(completeLSP); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toProvider(() -> { LSPStrategyManager strategyManager = new LSPStrategyManagerImpl(); @@ -311,7 +313,7 @@ public void initialize() { return strategyManager; }); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -322,12 +324,12 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); - for (LSP lsp : LSPUtils.getLSPs(controler.getScenario()).getLSPs().values()) { - ResourceImplementationUtils.printResults_shipmentPlan(controler.getControlerIO().getOutputPath(), lsp); - ResourceImplementationUtils.printResults_shipmentLog(controler.getControlerIO().getOutputPath(), lsp); + for (LSP lsp : LSPUtils.getLSPs(controller.getScenario()).getLSPs().values()) { + ResourceImplementationUtils.printResults_shipmentPlan(controller.getControlerIO().getOutputPath(), lsp); + ResourceImplementationUtils.printResults_shipmentLog(controller.getControlerIO().getOutputPath(), lsp); } } diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java index 0cf80a23fc6..e9c598334d1 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -47,8 +49,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.freight.carriers.controler.CarrierControlerUtils; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.logistics.*; import org.matsim.freight.logistics.examples.lspReplanning.AssignmentStrategyFactory; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils; @@ -261,11 +263,11 @@ public void initialize() { lspList.add(lsp); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new LSPModule()); - controler.addOverridingModule( new AbstractModule(){ + controller.addOverridingModule(new LSPModule()); + controller.addOverridingModule( new AbstractModule(){ @Override public void install(){ bind( LSPStrategyManager.class ).toProvider(() -> { LSPStrategyManager strategyManager = new LSPStrategyManagerImpl(); @@ -273,7 +275,7 @@ public void initialize() { return strategyManager; }); bind( CarrierStrategyManager.class ).toProvider(() -> { - CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.addStrategy(new GenericPlanStrategyImpl<>(new RandomPlanSelector<>()), null, 1); return strategyManager; }); @@ -284,8 +286,8 @@ public void initialize() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java index c9857e222ef..e48ed12439d 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -202,10 +204,10 @@ public void initialize() { lspList.add(lsp); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -216,12 +218,12 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); - for (LSP lsp : LSPUtils.getLSPs(controler.getScenario()).getLSPs().values()) { - ResourceImplementationUtils.printResults_shipmentPlan(controler.getControlerIO().getOutputPath(), lsp); - ResourceImplementationUtils.printResults_shipmentLog(controler.getControlerIO().getOutputPath(), lsp); + for (LSP lsp : LSPUtils.getLSPs(controller.getScenario()).getLSPs().values()) { + ResourceImplementationUtils.printResults_shipmentPlan(controller.getControlerIO().getOutputPath(), lsp); + ResourceImplementationUtils.printResults_shipmentLog(controller.getControlerIO().getOutputPath(), lsp); } } diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java index 8c5767d0d8f..5d383570486 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -236,10 +238,10 @@ public void initialize() { lspList.add(lsp); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -250,12 +252,12 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); - for (LSP lsp : LSPUtils.getLSPs(controler.getScenario()).getLSPs().values()) { - ResourceImplementationUtils.printResults_shipmentPlan(controler.getControlerIO().getOutputPath(), lsp); - ResourceImplementationUtils.printResults_shipmentLog(controler.getControlerIO().getOutputPath(), lsp); + for (LSP lsp : LSPUtils.getLSPs(controller.getScenario()).getLSPs().values()) { + ResourceImplementationUtils.printResults_shipmentPlan(controller.getControlerIO().getOutputPath(), lsp); + ResourceImplementationUtils.printResults_shipmentLog(controller.getControlerIO().getOutputPath(), lsp); } } diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java index 7018f2e6a07..03e916f8b15 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java @@ -39,6 +39,8 @@ import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; +import org.matsim.core.controler.Controller; +import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.network.io.MatsimNetworkReader; @@ -290,10 +292,10 @@ public void initialize() { lspList.add(completeLSP); LSPs lsps = new LSPs(lspList); - Controler controler = new Controler(scenario); + Controller controller = ControllerUtils.createController(scenario); LSPUtils.addLSPs(scenario, lsps); - controler.addOverridingModule(new AbstractModule() { + controller.addOverridingModule(new AbstractModule() { @Override public void install() { install(new LSPModule()); @@ -304,8 +306,8 @@ public void install() { config.controller().setOverwriteFileSetting(OverwriteFileSetting.deleteDirectoryIfExists); config.controller().setOutputDirectory(utils.getOutputDirectory()); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 - controler.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); + controller.run(); } @Test diff --git a/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/UsecasesCarrierScoringFunctionFactory.java b/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/UsecasesCarrierScoringFunctionFactory.java index f1287ff4de3..ba49d350c14 100644 --- a/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/UsecasesCarrierScoringFunctionFactory.java +++ b/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/UsecasesCarrierScoringFunctionFactory.java @@ -8,8 +8,8 @@ import org.matsim.api.core.v01.population.Activity; import org.matsim.api.core.v01.population.Leg; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.controler.CarrierScoringFunctionFactory; -import org.matsim.freight.carriers.controler.FreightActivity; +import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; +import org.matsim.freight.carriers.controller.FreightActivity; import org.matsim.core.population.routes.NetworkRoute; import org.matsim.core.scoring.ScoringFunction; import org.matsim.core.scoring.SumScoringFunction; diff --git a/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/replanning/ReceiverStrategyManager.java b/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/replanning/ReceiverStrategyManager.java index f10d7d98145..f697154a305 100644 --- a/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/replanning/ReceiverStrategyManager.java +++ b/contribs/freightreceiver/src/main/java/org/matsim/freight/receiver/replanning/ReceiverStrategyManager.java @@ -20,7 +20,7 @@ package org.matsim.freight.receiver.replanning; -import org.matsim.freight.carriers.controler.CarrierStrategyManager; +import org.matsim.freight.carriers.controller.CarrierStrategyManager; import org.matsim.freight.receiver.Receiver; import org.matsim.freight.receiver.ReceiverPlan; import org.matsim.core.replanning.GenericStrategyManager; 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 094c2f753f4..c3aa017dc39 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 @@ -70,7 +70,7 @@ import org.matsim.facilities.ActivityFacility; import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.analysis.RunFreightAnalysisEventBased; -import org.matsim.freight.carriers.controler.*; +import org.matsim.freight.carriers.controller.*; import org.matsim.freight.carriers.usecases.chessboard.CarrierTravelDisutilities; import org.matsim.smallScaleCommercialTrafficGeneration.data.CommercialTourSpecifications; import org.matsim.smallScaleCommercialTrafficGeneration.data.DefaultTourSpecificationsByUsingKID2002; @@ -1063,7 +1063,7 @@ public CarrierStrategyManager get() { travelDisutility, modeTravelTimes.get(TransportMode.car)); // final GenericStrategyManager strategyManager = new GenericStrategyManager<>(); - final CarrierStrategyManager strategyManager = CarrierControlerUtils.createDefaultCarrierStrategyManager(); + final CarrierStrategyManager strategyManager = CarrierControllerUtils.createDefaultCarrierStrategyManager(); strategyManager.setMaxPlansPerAgent(5); { GenericPlanStrategyImpl strategy = new GenericPlanStrategyImpl<>( From f2cad384638cc5995cbf43b626f46998698b40de Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Sun, 1 Dec 2024 23:00:23 +0100 Subject: [PATCH 04/51] optimize imports --- .../org/matsim/freight/carriers/Carrier.java | 5 ++--- .../freight/carriers/CarrierCapabilities.java | 3 +-- .../matsim/freight/carriers/CarrierImpl.java | 7 +++---- .../matsim/freight/carriers/CarrierPlan.java | 3 +-- .../freight/carriers/CarrierPlanReaderV1.java | 3 +-- .../freight/carriers/CarrierPlanWriter.java | 3 +-- .../carriers/CarrierPlanXmlParserV2.java | 7 +++---- .../carriers/CarrierPlanXmlParserV2_1.java | 7 +++---- .../carriers/CarrierPlanXmlReader.java | 7 +++---- .../carriers/CarrierPlanXmlWriterV1.java | 11 +++++----- .../carriers/CarrierPlanXmlWriterV2.java | 7 +++---- .../carriers/CarrierPlanXmlWriterV2_1.java | 19 ++++++++--------- .../freight/carriers/CarrierService.java | 1 - .../carriers/CarrierVehicleTypeReader.java | 9 ++++---- .../carriers/CarrierVehicleTypeReaderV1.java | 3 +-- .../carriers/CarrierVehicleTypeWriter.java | 3 +-- .../carriers/CarrierVehicleTypeWriterV1.java | 5 ++--- .../freight/carriers/CarrierVehicleTypes.java | 5 ++--- .../org/matsim/freight/carriers/Carriers.java | 7 +++---- .../freight/carriers/CarriersUtils.java | 9 ++++---- .../carriers/FreightCarriersConfigGroup.java | 5 ++--- .../matsim/freight/carriers/TimeWindow.java | 1 - .../org/matsim/freight/carriers/Tour.java | 3 +-- .../analysis/CarrierLoadAnalysis.java | 21 +++++++++---------- .../analysis/CarrierPlanAnalysis.java | 11 +++++----- ...tTimeAndDistanceAnalysisEventsHandler.java | 15 +++++++------ .../RunFreightAnalysisEventBased.java | 7 +++---- .../carriers/controller/CarrierAgent.java | 3 +-- .../controller/CarrierAgentTracker.java | 3 +-- .../controller/CarrierControllerListener.java | 3 +-- .../controller/CarrierDriverAgent.java | 11 +++++----- .../carriers/controller/CarrierModule.java | 3 +-- .../CarrierStrategyManagerImpl.java | 3 +-- .../CarrierTimeAllocationMutator.java | 5 ++--- .../CarrierTimeAndSpaceTourRouter.java | 5 ++--- .../controller/CarrierVehicleReRouter.java | 3 +-- .../controller/FreightAgentSource.java | 4 ++-- .../WithinDayActivityReScheduling.java | 7 +++---- .../carriers/events/AbstractCarrierEvent.java | 3 +-- .../carriers/events/CarrierEventsReaders.java | 3 +-- .../events/CarrierServiceEndEvent.java | 3 +-- .../events/CarrierServiceStartEvent.java | 3 +-- .../CarrierShipmentDeliveryEndEvent.java | 3 +-- .../CarrierShipmentDeliveryStartEvent.java | 7 +++---- .../events/CarrierShipmentPickupEndEvent.java | 7 +++---- .../CarrierShipmentPickupStartEvent.java | 3 +-- .../carriers/events/CarrierTourEndEvent.java | 3 +-- .../events/CarrierTourStartEvent.java | 7 +++---- .../events/CarrierTourStartEventCreator.java | 3 +-- .../CarrierServiceStartEventHandler.java | 1 - .../CarrierTourEndEventHandler.java | 1 - .../CarrierTourStartEventHandler.java | 1 - .../Vehicle2CarrierEventHandler.java | 5 ++--- .../carriers/jsprit/MatsimJspritFactory.java | 9 ++++---- .../jsprit/NetworkBasedTransportCosts.java | 5 ++--- .../NetworkBasedTransportCostsFactory.java | 9 ++++---- ...cleTypeDependentRoadPricingCalculator.java | 4 +--- .../usecases/analysis/CarrierScoreStats.java | 9 ++++---- .../usecases/analysis/LegHistogram.java | 17 +++++++-------- .../CarrierScoringFunctionFactoryImpl.java | 5 ++--- .../chessboard/FreightScenarioCreator.java | 7 +++---- .../chessboard/InitialCarrierPlanCreator.java | 3 +-- .../InnerOuterCityScenarioCreator.java | 5 ++--- .../chessboard/PassengerScenarioCreator.java | 5 ++--- .../usecases/chessboard/RunChessboard.java | 3 +-- .../RunPassengerAlongWithCarriers.java | 5 ++--- ...PlanAndOptimizeItsVehicleRouteFactory.java | 5 ++--- .../FreightLogisticsConfigGroup.java | 1 - .../logistics/LSPControllerListener.java | 1 - .../analysis/Driver2VehicleEventHandler.java | 5 ++--- .../logistics/events/LspEventsReader.java | 3 +-- .../initialPlans/ExampleTestOutput.java | 1 - .../ExampleMobsimOfSimpleLSP.java | 1 - .../ExampleMobsimOfTransportChain.java | 1 - ...eTwoLspsGroceryDeliveryMultipleChains.java | 2 -- ...GroceryDeliveryMultipleChainsWithToll.java | 1 - .../RandomLogisticChainShipmentAssigner.java | 2 +- .../RandomShiftingStrategyFactory.java | 1 - .../requirementsChecking/RedRequirement.java | 1 - .../ExampleSimulationTrackers.java | 1 - .../CarrierSchedulerUtils.java | 1 - .../CollectionCarrierScheduler.java | 1 - .../DistributionCarrierScheduler.java | 1 - .../LSPTourStartEventHandler.java | 3 +-- .../TransshipmentHubScheduler.java | 2 +- .../carriers/CarrierEventsReadersTest.java | 10 ++++----- .../carriers/CarrierPlanReaderV1Test.java | 1 - .../carriers/CarrierPlanXmlReaderV2Test.java | 12 +++++------ .../CarrierPlanXmlReaderV2WithDtdTest.java | 6 ++---- .../carriers/CarrierPlanXmlWriterV1Test.java | 1 - .../carriers/CarrierPlanXmlWriterV2Test.java | 8 +++---- .../CarrierPlanXmlWriterV2_1Test.java | 7 +++---- .../carriers/CarrierReadWriteV2_1Test.java | 4 +--- .../CarrierVehicleTypeLoaderTest.java | 3 +-- .../CarrierVehicleTypeReaderTest.java | 6 +++--- .../carriers/CarrierVehicleTypeTest.java | 3 +-- .../CarrierVehicleTypeWriterTest.java | 3 --- .../freight/carriers/CarriersUtilsTest.java | 7 +++---- .../FreightCarriersConfigGroupTest.java | 9 ++++---- .../FreightAnalysisEventBasedTest.java | 5 ++--- .../EquilWithCarrierWithPersonsIT.java | 2 +- .../EquilWithCarrierWithoutPersonsIT.java | 2 +- ...istanceConstraintFromVehiclesFileTest.java | 11 +++++----- .../jsprit/DistanceConstraintTest.java | 11 +++++----- .../carriers/jsprit/FixedCostsTest.java | 8 +++---- .../carriers/jsprit/IntegrationIT.java | 3 +-- .../jsprit/MatsimTransformerTest.java | 11 +++++----- .../NetworkBasedTransportCostsTest.java | 10 ++++----- ...istanceScoringFunctionFactoryForTests.java | 7 +++---- .../ScoringFunctionFactoryForTests.java | 7 +++---- .../StrategyManagerFactoryForTests.java | 5 ++--- .../TimeScoringFunctionFactoryForTests.java | 7 +++---- .../utils/CarrierControllerUtilsIT.java | 6 ++---- .../utils/CarrierControllerUtilsTest.java | 8 +++---- .../logistics/events/LspEventsReaderTest.java | 4 ++-- ...ulingOfTransportChainHubsVsDirectTest.java | 2 +- .../ExampleTwoEchelonGridTest.java | 2 +- .../CollectionLSPReplanningTest.java | 2 +- .../lspScoring/CollectionLSPScoringTest.java | 3 +-- .../lspScoring/ExampleLSPScoringTest.java | 3 +-- ...pleIterationsCollectionLSPScoringTest.java | 3 +-- .../ExampleMobsimOfSimpleLSPTest.java | 4 ++-- .../MultipleChainsReplanningTest.java | 2 +- .../CollectionTrackerTest.java | 7 +++---- .../logistics/io/LSPReadWriteTest.java | 2 +- 125 files changed, 251 insertions(+), 376 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/Carrier.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/Carrier.java index 8ee9e1812e5..e80fbb6c9fa 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/Carrier.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/Carrier.java @@ -21,13 +21,12 @@ package org.matsim.freight.carriers; +import java.util.List; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.population.HasPlansAndId; import org.matsim.utils.objectattributes.attributable.Attributable; -import java.util.List; -import java.util.Map; - /** * A carrier. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java index fa14ddfd9bb..cca27a8c435 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java @@ -21,12 +21,11 @@ package org.matsim.freight.carriers; +import java.util.*; import org.matsim.api.core.v01.Id; import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; -import java.util.*; - /** * This contains the capabilities/resources a carrier has/can deploy. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierImpl.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierImpl.java index 8dcc53adc75..54bebb6b9d2 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierImpl.java @@ -21,14 +21,13 @@ package org.matsim.freight.carriers; -import org.matsim.api.core.v01.Id; -import org.matsim.utils.objectattributes.attributable.Attributes; -import org.matsim.utils.objectattributes.attributable.AttributesImpl; - import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.matsim.api.core.v01.Id; +import org.matsim.utils.objectattributes.attributable.Attributes; +import org.matsim.utils.objectattributes.attributable.AttributesImpl; /** * This is a carrier that has capabilities and resources, jobs and plans to fulfill its obligations. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java index 9c51aac159e..e1f56c19d4a 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java @@ -21,13 +21,12 @@ package org.matsim.freight.carriers; +import java.util.Collection; import org.matsim.api.core.v01.population.BasicPlan; import org.matsim.utils.objectattributes.attributable.Attributable; import org.matsim.utils.objectattributes.attributable.Attributes; import org.matsim.utils.objectattributes.attributable.AttributesImpl; -import java.util.Collection; - /** * * A specific plan of a carrier, and its score. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java index 4e13ad599b6..d242e5ebce8 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -34,8 +35,6 @@ import org.matsim.vehicles.VehicleType; import org.xml.sax.Attributes; -import java.util.*; - /** * A reader that reads carriers and their plans. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java index 3d7922d9489..3e27e759e82 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java @@ -22,9 +22,8 @@ package org.matsim.freight.carriers; import com.google.inject.Inject; -import org.matsim.utils.objectattributes.AttributeConverter; - import java.util.Map; +import org.matsim.utils.objectattributes.AttributeConverter; /** * @author mrieser / Simunto diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java index a63697cfab4..c47a04a5469 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java @@ -21,7 +21,10 @@ package org.matsim.freight.carriers; +import static org.matsim.freight.carriers.CarrierConstants.*; + import com.google.inject.Inject; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -40,10 +43,6 @@ import org.matsim.vehicles.VehicleType; import org.xml.sax.Attributes; -import java.util.*; - -import static org.matsim.freight.carriers.CarrierConstants.*; - class CarrierPlanXmlParserV2 extends MatsimXmlParser { public static final Logger logger = LogManager.getLogger(CarrierPlanXmlParserV2.class); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java index 8503eb4acad..e8b3911df61 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java @@ -21,7 +21,10 @@ package org.matsim.freight.carriers; +import static org.matsim.freight.carriers.CarrierConstants.*; + import com.google.inject.Inject; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -40,10 +43,6 @@ import org.matsim.vehicles.VehicleType; import org.xml.sax.Attributes; -import java.util.*; - -import static org.matsim.freight.carriers.CarrierConstants.*; - class CarrierPlanXmlParserV2_1 extends MatsimXmlParser { public static final Logger logger = LogManager.getLogger(CarrierPlanXmlParserV2_1.class); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlReader.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlReader.java index 5155f5bdebc..4842ab434f9 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlReader.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlReader.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers; +import java.io.InputStream; +import java.net.URL; +import java.util.Stack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.core.api.internal.MatsimReader; @@ -28,10 +31,6 @@ import org.xml.sax.Attributes; import org.xml.sax.SAXException; -import java.io.InputStream; -import java.net.URL; -import java.util.Stack; - /** * A reader that reads carriers and their plans. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java index 510ea9b1ac3..e2b7e09d930 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java @@ -22,6 +22,11 @@ package org.matsim.freight.carriers; import com.graphhopper.jsprit.core.problem.job.Shipment; +import java.io.BufferedWriter; +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -30,12 +35,6 @@ import org.matsim.core.utils.io.MatsimXmlWriter; import org.matsim.core.utils.misc.Time; -import java.io.BufferedWriter; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - /** * A writer that writes carriers and their plans in a xml-file. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java index b78af8aa3e6..e47ffdb782d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java @@ -22,6 +22,9 @@ package org.matsim.freight.carriers; import com.google.inject.Inject; +import java.io.BufferedWriter; +import java.io.IOException; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -38,10 +41,6 @@ import org.matsim.utils.objectattributes.attributable.AttributesXmlWriterDelegate; import org.matsim.vehicles.VehicleType; -import java.io.BufferedWriter; -import java.io.IOException; -import java.util.*; - /** * A writer that writes carriers and their plans in a xml-file. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1.java index 92699982378..6195fb3834f 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1.java @@ -21,7 +21,16 @@ package org.matsim.freight.carriers; +import static org.matsim.freight.carriers.CarrierConstants.*; + import com.google.inject.Inject; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -34,16 +43,6 @@ import org.matsim.utils.objectattributes.attributable.AttributesXmlWriterDelegate; import org.matsim.vehicles.VehicleType; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import static org.matsim.freight.carriers.CarrierConstants.*; - /** * A writer that writes carriers and their plans in a xml-file. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java index b7106fa6de9..20ad184013e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java @@ -27,7 +27,6 @@ import org.matsim.utils.objectattributes.attributable.Attributes; import org.matsim.utils.objectattributes.attributable.AttributesImpl; - public final class CarrierService implements Attributable { public static class Builder { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java index f10e5fc9bd5..0d8d070c5c6 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java @@ -21,6 +21,10 @@ package org.matsim.freight.carriers; +import java.io.InputStream; +import java.net.URL; +import java.util.Map; +import java.util.Stack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -33,11 +37,6 @@ import org.xml.sax.Attributes; import org.xml.sax.SAXException; -import java.io.InputStream; -import java.net.URL; -import java.util.Map; -import java.util.Stack; - /** * Reader reading carrierVehicleTypes from a xml-file. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java index 92e2bacc590..52d56eaf0d2 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers; +import java.util.Stack; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -33,8 +34,6 @@ import org.matsim.vehicles.VehicleUtils; import org.xml.sax.Attributes; -import java.util.Stack; - class CarrierVehicleTypeReaderV1 extends MatsimXmlParser { private static final Logger log = LogManager.getLogger(CarrierVehicleTypeReaderV1.class) ; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriter.java index 4fbd8d68bbb..573f8441cae 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriter.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.core.api.internal.MatsimWriter; import org.matsim.vehicles.MatsimVehicleWriter; @@ -28,8 +29,6 @@ import org.matsim.vehicles.VehicleUtils; import org.matsim.vehicles.Vehicles; -import java.util.Map; - /** * A writer that writes carriers and their plans in a xml-file. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java index 823123e916a..b6671235c2a 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java @@ -21,6 +21,8 @@ package org.matsim.freight.carriers; +import java.io.BufferedWriter; +import java.io.IOException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.core.utils.io.MatsimXmlWriter; @@ -28,9 +30,6 @@ import org.matsim.vehicles.EngineInformation; import org.matsim.vehicles.VehicleType; -import java.io.BufferedWriter; -import java.io.IOException; - @Deprecated // only there if someone insists on writing V1 public final class CarrierVehicleTypeWriterV1 extends MatsimXmlWriter { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypes.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypes.java index e9900cdc6cb..0250412938a 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypes.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypes.java @@ -21,11 +21,10 @@ package org.matsim.freight.carriers; -import org.matsim.api.core.v01.Id; -import org.matsim.vehicles.VehicleType; - import java.util.HashMap; import java.util.Map; +import org.matsim.api.core.v01.Id; +import org.matsim.vehicles.VehicleType; /** * VehicleTypeContainer mapping all vehicleTypes. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/Carriers.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/Carriers.java index f13f0bc56ae..4512008b9e8 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/Carriers.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/Carriers.java @@ -21,13 +21,12 @@ package org.matsim.freight.carriers; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.Id; - import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.matsim.api.core.v01.Id; /** * A container that maps carriers. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java index c868457972f..bae1ba79c29 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java @@ -28,6 +28,10 @@ import com.graphhopper.jsprit.core.problem.job.Shipment; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.util.Solutions; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import javax.management.InvalidAttributeValueException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -44,11 +48,6 @@ import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; -import javax.management.InvalidAttributeValueException; -import java.util.*; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; - public class CarriersUtils { static final String CARRIER_VEHICLE = "carrierVehicle"; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/FreightCarriersConfigGroup.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/FreightCarriersConfigGroup.java index 1aed1a936f2..2474df19550 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/FreightCarriersConfigGroup.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/FreightCarriersConfigGroup.java @@ -22,11 +22,10 @@ package org.matsim.freight.carriers; import jakarta.validation.constraints.Positive; -import org.matsim.core.config.ConfigGroup; -import org.matsim.core.config.ReflectiveConfigGroup; - import java.net.URL; import java.util.Map; +import org.matsim.core.config.ConfigGroup; +import org.matsim.core.config.ReflectiveConfigGroup; public class FreightCarriersConfigGroup extends ReflectiveConfigGroup { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/TimeWindow.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/TimeWindow.java index 8c5e9fc0d25..1eadbe077c0 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/TimeWindow.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/TimeWindow.java @@ -24,7 +24,6 @@ import org.matsim.core.utils.misc.Time; - /** * Q: What happens/should happen if the time window is not sufficient to unload, or * the vehicle arrives after the time window? diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java index cb522e857fb..b9734e0bc64 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -30,8 +31,6 @@ import org.matsim.core.population.routes.NetworkRoute; import org.matsim.core.population.routes.RouteUtils; -import java.util.*; - /** * This is a tour of a carrier which is a sequence of activities and legs. *

diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java index 7de5125e51e..b28fdf86c13 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java @@ -21,6 +21,16 @@ package org.matsim.freight.carriers.analysis; +import static org.matsim.freight.carriers.events.CarrierEventAttributes.ATTRIBUTE_CAPACITYDEMAND; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.Map; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -34,17 +44,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.Map; - -import static org.matsim.freight.carriers.events.CarrierEventAttributes.ATTRIBUTE_CAPACITYDEMAND; - /** * @author Kai Martins-Turner (kturner) */ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java index aeec93fd605..610c376a5db 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java @@ -21,17 +21,16 @@ package org.matsim.freight.carriers.analysis; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.Id; -import org.matsim.core.utils.misc.Time; -import org.matsim.freight.carriers.*; - import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Path; import java.util.TreeMap; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.matsim.api.core.v01.Id; +import org.matsim.core.utils.misc.Time; +import org.matsim.freight.carriers.*; /** * Some basic analysis / data collection for {@link Carriers}(files) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java index c62863465d5..4e53c559222 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java @@ -21,6 +21,13 @@ package org.matsim.freight.carriers.analysis; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Path; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.TreeMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -44,14 +51,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.TreeMap; - /** * @author Kai Martins-Turner (kturner) */ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java index 7269a70ac7f..d6a01e09409 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers.analysis; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Scenario; @@ -36,10 +39,6 @@ import org.matsim.freight.carriers.FreightCarriersConfigGroup; import org.matsim.freight.carriers.events.CarrierEventsReaders; -import java.io.File; -import java.io.IOException; -import java.nio.file.Path; - //import static org.matsim.application.ApplicationUtils.globFile; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgent.java index 5be81661579..1afe10da4d0 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgent.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.controller; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -38,8 +39,6 @@ import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleUtils; -import java.util.*; - /** * This keeps track of the carrier during simulation. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgentTracker.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgentTracker.java index 8474ba0b8c7..f2bd02a204e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgentTracker.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierAgentTracker.java @@ -22,6 +22,7 @@ package org.matsim.freight.carriers.controller; import com.google.inject.Inject; +import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -35,8 +36,6 @@ import org.matsim.freight.carriers.events.CarrierEventCreator; import org.matsim.freight.carriers.events.CarrierEventCreatorUtils; -import java.util.*; - /** * This keeps track of all carrierAgents during simulation. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerListener.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerListener.java index 9754f54c130..136fecf4725 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerListener.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierControllerListener.java @@ -22,6 +22,7 @@ package org.matsim.freight.carriers.controller; import jakarta.inject.Inject; +import javax.annotation.Nullable; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Scenario; @@ -31,8 +32,6 @@ import org.matsim.core.controler.listener.ScoringListener; import org.matsim.freight.carriers.CarriersUtils; -import javax.annotation.Nullable; - /** * Controls the workflow of the simulation. *

diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java index e0de8c3ca82..ba8e40e3d71 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java @@ -21,6 +21,11 @@ package org.matsim.freight.carriers.controller; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -41,12 +46,6 @@ import org.matsim.freight.carriers.events.CarrierEventCreator; import org.matsim.vehicles.Vehicle; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - /** * This keeps track of a scheduledTour during simulation and can thus be seen as the driver of the vehicle that runs the tour. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierModule.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierModule.java index 5a3a45c6035..d95e1e7ac18 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierModule.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierModule.java @@ -24,6 +24,7 @@ import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; +import java.util.List; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.events.Event; import org.matsim.api.core.v01.population.Activity; @@ -38,8 +39,6 @@ import org.matsim.core.scoring.ScoringFunction; import org.matsim.freight.carriers.*; -import java.util.List; - public final class CarrierModule extends AbstractModule { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManagerImpl.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManagerImpl.java index 6e56807737d..8a673af527b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManagerImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierStrategyManagerImpl.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.controller; +import java.util.List; import org.matsim.api.core.v01.population.HasPlansAndId; import org.matsim.core.replanning.GenericPlanStrategy; import org.matsim.core.replanning.GenericStrategyManager; @@ -30,8 +31,6 @@ import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.CarrierPlan; -import java.util.List; - class CarrierStrategyManagerImpl implements CarrierStrategyManager{ final GenericStrategyManager delegate = new GenericStrategyManagerImpl<>(); @Override public void addStrategy( GenericPlanStrategy strategy, String subpopulation, double weight ){ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAllocationMutator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAllocationMutator.java index b7c58ef8e84..b38a96a8fd2 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAllocationMutator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAllocationMutator.java @@ -20,15 +20,14 @@ */ package org.matsim.freight.carriers.controller; +import java.util.ArrayList; +import java.util.Collection; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.replanning.ReplanningContext; import org.matsim.core.replanning.modules.GenericPlanStrategyModule; import org.matsim.freight.carriers.CarrierPlan; import org.matsim.freight.carriers.ScheduledTour; -import java.util.ArrayList; -import java.util.Collection; - /** * @author nagel * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java index 8c2362252df..116495f7549 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java @@ -21,6 +21,8 @@ package org.matsim.freight.carriers.controller; +import java.util.ArrayList; +import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -41,9 +43,6 @@ import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; -import java.util.ArrayList; -import java.util.List; - /** * Router routing scheduledTours. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierVehicleReRouter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierVehicleReRouter.java index e169c6cd001..1d9a02d74d0 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierVehicleReRouter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierVehicleReRouter.java @@ -35,6 +35,7 @@ import com.graphhopper.jsprit.io.algorithm.AlgorithmConfig; import com.graphhopper.jsprit.io.algorithm.AlgorithmConfigXmlReader; import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithms; +import java.util.Collection; import org.matsim.api.core.v01.network.Network; import org.matsim.contrib.roadpricing.RoadPricingScheme; import org.matsim.core.replanning.ReplanningContext; @@ -46,8 +47,6 @@ import org.matsim.freight.carriers.jsprit.MatsimJspritFactory; import org.matsim.freight.carriers.jsprit.NetworkBasedTransportCosts; -import java.util.Collection; - class CarrierVehicleReRouter implements GenericPlanStrategyModule{ private final Network network; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightAgentSource.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightAgentSource.java index 7af83457a4b..c1550c49701 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightAgentSource.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/FreightAgentSource.java @@ -22,6 +22,8 @@ package org.matsim.freight.carriers.controller; import com.google.inject.Inject; +import java.util.ArrayList; +import java.util.Collection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -35,8 +37,6 @@ import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleUtils; -import java.util.ArrayList; -import java.util.Collection; /** * Created by IntelliJ IDEA. User: zilske Date: 10/31/11 Time: 5:59 PM To change * this template use File | Settings | File Templates. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/WithinDayActivityReScheduling.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/WithinDayActivityReScheduling.java index fee97256f5d..0e4cbebfa6d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/WithinDayActivityReScheduling.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/WithinDayActivityReScheduling.java @@ -22,6 +22,9 @@ package org.matsim.freight.carriers.controller; import com.google.inject.Inject; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -38,10 +41,6 @@ import org.matsim.freight.carriers.Tour.Start; import org.matsim.freight.carriers.Tour.TourActivity; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - /* * Physically enforces beginnings of time windows for freight activities, i.e. freight agents * wait before closed doors until they can deliver / pick up their goods. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/AbstractCarrierEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/AbstractCarrierEvent.java index 1380144b9b4..497bc3dca7e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/AbstractCarrierEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/AbstractCarrierEvent.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.events; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.Event; import org.matsim.api.core.v01.events.HasLinkId; @@ -29,8 +30,6 @@ import org.matsim.freight.carriers.Carrier; import org.matsim.vehicles.Vehicle; -import java.util.Map; - /** * A general freight event contains the information (= {@link Id}) of the * - {@link Carrier} diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierEventsReaders.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierEventsReaders.java index 23c9176a0ff..ee06d87ba6d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierEventsReaders.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierEventsReaders.java @@ -21,11 +21,10 @@ package org.matsim.freight.carriers.events; +import java.util.Map; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.events.MatsimEventsReader; -import java.util.Map; - /** * Creates an {@link MatsimEventsReader} that also handles the carrier specific events. *

diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceEndEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceEndEvent.java index bfd8ad7d68c..f806248471c 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceEndEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceEndEvent.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.events; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,8 +29,6 @@ import org.matsim.freight.carriers.CarrierService; import org.matsim.vehicles.Vehicle; -import java.util.Map; - /** * An event, that informs that a Freight {@link CarrierService} activity has ended. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceStartEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceStartEvent.java index 1b866d5ce5b..d1b4d816ace 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceStartEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierServiceStartEvent.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.events; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,8 +29,6 @@ import org.matsim.freight.carriers.CarrierService; import org.matsim.vehicles.Vehicle; -import java.util.Map; - /** * An event, that informs that a Freight {@link CarrierService} activity has started. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryEndEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryEndEvent.java index c02717031fa..8f60260a067 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryEndEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryEndEvent.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.events; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,8 +29,6 @@ import org.matsim.freight.carriers.CarrierShipment; import org.matsim.vehicles.Vehicle; -import java.util.Map; - /** * An event, that informs that a Freight {@link CarrierShipment} delivery-activity has ended. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryStartEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryStartEvent.java index 43cf21fc752..a30035968c0 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryStartEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentDeliveryStartEvent.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers.events; +import static org.matsim.freight.carriers.events.CarrierEventAttributes.*; + +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,10 +31,6 @@ import org.matsim.freight.carriers.CarrierShipment; import org.matsim.vehicles.Vehicle; -import java.util.Map; - -import static org.matsim.freight.carriers.events.CarrierEventAttributes.*; - /** * An event, that informs that a Freight {@link CarrierShipment} delivery-activity has started. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupEndEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupEndEvent.java index 90e1fd137b7..4316e6f4dfe 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupEndEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupEndEvent.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers.events; +import static org.matsim.freight.carriers.events.CarrierEventAttributes.*; + +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,10 +31,6 @@ import org.matsim.freight.carriers.CarrierShipment; import org.matsim.vehicles.Vehicle; -import java.util.Map; - -import static org.matsim.freight.carriers.events.CarrierEventAttributes.*; - /** * An event, that informs that a Freight {@link CarrierShipment} pickup-activity has ended. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupStartEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupStartEvent.java index ab36e627190..fe851a10138 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupStartEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierShipmentPickupStartEvent.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.events; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,8 +29,6 @@ import org.matsim.freight.carriers.CarrierShipment; import org.matsim.vehicles.Vehicle; -import java.util.Map; - /** * An event, that informs that a Freight {@link CarrierShipment} pickup-activity has started. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourEndEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourEndEvent.java index 82e133f2166..1c0e3579312 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourEndEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourEndEvent.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.events; +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,8 +29,6 @@ import org.matsim.freight.carriers.Tour; import org.matsim.vehicles.Vehicle; -import java.util.Map; - /** * An event, that informs when a Freight {@link Tour} has ended. * There are NO specific information of the tour given, because the {@link Tour} is determined by the {@link Vehicle} and its {@link Carrier}. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEvent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEvent.java index 9c64e8213b2..aa4ff9f1084 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEvent.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers.events; +import static org.matsim.freight.carriers.events.CarrierEventAttributes.ATTRIBUTE_TOUR_ID; + +import java.util.Map; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.GenericEvent; import org.matsim.api.core.v01.network.Link; @@ -28,10 +31,6 @@ import org.matsim.freight.carriers.Tour; import org.matsim.vehicles.Vehicle; -import java.util.Map; - -import static org.matsim.freight.carriers.events.CarrierEventAttributes.ATTRIBUTE_TOUR_ID; - /** * An event, that informs when a Freight {@link Tour} has started. * There are NO specific information of the tour given, because the {@link Tour} is determined by the {@link Vehicle} and its {@link Carrier}. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java index aacf3e6ef12..fea34b4f577 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java @@ -21,6 +21,7 @@ package org.matsim.freight.carriers.events; +import java.util.TreeMap; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.ActivityEndEvent; import org.matsim.api.core.v01.events.Event; @@ -32,8 +33,6 @@ import org.matsim.freight.carriers.ScheduledTour; import org.matsim.vehicles.Vehicle; -import java.util.TreeMap; - /*package-private*/ final class CarrierTourStartEventCreator implements CarrierEventCreator { final TreeMap, ActivityEndEvent> endEventMap = new TreeMap<>(); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierServiceStartEventHandler.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierServiceStartEventHandler.java index a8ea55c13e8..362974eae3f 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierServiceStartEventHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierServiceStartEventHandler.java @@ -24,7 +24,6 @@ import org.matsim.core.events.handler.EventHandler; import org.matsim.freight.carriers.events.CarrierServiceStartEvent; - public interface CarrierServiceStartEventHandler extends EventHandler { void handleEvent( CarrierServiceStartEvent event ); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourEndEventHandler.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourEndEventHandler.java index 2d30ce4d70c..d14a5d285cf 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourEndEventHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourEndEventHandler.java @@ -24,7 +24,6 @@ import org.matsim.core.events.handler.EventHandler; import org.matsim.freight.carriers.events.CarrierTourEndEvent; - public interface CarrierTourEndEventHandler extends EventHandler { void handleEvent( CarrierTourEndEvent event ); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourStartEventHandler.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourStartEventHandler.java index 5f4b26ce4bb..3a7997cc9ef 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourStartEventHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/CarrierTourStartEventHandler.java @@ -24,7 +24,6 @@ import org.matsim.core.events.handler.EventHandler; import org.matsim.freight.carriers.events.CarrierTourStartEvent; - public interface CarrierTourStartEventHandler extends EventHandler { void handleEvent( CarrierTourStartEvent event ); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/Vehicle2CarrierEventHandler.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/Vehicle2CarrierEventHandler.java index bc9236decbf..0d5b9902f57 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/Vehicle2CarrierEventHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/eventhandler/Vehicle2CarrierEventHandler.java @@ -20,15 +20,14 @@ */ package org.matsim.freight.carriers.events.eventhandler; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.matsim.api.core.v01.Id; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.events.CarrierTourEndEvent; import org.matsim.freight.carriers.events.CarrierTourStartEvent; import org.matsim.vehicles.Vehicle; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - /** * Basic event handler that collects the relation between vehicles and carrier. * Necessary since link enter and leave events do not contain any information of the carrier. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java index 8710e50c7ba..d7fe28fcfe8 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java @@ -45,6 +45,10 @@ import com.graphhopper.jsprit.io.algorithm.AlgorithmConfig; import com.graphhopper.jsprit.io.algorithm.AlgorithmConfigXmlReader; import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithms; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Coord; @@ -57,11 +61,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - /** * A factory that creates matsim-object from jsprit * (...) and vice versa. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java index e6d8e1a0e45..0e9ece0da53 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java @@ -26,6 +26,8 @@ import com.graphhopper.jsprit.core.problem.driver.Driver; import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; @@ -45,9 +47,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - /** * This calculates transport-times, transport-costs and the distance to cover * the distance from one location to another. It calculates these values based diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsFactory.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsFactory.java index 6a0be5414f0..558ec523a81 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsFactory.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsFactory.java @@ -21,19 +21,18 @@ package org.matsim.freight.carriers.jsprit; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.router.util.TravelTime; -import org.matsim.freight.carriers.FreightCarriersConfigGroup; import org.matsim.freight.carriers.Carriers; +import org.matsim.freight.carriers.FreightCarriersConfigGroup; import org.matsim.vehicles.VehicleType; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - /** * @author steffenaxer */ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VehicleTypeDependentRoadPricingCalculator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VehicleTypeDependentRoadPricingCalculator.java index 6175780ab9a..7c9541f5777 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VehicleTypeDependentRoadPricingCalculator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VehicleTypeDependentRoadPricingCalculator.java @@ -21,14 +21,12 @@ package org.matsim.freight.carriers.jsprit; import com.graphhopper.jsprit.core.problem.vehicle.VehicleType; +import java.util.*; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; import org.matsim.contrib.roadpricing.RoadPricingScheme; import org.matsim.contrib.roadpricing.RoadPricingSchemeImpl.Cost; -import java.util.*; - - /** * Calculator that manages and calculates vehicle type dependent road pricing schemas. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java index 84556de1a14..ab4fa18632f 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java @@ -21,6 +21,10 @@ package org.matsim.freight.carriers.usecases.analysis; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Locale; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.core.controler.events.IterationEndsEvent; @@ -35,11 +39,6 @@ import org.matsim.freight.carriers.CarrierPlan; import org.matsim.freight.carriers.Carriers; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.util.Locale; - /** * As you can see, it is basically a copy of {@link org.matsim.analysis.ScoreStatsControlerListener}. However, it is modified to score {@link Carrier}s * rather than Persons. (Oct'13, schroeder) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java index fff393eee93..1954eff762e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java @@ -22,6 +22,14 @@ package org.matsim.freight.carriers.usecases.analysis; import jakarta.inject.Inject; +import java.awt.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintStream; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtils; import org.jfree.chart.JFreeChart; @@ -42,15 +50,6 @@ import org.matsim.api.core.v01.population.Population; import org.matsim.core.utils.misc.Time; -import java.awt.*; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.PrintStream; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; - /** * It is a copy of {@link org.matsim.analysis.LegHistogram}. It is modified to include or exclude persons. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java index a08cc97c960..ee2b54c9399 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java @@ -22,6 +22,8 @@ package org.matsim.freight.carriers.usecases.chessboard; import com.google.inject.Inject; +import java.util.HashSet; +import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -41,9 +43,6 @@ import org.matsim.freight.carriers.jsprit.VehicleTypeDependentRoadPricingCalculator; import org.matsim.vehicles.Vehicle; -import java.util.HashSet; -import java.util.Set; - /** * Defines example carrier scoring function (factory). * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/FreightScenarioCreator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/FreightScenarioCreator.java index c258d01e703..3d291829b77 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/FreightScenarioCreator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/FreightScenarioCreator.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers.usecases.chessboard; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.network.Link; @@ -34,10 +37,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - /** * Creates chessboard freight scenario. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java index fb2979e4be1..9bd932848f7 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InitialCarrierPlanCreator.java @@ -34,6 +34,7 @@ import com.graphhopper.jsprit.io.algorithm.AlgorithmConfig; import com.graphhopper.jsprit.io.algorithm.AlgorithmConfigXmlReader; import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithms; +import java.util.Collection; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.network.Network; import org.matsim.core.config.Config; @@ -44,8 +45,6 @@ import org.matsim.freight.carriers.jsprit.NetworkBasedTransportCosts; import org.matsim.freight.carriers.jsprit.NetworkRouter; -import java.util.Collection; - final class InitialCarrierPlanCreator { private final Network network; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InnerOuterCityScenarioCreator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InnerOuterCityScenarioCreator.java index d5b48f1df69..789a5681a46 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InnerOuterCityScenarioCreator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/InnerOuterCityScenarioCreator.java @@ -21,12 +21,11 @@ package org.matsim.freight.carriers.usecases.chessboard; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.network.Link; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.matsim.api.core.v01.Id; +import org.matsim.api.core.v01.network.Link; final class InnerOuterCityScenarioCreator { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PassengerScenarioCreator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PassengerScenarioCreator.java index 3a742ced5e6..1060931835e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PassengerScenarioCreator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PassengerScenarioCreator.java @@ -21,6 +21,8 @@ package org.matsim.freight.carriers.usecases.chessboard; +import java.util.ArrayList; +import java.util.List; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -36,9 +38,6 @@ import org.matsim.core.router.util.LeastCostPathCalculator.Path; import org.matsim.core.scenario.ScenarioUtils; -import java.util.ArrayList; -import java.util.List; - final class PassengerScenarioCreator { static int agentCounter = 1; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java index 16779812e59..ff62264a468 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunChessboard.java @@ -23,6 +23,7 @@ import com.google.inject.Provider; import jakarta.inject.Inject; +import java.util.Map; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; import org.matsim.api.core.v01.network.Network; @@ -48,8 +49,6 @@ import org.matsim.freight.carriers.usecases.analysis.CarrierScoreStats; import org.matsim.freight.carriers.usecases.analysis.LegHistogram; -import java.util.Map; - public final class RunChessboard { public static void main(String[] args){ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java index de2e7d3eb5e..2561968e1f2 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/RunPassengerAlongWithCarriers.java @@ -23,6 +23,8 @@ import com.google.inject.Provider; import jakarta.inject.Inject; +import java.net.URL; +import java.util.Map; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; import org.matsim.api.core.v01.network.Network; @@ -48,9 +50,6 @@ import org.matsim.freight.carriers.usecases.analysis.CarrierScoreStats; import org.matsim.freight.carriers.usecases.analysis.LegHistogram; -import java.net.URL; -import java.util.Map; - final class RunPassengerAlongWithCarriers { final static URL url = ExamplesUtils.getTestScenarioURL("freight-chessboard-9x9"); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/SelectBestPlanAndOptimizeItsVehicleRouteFactory.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/SelectBestPlanAndOptimizeItsVehicleRouteFactory.java index 0051af3de81..a043c85d958 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/SelectBestPlanAndOptimizeItsVehicleRouteFactory.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/SelectBestPlanAndOptimizeItsVehicleRouteFactory.java @@ -30,6 +30,8 @@ import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; import com.graphhopper.jsprit.core.util.Solutions; import com.graphhopper.jsprit.io.algorithm.VehicleRoutingAlgorithms; +import java.net.URL; +import java.util.Collection; import org.matsim.api.core.v01.network.Network; import org.matsim.core.replanning.GenericPlanStrategy; import org.matsim.core.replanning.GenericPlanStrategyImpl; @@ -46,9 +48,6 @@ import org.matsim.freight.carriers.jsprit.NetworkBasedTransportCosts; import org.matsim.freight.carriers.jsprit.NetworkRouter; -import java.net.URL; -import java.util.Collection; - final class SelectBestPlanAndOptimizeItsVehicleRouteFactory { final URL url = ExamplesUtils.getTestScenarioURL("freight-chessboard-9x9"); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java index b346cd92a38..bab230379ba 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java @@ -22,7 +22,6 @@ package org.matsim.freight.logistics; import java.net.URL; -import java.util.Arrays; import java.util.Map; import org.matsim.core.config.ConfigGroup; import org.matsim.core.config.ReflectiveConfigGroup; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControllerListener.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControllerListener.java index 54e7040f67b..0da2e144cbc 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControllerListener.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPControllerListener.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Set; import javax.annotation.Nullable; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Scenario; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java index 5cfde304930..906541a3e41 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java @@ -21,6 +21,8 @@ package org.matsim.freight.logistics.analysis; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.VehicleEntersTrafficEvent; import org.matsim.api.core.v01.events.VehicleLeavesTrafficEvent; @@ -29,9 +31,6 @@ import org.matsim.api.core.v01.population.Person; import org.matsim.vehicles.Vehicle; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - /** * Basic event handler that collects the relation between vehicles and drivers. * Necessary since link enter and leave events do not contain the driver anymore. diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/events/LspEventsReader.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/events/LspEventsReader.java index 1380da69044..b65cf79b7c0 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/events/LspEventsReader.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/events/LspEventsReader.java @@ -23,11 +23,10 @@ import java.util.Map; import java.util.TreeMap; - -import org.matsim.freight.logistics.LSP; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.events.MatsimEventsReader; import org.matsim.freight.carriers.events.CarrierEventsReaders; +import org.matsim.freight.logistics.LSP; /** * Creates an {@link MatsimEventsReader} that also handles the {@link diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java index b4aee003ecf..7cfc3b4ca82 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTestOutput.java @@ -25,7 +25,6 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java index bdbd71224f8..59fb551c08b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSP.java @@ -34,7 +34,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java index ee58841c0a6..1853cc27331 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfTransportChain.java @@ -33,7 +33,6 @@ import org.matsim.core.config.Config; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java index e6b9e33265b..1ed5bcc050d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChains.java @@ -44,7 +44,6 @@ import java.io.IOException; import java.util.*; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -73,7 +72,6 @@ import org.matsim.freight.logistics.shipment.LspShipment; import org.matsim.vehicles.VehicleType; - /** * This bases on {@link ExampleGroceryDeliveryMultipleChains}. * Now it will include two different LSPs diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java index 01dd11e9435..cd397b50937 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/ExampleTwoLspsGroceryDeliveryMultipleChainsWithToll.java @@ -23,7 +23,6 @@ import java.io.IOException; import java.util.*; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.analysis.personMoney.PersonMoneyEventsAnalysisModule; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomLogisticChainShipmentAssigner.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomLogisticChainShipmentAssigner.java index 7477d0e0ac3..6cd0c2389c6 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomLogisticChainShipmentAssigner.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomLogisticChainShipmentAssigner.java @@ -26,9 +26,9 @@ import java.util.Random; import org.matsim.core.gbl.Gbl; import org.matsim.core.gbl.MatsimRandom; +import org.matsim.freight.logistics.InitialShipmentAssigner; import org.matsim.freight.logistics.LSPPlan; import org.matsim.freight.logistics.LogisticChain; -import org.matsim.freight.logistics.InitialShipmentAssigner; import org.matsim.freight.logistics.shipment.LspShipment; /** diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomShiftingStrategyFactory.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomShiftingStrategyFactory.java index ee25acd18e5..45ae711dcf1 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomShiftingStrategyFactory.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/RandomShiftingStrategyFactory.java @@ -25,7 +25,6 @@ import java.util.Iterator; import java.util.List; import java.util.Random; - import org.matsim.core.config.groups.ScoringConfigGroup; import org.matsim.core.gbl.MatsimRandom; import org.matsim.core.replanning.GenericPlanStrategy; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/requirementsChecking/RedRequirement.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/requirementsChecking/RedRequirement.java index ea51cb3a65a..0422427ab30 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/requirementsChecking/RedRequirement.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/requirementsChecking/RedRequirement.java @@ -45,7 +45,6 @@ import org.matsim.freight.logistics.LogisticChain; import org.matsim.freight.logistics.shipment.LspShipmentRequirement; - /*package-private*/ class RedRequirement implements LspShipmentRequirement { static final String RED = "red"; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/ExampleSimulationTrackers.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/ExampleSimulationTrackers.java index 88d29d56327..26959c6081d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/ExampleSimulationTrackers.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/ExampleSimulationTrackers.java @@ -25,7 +25,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Random; - import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CarrierSchedulerUtils.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CarrierSchedulerUtils.java index bbd9235ca64..deb8e984b2e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CarrierSchedulerUtils.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CarrierSchedulerUtils.java @@ -6,7 +6,6 @@ import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.util.Solutions; import java.util.List; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Scenario; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java index 708f57974e4..0534d285f7c 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java @@ -22,7 +22,6 @@ package org.matsim.freight.logistics.resourceImplementations; import java.util.Objects; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java index 249b5a76031..51704f91cb9 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java @@ -22,7 +22,6 @@ package org.matsim.freight.logistics.resourceImplementations; import java.util.*; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.locationtech.jts.util.Assert; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/LSPTourStartEventHandler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/LSPTourStartEventHandler.java index 4b3ff6a8daf..46a0ae0e709 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/LSPTourStartEventHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/LSPTourStartEventHandler.java @@ -21,6 +21,7 @@ package org.matsim.freight.logistics.resourceImplementations; +import java.util.Objects; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; import org.matsim.freight.carriers.Carrier; @@ -40,8 +41,6 @@ import org.matsim.freight.logistics.shipment.LspShipmentPlanElement; import org.matsim.freight.logistics.shipment.LspShipmentUtils; -import java.util.Objects; - /*package-private*/ class LSPTourStartEventHandler implements CarrierTourStartEventHandler, LSPSimulationTracker { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/TransshipmentHubScheduler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/TransshipmentHubScheduler.java index e4d151903e9..6c6081c81bf 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/TransshipmentHubScheduler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/TransshipmentHubScheduler.java @@ -29,10 +29,10 @@ import org.matsim.freight.logistics.LSPResourceScheduler; import org.matsim.freight.logistics.LogisticChainElement; import org.matsim.freight.logistics.resourceImplementations.ResourceImplementationUtils.TranshipmentHubSchedulerBuilder; +import org.matsim.freight.logistics.shipment.LspShipment; import org.matsim.freight.logistics.shipment.LspShipmentPlan; import org.matsim.freight.logistics.shipment.LspShipmentPlanElement; import org.matsim.freight.logistics.shipment.LspShipmentUtils; -import org.matsim.freight.logistics.shipment.LspShipment; /*package-private*/ class TransshipmentHubScheduler extends LSPResourceScheduler { diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java index bf1cb7be9a6..2b1c2ead062 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java @@ -20,6 +20,10 @@ package org.matsim.freight.carriers; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -36,12 +40,6 @@ import org.matsim.testcases.utils.EventsCollector; import org.matsim.vehicles.Vehicle; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.util.ArrayList; -import java.util.List; - - /** * @author Kai Martins-Turner (kturner) * @author Niclas Richter (nixlaos) diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanReaderV1Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanReaderV1Test.java index 38749fbabdf..8092ccfd02d 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanReaderV1Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanReaderV1Test.java @@ -26,7 +26,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.core.population.routes.NetworkRoute; -import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.Tour.Leg; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.VehicleType; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java index 0deffa73889..9d445358dc3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java @@ -21,8 +21,12 @@ package org.matsim.freight.carriers; -import org.junit.jupiter.api.BeforeEach; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.*; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; @@ -32,16 +36,10 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.gbl.Gbl; import org.matsim.core.scenario.ScenarioUtils; -import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.Vehicle; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.*; - public class CarrierPlanXmlReaderV2Test { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2WithDtdTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2WithDtdTest.java index fb12a37ff82..db3141cf8cb 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2WithDtdTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2WithDtdTest.java @@ -21,20 +21,18 @@ package org.matsim.freight.carriers; +import java.util.*; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.core.gbl.Gbl; -import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.Vehicle; -import java.util.*; - public class CarrierPlanXmlReaderV2WithDtdTest { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java index f4840b577ae..630ba406b86 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java @@ -24,7 +24,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; -import org.matsim.freight.carriers.*; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java index 46444ed07d3..28f155f2549 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java @@ -21,20 +21,18 @@ package org.matsim.freight.carriers; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.TransportMode; -import org.matsim.freight.carriers.*; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.Vehicle; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.*; - public class CarrierPlanXmlWriterV2Test { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1Test.java index b3a12fdb60f..f331ff0b671 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2_1Test.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -30,10 +33,6 @@ import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.Vehicle; -import java.util.*; - -import static org.junit.jupiter.api.Assertions.*; - public class CarrierPlanXmlWriterV2_1Test { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java index 71d69e6d216..4ce250f11e3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java @@ -21,13 +21,11 @@ package org.matsim.freight.carriers; +import java.util.Collections; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.matsim.freight.carriers.*; import org.matsim.testcases.MatsimTestUtils; -import java.util.Collections; - public class CarrierReadWriteV2_1Test { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java index 97954bb151d..e6c7333ae73 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java @@ -21,12 +21,11 @@ package org.matsim.freight.carriers; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; -import org.matsim.freight.carriers.*; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java index 3a2f5a5648e..ec715e0aa44 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java @@ -21,6 +21,9 @@ package org.matsim.freight.carriers; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.BeforeEach; @@ -30,9 +33,6 @@ import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.VehicleType; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - public class CarrierVehicleTypeReaderTest { @RegisterExtension private MatsimTestUtils utils = new MatsimTestUtils() ; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java index a95fac8d1ec..36038dc0647 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java @@ -21,13 +21,12 @@ package org.matsim.freight.carriers; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.TransportMode; -import org.matsim.freight.carriers.CarrierVehicleTypes; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.*; import org.matsim.vehicles.EngineInformation.FuelType; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java index 307408885a6..0076de83c33 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java @@ -23,9 +23,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.matsim.freight.carriers.CarrierVehicleTypeReader; -import org.matsim.freight.carriers.CarrierVehicleTypeWriter; -import org.matsim.freight.carriers.CarrierVehicleTypes; import org.matsim.testcases.MatsimTestUtils; public class CarrierVehicleTypeWriterTest { diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java index 04772ee65a2..70892f49e51 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java @@ -21,18 +21,17 @@ package org.matsim.freight.carriers; +import static org.matsim.testcases.MatsimTestUtils.EPSILON; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; -import org.matsim.freight.carriers.*; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import static org.matsim.testcases.MatsimTestUtils.EPSILON; - /** */ public class CarriersUtilsTest { @@ -43,7 +42,7 @@ public class CarriersUtilsTest { @Test void testAddAndGetVehicleToCarrier() { VehicleType vehicleType = VehicleUtils.createDefaultVehicleType(); - + Carrier carrier = new CarrierImpl(Id.create("carrier", Carrier.class)); Id testVehicleId = Id.createVehicleId("testVehicle"); CarrierVehicle carrierVehicle = CarrierVehicle.newInstance(testVehicleId, Id.createLinkId("link0"),vehicleType); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/FreightCarriersConfigGroupTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/FreightCarriersConfigGroupTest.java index 33a4d6736e8..5c3d053190b 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/FreightCarriersConfigGroupTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/FreightCarriersConfigGroupTest.java @@ -21,6 +21,10 @@ package org.matsim.freight.carriers; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.matsim.core.config.Config; @@ -28,11 +32,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.freight.carriers.FreightCarriersConfigGroup.UseDistanceConstraintForTourPlanning; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.Map; - /** * @author mrieser / Simunto */ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest.java index c7fc851bf24..58587ab5248 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest.java @@ -21,15 +21,14 @@ package org.matsim.freight.carriers.analysis; +import java.io.IOException; +import java.net.URL; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.testcases.MatsimTestUtils; -import java.io.IOException; -import java.net.URL; - public class FreightAnalysisEventBasedTest { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java index be381fc83a7..7a48f4c0426 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java @@ -21,8 +21,8 @@ package org.matsim.freight.carriers.controller; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java index 6b29b060161..d106530ef27 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java @@ -33,9 +33,9 @@ import org.matsim.core.config.groups.RoutingConfigGroup; import org.matsim.core.controler.AbstractModule; import org.matsim.core.controler.Controler; -import org.matsim.freight.carriers.FreightCarriersConfigGroup; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.CarriersUtils; +import org.matsim.freight.carriers.FreightCarriersConfigGroup; import org.matsim.freight.carriers.ScheduledTour; import org.matsim.freight.carriers.Tour; import org.matsim.freight.carriers.mobsim.DistanceScoringFunctionFactoryForTests; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java index 43abc654497..b9c2cbaa909 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java @@ -21,6 +21,10 @@ package org.matsim.freight.carriers.jsprit; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Assertions; @@ -39,18 +43,13 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.FreightCarriersConfigGroup.UseDistanceConstraintForTourPlanning; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; +import org.matsim.freight.carriers.FreightCarriersConfigGroup.UseDistanceConstraintForTourPlanning; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - /** * * @author rewert, kturner diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java index 50b8505cb70..044be8d0f77 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java @@ -21,6 +21,10 @@ package org.matsim.freight.carriers.jsprit; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.Assertions; @@ -39,18 +43,13 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.examples.ExamplesUtils; import org.matsim.freight.carriers.*; -import org.matsim.freight.carriers.FreightCarriersConfigGroup.UseDistanceConstraintForTourPlanning; import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; +import org.matsim.freight.carriers.FreightCarriersConfigGroup.UseDistanceConstraintForTourPlanning; import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.Vehicle; import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - /** * * @author rewert, kturner diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java index 7e0e4bbe12e..4d466e54bdc 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java @@ -27,10 +27,12 @@ import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.util.Solutions; +import java.net.URL; +import java.util.Collection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; @@ -46,10 +48,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.net.URL; -import java.util.Collection; - - /** * @author kturner * diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java index 762a2efe08a..8b157434f38 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java @@ -27,6 +27,7 @@ import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.reporting.SolutionPrinter; import com.graphhopper.jsprit.core.util.Solutions; +import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -41,8 +42,6 @@ import org.matsim.freight.carriers.jsprit.NetworkBasedTransportCosts.Builder; import org.matsim.testcases.MatsimTestUtils; -import java.util.concurrent.ExecutionException; - public class IntegrationIT { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java index 15f7a1a7c86..d952de404bf 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java @@ -21,6 +21,8 @@ package org.matsim.freight.carriers.jsprit; +import static org.junit.jupiter.api.Assertions.*; + import com.graphhopper.jsprit.core.problem.Location; import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.job.Job; @@ -31,6 +33,9 @@ import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl; import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; @@ -44,12 +49,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - public class MatsimTransformerTest { @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsTest.java index 64e7eeba641..d58cadf388a 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCostsTest.java @@ -21,9 +21,13 @@ package org.matsim.freight.carriers.jsprit; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import com.graphhopper.jsprit.core.problem.Location; import com.graphhopper.jsprit.core.problem.driver.Driver; import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; +import java.util.Arrays; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -43,12 +47,6 @@ import org.matsim.vehicles.VehicleUtils; import org.matsim.vehicles.VehiclesFactory; -import java.util.Arrays; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - - public class NetworkBasedTransportCostsTest { diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java index f86e4fa825b..89bec08003a 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java @@ -22,6 +22,8 @@ package org.matsim.freight.carriers.mobsim; import jakarta.inject.Inject; +import java.util.HashSet; +import java.util.Set; import org.junit.jupiter.api.Disabled; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; @@ -38,14 +40,11 @@ import org.matsim.deprecated.scoring.ScoringFunctionAccumulator.LegScoring; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.CarrierConstants; -import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.CarrierVehicle; +import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.vehicles.Vehicle; -import java.util.HashSet; -import java.util.Set; - @Disabled public class DistanceScoringFunctionFactoryForTests implements CarrierScoringFunctionFactory{ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java index 460c0e0d735..87e50dacbe5 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java @@ -21,6 +21,8 @@ package org.matsim.freight.carriers.mobsim; +import java.util.HashSet; +import java.util.Set; import org.junit.jupiter.api.Disabled; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; @@ -37,14 +39,11 @@ import org.matsim.deprecated.scoring.ScoringFunctionAccumulator.LegScoring; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.CarrierConstants; -import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.CarrierVehicle; +import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.vehicles.Vehicle; -import java.util.HashSet; -import java.util.Set; - @Disabled public class ScoringFunctionFactoryForTests implements CarrierScoringFunctionFactory{ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java index fb774d2d9e2..c61519ea613 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/StrategyManagerFactoryForTests.java @@ -23,6 +23,7 @@ import com.google.inject.Provider; import jakarta.inject.Inject; +import java.util.Map; import org.junit.jupiter.api.Disabled; import org.matsim.api.core.v01.TransportMode; import org.matsim.api.core.v01.network.Link; @@ -36,13 +37,11 @@ import org.matsim.core.router.util.TravelTime; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.CarrierPlan; +import org.matsim.freight.carriers.controller.CarrierControllerUtils; import org.matsim.freight.carriers.controller.CarrierReRouteVehicles; import org.matsim.freight.carriers.controller.CarrierStrategyManager; -import org.matsim.freight.carriers.controller.CarrierControllerUtils; import org.matsim.vehicles.Vehicle; -import java.util.Map; - @Disabled public class StrategyManagerFactoryForTests implements Provider{ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java index e5bdc0b131a..3b3f8965acf 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/TimeScoringFunctionFactoryForTests.java @@ -22,6 +22,8 @@ package org.matsim.freight.carriers.mobsim; import jakarta.inject.Inject; +import java.util.HashSet; +import java.util.Set; import org.junit.jupiter.api.Disabled; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.network.Link; @@ -38,14 +40,11 @@ import org.matsim.deprecated.scoring.ScoringFunctionAccumulator.LegScoring; import org.matsim.freight.carriers.Carrier; import org.matsim.freight.carriers.CarrierConstants; -import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.CarrierVehicle; +import org.matsim.freight.carriers.CarriersUtils; import org.matsim.freight.carriers.controller.CarrierScoringFunctionFactory; import org.matsim.vehicles.Vehicle; -import java.util.HashSet; -import java.util.Set; - @Disabled public class TimeScoringFunctionFactoryForTests implements CarrierScoringFunctionFactory{ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java index 76738a411a9..3abd2a401c2 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java @@ -26,8 +26,9 @@ import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.util.Solutions; -import org.junit.jupiter.api.BeforeEach; +import java.util.Collection; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; @@ -45,9 +46,6 @@ import org.matsim.vehicles.*; import org.matsim.vehicles.EngineInformation.FuelType; -import java.util.Collection; - - //TODO: length of routes (legs) AND end time of route are missing. /** * @author kturner diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java index 24968c4d1e6..a72c68dd3b3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java @@ -28,10 +28,12 @@ import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.util.Solutions; +import java.net.URL; +import java.util.Collection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; @@ -41,7 +43,6 @@ import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.PlansConfigGroup; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.network.NetworkUtils; @@ -58,9 +59,6 @@ import org.matsim.testcases.MatsimTestUtils; import org.matsim.vehicles.*; -import java.net.URL; -import java.util.Collection; - public class CarrierControllerUtilsTest{ @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/events/LspEventsReaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/events/LspEventsReaderTest.java index 5455ab846ef..e94073aace3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/events/LspEventsReaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/events/LspEventsReaderTest.java @@ -4,8 +4,8 @@ import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.events.Event; import org.matsim.core.api.experimental.events.EventsManager; @@ -63,4 +63,4 @@ private static class TestEventHandler handledEvents.add(event); } } -} \ No newline at end of file +} diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirectTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirectTest.java index 0e413a0719a..53fdd3eebcc 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirectTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirectTest.java @@ -25,8 +25,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.testcases.MatsimTestUtils; public class ExampleSchedulingOfTransportChainHubsVsDirectTest { diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGridTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGridTest.java index d2fce96569c..525936facc3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGridTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/initialPlans/ExampleTwoEchelonGridTest.java @@ -25,8 +25,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.testcases.MatsimTestUtils; public class ExampleTwoEchelonGridTest { diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java index ea611a35edc..eaa6c22e3f4 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspReplanning/CollectionLSPReplanningTest.java @@ -25,8 +25,8 @@ import java.util.*; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java index e0dd95c3fad..acfb73567df 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/CollectionLSPScoringTest.java @@ -28,8 +28,8 @@ import java.util.*; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -39,7 +39,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java index 2e5f813c721..39139e17be7 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java @@ -21,12 +21,11 @@ package org.matsim.freight.logistics.examples.lspScoring; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Scenario; import org.matsim.core.config.Config; import org.matsim.core.config.groups.VspExperimentalConfigGroup; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.freight.logistics.LSP; import org.matsim.freight.logistics.LSPUtils; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java index cd73679404e..e18204c2f99 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/MultipleIterationsCollectionLSPScoringTest.java @@ -26,8 +26,8 @@ import java.util.*; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -37,7 +37,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSPTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSPTest.java index 89c841a26bb..8c50a3b20b3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSPTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/mobsimExamples/ExampleMobsimOfSimpleLSPTest.java @@ -25,8 +25,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.testcases.MatsimTestUtils; /** @@ -52,4 +52,4 @@ public void testForRuntimeExceptionsAndCompareEvents() { MatsimTestUtils.assertEqualEventsFiles(utils.getClassInputDirectory() + "output_events.xml.gz", utils.getOutputDirectory() + "output_events.xml.gz" ); } -} \ No newline at end of file +} diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java index 6b815ecf943..b98dd24e4ca 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/multipleChains/MultipleChainsReplanningTest.java @@ -28,8 +28,8 @@ import java.util.Collections; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java index 9858cddf1a3..47dac541f34 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java @@ -21,12 +21,14 @@ package org.matsim.freight.logistics.examples.simulationTrackers; +import static org.junit.jupiter.api.Assertions.*; + import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -36,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; @@ -59,8 +60,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import static org.junit.jupiter.api.Assertions.*; - public class CollectionTrackerTest { private static final Logger log = LogManager.getLogger(CollectionTrackerTest.class); @RegisterExtension diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/io/LSPReadWriteTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/io/LSPReadWriteTest.java index 9d3083cca8b..82a2d86a835 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/io/LSPReadWriteTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/io/LSPReadWriteTest.java @@ -1,8 +1,8 @@ package org.matsim.freight.logistics.io; import java.util.Collections; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.freight.carriers.CarrierPlanXmlReader; import org.matsim.freight.carriers.CarrierVehicleTypeReader; import org.matsim.freight.carriers.CarrierVehicleTypes; From e81ec2acccfa698bdb63399f612491718686f655 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Sun, 1 Dec 2024 23:03:54 +0100 Subject: [PATCH 05/51] optimize imports --- .../logistics/lspMobsimTests/CollectionLSPMobsimTest.java | 4 +--- .../logistics/lspMobsimTests/CompleteLSPMobsimTest.java | 3 +-- .../lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java | 3 +-- .../logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java | 3 +-- .../logistics/lspMobsimTests/MainRunLSPMobsimTest.java | 3 +-- .../logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java | 3 +-- .../MultipleIterationsCollectionLSPMobsimTest.java | 3 +-- .../MultipleIterationsCompleteLSPMobsimTest.java | 3 +-- .../MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java | 3 +-- .../MultipleIterationsFirstReloadLSPMobsimTest.java | 3 +-- .../MultipleIterationsMainRunLSPMobsimTest.java | 3 +-- .../MultipleShipmentsCollectionLSPMobsimTest.java | 3 +-- .../MultipleShipmentsCompleteLSPMobsimTest.java | 3 +-- .../MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java | 3 +-- .../MultipleShipmentsFirstReloadLSPMobsimTest.java | 3 +-- .../lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java | 3 +-- .../RepeatedMultipleShipmentsCompleteLSPMobsimTest.java | 3 +-- 17 files changed, 17 insertions(+), 35 deletions(-) diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java index c7fcfa27c7f..df196d86233 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CollectionLSPMobsimTest.java @@ -31,18 +31,16 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; -import org.matsim.api.core.v01.events.Event; import org.matsim.api.core.v01.network.Link; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.events.handler.BasicEventHandler; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java index 4d6983fb661..4a17e1dbc4d 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/CompleteLSPMobsimTest.java @@ -24,8 +24,8 @@ import java.util.*; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -35,7 +35,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java index eec97b8a5d1..3294ed1b7c2 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstAndSecondReloadLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java index a23d4eca1e5..d5ba96be6d0 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/FirstReloadLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java index cf0e4895fd7..aac62ebf43a 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java index 282b578270f..57a4886fba3 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MainRunOnlyLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java index af1c3f08741..910cd4ce3ea 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCollectionLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java index eeb0d34dce8..8b2a05157c6 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsCompleteLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java index 4edcebb8a13..14d2f7a263f 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstAndSecondReloadLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java index f0167615a8c..fb6fb93f516 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsFirstReloadLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java index 741b2838909..8dac1d91417 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleIterationsMainRunLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java index b68714fd639..6a6c4aafdb6 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCollectionLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java index b4553664f91..984027f50d9 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsCompleteLSPMobsimTest.java @@ -29,8 +29,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -40,7 +40,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java index e9c598334d1..37d260c2f28 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstAndSecondReloadLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java index e48ed12439d..7b75f3a8fd7 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsFirstReloadLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java index 5d383570486..d0119ec03a2 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/MultipleShipmentsMainRunLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java index 03e916f8b15..f14a75d3802 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/lspMobsimTests/RepeatedMultipleShipmentsCompleteLSPMobsimTest.java @@ -27,8 +27,8 @@ import java.util.LinkedList; import java.util.List; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; import org.matsim.api.core.v01.TransportMode; @@ -38,7 +38,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; From 65846ba43ab2018556121927c157e3be1f542df2 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Sun, 1 Dec 2024 23:05:03 +0100 Subject: [PATCH 06/51] fix compile error --- .../logistics/examples/lspScoring/ExampleLSPScoring.java | 9 ++++----- .../examples/lspScoring/ExampleLSPScoringTest.java | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java index 0d3d9fcb155..69f9cc76a59 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoring.java @@ -33,7 +33,6 @@ import org.matsim.core.config.ConfigUtils; import org.matsim.core.config.groups.VspExperimentalConfigGroup; import org.matsim.core.controler.AbstractModule; -import org.matsim.core.controler.Controler; import org.matsim.core.controler.Controller; import org.matsim.core.controler.ControllerUtils; import org.matsim.core.controler.OutputDirectoryHierarchy.OverwriteFileSetting; @@ -164,22 +163,22 @@ public static void main(String[] args) { Scenario scenario = prepareScenario(config); - Controler controler = prepareControler(scenario); + Controller controller = prepareController(scenario); // The VSP default settings are designed for person transport simulation. After talking to Kai, // they will be set to WARN here. Kai MT may'23 - controler + controller .getConfig() .vspExperimental() .setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); - controler.run(); + controller.run(); for (LSP lsp2 : LSPUtils.getLSPs(scenario).getLSPs().values()) { System.out.println("The tip of all customers was: " + lsp2.getSelectedPlan().getScore()); } } - static Controller prepareControler(Scenario scenario) { + static Controller prepareController(Scenario scenario) { // Start the Mobsim one iteration is sufficient for scoring Controller controller = ControllerUtils.createController(scenario); controller.addOverridingModule(new LSPModule()); diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java index 39139e17be7..c6634e58239 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/lspScoring/ExampleLSPScoringTest.java @@ -44,7 +44,7 @@ public void testMain() { Scenario scenario = ExampleLSPScoring.prepareScenario(config); - Controller controller = ExampleLSPScoring.prepareControler(scenario); + Controller controller = ExampleLSPScoring.prepareController(scenario); //The VSP default settings are designed for person transport simulation. After talking to Kai, they will be set to WARN here. Kai MT may'23 controller.getConfig().vspExperimental().setVspDefaultsCheckingLevel(VspExperimentalConfigGroup.VspDefaultsCheckingLevel.warn); From 900ed647c178b6ddf595ca42200919c509468b37 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Sun, 1 Dec 2024 23:21:55 +0100 Subject: [PATCH 07/51] also move test input --- .../carrierPlansEquils.xml | 0 .../EquilWithCarrierWithPersonsIT/network.xml | 0 .../EquilWithCarrierWithPersonsIT/plans100.xml | 0 .../carrierPlansEquils.xml | 0 .../EquilWithCarrierWithoutPersonsIT/network.xml | 0 .../output_events.xml.gz | Bin .../{controler => controller}/vehicleTypes_v2.xml | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename contribs/freight/test/input/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml (100%) rename contribs/freight/test/input/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithPersonsIT/network.xml (100%) mode change 100755 => 100644 rename contribs/freight/test/input/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithPersonsIT/plans100.xml (100%) rename contribs/freight/test/input/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml (100%) rename contribs/freight/test/input/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithoutPersonsIT/network.xml (100%) mode change 100755 => 100644 rename contribs/freight/test/input/org/matsim/freight/carriers/{controler => controller}/EquilWithCarrierWithoutPersonsIT/output_events.xml.gz (100%) rename contribs/freight/test/input/org/matsim/freight/carriers/{controler => controller}/vehicleTypes_v2.xml (100%) diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml similarity index 100% rename from contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml rename to contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT/network.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/network.xml old mode 100755 new mode 100644 similarity index 100% rename from contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT/network.xml rename to contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/network.xml diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT/plans100.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/plans100.xml similarity index 100% rename from contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithPersonsIT/plans100.xml rename to contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/plans100.xml diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml similarity index 100% rename from contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml rename to contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT/network.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/network.xml old mode 100755 new mode 100644 similarity index 100% rename from contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT/network.xml rename to contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/network.xml diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT/output_events.xml.gz b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/output_events.xml.gz similarity index 100% rename from contribs/freight/test/input/org/matsim/freight/carriers/controler/EquilWithCarrierWithoutPersonsIT/output_events.xml.gz rename to contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/output_events.xml.gz diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controler/vehicleTypes_v2.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/vehicleTypes_v2.xml similarity index 100% rename from contribs/freight/test/input/org/matsim/freight/carriers/controler/vehicleTypes_v2.xml rename to contribs/freight/test/input/org/matsim/freight/carriers/controller/vehicleTypes_v2.xml From 883ad57756edde2b0232df4d7c480993aa52c367 Mon Sep 17 00:00:00 2001 From: nkuehnel Date: Mon, 2 Dec 2024 21:47:12 +0100 Subject: [PATCH 08/51] DRT: add minimum allowed detour, remove misleading consistency check/comments --- .../DefaultDrtOptimizationConstraintsSet.java | 24 +++++++------------ .../DefaultDrtRouteConstraintsCalculator.java | 13 ++++++---- 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java index 3ba0a7ce169..6748210fe39 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java @@ -1,9 +1,7 @@ package org.matsim.contrib.drt.optimizer.constraints; -import com.google.common.base.Verify; import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.PositiveOrZero; -import org.matsim.core.config.Config; public class DefaultDrtOptimizationConstraintsSet extends DrtOptimizationConstraintsSet { @@ -23,34 +21,28 @@ public class DefaultDrtOptimizationConstraintsSet extends DrtOptimizationConstra @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, " + "Defines the maximum allowed absolute detour in seconds. 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 " + "Defines the maximum allowed absolute detour based on the unsharedRideTime. 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 " + "Defines the maximum allowed absolute detour based on the unsharedRideTime. 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] - @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."); - } - } + @Parameter + @Comment( + "Defines the minimum allowed absolute detour in seconds. By default, this bound is disabled (i.e. set to 0.)") + @PositiveOrZero + public double minimumAllowedDetour = 0; } diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DefaultDrtRouteConstraintsCalculator.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DefaultDrtRouteConstraintsCalculator.java index f8e1f9b36eb..cfcaaa3e5c8 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DefaultDrtRouteConstraintsCalculator.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/routing/DefaultDrtRouteConstraintsCalculator.java @@ -25,9 +25,12 @@ public DefaultDrtRouteConstraintsCalculator(DrtConfigGroup drtCfg, ConstraintSet /** * Calculates the maximum travel time defined as: drtCfg.getMaxTravelTimeAlpha() * unsharedRideTime + drtCfg.getMaxTravelTimeBeta() - * - * Calculates the maximum ride time defined as: drtCfg.maxDetourAlpha * - * unsharedRideTime + drtCfg.maxDetourBeta + * + * Calculates the maximum ride time defined as: + * unsharedRideTime + min( + * maxAbsoluteDetour, + * max(minimumAllowedDetour, unsharedRideTime * (1-drtCfg.maxDetourAlpha) + drtCfg.maxDetourBeta) + * ) * * @return DrtRouteConstraints constraints */ @@ -40,8 +43,8 @@ public DrtRouteConstraints calculateRouteConstraints(double departureTime, Link if (constraintsSet instanceof DefaultDrtOptimizationConstraintsSet defaultSet) { double maxTravelTime = defaultSet.maxTravelTimeAlpha * unsharedRideTime + defaultSet.maxTravelTimeBeta; - double maxRideTime = Math.min(unsharedRideTime + defaultSet.maxAbsoluteDetour, - defaultSet.maxDetourAlpha * unsharedRideTime + defaultSet.maxDetourBeta); + double maxDetour = Math.max(defaultSet.minimumAllowedDetour, unsharedRideTime * (defaultSet.maxDetourAlpha -1) + defaultSet.maxDetourBeta); + double maxRideTime = unsharedRideTime + Math.min(defaultSet.maxAbsoluteDetour, maxDetour); double maxWaitTime = constraintsSet.maxWaitTime; return new DrtRouteConstraints(maxTravelTime, maxRideTime, maxWaitTime); From 8aa7e7f7581c3efe54f75b767b53d38a657c5640 Mon Sep 17 00:00:00 2001 From: nkuehnel Date: Mon, 2 Dec 2024 22:31:38 +0100 Subject: [PATCH 09/51] add consistency check for minimum/maximum allowed detour --- .../DefaultDrtOptimizationConstraintsSet.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java index 6748210fe39..fd26a90256a 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/optimizer/constraints/DefaultDrtOptimizationConstraintsSet.java @@ -1,7 +1,9 @@ package org.matsim.contrib.drt.optimizer.constraints; +import com.google.common.base.Verify; import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.PositiveOrZero; +import org.matsim.core.config.Config; public class DefaultDrtOptimizationConstraintsSet extends DrtOptimizationConstraintsSet { @@ -45,4 +47,11 @@ public class DefaultDrtOptimizationConstraintsSet extends DrtOptimizationConstra "Defines the minimum allowed absolute detour in seconds. By default, this bound is disabled (i.e. set to 0.)") @PositiveOrZero public double minimumAllowedDetour = 0; + + @Override + protected void checkConsistency(Config config) { + super.checkConsistency(config); + Verify.verify(maxAbsoluteDetour > minimumAllowedDetour, "The minimum allowed detour must" + + "be lower than the maximum allowed detour."); + } } From 04ccc72fb224a0b8b66d648e231acd0039303046 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Mon, 2 Dec 2024 23:41:08 +0100 Subject: [PATCH 10/51] poms in contribs: use ${project.parent.version} instead of i) hardcoded version or ii) old, deprecated ${project.version} --- contribs/accessibility/pom.xml | 6 ++-- contribs/analysis/pom.xml | 2 +- contribs/application/pom.xml | 16 ++++----- contribs/av/pom.xml | 6 ++-- contribs/bicycle/pom.xml | 2 +- contribs/cadytsIntegration/pom.xml | 2 +- contribs/carsharing/pom.xml | 2 +- .../commercialTrafficApplications/pom.xml | 4 +-- contribs/drt-extensions/pom.xml | 10 +++--- contribs/drt/pom.xml | 6 ++-- contribs/dvrp/pom.xml | 6 ++-- contribs/emissions/pom.xml | 2 +- contribs/ev/pom.xml | 2 +- contribs/freight/pom.xml | 6 ++-- contribs/freightreceiver/pom.xml | 4 +-- contribs/informed-mode-choice/pom.xml | 2 +- contribs/integration/pom.xml | 8 ++--- contribs/locationchoice/pom.xml | 4 +-- contribs/minibus/pom.xml | 2 +- contribs/noise/pom.xml | 2 +- contribs/parking/pom.xml | 6 ++-- contribs/pom.xml | 6 ++-- contribs/pseudosimulation/pom.xml | 2 +- contribs/shared_mobility/pom.xml | 4 +-- contribs/signals/pom.xml | 4 +-- contribs/simulatedannealing/pom.xml | 2 +- contribs/simwrapper/pom.xml | 4 +-- .../small-scale-traffic-generation/pom.xml | 4 +-- contribs/sumo/pom.xml | 2 +- contribs/taxi/pom.xml | 6 ++-- contribs/vsp/pom.xml | 34 +++++++++---------- 31 files changed, 84 insertions(+), 84 deletions(-) diff --git a/contribs/accessibility/pom.xml b/contribs/accessibility/pom.xml index c4ead8bf378..f08160490b9 100644 --- a/contribs/accessibility/pom.xml +++ b/contribs/accessibility/pom.xml @@ -37,12 +37,12 @@ org.matsim.contrib matrixbasedptrouter - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib roadpricing - 2025.0-SNAPSHOT + ${project.parent.version} net.sf.trove4j @@ -70,7 +70,7 @@ org.matsim.contrib analysis - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/analysis/pom.xml b/contribs/analysis/pom.xml index 74a32b64c03..eea01c79ffb 100644 --- a/contribs/analysis/pom.xml +++ b/contribs/analysis/pom.xml @@ -13,7 +13,7 @@ org.matsim.contrib roadpricing - 2025.0-SNAPSHOT + ${project.parent.version} org.osgeo diff --git a/contribs/application/pom.xml b/contribs/application/pom.xml index e8ec00d4800..b2b75824e01 100644 --- a/contribs/application/pom.xml +++ b/contribs/application/pom.xml @@ -40,37 +40,37 @@ org.matsim.contrib otfvis - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib osm - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib sumo - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib analysis - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib emissions - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib noise - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib freight - 2025.0-SNAPSHOT + ${project.parent.version} @@ -151,7 +151,7 @@ org.matsim.contrib dvrp - 2025.0-SNAPSHOT + ${project.parent.version} compile diff --git a/contribs/av/pom.xml b/contribs/av/pom.xml index 1536e9e78ef..590c8f7e7a1 100644 --- a/contribs/av/pom.xml +++ b/contribs/av/pom.xml @@ -16,19 +16,19 @@ org.matsim.contrib dvrp - 2025.0-SNAPSHOT + ${project.parent.version} compile org.matsim.contrib taxi - 2025.0-SNAPSHOT + ${project.parent.version} compile org.matsim.contrib drt - 2025.0-SNAPSHOT + ${project.parent.version} compile diff --git a/contribs/bicycle/pom.xml b/contribs/bicycle/pom.xml index f3ffdc96601..9bd3a41df5e 100644 --- a/contribs/bicycle/pom.xml +++ b/contribs/bicycle/pom.xml @@ -23,7 +23,7 @@ org.matsim.contrib osm - 2025.0-SNAPSHOT + ${project.parent.version} compile diff --git a/contribs/cadytsIntegration/pom.xml b/contribs/cadytsIntegration/pom.xml index 2d4b716db7e..5fba4fc8e57 100644 --- a/contribs/cadytsIntegration/pom.xml +++ b/contribs/cadytsIntegration/pom.xml @@ -17,7 +17,7 @@ org.matsim.contrib analysis - 2025.0-SNAPSHOT + ${project.parent.version} 2012 diff --git a/contribs/carsharing/pom.xml b/contribs/carsharing/pom.xml index 2580047b892..54eb37ac992 100644 --- a/contribs/carsharing/pom.xml +++ b/contribs/carsharing/pom.xml @@ -12,7 +12,7 @@ org.matsim.contrib dvrp - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/commercialTrafficApplications/pom.xml b/contribs/commercialTrafficApplications/pom.xml index 2d6f1061274..4804f34b6d9 100644 --- a/contribs/commercialTrafficApplications/pom.xml +++ b/contribs/commercialTrafficApplications/pom.xml @@ -14,13 +14,13 @@ org.matsim.contrib freight - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib drt - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/drt-extensions/pom.xml b/contribs/drt-extensions/pom.xml index 06367285755..3ab0a82d2e5 100644 --- a/contribs/drt-extensions/pom.xml +++ b/contribs/drt-extensions/pom.xml @@ -15,25 +15,25 @@ org.matsim.contrib drt - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib ev - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib informed-mode-choice - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib simwrapper - 2025.0-SNAPSHOT + ${project.parent.version} @@ -45,7 +45,7 @@ org.matsim.contrib vsp - 2025.0-SNAPSHOT + ${project.parent.version} test diff --git a/contribs/drt/pom.xml b/contribs/drt/pom.xml index 7790f252b3c..99fd9d77ec7 100644 --- a/contribs/drt/pom.xml +++ b/contribs/drt/pom.xml @@ -15,19 +15,19 @@ org.matsim.contrib dvrp - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib otfvis - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib common - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/dvrp/pom.xml b/contribs/dvrp/pom.xml index 716fab806f2..e6fc424004c 100644 --- a/contribs/dvrp/pom.xml +++ b/contribs/dvrp/pom.xml @@ -24,17 +24,17 @@ org.matsim.contrib otfvis - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib common - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib ev - 2025.0-SNAPSHOT + ${project.parent.version} org.apache.commons diff --git a/contribs/emissions/pom.xml b/contribs/emissions/pom.xml index 16d87bc8cdb..98daccca22b 100644 --- a/contribs/emissions/pom.xml +++ b/contribs/emissions/pom.xml @@ -58,7 +58,7 @@ org.matsim.contrib analysis - 2025.0-SNAPSHOT + ${project.parent.version} com.fasterxml.jackson.core diff --git a/contribs/ev/pom.xml b/contribs/ev/pom.xml index e1c5144d706..120d63dfbe3 100644 --- a/contribs/ev/pom.xml +++ b/contribs/ev/pom.xml @@ -14,7 +14,7 @@ org.matsim.contrib common - 2025.0-SNAPSHOT + ${project.parent.version} org.apache.commons diff --git a/contribs/freight/pom.xml b/contribs/freight/pom.xml index d6dd0d20b65..c1df7ab953a 100644 --- a/contribs/freight/pom.xml +++ b/contribs/freight/pom.xml @@ -55,13 +55,13 @@ org.matsim.contrib roadpricing - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib otfvis - 2025.0-SNAPSHOT + ${project.parent.version} @@ -85,7 +85,7 @@ org.matsim matsim-examples - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/noise/pom.xml b/contribs/noise/pom.xml index ac1c5fbd32b..920c9b58606 100644 --- a/contribs/noise/pom.xml +++ b/contribs/noise/pom.xml @@ -13,7 +13,7 @@ org.matsim.contrib analysis - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/parking/pom.xml b/contribs/parking/pom.xml index f6d4bbf3c76..8dd4d6c1af9 100644 --- a/contribs/parking/pom.xml +++ b/contribs/parking/pom.xml @@ -12,17 +12,17 @@ org.matsim.contrib multimodal - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib otfvis - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib dvrp - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/pom.xml b/contribs/pom.xml index c8b2dd3620c..ae36adaea70 100644 --- a/contribs/pom.xml +++ b/contribs/pom.xml @@ -115,14 +115,14 @@ org.matsim matsim - ${project.version} + ${project.parent.version} jar compile org.matsim matsim - ${project.version} + ${project.parent.version} test-jar test @@ -133,7 +133,7 @@ org.matsim matsim-examples test - ${project.version} + ${project.parent.version} diff --git a/contribs/pseudosimulation/pom.xml b/contribs/pseudosimulation/pom.xml index 9d9ec4449f2..dbb6f00a75e 100644 --- a/contribs/pseudosimulation/pom.xml +++ b/contribs/pseudosimulation/pom.xml @@ -13,7 +13,7 @@ org.matsim.contrib common - 2025.0-SNAPSHOT + ${project.parent.version} commons-cli diff --git a/contribs/shared_mobility/pom.xml b/contribs/shared_mobility/pom.xml index d97630a3c64..24edfc4a3ce 100644 --- a/contribs/shared_mobility/pom.xml +++ b/contribs/shared_mobility/pom.xml @@ -16,12 +16,12 @@ org.matsim matsim-examples - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib common - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/signals/pom.xml b/contribs/signals/pom.xml index 15dc9962de4..23d03270960 100644 --- a/contribs/signals/pom.xml +++ b/contribs/signals/pom.xml @@ -22,12 +22,12 @@ org.matsim matsim-examples - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib otfvis - 2025.0-SNAPSHOT + ${project.parent.version} compile diff --git a/contribs/simulatedannealing/pom.xml b/contribs/simulatedannealing/pom.xml index fbe7ed06b54..a3a2688d16e 100644 --- a/contribs/simulatedannealing/pom.xml +++ b/contribs/simulatedannealing/pom.xml @@ -16,7 +16,7 @@ org.matsim.contrib common - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/simwrapper/pom.xml b/contribs/simwrapper/pom.xml index 499bf95af87..cf59db1d70d 100644 --- a/contribs/simwrapper/pom.xml +++ b/contribs/simwrapper/pom.xml @@ -16,7 +16,7 @@ org.matsim.contrib application - 2025.0-SNAPSHOT + ${project.parent.version} @@ -55,7 +55,7 @@ org.matsim.contrib vsp - 2025.0-SNAPSHOT + ${project.parent.version} test diff --git a/contribs/small-scale-traffic-generation/pom.xml b/contribs/small-scale-traffic-generation/pom.xml index 46ea6a80936..07314d16da1 100644 --- a/contribs/small-scale-traffic-generation/pom.xml +++ b/contribs/small-scale-traffic-generation/pom.xml @@ -15,13 +15,13 @@ org.matsim.contrib application - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib freight - 2025.0-SNAPSHOT + ${project.parent.version} diff --git a/contribs/sumo/pom.xml b/contribs/sumo/pom.xml index da11bdf4865..fb52edc379c 100644 --- a/contribs/sumo/pom.xml +++ b/contribs/sumo/pom.xml @@ -16,7 +16,7 @@ org.matsim.contrib osm - ${project.version} + ${project.parent.version} diff --git a/contribs/taxi/pom.xml b/contribs/taxi/pom.xml index 33a2ceb4c42..b94a6ed2d99 100644 --- a/contribs/taxi/pom.xml +++ b/contribs/taxi/pom.xml @@ -28,17 +28,17 @@ org.matsim.contrib dvrp - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib drt - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib ev - 2025.0-SNAPSHOT + ${project.parent.version} org.assertj diff --git a/contribs/vsp/pom.xml b/contribs/vsp/pom.xml index 8f4e01bec37..29cbf1de5d6 100644 --- a/contribs/vsp/pom.xml +++ b/contribs/vsp/pom.xml @@ -22,59 +22,59 @@ org.matsim.contrib multimodal - 2025.0-SNAPSHOT + ${project.parent.version} compile org.matsim.contrib taxi - 2025.0-SNAPSHOT + ${project.parent.version} compile org.matsim.contrib dvrp - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib parking - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib freight - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib accessibility - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib emissions - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib minibus - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib common - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib analysis - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib informed-mode-choice - 2025.0-SNAPSHOT + ${project.parent.version} @@ -97,17 +97,17 @@ org.matsim.contrib otfvis - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib noise - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib signals - 2025.0-SNAPSHOT + ${project.parent.version} org.openstreetmap.osmosis @@ -145,7 +145,7 @@ org.matsim.contrib cadyts-integration - 2025.0-SNAPSHOT + ${project.parent.version} org.apache.poi @@ -174,12 +174,12 @@ org.matsim matsim-examples - 2025.0-SNAPSHOT + ${project.parent.version} org.matsim.contrib drt - 2025.0-SNAPSHOT + ${project.parent.version} org.openjfx From ff71aa61aab510f150c58dd479ab88c8d4b632c7 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 08:51:51 +0100 Subject: [PATCH 11/51] integrateUnitsForFuelConsumption --- .../org/matsim/vehicles/VehicleUtils.java | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/matsim/src/main/java/org/matsim/vehicles/VehicleUtils.java b/matsim/src/main/java/org/matsim/vehicles/VehicleUtils.java index 7c263b086e3..d149ad07eb2 100644 --- a/matsim/src/main/java/org/matsim/vehicles/VehicleUtils.java +++ b/matsim/src/main/java/org/matsim/vehicles/VehicleUtils.java @@ -299,16 +299,24 @@ public static void setAccessTime(VehicleType vehicleType, double accessTime) { vehicleType.getAttributes().putAttribute(ACCESSTIME, accessTime); } + /** + * @deprecated use getFuelConsumptionPerMeter instead + */ + @Deprecated public static Double getFuelConsumption(VehicleType vehicleType) { - return getFuelConsumption(vehicleType.getEngineInformation()); + return getFuelConsumptionLitersPerMeter(vehicleType.getEngineInformation()); } + /** + * @deprecated use setFuelConsumptionPerMeter instead + */ + @Deprecated public static void setFuelConsumption(VehicleType vehicleType, double literPerMeter) { - setFuelConsumption(vehicleType.getEngineInformation(), literPerMeter); + setFuelConsumptionLitersPerMeter(vehicleType.getEngineInformation(), literPerMeter); } //******** EngineInformation attributes ************ - + //TODO create enum for fuel type public static String getHbefaTechnology( EngineInformation ei ){ return (String) ei.getAttributes().getAttribute( HBEFA_TECHNOLOGY ) ; } @@ -345,6 +353,14 @@ public static void setEnergyConsumptionKWhPerMeter(EngineInformation engineInfor engineInformation.getAttributes().putAttribute(ENERGYCONSUMPTION, energyConsumptionKWhPerMeter); } + public static Double getFuelConsumptionLitersPerMeter(EngineInformation engineInformation) { + return (Double) engineInformation.getAttributes().getAttribute(FUELCONSUMPTION); + } + + public static void setFuelConsumptionLitersPerMeter(EngineInformation engineInformation, double fuelConsumptionLitersPerMeter) { + engineInformation.getAttributes().putAttribute(FUELCONSUMPTION, fuelConsumptionLitersPerMeter); + } + public static Double getEnergyCapacity(EngineInformation engineInformation) { return (Double) engineInformation.getAttributes().getAttribute(ENERGYCAPACITY); } @@ -377,21 +393,33 @@ public static Vehicle createVehicle( Id id , VehicleType type ){ return new VehicleImpl( id , type ); } + /** + * @deprecated use getHbefaTechnology instead + */ @Deprecated static EngineInformation.FuelType getFuelType(EngineInformation engineInformation ){ return (EngineInformation.FuelType) engineInformation.getAttributes().getAttribute( FUEL_TYPE ); } + /** + * @deprecated use setHbefaTechnology instead + */ @Deprecated static void setFuelType(EngineInformation engineInformation, EngineInformation.FuelType fuelType ){ engineInformation.getAttributes().putAttribute( FUEL_TYPE, fuelType); } + /** + * @Deprecated use getFuelConsumptionPerMeter instead + */ @Deprecated static Double getFuelConsumption(EngineInformation engineInformation ){ return (Double) engineInformation.getAttributes().getAttribute( FUELCONSUMPTION ); } + /** + * @Deprecated use setFuelConsumptionPerMeter instead + */ @Deprecated static void setFuelConsumption(EngineInformation engineInformation, double fuelConsumption ){ engineInformation.getAttributes().putAttribute( FUELCONSUMPTION, fuelConsumption); From 9c6378e4576d238290f1328aadb86091935f290a Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:02:00 +0100 Subject: [PATCH 12/51] remove Builder with empty tourId --- .../java/org/matsim/freight/carriers/Tour.java | 15 --------------- .../carriers/jsprit/MatsimTransformerTest.java | 4 ++-- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java index b9734e0bc64..a876ca56042 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java @@ -61,21 +61,6 @@ public static class Builder { private End end; - /** - * Returns a new tour builder. - * - * @deprecated - * Please use {@link #newInstance(Id)} instead. kmt sep'22 - *

- * - * - * @return the builder including "unknown" as tourId - */ - @Deprecated - public static Builder newInstance(){ - return new Builder(Id.create("unknown", Tour.class)); - } - /** * Returns a new tour builder. * This now also includes an Id for this tour. diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java index d952de404bf..bdad703ac83 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java @@ -339,7 +339,7 @@ private ScheduledTour getMatsimServiceTour() { .setCapacityDemand(10).build(); CarrierVehicle matsimVehicle = getMatsimVehicle("matsimVehicle", "loc", getMatsimVehicleType()); double startTime = 15.0; - Tour.Builder sTourBuilder = Tour.Builder.newInstance(); + Tour.Builder sTourBuilder = Tour.Builder.newInstance(Id.create("testTour", Tour.class)); sTourBuilder.scheduleStart(matsimVehicle.getLinkId() ); sTourBuilder.addLeg(sTourBuilder.createLeg(null, 15.0, 0.0)); sTourBuilder.scheduleService(s1); @@ -355,7 +355,7 @@ private ScheduledTour getMatsimTour(String vehicleId) { CarrierShipment s2 = getMatsimShipment("s2", "from", "to2", 20); CarrierVehicle matsimVehicle = getMatsimVehicle(vehicleId, "loc", getMatsimVehicleType()); double startTime = 15.0; - Tour.Builder sTourBuilder = Tour.Builder.newInstance(); + Tour.Builder sTourBuilder = Tour.Builder.newInstance(Id.create("testTour", Tour.class)); sTourBuilder.scheduleStart(matsimVehicle.getLinkId() ); sTourBuilder.addLeg(sTourBuilder.createLeg(null, 15.0, 0.0)); sTourBuilder.schedulePickup(s1); From 1148e1d3a9c359f405423813e2f3b6849c534da9 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:07:37 +0100 Subject: [PATCH 13/51] remove Builder with empty tourId --- .../java/org/matsim/freight/carriers/CarrierPlanReaderV1.java | 2 +- .../org/matsim/freight/carriers/CarrierPlanXmlParserV2.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java index d242e5ebce8..2b0fc22fb3b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java @@ -187,7 +187,7 @@ public void startTag(String name, Attributes attributes, Stack context) { String vehicleId = attributes.getValue("vehicleId"); currentVehicle = vehicles.get(vehicleId); - currentTourBuilder = Tour.Builder.newInstance(); + currentTourBuilder = Tour.Builder.newInstance(Id.create("unknown", Tour.class)); break ; } case "leg": diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java index c47a04a5469..91f34e6a0e5 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java @@ -233,7 +233,7 @@ public void startTag(String name, Attributes atts, Stack context) { currentVehicle = vehicles.get(vehicleId); if (currentVehicle == null) throw new IllegalStateException("vehicle to vehicleId " + vehicleId + " is missing."); - currentTourBuilder = Tour.Builder.newInstance(); + currentTourBuilder = Tour.Builder.newInstance(Id.create("unknown", Tour.class)); break; case "leg": String depTime = atts.getValue("expected_dep_time"); From 548bb14f034080fd6c2579938fac7596db1ff7e5 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:11:06 +0100 Subject: [PATCH 14/51] remove unsupported carrier writer --- .../freight/carriers/CarrierCapabilities.java | 2 +- .../freight/carriers/CarrierPlanWriter.java | 25 -- .../carriers/CarrierPlanXmlWriterV1.java | 232 -------------- .../carriers/CarrierPlanXmlWriterV2.java | 295 ------------------ .../carriers/CarrierVehicleTypeWriterV1.java | 84 ----- .../carriers/CarrierPlanXmlWriterV1Test.java | 54 ---- .../carriers/CarrierPlanXmlWriterV2Test.java | 158 ---------- .../carrierPlansEquils.xml | 95 ------ .../carrierPlansEquils.xml | 111 ------- .../carrierPlansEquilsWritten.xml | 108 ------- 10 files changed, 1 insertion(+), 1163 deletions(-) delete mode 100644 contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java delete mode 100644 contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java delete mode 100644 contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java delete mode 100644 contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java delete mode 100644 contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test/carrierPlansEquils.xml delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquils.xml delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquilsWritten.xml diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java index cca27a8c435..879017be0f4 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierCapabilities.java @@ -64,7 +64,7 @@ public Builder setFleetSize(FleetSize fleetSize){ /** * @deprecated Since the vehicle type is in the {@link CarrierVehicleTypes} * container, it should not be duplicated here. It is also not written - * to file when writing {@link CarrierPlanXmlWriterV2}. + * to file when writing. */ @Deprecated public Builder addType( VehicleType type ){ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java index 3e27e759e82..888bfcf5289 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanWriter.java @@ -46,31 +46,6 @@ public void write(String filename) { this.writeV2_1(filename); } - /** - * @deprecated The underlining {@Link{CarrierPlanXmlWriterV1} is deprecated since April21 - */ - @Deprecated - public void writeV1(String filename) { - new CarrierPlanXmlWriterV1(this.carriers.getCarriers().values()).write(filename); - } - - - /** - * Writes out the Carriers file in version 2. - * Please use the method {@link #write(String)} instead to always ensure writing out to the newest format. - * - * @deprecated The underlining {@Link{CarrierPlanXmlWriterV2} is deprecated since Sep'22 - * - * @param filename Name of the file that should be written. - */ - @Deprecated public void writeV2(String filename) { - CarrierPlanXmlWriterV2 writer = new CarrierPlanXmlWriterV2(this.carriers); - if (this.attributeConverters != null) { - writer.putAttributeConverters(this.attributeConverters); - } - writer.write(filename); - } - /** * Writes out the Carriers file in version 2.1. * Please use the method {@link #write(String)} to always ensure writing out to the newest format. diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java deleted file mode 100644 index e2b7e09d930..00000000000 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * *********************************************************************** * - * project: org.matsim.* - * *********************************************************************** * - * * - * copyright : (C) by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** - * - */ - -package org.matsim.freight.carriers; - -import com.graphhopper.jsprit.core.problem.job.Shipment; -import java.io.BufferedWriter; -import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.network.Link; -import org.matsim.core.population.routes.NetworkRoute; -import org.matsim.core.utils.io.MatsimXmlWriter; -import org.matsim.core.utils.misc.Time; - -/** - * A writer that writes carriers and their plans in a xml-file. - * - * @author sschroeder - * - * @deprecated Use {@link CarrierPlanWriter} instead which writes the newest format - */ -@Deprecated -public class CarrierPlanXmlWriterV1 extends MatsimXmlWriter { - - @SuppressWarnings("unused") - private static final Logger logger = LogManager.getLogger(CarrierPlanXmlWriterV1.class); - - private final Collection carriers; - private int idCounter = 0; - private final Map> registeredShipments = new HashMap<>(); - - /** - * Constructs the writer with the carriers to be written. - * - * @param carriers to be written - */ - public CarrierPlanXmlWriterV1(Collection carriers) { - super(); - this.carriers = carriers; - } - - /** - * Writes carriers and their plans into a xml-file. - * - * @param filename should be the target xml-file - */ - public void write(String filename) { - logger.info("write carrier plans"); - try { - openFile(filename); - writeXmlHead(); - startCarriers(this.writer); - for (Carrier carrier : carriers) { - startCarrier(carrier, this.writer); - writeVehicles(carrier, this.writer); - writeShipments(carrier, this.writer); - writePlans(carrier, this.writer); - endCarrier(this.writer); - } - endCarriers(this.writer); - close(); - logger.info("done"); - } catch (IOException e) { - e.printStackTrace(); - logger.error(e); - System.exit(1); - } - } - - private void startCarriers(BufferedWriter writer) throws IOException { - writer.write("\t\n"); - } - - private void startCarrier(Carrier carrier, BufferedWriter writer) - throws IOException { - writer.write("\t\t\n"); - } - - private void writeVehicles(Carrier carrier, BufferedWriter writer) - throws IOException { - writer.write("\t\t\t\n"); - for (CarrierVehicle v : carrier.getCarrierCapabilities().getCarrierVehicles().values()) { - writer.write("\t\t\t\t\n"); - } - writer.write("\t\t\t\n\n"); - } - - private void writeShipments(Carrier carrier, BufferedWriter writer) - throws IOException { - writer.write("\t\t\t\n"); - for (CarrierShipment s : carrier.getShipments().values()) { - // CarrierShipment s = contract.getShipment(); - Id shipmentId = Id.create(++idCounter, Shipment.class); - registeredShipments.put(s, shipmentId); - writer.write("\t\t\t\t\n"); - } - writer.write("\t\t\t\n\n"); - } - - private String getTime(double time) { - return Time.writeTime(time); - } - - private void writePlans(Carrier carrier, BufferedWriter writer) - throws IOException { - if (carrier.getSelectedPlan() == null) { - return; - } - - for(CarrierPlan plan : carrier.getPlans()){ - writer.write("\t\t\t\n"); - - for (ScheduledTour tour : plan.getScheduledTours()) { - writer.write("\t\t\t\t\n"); - writer.write("\t\t\t\t\t\n"); - for (Tour.TourElement tourElement : tour.getTour().getTourElements()) { - if (tourElement instanceof Tour.Leg leg) { - writer.write("\t\t\t\t\t"); - if (leg.getRoute() != null) { - writer.write("\n"); - writer.write("\t\t\t\t\t\t"); - boolean firstLink = true; - for (Id id : ((NetworkRoute) leg.getRoute()).getLinkIds()) { - if (firstLink) { - writer.write(id.toString()); - firstLink = false; - } else { - writer.write(" " + id.toString()); - } - } - writer.write("\n"); - writer.write("\t\t\t\t\t\n"); - } else { - writer.write("\n"); - } - } - if (tourElement instanceof Tour.ShipmentBasedActivity act) { - writer.write("\t\t\t\t\t\n"); - } - - } - writer.write("\t\t\t\t\t\n"); - writer.write("\t\t\t\t\n"); - } - writer.write("\t\t\t\n\n"); - } - - } - - private void endCarrier(BufferedWriter writer) throws IOException { - writer.write("\t\t\n\n"); - registeredShipments.clear(); - } - - private void endCarriers(BufferedWriter writer) throws IOException { - writer.write("\t\n"); - - } -} diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java deleted file mode 100644 index e47ffdb782d..00000000000 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * *********************************************************************** * - * project: org.matsim.* - * *********************************************************************** * - * * - * copyright : (C) by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** - * - */ - -package org.matsim.freight.carriers; - -import com.google.inject.Inject; -import java.io.BufferedWriter; -import java.io.IOException; -import java.util.*; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.network.Link; -import org.matsim.core.population.routes.NetworkRoute; -import org.matsim.core.utils.collections.Tuple; -import org.matsim.core.utils.io.MatsimXmlWriter; -import org.matsim.core.utils.misc.Time; -import org.matsim.freight.carriers.Tour.Leg; -import org.matsim.freight.carriers.Tour.ServiceActivity; -import org.matsim.freight.carriers.Tour.ShipmentBasedActivity; -import org.matsim.freight.carriers.Tour.TourElement; -import org.matsim.utils.objectattributes.AttributeConverter; -import org.matsim.utils.objectattributes.attributable.AttributesXmlWriterDelegate; -import org.matsim.vehicles.VehicleType; - -/** - * A writer that writes carriers and their plans in a xml-file. - * - * @author sschroeder - * - * @deprecated Use {@link CarrierPlanWriter} instead which writes the newest format - */ -@Deprecated -public class CarrierPlanXmlWriterV2 extends MatsimXmlWriter { - - @SuppressWarnings("unused") - private static final Logger logger = LogManager.getLogger(CarrierPlanXmlWriterV2.class); - - private final Collection carriers; - - private final Map> registeredShipments = new HashMap<>(); - - private final Map> serviceMap = new HashMap<>(); - - private final AttributesXmlWriterDelegate attributesWriter = new AttributesXmlWriterDelegate(); - private final List> atts = new ArrayList<>(); - - - /** - * Constructs the writer with the carriers to be written. - * - * @param carriers to be written - */ - public CarrierPlanXmlWriterV2(Carriers carriers) { - super(); - this.carriers = carriers.getCarriers().values(); - } - - @Inject - public void putAttributeConverters( final Map, AttributeConverter> converters ) { - attributesWriter.putAttributeConverters( converters ); - } - - /** - * Writes carriers and their plans into a xml-file. - * - * @param filename should be the target xml-file - */ - public void write(String filename) { - logger.info("write carrier plans"); - try { - openFile(filename); - writeXmlHead(); - - startCarriers(this.writer); - for (Carrier carrier : carriers) { - startCarrier(carrier, this.writer); - writeVehiclesAndTheirTypes(carrier, this.writer); - writeShipments(carrier, this.writer); - writeServices(carrier,this.writer); - writePlans(carrier, this.writer); - endCarrier(this.writer); - } - endCarriers(this.writer); - close(); - logger.info("done"); - } catch (IOException e) { - e.printStackTrace(); - logger.error(e); - System.exit(1); - } - } - - private void startCarriers(BufferedWriter writer) throws IOException { - writer.write("\t\n"); - } - - private void startCarrier(Carrier carrier, BufferedWriter writer) - throws IOException { - writer.write("\t\t\n"); - attributesWriter.writeAttributes("\t\t\t", writer, carrier.getAttributes()); - } - - private void writeVehiclesAndTheirTypes(Carrier carrier, BufferedWriter writer)throws IOException { - writer.write("\t\t\t\n"); - //vehicles - writer.write("\t\t\t\t\n"); - for (CarrierVehicle v : carrier.getCarrierCapabilities().getCarrierVehicles().values()) { - Id vehicleTypeId = v.getVehicleTypeId(); - if(vehicleTypeId == null) vehicleTypeId = v.getType() == null ? null : v.getType().getId(); - if(vehicleTypeId == null) throw new IllegalStateException("vehicleTypeId is missing."); - writer.write("\t\t\t\t\t\n"); - } - writer.write("\t\t\t\t\n\n"); - writer.write("\t\t\t\n\n"); - } - - private void writeShipments(Carrier carrier, BufferedWriter writer) throws IOException { - if(carrier.getShipments().isEmpty()) return; - writer.write("\t\t\t\n"); - for (CarrierShipment s : carrier.getShipments().values()) { - // CarrierShipment s = contract.getShipment(); - Id shipmentId = s.getId(); - registeredShipments.put(s, shipmentId); - writer.write("\t\t\t\t\n"); - } else { - writer.write("\">\n"); - this.attributesWriter.writeAttributes("\t\t\t\t\t", writer, s.getAttributes()); - writer.write("\t\t\t\t\n"); - } - } - writer.write("\t\t\t\n\n"); - } - - private void writeServices(Carrier carrier, BufferedWriter writer) throws IOException { - writer.write("\t\t\t\n"); - for (CarrierService s : carrier.getServices().values()) { - serviceMap.put(s, s.getId()); - writer.write("\t\t\t\t\n"); - } else { - writer.write("\">\n"); - this.attributesWriter.writeAttributes("\t\t\t\t\t", writer, s.getAttributes()); - writer.write("\t\t\t\t\n"); - } - - } - writer.write("\t\t\t\n\n"); - - } - - private String getTime(double time) { - return Time.writeTime(time); - } - - private void writePlans(Carrier carrier, BufferedWriter writer) - throws IOException { - if (carrier.getSelectedPlan() == null) { - return; - } - - for(CarrierPlan plan : carrier.getPlans()){ - writer.write("\t\t\t\n"); - - for (ScheduledTour tour : plan.getScheduledTours()) { - writer.write("\t\t\t\t\n"); - writer.write("\t\t\t\t\t\n"); - for (TourElement tourElement : tour.getTour().getTourElements()) { - if (tourElement instanceof Leg leg) { - writer.write("\t\t\t\t\t"); - if (leg.getRoute() != null) { - writer.write("\n"); - writer.write("\t\t\t\t\t\t"); - boolean firstLink = true; - for (Id id : ((NetworkRoute) leg.getRoute()) - .getLinkIds()) { - if (firstLink) { - writer.write(id.toString()); - firstLink = false; - } else { - writer.write(" " + id.toString()); - } - } - writer.write("\n"); - writer.write("\t\t\t\t\t\n"); - } else { - writer.write("\n"); - } - } - else if (tourElement instanceof ShipmentBasedActivity act) { - writer.write("\t\t\t\t\t\n"); - } - else if (tourElement instanceof ServiceActivity act){ - writer.write("\t\t\t\t\t\n"); - } - - } - writer.write("\t\t\t\t\t\n"); - writer.write("\t\t\t\t\n"); - } - writer.write("\t\t\t\n\n"); - } - - } - - private void endCarrier(BufferedWriter writer) throws IOException { - writer.write("\t\t\n\n"); - registeredShipments.clear(); - } - - private void endCarriers(BufferedWriter writer) throws IOException { - writer.write("\t\n"); - - } -} diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java deleted file mode 100644 index b6671235c2a..00000000000 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterV1.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * *********************************************************************** * - * project: org.matsim.* - * *********************************************************************** * - * * - * copyright : (C) by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** - * - */ - -package org.matsim.freight.carriers; - -import java.io.BufferedWriter; -import java.io.IOException; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.matsim.core.utils.io.MatsimXmlWriter; -import org.matsim.vehicles.CostInformation; -import org.matsim.vehicles.EngineInformation; -import org.matsim.vehicles.VehicleType; - -@Deprecated // only there if someone insists on writing V1 -public final class CarrierVehicleTypeWriterV1 extends MatsimXmlWriter { - - @SuppressWarnings("unused") - private static final Logger logger = LogManager.getLogger(CarrierVehicleTypeWriter.class ); - - private final CarrierVehicleTypes vehicleTypes; - - - public CarrierVehicleTypeWriterV1(CarrierVehicleTypes carrierVehicleTypes) { - super(); - this.vehicleTypes = carrierVehicleTypes; - } - - - public void write(String filename) { - logger.info("write vehicle-types"); - try { - openFile(filename); - writeXmlHead(); - writeTypes(this.writer); - close(); - logger.info("done"); - } catch ( IOException e) { - e.printStackTrace(); - logger.error(e); - System.exit(1); - } - } - - private void writeTypes( BufferedWriter writer )throws IOException { - writer.write("\t\n"); - for( VehicleType type : vehicleTypes.getVehicleTypes().values()){ - writer.write("\t\t\n"); - writer.write("\t\t\t" + type.getDescription() + "\n"); - EngineInformation engineInformation = type.getEngineInformation(); - if(engineInformation != null && !engineInformation.getAttributes().isEmpty()) { - writer.write("\t\t\t\n"); - } - writer.write("\t\t\t" + type.getCapacity().getWeightInTons() + "\n" ); - CostInformation vehicleCostInformation = type.getCostInformation(); - if(vehicleCostInformation == null) throw new IllegalStateException("vehicleCostInformation is missing."); - writer.write("\t\t\t\n"); - writer.write("\t\t\n"); - } - writer.write("\t\n\n"); - } - - - -} diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java deleted file mode 100644 index 630ba406b86..00000000000 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * *********************************************************************** * - * project: org.matsim.* - * *********************************************************************** * - * * - * copyright : (C) by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** - * - */ - -package org.matsim.freight.carriers; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.matsim.api.core.v01.Id; -import org.matsim.testcases.MatsimTestUtils; -import org.matsim.vehicles.VehicleType; -import org.matsim.vehicles.VehicleUtils; - -/** - */ -public class CarrierPlanXmlWriterV1Test { - - @RegisterExtension - private MatsimTestUtils testUtils = new MatsimTestUtils(); - - @Test - void testCarrierPlanWriterWrites() { - - CarrierVehicleTypes carrierVehicleTypes = new CarrierVehicleTypes(); - new CarrierVehicleTypeReader( carrierVehicleTypes ).readFile( testUtils.getPackageInputDirectory() + "vehicleTypes_v2.xml" ); - VehicleType defaultVehicleType = VehicleUtils.getFactory().createVehicleType( Id.create("default", VehicleType.class ) ); - carrierVehicleTypes.getVehicleTypes().put( defaultVehicleType.getId(), defaultVehicleType ); - - Carriers carriers = new Carriers(); - CarrierPlanReaderV1 carrierPlanReaderV1 = new CarrierPlanReaderV1(carriers, carrierVehicleTypes ); - carrierPlanReaderV1.readFile(testUtils.getClassInputDirectory() + "carrierPlansEquils.xml"); - CarrierPlanXmlWriterV1 planWriter = new CarrierPlanXmlWriterV1(carriers.getCarriers().values()); - planWriter.write(testUtils.getOutputDirectory() + "carrierPlansEquilsWritten.xml"); - } - - -} diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java deleted file mode 100644 index 28f155f2549..00000000000 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * *********************************************************************** * - * project: org.matsim.* - * *********************************************************************** * - * * - * copyright : (C) by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** - * - */ - -package org.matsim.freight.carriers; - -import static org.junit.jupiter.api.Assertions.*; - -import java.util.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.matsim.api.core.v01.Id; -import org.matsim.api.core.v01.TransportMode; -import org.matsim.freight.carriers.CarrierCapabilities.FleetSize; -import org.matsim.testcases.MatsimTestUtils; -import org.matsim.vehicles.Vehicle; - -public class CarrierPlanXmlWriterV2Test { - - @RegisterExtension - private MatsimTestUtils testUtils = new MatsimTestUtils(); - - private Carrier testCarrier; - - @BeforeEach - public void setUp() { - - CarrierVehicleTypes carrierVehicleTypes = new CarrierVehicleTypes(); - new CarrierVehicleTypeReader( carrierVehicleTypes ).readFile( this.testUtils.getPackageInputDirectory() + "vehicleTypes_v2.xml" ); - - Carriers carriers = new Carriers(); - new CarrierPlanXmlReader(carriers, carrierVehicleTypes ).readFile(this.testUtils.getClassInputDirectory() + "carrierPlansEquils.xml" ); - new CarrierPlanXmlWriterV2(carriers).write(this.testUtils.getClassInputDirectory() + "carrierPlansEquilsWritten.xml"); - carriers.getCarriers().clear(); - new CarrierPlanXmlReader(carriers, carrierVehicleTypes ).readFile(this.testUtils.getClassInputDirectory() + "carrierPlansEquilsWritten.xml" ); - testCarrier = carriers.getCarriers().get(Id.create("testCarrier", Carrier.class)); - } - - @Test - void test_whenReadingServices_nuOfServicesIsCorrect(){ - assertEquals(3,testCarrier.getServices().size()); - } - - @Test - void test_whenReadingCarrier_itReadsTypeIdsCorrectly(){ - - CarrierVehicle light = CarriersUtils.getCarrierVehicle(testCarrier, Id.createVehicleId("lightVehicle")); - assertEquals("light",light.getVehicleTypeId().toString()); - - CarrierVehicle medium = CarriersUtils.getCarrierVehicle(testCarrier, Id.createVehicleId("mediumVehicle")); - assertEquals("medium",medium.getVehicleTypeId().toString()); - - CarrierVehicle heavy = CarriersUtils.getCarrierVehicle(testCarrier, Id.createVehicleId("heavyVehicle")); - assertEquals("heavy",heavy.getVehicleTypeId().toString()); - } - - @Test - void test_whenReadingCarrier_itReadsVehiclesCorrectly(){ - Map, CarrierVehicle> carrierVehicles = testCarrier.getCarrierCapabilities().getCarrierVehicles(); - assertEquals(3,carrierVehicles.size()); - assertTrue(exactlyTheseVehiclesAreInVehicleCollection(Arrays.asList(Id.create("lightVehicle", Vehicle.class), - Id.create("mediumVehicle", Vehicle.class),Id.create("heavyVehicle", Vehicle.class)),carrierVehicles.values())); - } - - @Test - void test_whenReadingCarrier_itReadsFleetSizeCorrectly(){ - assertEquals(FleetSize.INFINITE, testCarrier.getCarrierCapabilities().getFleetSize()); - } - - @Test - void test_whenReadingCarrier_itReadsShipmentsCorrectly(){ - assertEquals(2, testCarrier.getShipments().size()); - } - - @Test - void test_whenReadingCarrier_itReadsPlansCorrectly(){ - assertEquals(3, testCarrier.getPlans().size()); - } - - @Test - void test_whenReadingCarrier_itSelectsPlansCorrectly(){ - assertNotNull(testCarrier.getSelectedPlan()); - } - - @Test - void test_whenReadingPlans_nuOfToursIsCorrect(){ - List plans = new ArrayList<>(testCarrier.getPlans()); - assertEquals(1, plans.get(0).getScheduledTours().size()); - assertEquals(1, plans.get(1).getScheduledTours().size()); - assertEquals(1, plans.get(2).getScheduledTours().size()); - } - - @Test - void test_whenReadingToursOfPlan1_nuOfActivitiesIsCorrect(){ - List plans = new ArrayList<>(testCarrier.getPlans()); - CarrierPlan plan1 = plans.getFirst(); - ScheduledTour tour1 = plan1.getScheduledTours().iterator().next(); - assertEquals(5,tour1.getTour().getTourElements().size()); - } - - @Test - void test_whenReadingToursOfPlan2_nuOfActivitiesIsCorrect(){ - List plans = new ArrayList<>(testCarrier.getPlans()); - CarrierPlan plan2 = plans.get(1); - ScheduledTour tour1 = plan2.getScheduledTours().iterator().next(); - assertEquals(9,tour1.getTour().getTourElements().size()); - } - - @Test - void test_whenReadingToursOfPlan3_nuOfActivitiesIsCorrect(){ - List plans = new ArrayList<>(testCarrier.getPlans()); - CarrierPlan plan3 = plans.get(2); - ScheduledTour tour1 = plan3.getScheduledTours().iterator().next(); - assertEquals(9,tour1.getTour().getTourElements().size()); - } - - - private boolean exactlyTheseVehiclesAreInVehicleCollection(List> asList, Collection carrierVehicles) { - List vehicles = new ArrayList<>(carrierVehicles); - for(CarrierVehicle type : carrierVehicles) if(asList.contains(type.getId() )) vehicles.remove(type ); - return vehicles.isEmpty(); - } - - @Test - void test_CarrierHasAttributes(){ - assertEquals((TransportMode.drt), CarriersUtils.getCarrierMode(testCarrier)); - assertEquals(50, CarriersUtils.getJspritIterations(testCarrier)); - } - - @Test - void test_ServicesAndShipmentsHaveAttributes(){ - Object serviceCustomerAtt = testCarrier.getServices().get(Id.create("serv1",CarrierService.class)).getAttributes().getAttribute("customer"); - assertNotNull(serviceCustomerAtt); - assertEquals("someRandomCustomer", serviceCustomerAtt); - Object shipmentCustomerAtt = testCarrier.getShipments().get(Id.create("s1",CarrierShipment.class)).getAttributes().getAttribute("customer"); - assertNotNull(shipmentCustomerAtt); - assertEquals("someRandomCustomer", shipmentCustomerAtt); - } - -} diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test/carrierPlansEquils.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test/carrierPlansEquils.xml deleted file mode 100644 index 9c6165af57d..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV1Test/carrierPlansEquils.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquils.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquils.xml deleted file mode 100644 index 68337d77b88..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquils.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - drt - 50 - - - - - - - - - - - - - - someRandomCustomer - - - - - - - - - someRandomCustomer - - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquilsWritten.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquilsWritten.xml deleted file mode 100644 index 5c122507f56..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierPlanXmlWriterV2Test/carrierPlansEquilsWritten.xml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - drt - 50 - - - - - - - - - - - - - - someRandomCustomer - - - - - - - - - someRandomCustomer - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - - - - - - - - - 2 3 4 - - - - - - - - - - - - - - - - - - - - - - - - From c72e43659d7f63a8e67d46f2437a6b954b66d669 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:15:21 +0100 Subject: [PATCH 15/51] remove unneeded CarrierVehicleTypeLoader.java --- .../carriers/CarrierVehicleTypeLoader.java | 65 ------------------- .../freight/carriers/CarriersUtils.java | 2 - .../usecases/chessboard/PlotPlans.java | 2 - 3 files changed, 69 deletions(-) delete mode 100644 contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeLoader.java diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeLoader.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeLoader.java deleted file mode 100644 index c9fbe45d4ad..00000000000 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeLoader.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * *********************************************************************** * - * project: org.matsim.* - * *********************************************************************** * - * * - * copyright : (C) by the members listed in the COPYING, * - * LICENSE and WARRANTY file. * - * email : info at matsim dot org * - * * - * *********************************************************************** * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * See also COPYING, LICENSE and WARRANTY file * - * * - * *********************************************************************** - * - */ - -package org.matsim.freight.carriers; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -/** - * @deprecated Functionality is removed. VehicleTypes must be set (and available) when creating the vehicle. kai/kai jan'22 - *

- * Loader that loads/assigns vehicleTypes to their vehicles and carriers respectively. - * - * @author sschroeder - * - */ -@Deprecated -public class CarrierVehicleTypeLoader { - - @SuppressWarnings("unused") - private static final Logger logger = LogManager.getLogger(CarrierVehicleTypeLoader.class); - - /** - * Constructs the loader with the carriers the types should be assigned to. - * - * @param carriers - * - * * @deprecated Functionality is removed. VehicleTypes must be set (and available) when creating the vehicle. kai/kai jan'22 - */ - @Deprecated - public CarrierVehicleTypeLoader(Carriers carriers) { - super(); - } - - /** - * Assigns types to carriers and their vehicles. - * - * @param types - * - * @deprecated Functionality is removed. VehicleTypes must be set (and available) when creating the vehicle. kai/kai jan'22 - */ - @Deprecated - public void loadVehicleTypes(CarrierVehicleTypes types){ - logger.error("Functionality is removed. VehicleTypes must be set (and available) when creating the vehicle."); - } - -} diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java index bae1ba79c29..e99be9d98db 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java @@ -381,8 +381,6 @@ public static void loadCarriersAccordingToFreightConfig(Scenario scenario) { Carriers carriers = addOrGetCarriers(scenario); // also registers with scenario new CarrierPlanXmlReader(carriers, vehTypes).readURL( IOUtils.extendUrl(scenario.getConfig().getContext(), freightCarriersConfigGroup.getCarriersFile())); - -// new CarrierVehicleTypeLoader( carriers ).loadVehicleTypes( vehTypes ); } /** diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PlotPlans.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PlotPlans.java index 838ac5463ae..9e615dda9f4 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PlotPlans.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/PlotPlans.java @@ -47,8 +47,6 @@ public static void main(String[] args) { // new CarrierPlanXmlReader(carriers).read("input/usecases/chessboard/freight/singleCarrierTwentyActivities.xml"); new CarrierPlanXmlReader(carriers, types ).readFile("output/ITERS/it.140/140.carrierPlans.xml" ); - new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(types); - final Carrier carrier = carriers.getCarriers().get(Id.create("carrier1",Carrier.class)); VehicleRoutingProblem.Builder vrpBuilder = MatsimJspritFactory.createRoutingProblemBuilder(carrier, scenario.getNetwork()); VehicleRoutingProblem vrp = vrpBuilder.build(); From b6f46e41d9c1db7d2eb1b561daa516607a4117fc Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:22:45 +0100 Subject: [PATCH 16/51] remove deprecated Builder method for CarrierVehicleType.java --- .../freight/carriers/CarrierVehicleType.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java index 16b7e92a03d..79ebaf288bb 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java @@ -64,23 +64,6 @@ public static Builder newInstance(Id typeId){ return new Builder(typeId); } - /** - * Returns a new instance of builder initialized with the typeId and the values the given from existing CarrierVehicleType. - *

- * Can be used for create a new, modified CarrierVehicleType basing on an existing one. - * Values can be changed within the builder afterwards. - * - * @param carrierVehicleType - * @param typeId - * @return a type builder - * - * @deprecated Use {@link #newInstance(Id)} instead - */ - @Deprecated(since = "sep'19", forRemoval = true) - public static Builder newInstance(Id typeId, CarrierVehicleType carrierVehicleType){ - throw new RuntimeException("not implemented") ; - } - private Builder(Id typeId){ this.delegate = VehicleUtils.getFactory().createVehicleType( typeId ) ; } From 11a43b046064290e897b29f167570b7ca05f42e6 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:24:50 +0100 Subject: [PATCH 17/51] remove deprecated und unneeded set type methods --- .../jointDemand/TestScenarioGeneration.java | 2 -- .../freight/carriers/CarrierVehicle.java | 23 ------------------- .../carriers/jsprit/MatsimJspritFactory.java | 3 --- .../freight/carriers/jsprit/SkillsIT.java | 2 -- 4 files changed, 30 deletions(-) diff --git a/contribs/commercialTrafficApplications/src/test/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/TestScenarioGeneration.java b/contribs/commercialTrafficApplications/src/test/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/TestScenarioGeneration.java index 1d6b845a665..601038f2f73 100644 --- a/contribs/commercialTrafficApplications/src/test/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/TestScenarioGeneration.java +++ b/contribs/commercialTrafficApplications/src/test/java/org/matsim/contrib/commercialTrafficApplications/jointDemand/TestScenarioGeneration.java @@ -126,8 +126,6 @@ private static CarrierVehicle getLightVehicle(Id id, VehicleType type, Id vehicleId, Id locationId, VehicleType vehicleT this.type = vehicleType; } - /** - * @param type - * @deprecated The vehicleType need now to be set in the constructor kai/kai jan'22 - */ - @Deprecated - public Builder setType( VehicleType type ){ - log.warn(".setType has no functionality anymore and is deprecated"); -// this.type=type; - return this; - } - - /** - * @param typeId - * @deprecated The vehicleTypeId is no longer needed and was confusing -> Use getType().getId kai/kai jan'22 - */ - @Deprecated - public Builder setTypeId(Id typeId ){ - log.warn(".setTypeId has no functionality anymore and is deprecated"); -// this.typeId = typeId; - return this; - } - - public Builder setEarliestStart(double earliestStart){ this.earliestStart=earliestStart; return this; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java index d7fe28fcfe8..00cf9347716 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/MatsimJspritFactory.java @@ -685,9 +685,6 @@ public static Carrier createCarrier(String carrierId, VehicleRoutingProblem vrp) capabilityBuilder.setFleetSize(CarrierCapabilities.FleetSize.FINITE); } else capabilityBuilder.setFleetSize(CarrierCapabilities.FleetSize.INFINITE); - for (com.graphhopper.jsprit.core.problem.vehicle.VehicleType type : vrp.getTypes()) { - capabilityBuilder.addType(createMatsimVehicleType(type)); - } for (Vehicle vehicle : vrp.getVehicles()) { capabilityBuilder.addVehicle(createCarrierVehicle(vehicle)); } diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/SkillsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/SkillsIT.java index 8886010e74b..7da556872c2 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/SkillsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/SkillsIT.java @@ -127,7 +127,6 @@ private Scenario setupTestScenario() { // typeOne.setCapacity(vehicleCapacity); typeOne.getCapacity().setOther( 2.0 ); CarriersUtils.addSkill(typeOne, "skill 1"); - capabilitiesBuilder.addType(typeOne); CarrierVehicle vehicleOne = CarrierVehicle.Builder.newInstance(Id.createVehicleId("1"), carrierLocation, typeOne ) .setEarliestStart(0.0) .setLatestEnd(Time.parseTime("24:00:00")) @@ -141,7 +140,6 @@ private Scenario setupTestScenario() { // typeTwo.setCapacity(vehicleCapacity); typeTwo.getCapacity().setOther( 2.0 ); CarriersUtils.addSkill(typeTwo, "skill 2"); - capabilitiesBuilder.addType(typeTwo); CarrierVehicle vehicleTwo = CarrierVehicle.Builder.newInstance(Id.createVehicleId("2"), carrierLocation, typeTwo ) .setEarliestStart(0.0) .setLatestEnd(Time.parseTime("24:00:00")) From 122398cecef5e35b8cbc405a20b6c454b1fa7648 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:25:27 +0100 Subject: [PATCH 18/51] remove deleted loader --- .../matsim/freight/carriers/jsprit/DistanceConstraintTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java index 044be8d0f77..21863c47f58 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java @@ -710,7 +710,5 @@ private static void defineCarriers(Carriers carriers, FleetSize fleetSize, Carri CarriersUtils.addCarrierVehicle(singleCarrier, carrierVehicle); } singleCarrier.getCarrierCapabilities().getVehicleTypes().addAll(vehicleTypes.getVehicleTypes().values()); - - new CarrierVehicleTypeLoader(carriers).loadVehicleTypes(vehicleTypes); } } From 4d489190e68487221db133fb64edf5cec6013928 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:36:59 +0100 Subject: [PATCH 19/51] use recent vehicle engineInformation methods --- .../carriers/jsprit/DistanceConstraint.java | 2 +- .../carriers/CarrierVehicleTypeTest.java | 20 +++++++++---------- .../jsprit/DistanceConstraintTest.java | 2 +- .../jsprit/MatsimTransformerTest.java | 13 ++++-------- .../utils/CarrierControllerUtilsTest.java | 6 +++--- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java index 068c70506cd..63c6729cd84 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java @@ -94,7 +94,7 @@ public ConstraintsStatus fulfilled(JobInsertionContext context, TourActivity pre consumptionPerMeter = VehicleUtils .getEnergyConsumptionKWhPerMeter(vehicleTypeOfNewVehicle.getEngineInformation()); else - consumptionPerMeter = VehicleUtils.getFuelConsumption(vehicleTypeOfNewVehicle); + consumptionPerMeter = VehicleUtils.getFuelConsumptionLitersPerMeter(vehicleTypeOfNewVehicle.getEngineInformation()); double routeDistance = calculateRouteDistance(context, newVehicle); double routeConsumption = routeDistance * (consumptionPerMeter); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java index 36038dc0647..653c3972aad 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeTest.java @@ -48,8 +48,8 @@ public void setUp() { costInformation1.setCostsPerMeter( 1.0 ); costInformation1.setCostsPerSecond( 0.5 ); EngineInformation engineInformation1 = mediumType.getEngineInformation(); - engineInformation1.setFuelType( FuelType.diesel ); - engineInformation1.setFuelConsumption( 0.02 ); + VehicleUtils.setHbefaTechnology( engineInformation1, "diesel" ); + VehicleUtils.setFuelConsumptionLitersPerMeter( engineInformation1, 0.02 ); VehicleCapacity vehicleCapacity = mediumType.getCapacity(); vehicleCapacity.setWeightInTons( 30 ); mediumType.setDescription( "Medium Vehicle" ).setMaximumVelocity( 13.89 ); @@ -72,8 +72,8 @@ public void setUp() { costInformation.setCostsPerMeter( 0.75 ); costInformation.setCostsPerSecond( 0.25 ); EngineInformation engineInformation = smallType.getEngineInformation() ; - engineInformation.setFuelType( FuelType.gasoline ); - engineInformation.setFuelConsumption( 0.015 ); + VehicleUtils.setHbefaTechnology( engineInformation, "gasoline" ); + VehicleUtils.setFuelConsumptionLitersPerMeter( engineInformation, 0.015 ); VehicleCapacity capacity = smallType.getCapacity() ; capacity.setWeightInTons( 16 ) ; // VehicleType smallType = CarriersUtils.CarrierVehicleTypeBuilder.newInstance( smallTypeId, mediumType ) @@ -106,8 +106,8 @@ void test_whenCreatingTypeMedium_itCreatesCostInfoCorrectly(){ @Test void test_whenCreatingTypeMedium_itCreatesEngineInfoCorrectly(){ VehicleType medium = types.getVehicleTypes().get(Id.create("medium", org.matsim.vehicles.VehicleType.class ) ); - Assertions.assertEquals(0.02, medium.getEngineInformation().getFuelConsumption(),0.001); - Assertions.assertEquals(FuelType.diesel, medium.getEngineInformation().getFuelType()); + Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumptionLitersPerMeter(medium.getEngineInformation())); + Assertions.assertEquals("diesel", VehicleUtils.getHbefaTechnology(medium.getEngineInformation())); } @Test @@ -140,8 +140,8 @@ void test_whenCopyingTypeMedium_itCopiesCostInfoCorrectly(){ @Test void test_whenCopyingTypeMedium_itCopiesEngineInfoCorrectly(){ VehicleType medium2 = types.getVehicleTypes().get(Id.create("medium2", org.matsim.vehicles.VehicleType.class ) ); - Assertions.assertEquals(0.02, medium2.getEngineInformation().getFuelConsumption(),0.001); - Assertions.assertEquals(FuelType.diesel, medium2.getEngineInformation().getFuelType()); + Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumptionLitersPerMeter(medium2.getEngineInformation())); + Assertions.assertEquals("diesel", VehicleUtils.getHbefaTechnology(medium2.getEngineInformation())); } @Test @@ -174,8 +174,8 @@ void test_whenModifyingTypeSmall_itModifiesCostInfoCorrectly(){ @Test void test_whenModifyingTypeSmall_itModifiesEngineInfoCorrectly(){ VehicleType small = types.getVehicleTypes().get(Id.create("small", org.matsim.vehicles.VehicleType.class ) ); - Assertions.assertEquals(0.015, small.getEngineInformation().getFuelConsumption(),0.001); - Assertions.assertEquals(FuelType.gasoline, small.getEngineInformation().getFuelType()); + Assertions.assertEquals(0.015, VehicleUtils.getFuelConsumptionLitersPerMeter(small.getEngineInformation())); + Assertions.assertEquals("gasoline", VehicleUtils.getHbefaTechnology(small.getEngineInformation())); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java index 21863c47f58..6df599915f9 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java @@ -371,7 +371,7 @@ final void CarrierWithAdditionalDieselVehicleTest_Version4() throws ExecutionExc VehicleType vehicleType_Diesel = VehicleUtils.createVehicleType(Id.create("DieselVehicle", VehicleType.class)); vehicleType_Diesel.getCostInformation().setCostsPerMeter(0.00055).setCostsPerSecond(0.008).setFixedCost(400.); VehicleUtils.setHbefaTechnology(vehicleType_Diesel.getEngineInformation(), "diesel"); - VehicleUtils.setFuelConsumption(vehicleType_Diesel, 0.0001625); + VehicleUtils.setFuelConsumptionLitersPerMeter(vehicleType_Diesel.getEngineInformation(), 0.0001625); vehicleType_Diesel.setDescription("Carrier_Version4"); vehicleType_Diesel.getCapacity().setOther(40.); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java index bdad703ac83..5025334cc5e 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/MatsimTransformerTest.java @@ -377,18 +377,13 @@ private CarrierVehicle getMatsimVehicle(String VehicleId, String locationId, Veh } private VehicleType getMatsimVehicleType() { -// EngineInformation engineInformation = new EngineInformation(); -// engineInformation.setFuelType( FuelType.diesel ); -// engineInformation.setFuelConsumption( (double) 15 ); -// CarriersUtils.CarrierVehicleTypeBuilder builder = CarriersUtils.CarrierVehicleTypeBuilder.newInstance( Id.create( "matsimType", VehicleType.class ) ) VehicleType vehicleType = VehicleUtils.getFactory() .createVehicleType(Id.create("matsimType", VehicleType.class)).setMaximumVelocity(13.8); vehicleType.getCapacity().setOther(50); vehicleType.getCostInformation().setCostsPerMeter(10.0).setCostsPerSecond(5.0).setFixedCost(100.); VehicleUtils.setHbefaTechnology(vehicleType.getEngineInformation(), "diesel"); - VehicleUtils.setFuelConsumption(vehicleType, 15.); -// vehicleType.getEngineInformation().setFuelType( FuelType.diesel ) ; -// vehicleType.getEngineInformation().setFuelConsumption( 15. ); + VehicleUtils.setFuelConsumptionLitersPerMeter(vehicleType.getEngineInformation(), 0.015); + return vehicleType; } @@ -421,8 +416,8 @@ void createVehicleRoutingProblemBuilderWithServices_isMadeCorrectly() { assertEquals(10.0, vehicle.getType().getVehicleCostParams().perDistanceUnit, 0.0); assertEquals(5.0, vehicle.getType().getVehicleCostParams().perTransportTimeUnit, 0.0); assertEquals(100.0, vehicle.getType().getVehicleCostParams().fix, 0.0); - // assertEquals(FuelType.diesel, vehicle. ...); //TODO - // assertEquals(15, FuelConsumption ...); //TODO + assertEquals("diesel", VehicleUtils.getHbefaTechnology(((VehicleType)vehicle.getType().getUserData()).getEngineInformation())); + assertEquals(0.015, VehicleUtils.getFuelConsumptionLitersPerMeter(((VehicleType)vehicle.getType().getUserData()).getEngineInformation())); assertEquals(13.8, vehicle.getType().getMaxVelocity(), 0.0); // check service data diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java index fc3ad78fc84..f4c95c5bd13 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java @@ -100,7 +100,7 @@ public void setUp() { final Id vehicleTypeId = Id.create( "gridType", VehicleType.class ); VehicleType carrierVehType = VehicleUtils.getFactory().createVehicleType( vehicleTypeId ); VehicleUtils.setHbefaTechnology(carrierVehType.getEngineInformation(), "diesel"); - VehicleUtils.setFuelConsumption(carrierVehType, 0.015); + VehicleUtils.setFuelConsumptionLitersPerMeter(carrierVehType.getEngineInformation(), 0.015); VehicleCapacity vehicleCapacity = carrierVehType.getCapacity(); vehicleCapacity.setOther( 3 ); CostInformation costInfo = carrierVehType.getCostInformation(); @@ -220,7 +220,7 @@ void fleetAvailableAfterConvertingIsCorrect() { Assertions.assertEquals(0.001, carrierVehicleType.getCostInformation().getCostsPerSecond(), 0.0 ); Assertions.assertEquals(10, carrierVehicleType.getMaximumVelocity(), 0.0); Assertions.assertEquals("diesel", VehicleUtils.getHbefaTechnology(carrierVehicleType.getEngineInformation())); - Assertions.assertEquals(0.015, VehicleUtils.getFuelConsumption(carrierVehicleType), 0.0); + Assertions.assertEquals(0.015, VehicleUtils.getFuelConsumptionLitersPerMeter(carrierVehicleType.getEngineInformation()), 0.0); } Assertions.assertEquals(FleetSize.INFINITE, carrierWShipmentsOnlyFromCarrierWShipments.getCarrierCapabilities().getFleetSize()); @@ -232,7 +232,7 @@ void fleetAvailableAfterConvertingIsCorrect() { Assertions.assertEquals(0.001, carrierVehicleType.getCostInformation().getCostsPerSecond(), 0.0 ); Assertions.assertEquals(10, carrierVehicleType.getMaximumVelocity(), 0.0); Assertions.assertEquals("diesel", VehicleUtils.getHbefaTechnology(carrierVehicleType.getEngineInformation())); - Assertions.assertEquals(0.015, VehicleUtils.getFuelConsumption(carrierVehicleType), 0.0); } + Assertions.assertEquals(0.015, VehicleUtils.getFuelConsumptionLitersPerMeter(carrierVehicleType.getEngineInformation()), 0.0); } } @Test From 83b29c55a1cc4b16c09d6aa60f2cb063ad0f0968 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:37:15 +0100 Subject: [PATCH 20/51] delete deprecated methods --- .../java/org/matsim/freight/carriers/CarrierVehicle.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java index 967634e7c24..282935ebe73 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java @@ -128,10 +128,7 @@ private CarrierVehicle(Builder builder){ public Id getLinkId() { return locationId; } - /** - * @deprecated -- please inline. kai, jul'22 - */ - @Deprecated public Id getLocation() { return getLinkId(); } + @Override public Id getId() { return vehicleId; From 3d5a88d5b20d6f49e6441a9453a01f8c146d933b Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 09:37:53 +0100 Subject: [PATCH 21/51] use non deprecated Thread method --- .../carriers/jsprit/NetworkBasedTransportCosts.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java index 0e9ece0da53..aa18f9d2487 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java @@ -657,12 +657,12 @@ private VehicleImpl getDefaultVehicle(Location fromId) { private void informEndCalc() { for (InternalLeastCostPathCalculatorListener l : listeners) - l.endCalculation(Thread.currentThread().getId()); + l.endCalculation(Thread.currentThread().threadId()); } private void informStartCalc() { for (InternalLeastCostPathCalculatorListener l : listeners) - l.startCalculation(Thread.currentThread().getId()); + l.startCalculation(Thread.currentThread().threadId()); } /** @@ -852,11 +852,11 @@ public LeastCostPathCalculator getRouter() { } private LeastCostPathCalculator createLeastCostPathCalculator() { - LeastCostPathCalculator router = routerCache.get(Thread.currentThread().getId()); + LeastCostPathCalculator router = routerCache.get(Thread.currentThread().threadId()); if (router == null) { LeastCostPathCalculator newRouter = leastCostPathCalculatorFactory.createPathCalculator(network, travelDisutility, travelTime); - router = routerCache.putIfAbsent(Thread.currentThread().getId(), newRouter); + router = routerCache.putIfAbsent(Thread.currentThread().threadId(), newRouter); if (router == null) { router = newRouter; } From 82bd72babcfdd61f4564c5a304b138588e487bff Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 11:11:24 +0100 Subject: [PATCH 22/51] rename depreacated vehicleTypes file --- .../freight/carriers/CarrierVehicleTypeReaderTest.java | 2 +- .../{vehicleTypes.xml => vehicleTypes_deprecated_v1.xml} | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) rename contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/{vehicleTypes.xml => vehicleTypes_deprecated_v1.xml} (70%) diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java index 1f08349d7df..0635c8121c4 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java @@ -47,7 +47,7 @@ public class CarrierVehicleTypeReaderTest { @BeforeEach public void setUp() { types = new CarrierVehicleTypes(); - inFilename = utils.getClassInputDirectory() + "vehicleTypes.xml"; + inFilename = utils.getClassInputDirectory() + "vehicleTypes_deprecated_v1.xml"; new CarrierVehicleTypeReader(types).readFile( inFilename ); } diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes_deprecated_v1.xml similarity index 70% rename from contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes.xml rename to contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes_deprecated_v1.xml index f4087007a6d..703e60cd498 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes.xml +++ b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes_deprecated_v1.xml @@ -13,4 +13,10 @@ + + Medium Vehicle + 30 + + + From 4740d6db944d39e08ecfdf8158bb75b391e0cf8b Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 11:13:22 +0100 Subject: [PATCH 23/51] remove vehicleTypes duplicates to reduce inputs --- .../freight/carriers/CarrierModuleTest.java | 2 +- .../carriers/CarrierPlanXmlReaderV2Test.java | 2 +- .../carriers/CarrierReadWriteV2_1Test.java | 4 +- .../CarrierVehicleTypeReaderTest.java | 11 +-- .../CarrierVehicleTypeWriterTest.java | 2 +- .../EquilWithCarrierWithPersonsIT.java | 4 +- .../carriers/jsprit/IntegrationIT.java | 5 +- .../CarrierModuleTest/vehicleTypes.xml | 39 -------- .../CarrierReadWriteV2_1Test/carriers.xml | 8 +- .../CarrierReadWriteV2_1Test/vehicles.xml | 53 ----------- .../vehicleTypes_v2.xml | 51 ---------- .../vehicleTypes.xml | 16 ---- .../carrierPlansEquils.xml | 31 +++--- .../carrierPlansEquils.xml | 30 +++--- .../carriers/controller/vehicleTypes_v2.xml | 95 ------------------- .../carriers/jsprit/IntegrationIT/carrier.xml | 30 +++--- .../jsprit/IntegrationIT/vehicleTypes.xml | 29 ------ .../freight/carriers/vehicleTypes_v2.xml | 44 +++------ 18 files changed, 76 insertions(+), 380 deletions(-) delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierModuleTest/vehicleTypes.xml delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/vehicles.xml delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes_v2.xml delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest/vehicleTypes.xml delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/controller/vehicleTypes_v2.xml delete mode 100644 contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/vehicleTypes.xml diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java index 905b080aa54..e80f24075be 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierModuleTest.java @@ -70,7 +70,7 @@ public void setUp(){ config.controller().setCreateGraphsInterval(0); freightCarriersConfigGroup = ConfigUtils.addOrGetModule( config, FreightCarriersConfigGroup.class ) ; freightCarriersConfigGroup.setCarriersFile( testUtils.getClassInputDirectory() + "carrierPlansEquils.xml"); - freightCarriersConfigGroup.setCarriersVehicleTypesFile( testUtils.getClassInputDirectory() + "vehicleTypes.xml"); + freightCarriersConfigGroup.setCarriersVehicleTypesFile( testUtils.getPackageInputDirectory() + "vehicleTypes_v2.xml"); Scenario scenario = ScenarioUtils.loadScenario( config ); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java index 9d445358dc3..07b0a547f3e 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierPlanXmlReaderV2Test.java @@ -190,7 +190,7 @@ void test_readStream() { - + diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java index 4ce250f11e3..5da6137dcd8 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierReadWriteV2_1Test.java @@ -41,7 +41,7 @@ void readWriteTest() { String outputFilename = utils.getOutputDirectory() + "outputCarriers.xml"; CarrierVehicleTypeReader vehicleTypeReader = new CarrierVehicleTypeReader(carrierVehicleTypes); - vehicleTypeReader.readFile(utils.getClassInputDirectory() + "vehicles.xml"); + vehicleTypeReader.readFile(utils.getPackageInputDirectory() + "vehicleTypes_v2.xml"); CarrierPlanXmlReader carrierReader = new CarrierPlanXmlReader(carriers, carrierVehicleTypes); carrierReader.readFile(inputFilename); @@ -63,7 +63,7 @@ void readWriteReadTest() { String outputFilename2 = utils.getOutputDirectory() + "/outputCarriers2.xml"; CarrierVehicleTypeReader vehicleTypeReader = new CarrierVehicleTypeReader(carrierVehicleTypes); - vehicleTypeReader.readFile(utils.getClassInputDirectory() + "vehicles.xml"); + vehicleTypeReader.readFile(utils.getPackageInputDirectory() + "vehicleTypes_v2.xml"); CarrierPlanXmlReader reader1 = new CarrierPlanXmlReader(carriers, carrierVehicleTypes); reader1.readFile(utils.getClassInputDirectory() + "carriers.xml"); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java index 0635c8121c4..19ef4f5fb23 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java @@ -34,8 +34,6 @@ import org.matsim.vehicles.VehicleType; import org.matsim.vehicles.VehicleUtils; -import java.nio.file.Path; - public class CarrierVehicleTypeReaderTest { @RegisterExtension private MatsimTestUtils utils = new MatsimTestUtils() ; @@ -53,14 +51,15 @@ public void setUp() { @Test void test_whenReadingTypes_nuOfTypesIsReadCorrectly(){ - assertEquals(2, types.getVehicleTypes().size()); + assertEquals(3, types.getVehicleTypes().size()); } @Test void test_whenReadingTypes_itReadyExactlyTheTypesFromFile(){ assertTrue(types.getVehicleTypes().containsKey(Id.create("medium", org.matsim.vehicles.VehicleType.class ) ) ); assertTrue(types.getVehicleTypes().containsKey(Id.create("light", org.matsim.vehicles.VehicleType.class ) ) ); - assertEquals(2, types.getVehicleTypes().size()); + assertTrue(types.getVehicleTypes().containsKey(Id.create("heavy", org.matsim.vehicles.VehicleType.class ) ) ); + assertEquals(3, types.getVehicleTypes().size()); } @Test @@ -94,7 +93,7 @@ void test_whenReadingTypeMedium_itReadsEngineInfoCorrectly(){ void readV1andWriteV2(){ final String outFilename = utils.getOutputDirectory() + "/vehicleTypes_v2.xml"; new CarrierVehicleTypeWriter( types ).write( outFilename ) ; - final String referenceFilename = utils.getClassInputDirectory() + "/vehicleTypes_v2.xml" ; + final String referenceFilename = utils.getPackageInputDirectory() + "/vehicleTypes_v2.xml" ; MatsimTestUtils.assertEqualFilesLineByLine( referenceFilename, outFilename ); } @@ -107,7 +106,7 @@ void readV2andWriteV2() { log.info("") ; log.info("now starting for real") ; log.info("") ; - String inFilename1 = utils.getClassInputDirectory() + "vehicleTypes_v2.xml"; + String inFilename1 = utils.getPackageInputDirectory() + "vehicleTypes_v2.xml"; CarrierVehicleTypes types1 = new CarrierVehicleTypes(); new CarrierVehicleTypeReader( types1 ).readFile( inFilename1 ); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java index 0076de83c33..89228f26c4e 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest.java @@ -33,7 +33,7 @@ public class CarrierVehicleTypeWriterTest { @Test void testTypeWriter(){ CarrierVehicleTypes types = new CarrierVehicleTypes(); - new CarrierVehicleTypeReader(types).readFile(utils.getClassInputDirectory()+ "vehicleTypes.xml"); + new CarrierVehicleTypeReader(types).readFile(utils.getPackageInputDirectory()+ "vehicleTypes_v2.xml"); final String outputVehTypeFile = utils.getOutputDirectory()+ "vehicleTypesWritten.xml"; new CarrierVehicleTypeWriter(types).write(outputVehTypeFile); types.getVehicleTypes().clear(); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java index 7a48f4c0426..d18c15840a4 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT.java @@ -40,6 +40,8 @@ import org.matsim.freight.carriers.mobsim.StrategyManagerFactoryForTests; import org.matsim.testcases.MatsimTestUtils; +import java.nio.file.Path; + public class EquilWithCarrierWithPersonsIT { private Controler controler; @@ -81,7 +83,7 @@ static Scenario commonScenario( Config config, MatsimTestUtils testUtils ){ Scenario scenario = ScenarioUtils.loadScenario( config ); CarrierVehicleTypes carrierVehicleTypes = new CarrierVehicleTypes(); - new CarrierVehicleTypeReader( carrierVehicleTypes ).readFile( testUtils.getPackageInputDirectory() + "vehicleTypes_v2.xml" ); + new CarrierVehicleTypeReader( carrierVehicleTypes ).readFile(Path.of(testUtils.getPackageInputDirectory()).getParent().resolve("vehicleTypes_v2.xml").toString()); Carriers carriers = CarriersUtils.addOrGetCarriers(scenario ); new CarrierPlanXmlReader( carriers, carrierVehicleTypes ).readFile( testUtils.getClassInputDirectory() + "carrierPlansEquils.xml" ); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java index 8b157434f38..6c61511a480 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/IntegrationIT.java @@ -27,6 +27,7 @@ import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import com.graphhopper.jsprit.core.reporting.SolutionPrinter; import com.graphhopper.jsprit.core.util.Solutions; +import java.nio.file.Path; import java.util.concurrent.ExecutionException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -50,7 +51,7 @@ public class IntegrationIT { @Test void testJsprit() throws ExecutionException, InterruptedException { final String networkFilename = utils.getClassInputDirectory() + "/merged-network-simplified.xml.gz"; - final String vehicleTypeFilename = utils.getClassInputDirectory() + "/vehicleTypes.xml"; + final String vehicleTypeFilename = Path.of(utils.getPackageInputDirectory()).getParent().resolve("vehicleTypes_v2.xml").toString(); final String carrierFilename = utils.getClassInputDirectory() + "/carrier.xml"; Config config = ConfigUtils.createConfig(); @@ -98,7 +99,7 @@ void testJsprit() throws ExecutionException, InterruptedException { @Test void testJspritWithDefaultSolutionOption() throws ExecutionException, InterruptedException { final String networkFilename = utils.getClassInputDirectory() + "/merged-network-simplified.xml.gz"; - final String vehicleTypeFilename = utils.getClassInputDirectory() + "/vehicleTypes.xml"; + final String vehicleTypeFilename = Path.of(utils.getPackageInputDirectory()).getParent().resolve("vehicleTypes_v2.xml").toString(); final String carrierFilename = utils.getClassInputDirectory() + "/carrier.xml"; Config config = ConfigUtils.createConfig(); diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierModuleTest/vehicleTypes.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierModuleTest/vehicleTypes.xml deleted file mode 100644 index 1ad295354d8..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierModuleTest/vehicleTypes.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - Light Vehicle - - - - - - - - - - - - - - - - Medium Vehicle - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/carriers.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/carriers.xml index 88124972eec..3d2ae8952c2 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/carriers.xml +++ b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/carriers.xml @@ -8,8 +8,8 @@ - - + + @@ -115,8 +115,8 @@ - - + + diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/vehicles.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/vehicles.xml deleted file mode 100644 index 3ff84f751a1..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierReadWriteV2_1Test/vehicles.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes_v2.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes_v2.xml deleted file mode 100644 index 8568206c736..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest/vehicleTypes_v2.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - Light Vehicle - - - - - - - - 0.02 - gasoline - - - - - - - - - - - - - Medium Vehicle - - - - - - - - 0.02 - gasoline - - - - - - - - - - - - - \ No newline at end of file diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest/vehicleTypes.xml b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest/vehicleTypes.xml deleted file mode 100644 index 9ac37fd0dfe..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeWriterTest/vehicleTypes.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - Medium Vehicle - - 30 - - - - - Light Vehicle - 15 - - - - diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml index 1a7369f8abf..0971f759480 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml +++ b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithPersonsIT/carrierPlansEquils.xml @@ -31,17 +31,17 @@ - - + + - + - + @@ -58,7 +58,7 @@ - + @@ -76,18 +76,18 @@ - + - + - + - + @@ -106,18 +106,18 @@ - + - + - + - + @@ -136,7 +136,6 @@ - + - - \ No newline at end of file + diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml index 4fd1e13d09d..e7374870fc3 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml +++ b/contribs/freight/test/input/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT/carrierPlansEquils.xml @@ -31,17 +31,17 @@ - - + + - + - + @@ -58,7 +58,7 @@ - + @@ -76,18 +76,18 @@ - + - + - + - + @@ -106,18 +106,18 @@ - + - + - + - + @@ -136,6 +136,6 @@ - + - + diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/controller/vehicleTypes_v2.xml b/contribs/freight/test/input/org/matsim/freight/carriers/controller/vehicleTypes_v2.xml deleted file mode 100644 index d29386a7a2a..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/controller/vehicleTypes_v2.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - Light Vehicle - - - - - - - - 0.02 - gasoline - - - - - - - - - - - - - Medium Vehicle - - - - - - - - 0.02 - gasoline - - - - - - - - - - - - - Medium Vehicle - - - - - - - - 0.03 - gasoline - - - - - - - - - - - - - Medium Vehicle - - - - - - - - 0.03 - gasoline - - - - - - - - - - - - - diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/carrier.xml b/contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/carrier.xml index e14845dfaff..3f7eaf626e1 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/carrier.xml +++ b/contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/carrier.xml @@ -3,19 +3,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -197,8 +197,8 @@ - - + + diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/vehicleTypes.xml b/contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/vehicleTypes.xml deleted file mode 100644 index 5f3ad64ff22..00000000000 --- a/contribs/freight/test/input/org/matsim/freight/carriers/jsprit/IntegrationIT/vehicleTypes.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - null - 6000 - - - - null - 7000 - - - - null - 12000 - - - - null - 3000 - - - - null - 15000 - - - - diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml b/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml index 442ad345d70..f78dccd883c 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml +++ b/contribs/freight/test/input/org/matsim/freight/carriers/vehicleTypes_v2.xml @@ -2,29 +2,7 @@ - - - Light Vehicle - - - - - - - - 0.02 - gasoline - - - - - - - - - - - + Medium Vehicle @@ -34,11 +12,11 @@ - 0.02 gasoline + 0.03 - + @@ -46,21 +24,21 @@ - + - Medium Vehicle - + Light Vehicle + - 0.03 gasoline + 0.02 - + @@ -68,7 +46,7 @@ - + Medium Vehicle @@ -78,11 +56,11 @@ - 0.03 gasoline + 0.02 - + From b6541d227fc9641709ad7da0a0408e463e278558 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 11:14:06 +0100 Subject: [PATCH 24/51] use recent EngineInformation setter --- .../matsim/freight/carriers/CarrierVehicleTypeReaderV1.java | 5 ++--- .../freight/carriers/CarrierVehicleTypeReaderTest.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java index 52d56eaf0d2..f1cb66dac45 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderV1.java @@ -72,9 +72,8 @@ public void startTag( String name, Attributes attributes, Stack context } if(name.equals("engineInformation")){ EngineInformation engineInfo = this.currentType.getEngineInformation() ; - VehicleUtils.setFuelConsumption(this.currentType, Double.parseDouble(attributes.getValue( "gasConsumption" ))); - engineInfo.setFuelConsumption( Double.parseDouble( attributes.getValue( "gasConsumption" ) ) ); - engineInfo.setFuelType( EngineInformation.FuelType.valueOf( attributes.getValue( "fuelType" ) ) ); + VehicleUtils.setHbefaTechnology(engineInfo, attributes.getValue( "fuelType")); + VehicleUtils.setFuelConsumptionLitersPerMeter(engineInfo, Double.parseDouble(attributes.getValue( "gasConsumption" ))); } if(name.equals("costInformation")){ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java index 19ef4f5fb23..1dbfcf0b096 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java @@ -85,7 +85,7 @@ void test_whenReadingTypeMedium_itReadsCostInfoCorrectly(){ @Test void test_whenReadingTypeMedium_itReadsEngineInfoCorrectly(){ VehicleType medium = types.getVehicleTypes().get(Id.create("medium", org.matsim.vehicles.VehicleType.class ) ); - assertEquals(0.02, VehicleUtils.getFuelConsumption(medium), 0.01); + assertEquals(0.02, VehicleUtils.getFuelConsumptionLitersPerMeter(medium.getEngineInformation()), 0.01); assertEquals("gasoline", VehicleUtils.getHbefaTechnology(medium.getEngineInformation())); } From b98f7b3eb311f3d76361d9871de0d752780b4ddd Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 11:14:17 +0100 Subject: [PATCH 25/51] update events for testing --- .../runChessboard/output_events.xml.gz | Bin 437704 -> 437491 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/usecases/chessboard/RunChessboardIT/runChessboard/output_events.xml.gz b/contribs/freight/test/input/org/matsim/freight/carriers/usecases/chessboard/RunChessboardIT/runChessboard/output_events.xml.gz index 8057a55fbcc2e29c7029d1b3e51cee8c0b69914c..bf5ebee32b8761d77debf4122e84657092b73c99 100644 GIT binary patch delta 404893 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 Y$!deTRz@#~!eS~k&!0J{Ny#cZG?wOj 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

o$p}F^#1i5#+}8gLsU_~=o47gNR9kV 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𝔜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 Ir9)i-0IF4$C;$Ke delta 404885 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%0DT2K6Dvpc2EeV=OFNrc)(R%7K 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

2q=MsG30!5)rs>Bb;Bi$0l@BiN1 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 z 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

$jaDG;b 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 Date: Tue, 3 Dec 2024 11:22:34 +0100 Subject: [PATCH 26/51] use recent EngineInformation setter --- .../matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java | 4 ++-- .../org/matsim/freight/carriers/jsprit/FixedCostsTest.java | 4 ++-- .../freight/carriers/utils/CarrierControllerUtilsIT.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java index ab2b8e78d67..7d221c171fb 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java @@ -64,7 +64,7 @@ void test_whenLoadingTypes_allAssignmentsInLightVehicleAreCorrectly(){ Assertions.assertEquals(30, vehicleTypeLoaded.getCostInformation().getCostsPerSecond(), MatsimTestUtils.EPSILON); Assertions.assertEquals("gasoline", VehicleUtils.getHbefaTechnology(vehicleTypeLoaded.getEngineInformation())); - Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumption(vehicleTypeLoaded), MatsimTestUtils.EPSILON); + Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumptionLitersPerMeter(vehicleTypeLoaded.getEngineInformation()), MatsimTestUtils.EPSILON); } @Test @@ -83,7 +83,7 @@ void test_whenLoadingTypes_allAssignmentsInMediumVehicleAreCorrectly(){ Assertions.assertEquals(30, vehicleTypeLoaded.getCostInformation().getCostsPerSecond(), MatsimTestUtils.EPSILON); Assertions.assertEquals("gasoline", VehicleUtils.getHbefaTechnology(vehicleTypeLoaded.getEngineInformation())); - Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumption(vehicleTypeLoaded), MatsimTestUtils.EPSILON); + Assertions.assertEquals(0.02, VehicleUtils.getFuelConsumptionLitersPerMeter(vehicleTypeLoaded.getEngineInformation()), MatsimTestUtils.EPSILON); } diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java index 76bad393dca..cf5060bf772 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/FixedCostsTest.java @@ -89,7 +89,7 @@ public void setUp() { VehicleType carrierVehType_A = VehicleUtils.getFactory().createVehicleType( vehicleTypeId ); { EngineInformation engineInformation1 = carrierVehType_A.getEngineInformation(); - VehicleUtils.setFuelConsumption(carrierVehType_A, 0.015); + VehicleUtils.setFuelConsumptionLitersPerMeter(carrierVehType_A.getEngineInformation(), 0.015); VehicleUtils.setHbefaTechnology(engineInformation1, "diesel"); carrierVehType_A.getCapacity().setOther( 1. ); carrierVehType_A.getCostInformation().setFixedCost( 0. ).setCostsPerMeter( 0.001 ).setCostsPerSecond( 0.0 ); @@ -104,7 +104,7 @@ public void setUp() { VehicleType carrierVehType_B = VehicleUtils.getFactory().createVehicleType( vehicleTypeId1 ); { EngineInformation engineInformation = carrierVehType_B.getEngineInformation(); - VehicleUtils.setFuelConsumption(carrierVehType_A, 0.015); + VehicleUtils.setFuelConsumptionLitersPerMeter(carrierVehType_A.getEngineInformation(), 0.015); VehicleUtils.setHbefaTechnology(engineInformation, "diesel"); carrierVehType_B.getCapacity().setOther( 1. ); carrierVehType_B.getCostInformation().setFixedCost( 10. ).setCostsPerMeter( 0.00001 ).setCostsPerSecond( 0. ) ; diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java index 313dd55ceac..28314c1a817 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java @@ -88,7 +88,7 @@ public void setUp() { VehicleType carrierVehType = VehicleUtils.getFactory().createVehicleType( vehTypeId ); EngineInformation engineInformation = carrierVehType.getEngineInformation() ; VehicleUtils.setHbefaTechnology(engineInformation, "diesel"); - VehicleUtils.setFuelConsumption(carrierVehType, 0.015); + VehicleUtils.setFuelConsumptionLitersPerMeter(engineInformation, 0.015); VehicleCapacity capacity = carrierVehType.getCapacity() ; capacity.setOther( 3. ) ; CostInformation costInfo = carrierVehType.getCostInformation(); From 938391e9bc8335f7dbe212300fafcb062f5b1cd0 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 12:00:58 +0100 Subject: [PATCH 27/51] update javadoc parameter descriptions --- .../freight/carriers/CarrierPlanReaderV1.java | 2 +- .../carriers/CarrierPlanXmlParserV2.java | 2 +- .../carriers/CarrierPlanXmlParserV2_1.java | 2 +- .../freight/carriers/CarrierService.java | 10 +++--- .../freight/carriers/CarrierShipment.java | 18 +++++----- .../freight/carriers/CarrierVehicle.java | 10 +++--- .../freight/carriers/CarrierVehicleType.java | 22 ++++++------ .../freight/carriers/ScheduledTour.java | 6 ++-- .../org/matsim/freight/carriers/Tour.java | 34 +++++++++---------- .../controller/CarrierReRouteVehicles.java | 4 +-- .../CarrierTimeAndSpaceTourRouter.java | 8 ++--- .../carriers/jsprit/DistanceConstraint.java | 10 +++--- 12 files changed, 64 insertions(+), 64 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java index 2b0fc22fb3b..4bb90047d86 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanReaderV1.java @@ -81,7 +81,7 @@ class CarrierPlanReaderV1 extends MatsimXmlParser { * Constructs a reader with an empty carriers-container for the carriers to be constructed. * * @param carriers which is a map that stores carriers - * @param carrierVehicleTypes + * @param carrierVehicleTypes which is a map that stores carrierVehicleTypes */ public CarrierPlanReaderV1( Carriers carriers, CarrierVehicleTypes carrierVehicleTypes ) { super(ValidationType.DTD_OR_XSD); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java index 91f34e6a0e5..271871b0970 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2.java @@ -77,7 +77,7 @@ class CarrierPlanXmlParserV2 extends MatsimXmlParser { * Constructs a reader with an empty carriers-container for the carriers to be constructed. * * @param carriers which is a map that stores carriers - * @param carrierVehicleTypes + * @param carrierVehicleTypes which is a map that stores vehicle types */ CarrierPlanXmlParserV2( Carriers carriers, CarrierVehicleTypes carrierVehicleTypes ) { super(ValidationType.XSD_ONLY); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java index e8b3911df61..9c3f2b7a1e6 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlanXmlParserV2_1.java @@ -76,7 +76,7 @@ class CarrierPlanXmlParserV2_1 extends MatsimXmlParser { * Constructs a reader with an empty carriers-container for the carriers to be constructed. * * @param carriers which is a map that stores carriers - * @param carrierVehicleTypes + * @param carrierVehicleTypes which is a map that stores vehicle types */ CarrierPlanXmlParserV2_1(Carriers carriers, CarrierVehicleTypes carrierVehicleTypes ) { super(ValidationType.XSD_ONLY); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java index 9c7eee429e5..69a5ce75e42 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierService.java @@ -55,10 +55,10 @@ public Builder setName(String name){ } /** - * By default it is [0.0,Integer.MaxValue]. + * By default, it is [0.0,Integer.MaxValue]. * - * @param serviceDuration - * @return + * @param serviceDuration duration of the service + * @return the builder */ public Builder setServiceDuration(double serviceDuration){ this.serviceTime = serviceDuration; @@ -71,8 +71,8 @@ public Builder setServiceDuration(double serviceDuration){ *

Note that the time-window restricts the start-time of the service (i.e. serviceActivity). If one works with hard time-windows (which means that * time-windows must be met) than the service is allowed to start between startTimeWindow.getStart() and startTimeWindow.getEnd(). * - * @param startTimeWindow - * @return + * @param startTimeWindow time-window for the service + * @return the builder */ public Builder setServiceStartTimeWindow(TimeWindow startTimeWindow){ this.timeWindow = startTimeWindow; diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java index 489657ba54e..b378db94620 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java @@ -54,10 +54,10 @@ public static class Builder { *

The builder is init with the shipment's origin (from), destination (to) and with the shipment's size. * The default-value for serviceTime is 0.0. The default-value for a timeWindow is [start=0.0, end=Double.maxValue()]. * - * @param from - * @param to - * @param size - * @return the builder + * @param from the origin + * @param to the destination + * @param size size of the shipment + * @return the builder */ @Deprecated public static Builder newInstance(Id from, Id to, int size){ @@ -70,11 +70,11 @@ public static Builder newInstance(Id from, Id to, int size){ *

The builder is init with the shipment's origin (from), destination (to) and with the shipment's size. * The default-value for serviceTime is 0.0. The default-value for a timeWindow is [start=0.0, end=Double.maxValue()]. * - * @param id - * @param from - * @param to - * @param size - * @return the builder + * @param id the id of the shipment + * @param from the origin + * @param to the destination + * @param size size of the shipment + * @return the builder */ public static Builder newInstance(Id id, Id from, Id to, int size){ return new Builder(id, from,to,size); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java index 282935ebe73..7d317af7d26 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicle.java @@ -46,8 +46,8 @@ public final class CarrierVehicle implements Vehicle { *

* The default values for other fields (being implicitly set) are [capacity=0][earliestStart=0.0][latestEnd=Integer.MaxValue()]. * - * @param vehicleId - * @param locationId + * @param vehicleId the vehicle id + * @param locationId the location id * @return CarrierVehicle * @see CarrierVehicle */ @@ -68,9 +68,9 @@ public static class Builder { *

* The default values for other fields (being implicitly set) are [capacity=0][earliestStart=0.0][latestEnd=Integer.MaxValue()]. * - * @param vehicleId - * @param locationId - * @param vehicleType + * @param vehicleId the vehicle id + * @param locationId the location id + * @param vehicleType the vehicle type * @return a new vehicle builder */ public static Builder newInstance( Id vehicleId, Id locationId, VehicleType vehicleType ){ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java index 79ebaf288bb..7033a3454d7 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java @@ -57,7 +57,7 @@ public static class Builder { *

* The defaults are [fix=0.0][perDistanceUnit=1.0][perTimeUnit=0.0]. * - * @param typeId + * @param typeId the type id * @return a type builder */ public static Builder newInstance(Id typeId){ @@ -72,8 +72,8 @@ private Builder(Id typeId){ * Sets fixed costs of vehicle. * *

By default it is 0. - * @param fix - * @return + * @param fix fixed costs + * @return this builder */ public Builder setFixCost(double fix){ this.delegate.getCostInformation().setFixedCost( fix ) ; @@ -85,8 +85,8 @@ public Builder setFixCost(double fix){ * *

By default it is 1. * - * @param perDistanceUnit - * @return + * @param perDistanceUnit costs per distance-unit + * @return this builder */ public Builder setCostPerDistanceUnit(double perDistanceUnit){ this.delegate.getCostInformation().setCostsPerMeter( perDistanceUnit ) ; @@ -98,8 +98,8 @@ public Builder setCostPerDistanceUnit(double perDistanceUnit){ * *

By default it is 0. * - * @param perTimeUnit - * @return + * @param perTimeUnit costs per time-unit + * @return this builder */ public Builder setCostPerTimeUnit(double perTimeUnit){ this.delegate.getCostInformation().setCostsPerSecond( perTimeUnit ) ; @@ -109,8 +109,8 @@ public Builder setCostPerTimeUnit(double perTimeUnit){ /** * Sets description. * - * @param description - * @return this builder + * @param description the description + * @return this builder */ public Builder setDescription(String description){ this.delegate.setDescription( description ) ; @@ -122,8 +122,8 @@ public Builder setDescription(String description){ * *

By default, the capacity is 0. * - * @param capacity - * @return this builder + * @param capacity the capacity of the vehicle-type + * @return this builder */ public Builder setCapacity(int capacity){ this.delegate.getCapacity().setOther( capacity ); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/ScheduledTour.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/ScheduledTour.java index 6a133ebc71c..84eeb1907a1 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/ScheduledTour.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/ScheduledTour.java @@ -37,9 +37,9 @@ public class ScheduledTour { *

Look at the builder. It might be easier to build a scheduled tour. * You get the builder this way: ScheduledTour.Builder.newInstance(carrierVehicle). * - * @param tour - * @param vehicle - * @param departureTime + * @param tour The scheduled tour. + * @param vehicle The vehicle for the tour. + * @param departureTime The time when the vehicle starts the tour. * @return a scheduledTour * @see ScheduledTour */ diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java index a876ca56042..55f72325237 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/Tour.java @@ -82,8 +82,8 @@ private Builder(Id tourId) { * *

Tour start should correspond to the locationId of the vehicle that runs the tour. * - * @param startLinkId - * @return the builder again + * @param startLinkId linkId of the start location + * @return the builder again */ public Builder scheduleStart(Id startLinkId) { scheduleStart(startLinkId, TimeWindow.newInstance(0.0, Double.MAX_VALUE)); @@ -105,7 +105,7 @@ public void scheduleEnd(Id endLinkId, TimeWindow timeWindow){ /** * Schedules the end of the tour (in terms of locationId). * - * @param endLinkId + * @param endLinkId linkId of the end location */ public void scheduleEnd(Id endLinkId) { scheduleEnd(endLinkId, TimeWindow.newInstance(0.0, Double.MAX_VALUE)); @@ -116,8 +116,8 @@ public void scheduleEnd(Id endLinkId) { * *

Consider that a leg follows an activity. Otherwise, an exception occurs. * - * @param leg - * @throws IllegalStateException if leg is null or if previous element is not an activity. + * @param leg the leg to be added + * @throws IllegalStateException if leg is null or if previous element is not an activity. */ public Builder addLeg(Leg leg) { Gbl.assertNotNull(leg); @@ -140,9 +140,9 @@ public Leg createLeg(Route route, double dep_time, double transportTime) { /** * Inserts leg at the beginning of a tour. * - * @param leg - * @return the builder - * @throws IllegalStateException if leg is null + * @param leg the leg to be inserted + * @return the builder + * @throws IllegalStateException if leg is null */ @Deprecated public Builder insertLegAtBeginning(Leg leg) { @@ -154,9 +154,9 @@ public Builder insertLegAtBeginning(Leg leg) { /** * Schedules a pickup of the shipment right at the beginning of the tour. * - * @param shipment - * @return the builder - * @throws IllegalStateException if shipment is null or shipment has already been picked up. + * @param shipment the shipment to be picked up + * @return the builder + * @throws IllegalStateException if shipment is null or shipment has already been picked up. */ @Deprecated public Builder schedulePickupAtBeginning(CarrierShipment shipment) { @@ -202,8 +202,8 @@ private void assertLastElementIsLeg() { /** * Schedules a delivery of a shipment, i.e. adds a delivery activity to current tour. * - * @param shipment - * @throws IllegalStateException if shipment is null or if shipment has not been picked up yet or if last element is not a leg. + * @param shipment the shipment to be delivered + * @throws IllegalStateException if shipment is null or if shipment has not been picked up yet or if last element is not a leg. */ public void scheduleDelivery(CarrierShipment shipment) { Gbl.assertNotNull(shipment); @@ -256,10 +256,10 @@ public Leg createLeg() { /** * Creates and returns a network route. * - * @param startLinkId - * @param linkIds - * @param endLinkId - * @return NetworkRoute + * @param startLinkId start link id + * @param linkIds list of link ids that form the route + * @param endLinkId end link id + * @return NetworkRoute * @see NetworkRoute */ public NetworkRoute createRoute(Id startLinkId, List> linkIds, Id endLinkId) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierReRouteVehicles.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierReRouteVehicles.java index daf94e0e147..a2e32470a88 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierReRouteVehicles.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierReRouteVehicles.java @@ -77,8 +77,8 @@ private CarrierReRouteVehicles( LeastCostPathCalculator router, Network network, /** * Routes the carrierPlan in time and space. * - * @param carrierPlan - * @throws IllegalStateException if carrierPlan is null. + * @param carrierPlan the carrierPlan to be routed. + * @throws IllegalStateException if carrierPlan is null. * @see CarrierTimeAndSpaceTourRouter */ @Override diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java index 116495f7549..b02c5938e42 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierTimeAndSpaceTourRouter.java @@ -93,9 +93,9 @@ public Attributes getAttributes() { /** * Constructs the timeAndSpaceRouter with a leastCostPathCalculator, network and travelTime. - * @param router - * @param network - * @param travelTime + * @param router the leastCostPathCalculator + * @param network the network + * @param travelTime the travelTime * @see LeastCostPathCalculator, Network, TravelTime */ public CarrierTimeAndSpaceTourRouter( LeastCostPathCalculator router, Network network, TravelTime travelTime ) { @@ -110,7 +110,7 @@ public CarrierTimeAndSpaceTourRouter( LeastCostPathCalculator router, Network ne * *

Uses a leastCostPathCalculator to calculate a route/path from one activity to another. It starts at the departureTime of * the scheduledTour and determines activity arrival and departure times considering activities time-windows. - * @param tour + * @param tour the scheduledTour to be routed. */ public void route(ScheduledTour tour) { MatsimVehicleAdapter matsimVehicle = new MatsimVehicleAdapter(tour.getVehicle()); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java index 63c6729cd84..8615e0b3d75 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/DistanceConstraint.java @@ -212,9 +212,9 @@ private double calculateRouteDistance(JobInsertionContext context, Vehicle newVe * directly behind the new pickup. This method gives back the minimal distance * of this three options. * - * @param context - * @param newInvestigatedPickup - * @param nextAct + * @param context the context of the job insertion + * @param newInvestigatedPickup the new pickup which should be added to the tour + * @param nextAct the next activity after the new pickup * @return minimal distance of the associated delivery */ private double findMinimalAdditionalDistance(JobInsertionContext context, TourActivity newInvestigatedPickup, @@ -283,8 +283,8 @@ private double findMinimalAdditionalDistance(JobInsertionContext context, TourAc /** * Checks if the find possible distance is the minimal one. * - * @param minimalAdditionalDistance - * @param possibleAdditionalDistance + * @param minimalAdditionalDistance the minimal additional distance + * @param possibleAdditionalDistance the possible additional distance * @return the minimal transport distance */ private double findMinimalDistance(double minimalAdditionalDistance, double possibleAdditionalDistance) { From 709a7435c64c13e4a4e46a80e744070e8d328a07 Mon Sep 17 00:00:00 2001 From: Ricardo Ewert Date: Tue, 3 Dec 2024 13:51:12 +0100 Subject: [PATCH 28/51] add vehicleType to carrier load analysis --- .../matsim/freight/carriers/analysis/CarrierLoadAnalysis.java | 2 ++ .../runServiceEventTest/Load_perVehicle.tsv | 2 +- .../runShipmentEventTest/Load_perVehicle.tsv | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java index b28fdf86c13..37a4651ce7e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java @@ -95,6 +95,7 @@ void writeLoadPerVehicle(String analysisOutputDirectory, Scenario scenario) thro //Write headline: bw1.write(String.join(delimiter,"vehicleId", + "vehicleTypeId", "capacity", "maxLoad", "load state during tour")); @@ -109,6 +110,7 @@ void writeLoadPerVehicle(String analysisOutputDirectory, Scenario scenario) thro final Double capacity = vehicleType.getCapacity().getOther(); bw1.write(vehicleId.toString()); + bw1.write(delimiter + vehicleType.getId().toString()); bw1.write(delimiter + capacity); bw1.write(delimiter + maxLoad); bw1.write(delimiter + load); diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runServiceEventTest/Load_perVehicle.tsv b/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runServiceEventTest/Load_perVehicle.tsv index 67fb0e5f002..a1e0058ce5b 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runServiceEventTest/Load_perVehicle.tsv +++ b/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runServiceEventTest/Load_perVehicle.tsv @@ -1 +1 @@ -vehicleId capacity maxLoad load state during tour +vehicleId vehicleTypeId capacity maxLoad load state during tour diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runShipmentEventTest/Load_perVehicle.tsv b/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runShipmentEventTest/Load_perVehicle.tsv index cf7f4992d37..d61ddd36308 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runShipmentEventTest/Load_perVehicle.tsv +++ b/contribs/freight/test/input/org/matsim/freight/carriers/analysis/FreightAnalysisEventBasedTest/runShipmentEventTest/Load_perVehicle.tsv @@ -1,2 +1,2 @@ -vehicleId capacity maxLoad load state during tour -freight_carrier1_veh_freight_carrier1_veh_heavyVehicle_1_1 50.0 26 [3, 8, 18, 25, 26, 23, 13, 12, 7, 0] +vehicleId vehicleTypeId capacity maxLoad load state during tour +freight_carrier1_veh_freight_carrier1_veh_heavyVehicle_1_1 heavy 50.0 26 [3, 8, 18, 25, 26, 23, 13, 12, 7, 0] From 815b29f9478f9450ba328f1e0ac109eeb5b466d3 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:19:59 +0100 Subject: [PATCH 29/51] fix mal-formatted xsd file --- .../carrierVehicleTypes_v2.xsd | 159 +++++++++--------- 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderWithDtdV1Test/carrierVehicleTypes_v2.xsd b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderWithDtdV1Test/carrierVehicleTypes_v2.xsd index 043b44666d5..e35fcb0c615 100644 --- a/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderWithDtdV1Test/carrierVehicleTypes_v2.xsd +++ b/contribs/freight/test/input/org/matsim/freight/carriers/CarrierVehicleTypeReaderWithDtdV1Test/carrierVehicleTypes_v2.xsd @@ -4,85 +4,86 @@ elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From adc35addf9a97fb6fef173ee159ea57af5d46a1f Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:23:29 +0100 Subject: [PATCH 30/51] minor change: write out string --- .../org/matsim/freight/carriers/CarrierVehicleTypeReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java index 0d8d070c5c6..b96a224b20e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleTypeReader.java @@ -78,7 +78,7 @@ public void readURL( URL url ){ reader.readURL(url); } catch (Exception e) { log.warn("### Exception: Message={}", e.getMessage()); - log.warn("### Exception: Cause={}", e.getCause()); + log.warn("### Exception: Cause={}", e.getCause().toString()); log.warn("### Exception: Class={}", e.getClass()); if (e.getCause().getMessage().contains("cvc-elt.1.a")) { // "Cannot find the declaration of element" -> exception comes most probably because no validation information was found log.warn("read with validation = true failed. Try it again without validation... url: {}", url.toString()); From 20ed5dd1f6dbdf31de8032df4fe5a249b9cf7a87 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:27:24 +0100 Subject: [PATCH 31/51] minor cleanup --- .../carriers/jsprit/NetworkBasedTransportCosts.java | 3 --- .../freight/carriers/CarrierVehicleTypeLoaderTest.java | 5 ++--- .../freight/carriers/CarrierVehicleTypeReaderTest.java | 5 ++--- .../carriers/mobsim/ScoringFunctionFactoryForTests.java | 8 ++------ 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java index aa18f9d2487..73769efe064 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java @@ -84,8 +84,6 @@ */ public class NetworkBasedTransportCosts implements VRPTransportCosts { - private final RoadPricingScheme roadPricingScheme; - public interface InternalLeastCostPathCalculatorListener { void startCalculation(long routerId); @@ -577,7 +575,6 @@ private NetworkBasedTransportCosts(Builder builder) { this.travelTime = builder.travelTime; this.network = builder.network; this.leastCostPathCalculatorFactory = builder.leastCostPathCalculatorFactory; - this.roadPricingScheme = builder.roadPricingScheme; this.timeSliceWidth = builder.timeSliceWidth; this.defaultTypeId = builder.defaultTypeId; this.ttMemorizedCounter = new Counter("#TransportCostValues cached "); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java index 7d221c171fb..64ea88b6e93 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java @@ -37,15 +37,14 @@ public class CarrierVehicleTypeLoaderTest { @RegisterExtension public final MatsimTestUtils utils = new MatsimTestUtils(); - private CarrierVehicleTypes types; private Carriers carriers; @BeforeEach public void setUp() { - types = new CarrierVehicleTypes(); + CarrierVehicleTypes types = new CarrierVehicleTypes(); new CarrierVehicleTypeReader(types).readFile(Path.of(utils.getClassInputDirectory()).getParent().resolve("vehicleTypes_v2.xml").toString()); carriers = new Carriers(); - new CarrierPlanXmlReader(carriers, types ).readFile(utils.getClassInputDirectory() + "carrierPlansEquils.xml" ); + new CarrierPlanXmlReader(carriers, types).readFile(utils.getClassInputDirectory() + "carrierPlansEquils.xml" ); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java index 1dbfcf0b096..47e8f2b8a95 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeReaderTest.java @@ -40,13 +40,12 @@ public class CarrierVehicleTypeReaderTest { private static final Logger log = LogManager.getLogger(CarrierVehicleTypeReaderTest.class) ; private CarrierVehicleTypes types; - private String inFilename; @BeforeEach public void setUp() { types = new CarrierVehicleTypes(); - inFilename = utils.getClassInputDirectory() + "vehicleTypes_deprecated_v1.xml"; - new CarrierVehicleTypeReader(types).readFile( inFilename ); + String inFilename = utils.getClassInputDirectory() + "vehicleTypes_deprecated_v1.xml"; + new CarrierVehicleTypeReader(types).readFile(inFilename); } @Test diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java index 87e50dacbe5..09b4a35a59a 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java @@ -54,9 +54,8 @@ static class DriverLegScoring implements BasicScoring, LegScoring{ private final Carrier carrier; private final Set employedVehicles; private Leg currentLeg = null; - private double currentLegStartTime; - public DriverLegScoring(Carrier carrier, Network network) { + public DriverLegScoring(Carrier carrier, Network network) { super(); this.network = network; this.carrier = carrier; @@ -65,9 +64,7 @@ public DriverLegScoring(Carrier carrier, Network network) { @Override - public void finish() { - - } + public void finish() {} @Override @@ -86,7 +83,6 @@ public void reset() { @Override public void startLeg(double time, Leg leg) { currentLeg = leg; - currentLegStartTime = time; } From ef8fe25d4058139bc1f1c2fb04e9aaebd352664e Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:28:43 +0100 Subject: [PATCH 32/51] code style --- .../freight/carriers/CarriersUtils.java | 2 +- ...ventBasedCarrierScorer4MultipleChains.java | 2 +- .../DistributionCarrierScheduler.java | 31 +++++++------------ 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java index e99be9d98db..1b6a270e65e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarriersUtils.java @@ -234,7 +234,7 @@ public static void runJsprit(Scenario scenario, CarrierSelectionForSolution carr continue; } } - case solveForAllCarriersAndAddPLans -> {carrier.setSelectedPlan(null);} // Keep existing plan(s), but make them not selected. + case solveForAllCarriersAndAddPLans -> carrier.setSelectedPlan(null); // Keep existing plan(s), but make them not selected. default -> throw new IllegalStateException("Unexpected value: " + carriersSolutionType); } carrierActivityCounterMap.put(carrier.getId(), carrierActivityCounterMap.getOrDefault(carrier.getId(), 0) + carrier.getServices().size()); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java index 5469d53b508..fadb9e313ff 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java @@ -153,7 +153,7 @@ class LinkBasedTollScoring implements SumScoringFunction.ArbitraryEventScoring { private final double toll; private final List vehicleTypesToBeTolled; private double score; - private List tolledLinkList; + private final List tolledLinkList; private final Vehicle2CarrierEventHandler v2c = new Vehicle2CarrierEventHandler(); public LinkBasedTollScoring(double toll, List vehicleTypeToBeTolled, List tolledLinkListBerlin) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java index 51704f91cb9..a754612a027 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java @@ -100,8 +100,8 @@ protected void scheduleResource() { scheduledPlans.add(auxiliaryCarrier.getSelectedPlan()); var vrpLogic = CarrierSchedulerUtils.getVrpLogic(carrier); switch (vrpLogic) { - case serviceBased -> { carrier.getServices().putAll(auxiliaryCarrier.getServices()); } - case shipmentBased -> { carrier.getShipments().putAll(auxiliaryCarrier.getShipments()); } + case serviceBased -> carrier.getServices().putAll(auxiliaryCarrier.getServices()); + case shipmentBased -> carrier.getShipments().putAll(auxiliaryCarrier.getShipments()); default -> throw new IllegalStateException("Unexpected value: " + vrpLogic); } @@ -122,12 +122,11 @@ protected void scheduleResource() { scheduledPlans.add(auxiliaryCarrier.getSelectedPlan()); switch (CarrierSchedulerUtils.getVrpLogic(carrier)) { - case serviceBased -> { carrier.getServices().putAll(auxiliaryCarrier.getServices()); } - case shipmentBased -> { carrier.getShipments().putAll(auxiliaryCarrier.getShipments()); - //TODO: When using shipmentbased, only ONE Vrp should be created and solved. -> No need for the auxiliary carrier(s). KMT'Aug 24 - //Then we can also just pass all the vehicles over :) - //And need the TimeWindows for the Shipments... - } + case serviceBased -> carrier.getServices().putAll(auxiliaryCarrier.getServices()); + case shipmentBased -> //TODO: When using shipmentbased, only ONE Vrp should be created and solved. -> No need for the auxiliary carrier(s). KMT'Aug 24 + //Then we can also just pass all the vehicles over :) + //And need the TimeWindows for the Shipments... + carrier.getShipments().putAll(auxiliaryCarrier.getShipments()); default -> throw new IllegalStateException("Unexpected value: " + CarrierSchedulerUtils.getVrpLogic(carrier)); } shipmentsInCurrentTour.clear(); @@ -436,12 +435,8 @@ private void addDistributionServiceEventHandler( if (element.getIncomingShipments().getLspShipmentsWTime().contains(lspShipment)) { DistributionServiceStartEventHandler handler; switch (tourActivity) { - case Tour.ServiceActivity serviceActivity-> { - handler = new DistributionServiceStartEventHandler(serviceActivity.getService(), lspShipment, element, resource, null); - } - case Tour.ShipmentBasedActivity shipmentBasedActivity-> { - handler = new DistributionServiceStartEventHandler(null, lspShipment, element, resource, shipmentBasedActivity.getShipment()); - } + case Tour.ServiceActivity serviceActivity-> handler = new DistributionServiceStartEventHandler(serviceActivity.getService(), lspShipment, element, resource, null); + case Tour.ShipmentBasedActivity shipmentBasedActivity-> handler = new DistributionServiceStartEventHandler(null, lspShipment, element, resource, shipmentBasedActivity.getShipment()); default -> throw new IllegalStateException("Unexpected value: " + tourActivity); } @@ -461,12 +456,8 @@ private void addDistributionTourStartEventHandler( if (element.getIncomingShipments().getLspShipmentsWTime().contains(lspShipment)) { LSPTourStartEventHandler handler; switch (tourActivity) { - case Tour.ServiceActivity serviceActivity-> { - handler = new LSPTourStartEventHandler(lspShipment, serviceActivity.getService(), element, resource, tour, null); - } - case Tour.ShipmentBasedActivity shipmentBasedActivity-> { - handler = new LSPTourStartEventHandler(lspShipment, null , element, resource, tour, shipmentBasedActivity.getShipment()); - } + case Tour.ServiceActivity serviceActivity-> handler = new LSPTourStartEventHandler(lspShipment, serviceActivity.getService(), element, resource, tour, null); + case Tour.ShipmentBasedActivity shipmentBasedActivity-> handler = new LSPTourStartEventHandler(lspShipment, null , element, resource, tour, shipmentBasedActivity.getShipment()); default -> throw new IllegalStateException("Unexpected value: " + tourActivity); } From 3882734f72e671371b838ef9a9c645e8f17c13bf Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:29:34 +0100 Subject: [PATCH 33/51] inline local variable --- .../freight/carriers/usecases/analysis/LegHistogram.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java index 1954eff762e..2a1400a6564 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/LegHistogram.java @@ -391,8 +391,7 @@ private int getBinIndex(final double time) { private ModeData getDataForMode(final String legMode) { // +1 for all times out of our range - ModeData modeData = this.data.computeIfAbsent(legMode, k -> new ModeData(this.nofBins + 1)); - return modeData; + return this.data.computeIfAbsent(legMode, k -> new ModeData(this.nofBins + 1)); } private static class ModeData { From ed0e9eda280352d021901643dec50ba3de607bad Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:31:34 +0100 Subject: [PATCH 34/51] make final --- .../matsim/freight/carriers/analysis/CarrierLoadAnalysis.java | 2 +- .../matsim/freight/carriers/analysis/CarrierPlanAnalysis.java | 2 +- .../resourceImplementations/CollectionCarrierScheduler.java | 2 +- .../resourceImplementations/DistributionCarrierScheduler.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java index 37a4651ce7e..3e3bdc47283 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java @@ -51,7 +51,7 @@ public class CarrierLoadAnalysis implements CarrierShipmentPickupStartEventHandl private static final Logger log = LogManager.getLogger(CarrierLoadAnalysis.class); private final String delimiter; - Carriers carriers; + final Carriers carriers; private final Map, LinkedList> vehicle2Load = new LinkedHashMap<>(); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java index 610c376a5db..362dfaf8793 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierPlanAnalysis.java @@ -54,7 +54,7 @@ public class CarrierPlanAnalysis { private static final Logger log = LogManager.getLogger(CarrierPlanAnalysis.class); public final String delimiter; - Carriers carriers; + final Carriers carriers; public CarrierPlanAnalysis(String delimiter, Carriers carriers) { this.delimiter = delimiter; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java index 0534d285f7c..d91bf1c94f5 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/CollectionCarrierScheduler.java @@ -44,7 +44,7 @@ */ /*package-private*/ class CollectionCarrierScheduler extends LSPResourceScheduler { - Logger log = LogManager.getLogger(CollectionCarrierScheduler.class); + private static final Logger log = LogManager.getLogger(CollectionCarrierScheduler.class); private Carrier carrier; private CollectionCarrierResource resource; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java index a754612a027..90abf00ea67 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/DistributionCarrierScheduler.java @@ -48,7 +48,7 @@ */ /*package-private*/ class DistributionCarrierScheduler extends LSPResourceScheduler { - Logger log = LogManager.getLogger(DistributionCarrierScheduler.class); + private static final Logger log = LogManager.getLogger(DistributionCarrierScheduler.class); private Carrier carrier; private DistributionCarrierResource resource; From 6258a0be1f5fff4a0bae71c19ebd86fcd132b4e7 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:33:05 +0100 Subject: [PATCH 35/51] return void --- .../src/main/java/org/matsim/freight/logistics/LSPPlan.java | 2 +- .../main/java/org/matsim/freight/logistics/LSPPlanImpl.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlan.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlan.java index c6c3d48d4f2..7f7d3823866 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlan.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlan.java @@ -51,7 +51,7 @@ public interface LSPPlan extends BasicPlan, KnowsLSP { Collection getShipmentPlans(); - LSPPlan addShipmentPlan(LspShipmentPlan lspShipmentPlan); + void addShipmentPlan(LspShipmentPlan lspShipmentPlan); String getType(); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlanImpl.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlanImpl.java index a1bfe4e25cc..84a698a5edd 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlanImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPPlanImpl.java @@ -67,9 +67,8 @@ public Collection getShipmentPlans() { } @Override - public LSPPlan addShipmentPlan(LspShipmentPlan lspShipmentPlan) { + public void addShipmentPlan(LspShipmentPlan lspShipmentPlan) { this.lspShipmentPlans.add(lspShipmentPlan); - return null; } @Override From 407bd18a7653c5e955195dd4064046f4609cc957 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:33:50 +0100 Subject: [PATCH 36/51] rm not needed throw declarations --- .../org/matsim/freight/logistics/io/LSPPlanXmlWriter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/io/LSPPlanXmlWriter.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/io/LSPPlanXmlWriter.java index 2c97a9ae99e..c997b5a35d2 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/io/LSPPlanXmlWriter.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/io/LSPPlanXmlWriter.java @@ -94,11 +94,11 @@ private void writeRootElement() throws IOException { this.writer.write(NL); } - private void startLSP(LSP lsp) throws IOException { + private void startLSP(LSP lsp) { this.writeStartTag(LSP, List.of(createTuple(ID, lsp.getId().toString()))); } - private void writeResources(LSP lsp) throws IOException { + private void writeResources(LSP lsp) { if (lsp.getResources().isEmpty()) return; this.writeStartTag(RESOURCES, null); for (LSPResource resource : lsp.getResources()) { @@ -127,7 +127,7 @@ private void writeResources(LSP lsp) throws IOException { this.writeEndTag(RESOURCES); } - private void writeShipments(LSP lsp) throws IOException { + private void writeShipments(LSP lsp) { if (lsp.getLspShipments().isEmpty()) return; this.writeStartTag(SHIPMENTS, null); for (LspShipment lspShipment : lsp.getLspShipments()) { @@ -149,7 +149,7 @@ private void writeShipments(LSP lsp) throws IOException { this.writeEndTag(SHIPMENTS); } - private void writePlans(LSP lsp, BufferedWriter writer) throws IOException { + private void writePlans(LSP lsp, BufferedWriter writer) { if (lsp.getPlans().isEmpty()) return; this.writeStartTag(LSP_PLANS, null); From 56cc42b496a286f01c59eef04c18a13df48b04a8 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:35:12 +0100 Subject: [PATCH 37/51] correct order --- .../logistics/adapterTests/CollectionResourceTest.java | 2 +- .../logistics/adapterTests/DistributionResourceTest.java | 2 +- .../freight/logistics/adapterTests/MainRunResourceTest.java | 2 +- .../resourceImplementations/FirstReloadResourceTest.java | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/CollectionResourceTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/CollectionResourceTest.java index 5d1d12abe8e..b7c0966e53d 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/CollectionResourceTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/CollectionResourceTest.java @@ -108,7 +108,7 @@ public void testCollectionResource() { assertTrue(collectionCarrier.getServices().isEmpty()); assertTrue(collectionCarrier.getShipments().isEmpty()); if (collectionCarrier.getCarrierCapabilities() == capabilities) { - assertSame(capabilities.getFleetSize(), FleetSize.INFINITE); + assertSame(FleetSize.INFINITE, capabilities.getFleetSize()); assertFalse(capabilities.getVehicleTypes().isEmpty()); ArrayList types = new ArrayList<>(capabilities.getVehicleTypes()); if (types.size() == 1) { diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/DistributionResourceTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/DistributionResourceTest.java index a5b2bf9a8c9..4c4456bd9bc 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/DistributionResourceTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/DistributionResourceTest.java @@ -110,7 +110,7 @@ public void testCollectionResource() { assertTrue(distributionCarrier.getServices().isEmpty()); assertTrue(distributionCarrier.getShipments().isEmpty()); if (distributionCarrier.getCarrierCapabilities() == capabilities) { - assertSame(capabilities.getFleetSize(), FleetSize.INFINITE); + assertSame(FleetSize.INFINITE, capabilities.getFleetSize()); assertFalse(capabilities.getVehicleTypes().isEmpty()); ArrayList types = new ArrayList<>(capabilities.getVehicleTypes()); if (types.size() == 1) { diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/MainRunResourceTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/MainRunResourceTest.java index 24eec24bc2f..06b2c79e66e 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/MainRunResourceTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/adapterTests/MainRunResourceTest.java @@ -108,7 +108,7 @@ public void testMainRunResource() { assertTrue(carrier.getServices().isEmpty()); assertTrue(carrier.getShipments().isEmpty()); if (carrier.getCarrierCapabilities() == capabilities) { - assertSame(capabilities.getFleetSize(), FleetSize.INFINITE); + assertSame(FleetSize.INFINITE, capabilities.getFleetSize()); assertFalse(capabilities.getVehicleTypes().isEmpty()); ArrayList types = new ArrayList<>(capabilities.getVehicleTypes()); if (types.size() == 1) { diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/resourceImplementations/FirstReloadResourceTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/resourceImplementations/FirstReloadResourceTest.java index d69105472f6..b98bb40a884 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/resourceImplementations/FirstReloadResourceTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/resourceImplementations/FirstReloadResourceTest.java @@ -56,8 +56,8 @@ public void TranshipmentHubTest() { // assertSame(TranshipmentHub.getClassOfResource(), TranshipmentHub.class); assertNotNull(transshipmentHubResource.getClientElements()); assertTrue(transshipmentHubResource.getClientElements().isEmpty()); - assertSame(transshipmentHubResource.getEndLinkId(), hubLinkId); - assertSame(transshipmentHubResource.getStartLinkId(), hubLinkId); + assertSame(hubLinkId, transshipmentHubResource.getEndLinkId()); + assertSame(hubLinkId, transshipmentHubResource.getStartLinkId()); assertNotNull(transshipmentHubResource.getSimulationTrackers()); assertFalse(transshipmentHubResource.getSimulationTrackers().isEmpty()); assertEquals(1, transshipmentHubResource.getSimulationTrackers().size()); From ed965529bf33f34fdefc111cc184ad6f1470dda4 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:40:07 +0100 Subject: [PATCH 38/51] check for null --- .../matsim/freight/carriers/analysis/CarrierLoadAnalysis.java | 2 +- .../matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java | 2 ++ .../java/org/matsim/freight/carriers/CarriersUtilsTest.java | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java index 3e3bdc47283..760ce513035 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/CarrierLoadAnalysis.java @@ -104,7 +104,7 @@ void writeLoadPerVehicle(String analysisOutputDirectory, Scenario scenario) thro for (Id vehicleId : vehicle2Load.keySet()) { final LinkedList load = vehicle2Load.get(vehicleId); - final Integer maxLoad = load.stream().max(Comparator.naturalOrder()).get(); + final Integer maxLoad = load.stream().max(Comparator.naturalOrder()).orElseThrow(); final VehicleType vehicleType = VehicleUtils.findVehicle(vehicleId, scenario).getType(); final Double capacity = vehicleType.getCapacity().getOther(); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java index 64ea88b6e93..8a8b30b9a0a 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierVehicleTypeLoaderTest.java @@ -53,6 +53,7 @@ void test_whenLoadingTypes_allAssignmentsInLightVehicleAreCorrectly(){ Carrier testCarrier = carriers.getCarriers().get(Id.create("testCarrier", Carrier.class)); CarrierVehicle v = CarriersUtils.getCarrierVehicle(testCarrier,Id.createVehicleId("lightVehicle")); + assert v != null; VehicleType vehicleTypeLoaded = v.getType(); Assertions.assertNotNull(vehicleTypeLoaded); @@ -72,6 +73,7 @@ void test_whenLoadingTypes_allAssignmentsInMediumVehicleAreCorrectly(){ Carrier testCarrier = carriers.getCarriers().get(Id.create("testCarrier", Carrier.class)); CarrierVehicle v = CarriersUtils.getCarrierVehicle(testCarrier,Id.createVehicleId("mediumVehicle")); + assert v != null; VehicleType vehicleTypeLoaded = v.getType(); Assertions.assertNotNull(vehicleTypeLoaded); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java index 70892f49e51..b1525aa604c 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java @@ -57,6 +57,7 @@ void testAddAndGetVehicleToCarrier() { //get Vehicle CarrierVehicle carrierVehicle1 = CarriersUtils.getCarrierVehicle(carrier, testVehicleId ); + assert carrierVehicle1 != null; Assertions.assertEquals(testVehicleId, carrierVehicle1.getId()); Assertions.assertEquals(vehicleType, carrierVehicle1.getType()); Assertions.assertEquals(Id.createLinkId("link0"), carrierVehicle1.getLinkId() ); @@ -78,6 +79,7 @@ void testAddAndGetServiceToCarrier() { //get Service CarrierService cs1b = CarriersUtils.getService(carrier, serviceId ); + assert cs1b != null; Assertions.assertEquals(serviceId, cs1b.getId()); Assertions.assertEquals(service1.getId(), cs1b.getId()); Assertions.assertEquals(Id.createLinkId("link0"), cs1b.getLocationLinkId()); @@ -99,6 +101,7 @@ void testAddAndGetShipmentToCarrier() { //get Shipment CarrierShipment carrierShipment1b = CarriersUtils.getShipment(carrier, shipmentId ); + assert carrierShipment1b != null; Assertions.assertEquals(shipmentId, carrierShipment1b.getId()); Assertions.assertEquals(service1.getId(), carrierShipment1b.getId()); Assertions.assertEquals(Id.createLinkId("link0"), carrierShipment1b.getFrom()); From ed5f983b39fe0fafb04e5322d2ae621e8a3222b5 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:40:44 +0100 Subject: [PATCH 39/51] rm redundant initializer --- .../EventBasedCarrierScorer4MultipleChainsInclToll.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java index 292c95e72c2..b45a151a19e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChainsInclToll.java @@ -139,7 +139,7 @@ private void handleEvent(LinkEnterEvent event) { // scores tolls for vehicles driving on tolled links private void handleEvent(PersonMoneyEvent event) { - double tollValue = 0; + double tollValue; if (event.getPurpose().equals("toll")) { Id vehicleId = d2v.getVehicleOfDriver(event.getPersonId()); From 3fe59a082edbc70071c0f5af6a7103f1897627ce Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:42:37 +0100 Subject: [PATCH 40/51] rm redundant casts --- .../analysis/RunFreightAnalysisEventBased.java | 2 +- .../CarrierScoringFunctionFactoryImpl.java | 4 +--- .../DistanceConstraintFromVehiclesFileTest.java | 4 ++-- .../carriers/jsprit/DistanceConstraintTest.java | 4 ++-- .../mobsim/ScoringFunctionFactoryForTests.java | 4 +--- .../simulationTrackers/CollectionTrackerTest.java | 12 ++++++------ 6 files changed, 13 insertions(+), 17 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java index d6a01e09409..776a1054a03 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java @@ -135,7 +135,7 @@ private void createScenarioForFreightAnalysis(String vehiclesPath, String networ //freight settings FreightCarriersConfigGroup freightCarriersConfigGroup = ConfigUtils.addOrGetModule(config, FreightCarriersConfigGroup.class); freightCarriersConfigGroup.setCarriersFile(carriersPath); - freightCarriersConfigGroup.setCarriersVehicleTypesFile(carriersVehicleTypesPath.toString()); + freightCarriersConfigGroup.setCarriersVehicleTypesFile(carriersVehicleTypesPath); scenario = ScenarioUtils.loadScenario(config); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java index ee2b54c9399..8b61af1efdc 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/chessboard/CarrierScoringFunctionFactoryImpl.java @@ -186,9 +186,7 @@ public void handleLeg(Leg leg) { Id vehicleId = nRoute.getVehicleId(); CarrierVehicle vehicle = CarriersUtils.getCarrierVehicle(carrier, vehicleId); Gbl.assertNotNull(vehicle); - if(!employedVehicles.contains(vehicle)){ - employedVehicles.add(vehicle); - } + employedVehicles.add(vehicle); double distance = 0.0; if(leg.getRoute() instanceof NetworkRoute){ Link startLink = network.getLinks().get(leg.getRoute().getStartLinkId()); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java index b9c2cbaa909..74fc478bd16 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java @@ -117,8 +117,8 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru VehicleType vehicleType_SmallV1 = vehicleTypes.getVehicleTypes().get(Id.create("SmallBattery_V1", VehicleType.class)); VehicleType vehicleType_LargeV1 = vehicleTypes.getVehicleTypes().get(Id.create("LargeBattery_V1", VehicleType.class)); - Assertions.assertEquals(vehicleType_SmallV1.getId(), ((Vehicle) carrierV1.getSelectedPlan().getScheduledTours().iterator().next() - .getVehicle()).getType().getId()); + Assertions.assertEquals(vehicleType_SmallV1.getId(), carrierV1.getSelectedPlan().getScheduledTours().iterator().next() + .getVehicle().getType().getId()); double maxDistance_vehicleType_LargeV1 = VehicleUtils.getEnergyCapacity(vehicleType_LargeV1.getEngineInformation()) / VehicleUtils.getEnergyConsumptionKWhPerMeter(vehicleType_LargeV1.getEngineInformation()); double maxDistance_vehicleType_SmallV1 = VehicleUtils.getEnergyCapacity(vehicleType_SmallV1.getEngineInformation()) diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java index 6df599915f9..9fba60fad08 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java @@ -124,8 +124,8 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru carrierV1.getSelectedPlan().getScheduledTours().size(), "Not the correct amout of scheduled tours"); - Assertions.assertEquals(vehicleType_SmallV1.getId(), ((Vehicle) carrierV1.getSelectedPlan().getScheduledTours().iterator().next() - .getVehicle()).getType().getId()); + Assertions.assertEquals(vehicleType_SmallV1.getId(), carrierV1.getSelectedPlan().getScheduledTours().iterator().next() + .getVehicle().getType().getId()); double maxDistance_vehicleType_LargeV1 = VehicleUtils.getEnergyCapacity(vehicleType_LargeV1.getEngineInformation()) / VehicleUtils.getEnergyConsumptionKWhPerMeter(vehicleType_LargeV1.getEngineInformation()); double maxDistance_vehicleType_SmallV1 = VehicleUtils.getEnergyCapacity(vehicleType_SmallV1.getEngineInformation()) diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java index 09b4a35a59a..e529b690fd4 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/ScoringFunctionFactoryForTests.java @@ -92,9 +92,7 @@ public void endLeg(double time) { Id vehicleId = nRoute.getVehicleId(); CarrierVehicle vehicle = CarriersUtils.getCarrierVehicle(carrier, vehicleId); Gbl.assertNotNull(vehicle); - if(!employedVehicles.contains(vehicle)){ - employedVehicles.add(vehicle); - } + employedVehicles.add(vehicle); double distance = 0.0; if(currentLeg.getRoute() instanceof NetworkRoute){ distance += network.getLinks().get(currentLeg.getRoute().getStartLinkId()).getLength(); diff --git a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java index 47dac541f34..e72394b24ea 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/logistics/examples/simulationTrackers/CollectionTrackerTest.java @@ -221,7 +221,7 @@ public void testCollectionTracker() { if (handler instanceof TourStartHandler startHandler) { double scheduledCosts = 0; for (ScheduledTour scheduledTour : carrier.getSelectedPlan().getScheduledTours()) { - scheduledCosts += ((Vehicle) scheduledTour.getVehicle()).getType().getCostInformation().getFixedCosts(); + scheduledCosts += scheduledTour.getVehicle().getType().getCostInformation().getFixedCosts(); totalScheduledCosts += scheduledCosts; } double trackedCosts = startHandler.getVehicleFixedCosts(); @@ -236,7 +236,7 @@ public void testCollectionTracker() { Tour tour = scheduledTour.getTour(); for (TourElement element : tour.getTourElements()) { if (element instanceof ServiceActivity activity) { - scheduledCosts += activity.getService().getServiceDuration() * ((Vehicle) scheduledTour.getVehicle()).getType().getCostInformation().getCostsPerSecond(); + scheduledCosts += activity.getService().getServiceDuration() * scheduledTour.getVehicle().getType().getCostInformation().getCostsPerSecond(); totalScheduledCosts += scheduledCosts; totalScheduledWeight += activity.getService().getCapacityDemand(); totalNumberOfScheduledShipments++; @@ -255,7 +255,7 @@ public void testCollectionTracker() { Tour tour = scheduledTour.getTour(); for (TourElement element : tour.getTourElements()) { if (element instanceof Leg leg) { - scheduledTimeCosts += leg.getExpectedTransportTime() * ((Vehicle) scheduledTour.getVehicle()).getType().getCostInformation().getCostsPerSecond(); + scheduledTimeCosts += leg.getExpectedTransportTime() * scheduledTour.getVehicle().getType().getCostInformation().getCostsPerSecond(); } } } @@ -266,17 +266,17 @@ public void testCollectionTracker() { double trackedDistanceCosts = distanceHandler.getDistanceCosts(); totalTrackedCosts += trackedDistanceCosts; for (ScheduledTour scheduledTour : carrier.getSelectedPlan().getScheduledTours()) { - scheduledDistanceCosts += network.getLinks().get(scheduledTour.getTour().getEndLinkId()).getLength() * ((Vehicle) scheduledTour.getVehicle()).getType().getCostInformation().getCostsPerMeter(); + scheduledDistanceCosts += network.getLinks().get(scheduledTour.getTour().getEndLinkId()).getLength() * scheduledTour.getVehicle().getType().getCostInformation().getCostsPerMeter(); for (TourElement element : scheduledTour.getTour().getTourElements()) { System.out.println(element); if (element instanceof Leg leg) { NetworkRoute linkRoute = (NetworkRoute) leg.getRoute(); for (Id linkId : linkRoute.getLinkIds()) { - scheduledDistanceCosts += network.getLinks().get(linkId).getLength() * ((Vehicle) scheduledTour.getVehicle()).getType().getCostInformation().getCostsPerMeter(); + scheduledDistanceCosts += network.getLinks().get(linkId).getLength() * scheduledTour.getVehicle().getType().getCostInformation().getCostsPerMeter(); } } if (element instanceof ServiceActivity activity) { - scheduledDistanceCosts += network.getLinks().get(activity.getLocation()).getLength() * ((Vehicle) scheduledTour.getVehicle()).getType().getCostInformation().getCostsPerMeter(); + scheduledDistanceCosts += network.getLinks().get(activity.getLocation()).getLength() * scheduledTour.getVehicle().getType().getCostInformation().getCostsPerMeter(); // (I think that we need this since the last link is not in the route. Or is it? kai, jul'22) // (yy I do not understand why we do not need to do this for the end activity of the tour.) } From f74e486560b41b708b398fc9fb45a0118827f0cb Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:49:12 +0100 Subject: [PATCH 41/51] java doc improvements --- .../org/matsim/freight/carriers/CarrierPlan.java | 1 - .../matsim/freight/carriers/CarrierShipment.java | 4 ++-- .../events/CarrierTourStartEventCreator.java | 6 +++--- .../carriers/jsprit/VRPTransportCosts.java | 2 +- .../usecases/analysis/CarrierScoreStats.java | 1 - .../logistics/events/AbstractLogisticEvent.java | 2 +- .../examples/lspReplanning/package-info.java | 2 +- .../DistanceConstraintFromVehiclesFileTest.java | 9 +-------- .../carriers/jsprit/DistanceConstraintTest.java | 16 ++++------------ 9 files changed, 13 insertions(+), 30 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java index e1f56c19d4a..eed09f1b42b 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierPlan.java @@ -69,7 +69,6 @@ public Double getScore() { /** * In future (starting in May'23) this is the score from the MATSim scoring function. * The jsprit score is saved in attribute. Please use the method setJspritScore() to store it. - * @return the (MATSim) score */ @Override public void setScore(Double score) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java index b378db94620..01c8b873e70 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierShipment.java @@ -47,7 +47,7 @@ public final class CarrierShipment implements CarrierJob { public static class Builder { /** - * @Deprecated Please use Builder newInstance(Id id, Id from, Id to, int size) instead. + * @deprecated Please use Builder newInstance(Id id, Id from, Id to, int size) instead. *

* Returns a new shipment builder. * @@ -90,7 +90,7 @@ public static Builder newInstance(Id id, Id from, Id id, Id from, Id to, int size) instead. + * @deprecated Please use Builder (Id id, Id from, Id to, int size) instead. */ @Deprecated public Builder(Id from, Id to, int size) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java index fea34b4f577..6a29c022aae 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/events/CarrierTourStartEventCreator.java @@ -68,9 +68,9 @@ public Event createEvent(Event event, Carrier carrier, Activity activity, Schedu /** * Creating the FreightTourStartsEvent * - * @param personId - * @param carrier - * @param scheduledTour + * @param personId id of the driver (person) + * @param carrier the carrier + * @param scheduledTour the scheduledTour * @return CarrierTourStartEvent */ private CarrierTourStartEvent createFreightTourStartsEvent(Id personId, Carrier carrier, ScheduledTour scheduledTour) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VRPTransportCosts.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VRPTransportCosts.java index d831d329fc9..240c16adf7c 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VRPTransportCosts.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/VRPTransportCosts.java @@ -27,7 +27,7 @@ import org.matsim.core.router.util.TravelTime; /** - * @author: Steffen Axer + * @author Steffen Axer */ public interface VRPTransportCosts extends VehicleRoutingTransportCosts { LeastCostPathCalculator getRouter(); diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java index ab4fa18632f..8578c0a91b9 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/usecases/analysis/CarrierScoreStats.java @@ -80,7 +80,6 @@ public class CarrierScoreStats implements StartupListener, IterationEndsListener * * @param filename including the path, excluding the file type extension * @param createPNG true if in every iteration, the scorestats should be visualized in a graph and written to disk. - * @throws UncheckedIOException */ public CarrierScoreStats(Carriers carriers, final String filename, final boolean createPNG) throws UncheckedIOException { this.carriers = carriers; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/events/AbstractLogisticEvent.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/events/AbstractLogisticEvent.java index fd9791a6831..452ef06ff43 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/events/AbstractLogisticEvent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/events/AbstractLogisticEvent.java @@ -41,7 +41,7 @@ public final Id getLinkId() { } /** - * Adds the {@link Id< LspShipment >} to the list of attributes. {@link Id} is handled by + * Adds the {@link Id} to the list of attributes. {@link Id} is handled by * superclass {@link Event} * * @return The map of attributes diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspReplanning/package-info.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspReplanning/package-info.java index 3a42f344ada..5d554e99a82 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspReplanning/package-info.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/lspReplanning/package-info.java @@ -27,7 +27,7 @@ * This class here is in contrast used as a Replanning strategy. This behavior is not wanted anymore. *

* Please use the new approach as shown in - * {@link org.matsim.freight.logistics.example.lsp.multipleChains} ExampleMultipleOneEchelonChainsReplanning instead. + * {@link org.matsim.freight.logistics.examples.multipleChains} ExampleMultipleOneEchelonChainsReplanning instead. * ((The old approach is still available in CollectionLSPReplanningTest but will get removed earlier or later)). *

* KMT, Jul'24 diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java index 74fc478bd16..5fbecd0d3b9 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java @@ -53,7 +53,7 @@ /** * * @author rewert, kturner - * + *

* Test for the distance constraint. 4 different setups are used to control the * correct working of the constraint * @@ -452,8 +452,6 @@ private static Carrier addThreeServicesToCarrier(Carrier carrier) { /** * Creates the vehicle at the depot, ads this vehicle to the carriers and sets * the capabilities. Sets TimeWindow for the carriers. - * - * @param */ private static void createCarriers(Carriers carriers, FleetSize fleetSize, Carrier singleCarrier, CarrierVehicleTypes vehicleTypes) { @@ -473,8 +471,6 @@ private static void createCarriers(Carriers carriers, FleetSize fleetSize, Carri /** * Method for creating a new carrierVehicle * - * @param - * * @return new carrierVehicle at the depot */ static CarrierVehicle createGarbageTruck(String vehicleName, double earliestStartingTime, @@ -487,9 +483,6 @@ static CarrierVehicle createGarbageTruck(String vehicleName, double earliestStar /** * Defines and sets the Capabilities of the Carrier, including the vehicleTypes * for the carriers - * - * @param - * */ private static void defineCarriers(Carriers carriers, FleetSize fleetSize, Carrier singleCarrier, List vehicles, CarrierVehicleTypes vehicleTypes) { diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java index 9fba60fad08..cc17a82ff11 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java @@ -53,10 +53,10 @@ /** * * @author rewert, kturner - * + *

* Test for the distance constraint. 4 different setups are used to control the * correct working of the constraint for services - * + *

* 2 additional setups are defined when using shipments instead of service. * Shipments allow reloading of good during the tour. * @@ -435,7 +435,7 @@ else if (thisTypeId.equals("DieselVehicle")) * This test uses shipments instead of service . * As a consequence the vehicles can return to the depot, load more goods and run another subtour. * Distance is set to a value that, due to distance restrictions, two tours are necessary. - * + *

* This option (5) is designed similar to option 2 * */ @@ -515,7 +515,7 @@ final void CarrierWithShipmentsMidSizeBatteryTest_Version5() throws ExecutionExc * This test uses shipments instead of service . * As a consequence the vehicles can return to the depot, load more goods and run another subtour. * Distance is set to a value that one tour can be run with loading once. - * + *

* This option (6) is designed similar to option 5 * */ @@ -663,8 +663,6 @@ private static Carrier addThreeServicesToCarrier(Carrier carrier) { /** * Creates the vehicle at the depot, ads this vehicle to the carriers and sets * the capabilities. Sets TimeWindow for the carriers. - * - * @param */ private static void createCarriers(Carriers carriers, FleetSize fleetSize, Carrier singleCarrier, CarrierVehicleTypes vehicleTypes) { @@ -683,9 +681,6 @@ private static void createCarriers(Carriers carriers, FleetSize fleetSize, Carri /** * Method for creating a new carrierVehicle - * - * @param - * * @return new carrierVehicle at the depot */ static CarrierVehicle createCarrierVehicle(String vehicleName, double earliestStartingTime, @@ -698,9 +693,6 @@ static CarrierVehicle createCarrierVehicle(String vehicleName, double earliestSt /** * Defines and sets the Capabilities of the Carrier, including the vehicleTypes * for the carriers - * - * @param - * */ private static void defineCarriers(Carriers carriers, FleetSize fleetSize, Carrier singleCarrier, List vehicles, CarrierVehicleTypes vehicleTypes) { From caa677fe51d3fd8f47c9a8d38807ff40ee5d3408 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:49:56 +0100 Subject: [PATCH 42/51] logging improvements --- .../analysis/LspScoreStatsControlerListener.java | 8 ++++---- .../examples/initialPlans/MyEventBasedCarrierScorer.java | 2 +- .../EventBasedCarrierScorer4MultipleChains.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java index 2a687b82f0f..3a868d449d3 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java @@ -154,10 +154,10 @@ private void collectScoreInfo(final IterationEndsEvent event) { } - log.info("-- avg. score of the executed plan of each agent: " + (info.sumExecutedScores / info.nofExecutedScores)); - log.info("-- avg. score of the worst plan of each agent: " + (info.sumScoreWorst / info.nofScoreWorst)); - log.info("-- avg. of the avg. plan score per agent: " + (info.sumAvgScores / info.nofAvgScores)); - log.info("-- avg. score of the best plan of each agent: " + (info.sumScoreBest / info.nofScoreBest)); + log.info("-- avg. score of the executed plan of each agent: {}", info.sumExecutedScores / info.nofExecutedScores); + log.info("-- avg. score of the worst plan of each agent: {}", info.sumScoreWorst / info.nofScoreWorst); + log.info("-- avg. of the avg. plan score per agent: {}", info.sumAvgScores / info.nofAvgScores); + log.info("-- avg. score of the best plan of each agent: {}", info.sumScoreBest / info.nofScoreBest); try { info.write(event.getIteration(), this.out, this.delimiter); diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java index 846ecf3b5fe..ec67c2895f6 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/MyEventBasedCarrierScorer.java @@ -171,7 +171,7 @@ private void handleEvent(LinkEnterEvent event) { */ class LinkBasedTollScoring implements SumScoringFunction.ArbitraryEventScoring { - final Logger log = LogManager.getLogger(EventBasedScoring.class); + final Logger log = LogManager.getLogger(LinkBasedTollScoring.class); private final double toll; private final List vehicleTypesToBeTolled; diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java index fadb9e313ff..9cd649ae127 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/multipleChains/EventBasedCarrierScorer4MultipleChains.java @@ -148,7 +148,7 @@ private void handleEvent(LinkEnterEvent event) { */ class LinkBasedTollScoring implements SumScoringFunction.ArbitraryEventScoring { - final Logger log = LogManager.getLogger(EventBasedScoring.class); + final Logger log = LogManager.getLogger(LinkBasedTollScoring.class); private final double toll; private final List vehicleTypesToBeTolled; From 28326df377303baceae796802946de62c9364d8f Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:51:52 +0100 Subject: [PATCH 43/51] extract variable --- .../analysis/RunFreightAnalysisEventBased.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java index 776a1054a03..0502ae2e1c4 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/RunFreightAnalysisEventBased.java @@ -82,11 +82,12 @@ public RunFreightAnalysisEventBased(String simOutputPath, String analysisOutputP // the better version with the globFile method is not available since there is a circular dependency between the modules application and freight - this.EVENTS_PATH = Path.of(simOutputPath).resolve("output_events.xml.gz").toString(); - String vehiclesPath = Path.of(simOutputPath).resolve("output_allVehicles.xml.gz").toString(); - String networkPath = Path.of(simOutputPath).resolve("output_network.xml.gz").toString(); - String carriersPath = Path.of(simOutputPath).resolve("output_carriers.xml.gz").toString(); - String carriersVehicleTypesPath = Path.of(simOutputPath).resolve("output_carriersVehicleTypes.xml.gz").toString(); + final Path path = Path.of(simOutputPath); + this.EVENTS_PATH = path.resolve("output_events.xml.gz").toString(); + String vehiclesPath = path.resolve("output_allVehicles.xml.gz").toString(); + String networkPath = path.resolve("output_network.xml.gz").toString(); + String carriersPath = path.resolve("output_carriers.xml.gz").toString(); + String carriersVehicleTypesPath = path.resolve("output_carriersVehicleTypes.xml.gz").toString(); createScenarioForFreightAnalysis(vehiclesPath, networkPath, carriersPath, carriersVehicleTypesPath, globalCrs); } From a6b45c12ec63cafe5f679d82cbd153308c78d00e Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 15:58:11 +0100 Subject: [PATCH 44/51] language/grammar improvement --- .../org/matsim/freight/carriers/CarrierVehicleType.java | 8 ++++---- .../freight/carriers/controller/CarrierDriverAgent.java | 2 +- .../carriers/jsprit/NetworkBasedTransportCosts.java | 4 ++-- .../logistics/analysis/Driver2VehicleEventHandler.java | 2 +- .../ExampleSchedulingOfTransportChainHubsVsDirect.java | 2 +- .../simulationTrackers/DistanceAndTimeHandler.java | 2 +- .../jsprit/DistanceConstraintFromVehiclesFileTest.java | 6 +++--- .../freight/carriers/jsprit/DistanceConstraintTest.java | 6 +++--- .../mobsim/DistanceScoringFunctionFactoryForTests.java | 2 +- .../freight/carriers/utils/CarrierControllerUtilsIT.java | 2 +- .../carriers/utils/CarrierControllerUtilsTest.java | 4 ++-- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java index 7033a3454d7..2983b859043 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierVehicleType.java @@ -28,7 +28,7 @@ /** * The carrier vehicle type. *

- * I decided to put vehicle cost information into the type (which is indeed not a physical attribute of the type). Thus physical and + * I decided to put vehicle cost information into the type (which is indeed not a physical attribute of the type). Thus, physical and * non-physical attributes are used. This is likely to be changed in the future. * * @author sschroeder @@ -71,7 +71,7 @@ private Builder(Id typeId){ /** * Sets fixed costs of vehicle. * - *

By default it is 0. + *

By default, it is 0. * @param fix fixed costs * @return this builder */ @@ -83,7 +83,7 @@ public Builder setFixCost(double fix){ /** * Sets costs per distance-unit. * - *

By default it is 1. + *

By default, it is 1. * * @param perDistanceUnit costs per distance-unit * @return this builder @@ -96,7 +96,7 @@ public Builder setCostPerDistanceUnit(double perDistanceUnit){ /** * Sets costs per time-unit. * - *

By default it is 0. + *

By default, it is 0. * * @param perTimeUnit costs per time-unit * @return this builder diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java index ba8e40e3d71..50474242a92 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controller/CarrierDriverAgent.java @@ -264,7 +264,7 @@ else if( index < elementsSize ){ * Basic event handler that collects the relation between vehicles and drivers. * Necessary since link enter and leave events do not contain the driver anymore. *

- * This is the vice-versa implementation of {@link org.matsim.core.events.algorithms.Vehicle2DriverEventHandler}. + * This is the vice versa implementation of {@link org.matsim.core.events.algorithms.Vehicle2DriverEventHandler}. *

* In a first step only used internally. When needed more often, I have nothing against putting it more central. * diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java index 73769efe064..c97243d50fe 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/jsprit/NetworkBasedTransportCosts.java @@ -56,7 +56,7 @@ * *

* It can be used with multiple threads. Note that each thread gets its own - * leastCostPathCalculator. It is created only once and cached afterwards. Thus, + * leastCostPathCalculator. It is created only once and cached afterward. Thus, * it requires a threadSafe leastCostPathCalculatorFactory (the calculator * itself does not need to be thread-safe). * @@ -494,7 +494,7 @@ public Builder setRoadPricingScheme( RoadPricingScheme roadPricingScheme) { *

* Comments: *
    - *
  • By default this will take free speed travel times. + *
  • By default, this will take free speed travel times. *
  • yyyy These free speed travel times do not take the time-dependent * network into account. kai, jan'14 *
  • Either can be changed with builder.setTravelTime(...) or with diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java index 906541a3e41..55a1176330f 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/Driver2VehicleEventHandler.java @@ -35,7 +35,7 @@ * Basic event handler that collects the relation between vehicles and drivers. * Necessary since link enter and leave events do not contain the driver anymore. *

    - * This is the vice-versa implementation of {@link org.matsim.core.events.algorithms.Vehicle2DriverEventHandler}. + * This is the vice versa implementation of {@link org.matsim.core.events.algorithms.Vehicle2DriverEventHandler}. *

    * In a first step only used internally. When needed more often, I have nothing against putting it more central. -> matsim-libs * diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java index 8daef42c974..e13c4624a15 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java @@ -61,7 +61,7 @@ * Part is removed, Chain is now starting at the CollectionHub * *

    Scheduler = Macht die Pläne für die Fahrzeuge für die nächste MATSim-Iteration. Er plant es - * für jede Ressource. --> jede Ressource hat einen eigenen Scheduler: 1.) Simple: Nimm die + * für jede Ressource. → jede Ressource hat einen eigenen Scheduler: 1.) Simple: Nimm die * mitgegebene Reihenfolge. 2.) */ /*package-private*/ final class ExampleSchedulingOfTransportChainHubsVsDirect { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/DistanceAndTimeHandler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/DistanceAndTimeHandler.java index 5eece04dd0e..22572f86572 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/DistanceAndTimeHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/simulationTrackers/DistanceAndTimeHandler.java @@ -85,7 +85,7 @@ private void processLeaveEvent(Id vehicleId, double time) { distanceCosts += linkLength * carrierVehicle.getType().getCostInformation().getCostsPerMeter(); } - // (there might not be a corresponding enter event if vehicle just entered traffic. Could add + // (there might not be a corresponding enter-event if vehicle just entered traffic. Could add // that as well, but then we would need to compensate for fact that this covers little distance. // kai, jul'22) diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java index 5fbecd0d3b9..b23a9863069 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java @@ -147,8 +147,8 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru } /** - * Option 2: Tour is not possible with the vehicle with the small battery. Thats - * why one vehicle with a large battery is used. + * Option 2: Tour is not possible with the vehicle with the small battery. + * That's why one vehicle with a large battery is used. * */ @Test @@ -310,7 +310,7 @@ final void Carrier2SmallBatteryTest_Version3() throws ExecutionException, Interr /** * Option 4: An additional shipment outside the range of both BEVtypes. - * Therefore one diesel vehicle must be used and one vehicle with a small + * Therefore, one diesel vehicle must be used and one vehicle with a small * battery. * */ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java index cc17a82ff11..7c4c4a8dbd5 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java @@ -154,8 +154,8 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru } /** - * Option 2: Tour is not possible with the vehicle with the small battery. Thats - * why one vehicle with a large battery is used. + * Option 2: Tour is not possible with the vehicle with the small battery. + * That's why one vehicle with a large battery is used. * */ @Test @@ -332,7 +332,7 @@ final void Carrier2SmallBatteryTest_Version3() throws ExecutionException, Interr /** * Option 4: An additional service outside the range of both BEV types. - * Therefore one diesel vehicle must be used and one vehicle with a small + * Therefore, one diesel vehicle must be used and one vehicle with a small * battery. * */ diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java index 89bec08003a..6fc9b085bf1 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/mobsim/DistanceScoringFunctionFactoryForTests.java @@ -139,7 +139,7 @@ private double getTimeParameter(CarrierVehicle vehicle, Person driver) { // if(carrier.getCarrierCapabilities().getCarrierVehicles().containsKey(vehicleId)){ // return carrier.getCarrierCapabilities().getCarrierVehicles().get(vehicleId); // } -// log.error("Vehicle with Id does not exists", new IllegalStateException("vehicle with id " + vehicleId + " is missing")); +// log.error("Vehicle with Id does not exist", new IllegalStateException("vehicle with id " + vehicleId + " is missing")); // return null; // } } diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java index 28314c1a817..04a424cf5cd 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java @@ -138,7 +138,7 @@ public void setUp() { } /* - * Now convert it to a only shipment-based VRP. + * Now convert it to an only shipment-based VRP. */ //Convert to jsprit VRP diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java index f4c95c5bd13..fd3338da366 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java @@ -148,7 +148,7 @@ public void setUp() { carrierWServices.addPlan(carrierPlanServicesAndShipments) ; /* - * Now convert it to a only shipment-based VRP. + * Now convert it to an only shipment-based VRP. */ //Convert to jsprit VRP @@ -311,7 +311,7 @@ void convertionOfServicesIsDoneCorrectly() { } /*Note: This test can be removed / modified when jsprit works properly with a combined Service and Shipment VRP. - * Currently the capacity of the vehicle seems to be "ignored" in a way that the load within the tour is larger than the capacity; + * Currently, the capacity of the vehicle seems to be "ignored" in a way that the load within the tour is larger than the capacity; * Maybe it is because of the misunderstanding, that a Service is modeled as "Pickup" and not as thought before as "Delivery". KMT sep18 */ @Test From a97c1c3c3a5ffbdedc1ac5e15f0b86f76c11ecfe Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Tue, 3 Dec 2024 16:06:32 +0100 Subject: [PATCH 45/51] language/grammar improvement --- .../matsim/freight/carriers/CarrierJob.java | 2 +- ...tTimeAndDistanceAnalysisEventsHandler.java | 2 +- .../FreightLogisticsConfigGroup.java | 2 +- .../logistics/InitialShipmentAssigner.java | 4 +-- .../matsim/freight/logistics/LSPUtils.java | 2 +- .../LspScoreStatsControlerListener.java | 2 +- ...chedulingOfTransportChainHubsVsDirect.java | 2 +- .../SimpleForwardLogisticChainScheduler.java | 2 +- .../carriers/CarrierEventsReadersTest.java | 2 +- .../freight/carriers/CarriersUtilsTest.java | 2 +- .../EquilWithCarrierWithoutPersonsIT.java | 2 +- ...istanceConstraintFromVehiclesFileTest.java | 20 ++++++------- .../jsprit/DistanceConstraintTest.java | 30 +++++++++---------- .../utils/CarrierControllerUtilsIT.java | 10 +++---- .../utils/CarrierControllerUtilsTest.java | 28 ++++++++--------- 15 files changed, 56 insertions(+), 56 deletions(-) diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java index 3654fbff36a..1dc1cd32f8d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/CarrierJob.java @@ -10,7 +10,7 @@ * In the next steps it will be extended, as follows * 1) existing common methods of {@link CarrierShipment} and {@link * CarrierService} where moved up here - * 2) some similiar, but differently named methods of {@link + * 2) some similar, but differently named methods of {@link * CarrierShipment} and {@link CarrierService} were renamed to the same name and moved up here * ... * future) It maybe gets generalized in way, that we only have one job definition with 1 or 2 diff --git a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java index 4e53c559222..6302c0df803 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/analysis/FreightTimeAndDistanceAnalysisEventsHandler.java @@ -226,7 +226,7 @@ void writeTravelTimeAndDistancePerVehicle(String analysisOutputDirectory, Scenar void writeTravelTimeAndDistancePerVehicleType(String analysisOutputDirectory, Scenario scenario) throws IOException { log.info("Writing out Time & Distance & Costs ... perVehicleType"); - //----- All VehicleTypes in CarriervehicleTypes container. Used so that even unused vehTypes appear in the output + //----- All VehicleTypes in CarrierVehicleTypes container. Used so that even unused vehTypes appear in the output TreeMap, VehicleType> vehicleTypesMap = new TreeMap<>(CarriersUtils.getCarrierVehicleTypes(scenario).getVehicleTypes()); //For the case that there are additional vehicle types found in the events. for (VehicleType vehicleType : vehicleId2VehicleType.values()) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java index bab230379ba..ca222f462ab 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/FreightLogisticsConfigGroup.java @@ -62,7 +62,7 @@ public void setLspsFile(String lspsFile) { //--- - // Commenting this out, because in a frist step I think it is better/ more streight forward to have the VRP logic in the carriers as an attribute. + // Commenting this out, because in a frist step I think it is better/ more straight forward to have the VRP logic in the carriers as an attribute. // please see {@link CarrierSchedulerUtils#setVrpLogic(carrier, VRPLogic)} and {@link CarrierSchedulerUtils#getVrpLogic(carrier)} //--- diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/InitialShipmentAssigner.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/InitialShipmentAssigner.java index eb6ff6287e7..9d856aaa6cb 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/InitialShipmentAssigner.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/InitialShipmentAssigner.java @@ -25,12 +25,12 @@ /** * Takes an {@link LspShipment} and normally assigns it to something that belongs to an {@link LSP}. *
    - * After changes in fall 2023 (see master thesis of nrichter), the assingment is + * After changes in fall 2023 (see master thesis of nrichter), the assignment is * there to be done one time initially. *
    * If there are several {@link LogisticChain}s in a {@link LSPPlan}, the {@link LSP} has to assign each {@link * LspShipment} to the suitable {@link LogisticChain}. For this purpose, each {@link LSPPlan} - * (or only the LSP? - kmt'jan'24), contains a pluggable strategy + * (or only the LSP? - kmt jan'24), contains a pluggable strategy * that is contained in classes implementing the interface {@link InitialShipmentAssigner}.
    *
    * During iterations, it can happen that the {@link LspShipment} should be moved to another diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPUtils.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPUtils.java index e40c44e95b6..4f0ae7a718d 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPUtils.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/LSPUtils.java @@ -50,7 +50,7 @@ public static boolean isPlanTheSelectedPlan(LSPPlan lspPlan) { return lspPlan.getLSP().getSelectedPlan() == lspPlan; } - public static LogisticChainScheduler createForwardLogisiticChainScheduler() { + public static LogisticChainScheduler createForwardLogisticChainScheduler() { return new ForwardLogisticChainSchedulerImpl(); } diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java index 3a868d449d3..438c34feaa2 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/analysis/LspScoreStatsControlerListener.java @@ -188,7 +188,7 @@ private void writePng() { } @Override - public void notifyShutdown(final ShutdownEvent controlerShudownEvent) { + public void notifyShutdown(final ShutdownEvent controlerShutdownEvent) { try { this.out.close(); for (ScoreHist data : this.perLsp.values()) { diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java index e13c4624a15..59c36fde881 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/examples/initialPlans/ExampleSchedulingOfTransportChainHubsVsDirect.java @@ -428,7 +428,7 @@ private static LSP createInitialLSP(Scenario scenario, SolutionType solutionType log.error( "This is totally untested. I can neither say if it will work nor if it will do anything useful - kmt feb22"); - // TODO: Habe das vorziehen vor das switch statement rückgängig gemacht, weil es sideeffekte + // TODO: Habe das vorziehen vor das switch statement rückgängig gemacht, weil es sideeffects // hatte -> Die dürften hier auch sein!!!! (KMT may22) // Die createLSPPlan_reloading(..) Methoden sind nicht unabhängig voneinander. // Das liegt wohl am statischen und das dann dort wieder Verknüpfungen gesetzt werden --> diff --git a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/SimpleForwardLogisticChainScheduler.java b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/SimpleForwardLogisticChainScheduler.java index f046b80c846..59307392ff6 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/SimpleForwardLogisticChainScheduler.java +++ b/contribs/freight/src/main/java/org/matsim/freight/logistics/resourceImplementations/SimpleForwardLogisticChainScheduler.java @@ -33,7 +33,7 @@ * LogisticChainElement}. * *

    2.) all {@link LSPResource}s that were handed over to the SimpleForwardSolutionScheduler - * exogenously, are now scheduled sequentially in an order that was also specified exogenously. This + * exogenous, are now scheduled sequentially in an order that was also specified exogenously. This * order ensures that each {@link LogisticChain} is traversed from the first to the last {@link * LogisticChainElement}. During this procedure, the concerned {@link LspShipment}s are taken from * the collection of incoming shipments, handled by the {@link LSPResource} in charge and then added diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java index 2b1c2ead062..933961095cb 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarrierEventsReadersTest.java @@ -193,7 +193,7 @@ void testReader() { handledEvents.addAll(eventHandlerServices.handledEvents); handledEvents.addAll(eventHandlerShipments.handledEvents); - //Please note: This test is sensitive to the order of events as they are added in carrierEvents (input) and the resukts of the handler... + //Please note: This test is sensitive to the order of events as they are added in carrierEvents (input) and the results of the handler... Assertions.assertArrayEquals(carrierEvents.toArray(), handledEvents.toArray()); } diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java index b1525aa604c..fe0428621e0 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/CarriersUtilsTest.java @@ -111,7 +111,7 @@ void testAddAndGetShipmentToCarrier() { @Test void testGetSetJspritIteration(){ Carrier carrier = new CarrierImpl(Id.create("carrier", Carrier.class)); - //jspirtIterations is not set. should return Integer.Min_Value (null is not possible because returning (int) + //jspritIterations is not set. should return Integer.Min_Value (null is not possible because returning (int) Assertions.assertEquals(Integer.MIN_VALUE, CarriersUtils.getJspritIterations(carrier) ); CarriersUtils.setJspritIterations(carrier, 125); diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java index d106530ef27..1df5a1a5b22 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/controller/EquilWithCarrierWithoutPersonsIT.java @@ -203,7 +203,7 @@ public void install() { } @Test - void testEventFilessAreEqual(){ + void testEventFilesAreEqual(){ setUp(); controler.addOverridingModule(new CarrierModule()); controler.addOverridingModule(new AbstractModule() { diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java index b23a9863069..43557b37a2a 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintFromVehiclesFileTest.java @@ -112,7 +112,7 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru Assertions.assertEquals(1, carrierV1.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); VehicleType vehicleType_SmallV1 = vehicleTypes.getVehicleTypes().get(Id.create("SmallBattery_V1", VehicleType.class)); VehicleType vehicleType_LargeV1 = vehicleTypes.getVehicleTypes().get(Id.create("LargeBattery_V1", VehicleType.class)); @@ -143,7 +143,7 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru } Assertions.assertEquals(24000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); } /** @@ -189,7 +189,7 @@ final void CarrierLargeBatteryTest_Version2() throws ExecutionException, Interru Assertions.assertEquals(1, carrierV2.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); VehicleType vehicleType_SmallV2 = vehicleTypes.getVehicleTypes().get(Id.create("SmallBattery_V2", VehicleType.class)); VehicleType vehicleType_LargeV2 = vehicleTypes.getVehicleTypes().get(Id.create("LargeBattery_V2", VehicleType.class)); @@ -220,7 +220,7 @@ final void CarrierLargeBatteryTest_Version2() throws ExecutionException, Interru } Assertions.assertEquals(24000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); } @@ -266,7 +266,7 @@ final void Carrier2SmallBatteryTest_Version3() throws ExecutionException, Interr Assertions.assertEquals(2, carrierV3.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); VehicleType vehicleType_SmallV3 = vehicleTypes.getVehicleTypes().get(Id.create("SmallBattery_V3", VehicleType.class)); VehicleType vehicleType_LargeV3 = vehicleTypes.getVehicleTypes().get(Id.create("LargeBattery_V3", VehicleType.class)); @@ -300,16 +300,16 @@ final void Carrier2SmallBatteryTest_Version3() throws ExecutionException, Interr if (distanceTour == 12000) Assertions.assertEquals(12000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); else Assertions.assertEquals(20000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); } } /** - * Option 4: An additional shipment outside the range of both BEVtypes. + * Option 4: An additional shipment outside the range of both BEV types. * Therefore, one diesel vehicle must be used and one vehicle with a small * battery. * @@ -385,11 +385,11 @@ final void CarrierWithAdditionalDieselVehicleTest_Version4() throws ExecutionExc if (thisTypeId.equals("SmallBattery_V4")) Assertions.assertEquals(24000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); else if (thisTypeId.equals("DieselVehicle")) Assertions.assertEquals(36000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); else Assertions.fail("Wrong vehicleType used"); } diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java index 7c4c4a8dbd5..a375cceac46 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/jsprit/DistanceConstraintTest.java @@ -122,7 +122,7 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru Assertions.assertEquals(1, carrierV1.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); Assertions.assertEquals(vehicleType_SmallV1.getId(), carrierV1.getSelectedPlan().getScheduledTours().iterator().next() .getVehicle().getType().getId()); @@ -150,7 +150,7 @@ final void CarrierSmallBatteryTest_Version1() throws ExecutionException, Interru } Assertions.assertEquals(24000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); } /** @@ -205,7 +205,7 @@ final void CarrierLargeBatteryTest_Version2() throws ExecutionException, Interru Assertions.assertEquals(1, carrierV2.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); Assertions.assertEquals(vehicleType_LargeV2.getId(), carrierV2.getSelectedPlan().getScheduledTours().iterator().next() .getVehicle().getType().getId()); @@ -233,7 +233,7 @@ final void CarrierLargeBatteryTest_Version2() throws ExecutionException, Interru } Assertions.assertEquals(24000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); } @@ -291,7 +291,7 @@ final void Carrier2SmallBatteryTest_Version3() throws ExecutionException, Interr Assertions.assertEquals(2, carrierV3.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); double maxDistance_vehicleType_LargeV3 = VehicleUtils.getEnergyCapacity(vehicleType_LargeV3.getEngineInformation()) / VehicleUtils.getEnergyConsumptionKWhPerMeter(vehicleType_LargeV3.getEngineInformation()); @@ -322,11 +322,11 @@ final void Carrier2SmallBatteryTest_Version3() throws ExecutionException, Interr if (distanceTour == 12000) Assertions.assertEquals(12000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); else Assertions.assertEquals(20000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); } } @@ -390,7 +390,7 @@ final void CarrierWithAdditionalDieselVehicleTest_Version4() throws ExecutionExc Assertions.assertEquals(2, carrierV4.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); double maxDistance_vehicleType_Large4 = VehicleUtils.getEnergyCapacity(vehicleType_LargeV4.getEngineInformation()) / VehicleUtils.getEnergyConsumptionKWhPerMeter(vehicleType_LargeV4.getEngineInformation()); @@ -420,11 +420,11 @@ final void CarrierWithAdditionalDieselVehicleTest_Version4() throws ExecutionExc if (thisTypeId.equals("SmallBattery_V4")) Assertions.assertEquals(24000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); else if (thisTypeId.equals("DieselVehicle")) Assertions.assertEquals(36000, distanceTour, MatsimTestUtils.EPSILON, - "The schedulded tour has a non expected distance"); + "The scheduled tour has a non expected distance"); else Assertions.fail("Wrong vehicleType used"); } @@ -478,7 +478,7 @@ final void CarrierWithShipmentsMidSizeBatteryTest_Version5() throws ExecutionExc //We need two tours, due to reloading both shipments must be transported one after the other Assertions.assertEquals(2, carrierV5.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); Assertions.assertEquals(vehicleType_MidSizeV5.getId(), carrierV5.getSelectedPlan().getScheduledTours().iterator().next() .getVehicle().getType().getId()); @@ -505,9 +505,9 @@ final void CarrierWithShipmentsMidSizeBatteryTest_Version5() throws ExecutionExc Assertions.assertEquals(2, distancesOfTours.size(), "There must be two entry for tour distances"); //One tour has distance of 12000m - Assertions.assertTrue(distancesOfTours.contains(12000.0), "The schedulded tour has a non expected distance"); + Assertions.assertTrue(distancesOfTours.contains(12000.0), "The scheduled tour has a non expected distance"); //The other tour has distance of 20000m - Assertions.assertTrue(distancesOfTours.contains(20000.0), "The schedulded tour has a non expected distance"); + Assertions.assertTrue(distancesOfTours.contains(20000.0), "The scheduled tour has a non expected distance"); } /** @@ -559,7 +559,7 @@ final void CarrierWithShipmentsLargeBatteryTest_Version6() throws ExecutionExcep //We need two tours, due to reloading both shipments must be transported one after the other Assertions.assertEquals(1, carrierV5.getSelectedPlan().getScheduledTours().size(), - "Not the correct amout of scheduled tours"); + "Not the correct amount of scheduled tours"); Assertions.assertEquals(vehicleType_LargeV5.getId(), carrierV5.getSelectedPlan().getScheduledTours().iterator().next() .getVehicle().getType().getId()); @@ -586,7 +586,7 @@ final void CarrierWithShipmentsLargeBatteryTest_Version6() throws ExecutionExcep Assertions.assertEquals(1, distancesOfTours.size(), "There must be one entry for tour distances"); //This tour has distance of 24000m - Assertions.assertTrue(distancesOfTours.contains(24000.0), "The schedulded tour has a non expected distance"); + Assertions.assertTrue(distancesOfTours.contains(24000.0), "The scheduled tour has a non expected distance"); } /** diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java index 04a424cf5cd..d7127bc80bf 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsIT.java @@ -69,7 +69,7 @@ public class CarrierControllerUtilsIT{ public void setUp() { //Create carrier with services and shipments - Carriers carriersWithServicesAndShpiments = new Carriers(); + Carriers carriersWithServicesAndShipments = new Carriers(); carrierWServices = CarriersUtils.createCarrier(CARRIER_SERVICES_ID ); CarrierService service1 = createMatsimService("Service1", "i(3,9)", 2); CarriersUtils.addService(carrierWServices, service1); @@ -110,8 +110,8 @@ public void setUp() { carrierWShipments.setCarrierCapabilities(ccBuilder.build()); // Add both carriers - carriersWithServicesAndShpiments.addCarrier(carrierWServices); - carriersWithServicesAndShpiments.addCarrier(carrierWShipments); + carriersWithServicesAndShipments.addCarrier(carrierWServices); + carriersWithServicesAndShipments.addCarrier(carrierWShipments); //load Network and build netbasedCosts for jsprit Network network = NetworkUtils.createNetwork(); @@ -120,7 +120,7 @@ public void setUp() { final NetworkBasedTransportCosts netBasedCosts = netBuilder.build() ; netBuilder.setTimeSliceWidth(1800) ; // !!!!, otherwise it will not do anything. - for (Carrier carrier : carriersWithServicesAndShpiments.getCarriers().values()) { + for (Carrier carrier : carriersWithServicesAndShipments.getCarriers().values()) { //Build VRP VehicleRoutingProblem.Builder vrpBuilder = MatsimJspritFactory.createRoutingProblemBuilder(carrier, network); vrpBuilder.setRoutingCost(netBasedCosts) ; @@ -143,7 +143,7 @@ public void setUp() { //Convert to jsprit VRP Carriers carriersWithShipmentsOnly = CarriersUtils.createShipmentVRPCarrierFromServiceVRPSolution( - carriersWithServicesAndShpiments ); + carriersWithServicesAndShipments ); for (Carrier carrier : carriersWithShipmentsOnly.getCarriers().values()) { //Build VRP diff --git a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java index fd3338da366..1896021e805 100644 --- a/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java +++ b/contribs/freight/src/test/java/org/matsim/freight/carriers/utils/CarrierControllerUtilsTest.java @@ -82,7 +82,7 @@ public class CarrierControllerUtilsTest{ public void setUp() { //Create carrier with services and shipments - Carriers carriersWithServicesAndShpiments = new Carriers(); + Carriers carriersWithServicesAndShipments = new Carriers(); carrierWServices = CarriersUtils.createCarrier(CARRIER_SERVICES_ID ); CarrierService service1 = createMatsimService("Service1", "i(3,9)", 2); CarriersUtils.addService(carrierWServices, service1); @@ -121,8 +121,8 @@ public void setUp() { carrierWShipments.setCarrierCapabilities(ccBuilder.build()); // Add both carriers - carriersWithServicesAndShpiments.addCarrier(carrierWServices); - carriersWithServicesAndShpiments.addCarrier(carrierWShipments); + carriersWithServicesAndShipments.addCarrier(carrierWServices); + carriersWithServicesAndShipments.addCarrier(carrierWShipments); //load Network and build netbasedCosts for jsprit Network network = NetworkUtils.createNetwork(); @@ -152,7 +152,7 @@ public void setUp() { */ //Convert to jsprit VRP - Carriers carriersWithShipmentsOnly = CarriersUtils.createShipmentVRPCarrierFromServiceVRPSolution(carriersWithServicesAndShpiments); + Carriers carriersWithShipmentsOnly = CarriersUtils.createShipmentVRPCarrierFromServiceVRPSolution(carriersWithServicesAndShipments); carrierWShipmentsOnlyFromCarrierWServices = carriersWithShipmentsOnly.getCarriers().get(CARRIER_SERVICES_ID); //with converted Service carrierWShipmentsOnlyFromCarrierWShipments = carriersWithShipmentsOnly.getCarriers().get(CARRIER_SHIPMENTS_ID); //with copied Shipments } @@ -160,7 +160,7 @@ public void setUp() { //Should only have Services @Test - void numberOfInitalServicesIsCorrect() { + void numberOfInitialServicesIsCorrect() { Assertions.assertEquals(2, carrierWServices.getServices().size()); int demandServices = 0; @@ -236,7 +236,7 @@ void fleetAvailableAfterConvertingIsCorrect() { } @Test - void copiingOfShipmentsIsDoneCorrectly() { + void copyingOfShipmentsIsDoneCorrectly() { boolean foundShipment1 = false; boolean foundShipment2 = false; CarrierShipment carrierShipment1 = CarriersUtils.getShipment(carrierWShipmentsOnlyFromCarrierWShipments, Id.create("shipment1", CarrierShipment.class)); @@ -269,19 +269,19 @@ void copiingOfShipmentsIsDoneCorrectly() { Assertions.assertEquals(0.0, carrierShipment2.getPickupTimeWindow().getStart(), 0); Assertions.assertEquals(7200.0, carrierShipment2.getPickupTimeWindow().getEnd(), 0); } - Assertions.assertTrue(foundShipment1, "Not found Shipment1 after copiing"); - Assertions.assertTrue(foundShipment2, "Not found Shipment2 after copiing"); + Assertions.assertTrue(foundShipment1, "Not found Shipment1 after copying"); + Assertions.assertTrue(foundShipment2, "Not found Shipment2 after copying"); } @Test void convertionOfServicesIsDoneCorrectly() { - boolean foundSercice1 = false; + boolean foundService1 = false; boolean foundService2 = false; CarrierShipment carrierShipment1 = CarriersUtils.getShipment(carrierWShipmentsOnlyFromCarrierWServices, Id.create("Service1", CarrierShipment.class)); assert carrierShipment1 != null; if (carrierShipment1.getId() == Id.create("Service1", CarrierShipment.class)) { - foundSercice1 = true; + foundService1 = true; Assertions.assertEquals(Id.createLinkId("i(6,0)"), carrierShipment1.getFrom()); Assertions.assertEquals(Id.createLinkId("i(3,9)"), carrierShipment1.getTo()); Assertions.assertEquals(2, carrierShipment1.getSize()); @@ -306,7 +306,7 @@ void convertionOfServicesIsDoneCorrectly() { Assertions.assertEquals(0.0, carrierShipment2.getPickupTimeWindow().getStart(), 0); Assertions.assertEquals(36001.0, carrierShipment2.getPickupTimeWindow().getEnd(), 0); } - Assertions.assertTrue(foundSercice1, "Not found converted Service1 after converting"); + Assertions.assertTrue(foundService1, "Not found converted Service1 after converting"); Assertions.assertTrue(foundService2, "Not found converted Service2 after converting"); } @@ -454,10 +454,10 @@ void testRunJsprit_NoOfJspritIterationsMissing() { } /** - * Don't crash even if there is no algortihm file specified. + * Don't crash even if there is no algorithm file specified. */ @Test - void testRunJsprit_NoAlgortihmFileGiven(){ + void testRunJsprit_NoAlgorithmFileGiven(){ Config config = prepareConfig(); config.controller().setOutputDirectory(utils.getOutputDirectory()); Scenario scenario = ScenarioUtils.loadScenario(config); @@ -476,7 +476,7 @@ private Config prepareConfig(){ Config config = ConfigUtils.loadConfig(IOUtils.extendUrl(scenarioUrl, "config.xml" ) ); config.controller().setLastIteration(0); config.plans().setActivityDurationInterpretation(PlansConfigGroup.ActivityDurationInterpretation.tryEndTimeThenDuration ); - //freight configstuff + //freight config stuff FreightCarriersConfigGroup freightCarriersConfigGroup = ConfigUtils.addOrGetModule(config, FreightCarriersConfigGroup.class); freightCarriersConfigGroup.setCarriersFile(IOUtils.extendUrl(scenarioUrl, "singleCarrierFiveActivitiesWithoutRoutes.xml" ).toString() ); freightCarriersConfigGroup.setCarriersVehicleTypesFile(IOUtils.extendUrl(scenarioUrl, "vehicleTypes.xml" ).toString() ); From 239b54673f1773d4c886c2af869cce75925afe09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Tue, 3 Dec 2024 20:51:08 +0100 Subject: [PATCH 46/51] feat(drt): fix letting agent stuck after rejected prebooking (#3625) --- .../analysis/DrtEventSequenceCollector.java | 5 +- .../drt/prebooking/PrebookingManager.java | 33 ++++--- .../drt/prebooking/PrebookingTest.java | 93 ++++++++++++++++--- .../prebooking/PrebookingTestEnvironment.java | 55 +++++++++-- 4 files changed, 150 insertions(+), 36 deletions(-) diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtEventSequenceCollector.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtEventSequenceCollector.java index 90836e785cc..cee1304544d 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtEventSequenceCollector.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/analysis/DrtEventSequenceCollector.java @@ -159,7 +159,10 @@ public List getDrtFares() { } public boolean isCompleted() { - return submitted.getPersonIds().stream().allMatch(personId -> personEvents.get(personId).droppedOff != null); + return submitted.getPersonIds().stream().allMatch(personId -> { + var events = personEvents.get(personId); + return events != null && personEvents.get(personId).droppedOff != null; + }); } } diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingManager.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingManager.java index a5dad2f114b..69aef1db822 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingManager.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingManager.java @@ -399,22 +399,31 @@ private void processRejections(double now) { int index = WithinDayAgentUtils.getCurrentPlanElementIndex(agent); Plan plan = WithinDayAgentUtils.getModifiablePlan(agent); PlanElement planElement = plan.getPlanElements().get(index); - Activity activity; - if(planElement instanceof Activity currentActivity) { - activity = currentActivity; + + if (planElement instanceof Activity currentActivity) { + Activity activity = currentActivity; + activity.setEndTime(Double.POSITIVE_INFINITY); + activity.setMaximumDurationUndefined(); + + ((HasModifiablePlan) agent).resetCaches(); + internalInterface.getMobsim().rescheduleActivityEnd(agent); + eventsManager.processEvent(new PersonStuckEvent(now, agent.getId(), agent.getCurrentLinkId(), + this.mode)); + + internalInterface.getMobsim().getAgentCounter().incLost(); + internalInterface.getMobsim().getAgentCounter().decLiving(); } else { // If the current element is a leg, the agent is walking towards the pickup location // We make the agent stuck at the interaction activity - activity = (Activity) plan.getPlanElements().get(index+1); + while (index < plan.getPlanElements().size()) { + if (plan.getPlanElements().get(index) instanceof Activity activity) { + activity.setEndTime(Double.POSITIVE_INFINITY); + activity.setMaximumDurationUndefined(); + } + + index++; + } } - activity.setEndTime(Double.POSITIVE_INFINITY); - activity.setMaximumDurationUndefined(); - - ((HasModifiablePlan) agent).resetCaches(); - internalInterface.getMobsim().rescheduleActivityEnd(agent); - eventsManager.processEvent(new PersonStuckEvent(now, agent.getId(), agent.getCurrentLinkId(), - this.mode)); - internalInterface.getMobsim().getAgentCounter().incLost(); } } } diff --git a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTest.java b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTest.java index 4809a205c8a..22f9bef8d06 100644 --- a/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTest.java +++ b/contribs/drt/src/test/java/org/matsim/contrib/drt/prebooking/PrebookingTest.java @@ -4,6 +4,11 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.matsim.api.core.v01.Coord; +import org.matsim.api.core.v01.population.Activity; +import org.matsim.api.core.v01.population.Leg; +import org.matsim.api.core.v01.population.Person; +import org.matsim.api.core.v01.population.Plan; import org.matsim.contrib.drt.passenger.DrtRequest; import org.matsim.contrib.drt.prebooking.PrebookingTestEnvironment.RequestInfo; import org.matsim.contrib.drt.prebooking.logic.AttributeBasedPrebookingLogic; @@ -13,6 +18,7 @@ import org.matsim.contrib.dvrp.fleet.DvrpVehicle; import org.matsim.contrib.dvrp.run.AbstractDvrpModeModule; import org.matsim.core.controler.Controler; +import org.matsim.core.population.PopulationUtils; import org.matsim.testcases.MatsimTestUtils; /** @@ -67,7 +73,8 @@ static PrebookingParams installPrebooking(Controler controller, boolean installL return installPrebooking(controller, installLogic, new PrebookingParams()); } - static PrebookingParams installPrebooking(Controler controller, boolean installLogic, PrebookingParams prebookingParams) { + static PrebookingParams installPrebooking(Controler controller, boolean installLogic, + PrebookingParams prebookingParams) { DrtConfigGroup drtConfig = DrtConfigGroup.getSingleModeDrtConfig(controller.getConfig()); drtConfig.addParameterSet(prebookingParams); @@ -647,12 +654,12 @@ void intraStopTiming_pickupTooEarly() { .addRequest("requestA1", 1, 1, 8, 8, 2000.0, 1.0) // forward .addRequest("requestA2", 1, 1, 8, 8, 2000.0, 2.0) // forward .addRequest("requestB1", 8, 8, 1, 1, 2356.0, 3.0) // backward - .configure(300.0, 2.0, 1800.0, 60.0) // + .configure(300.0, 2.0, 1800.0, 60.0) // .endTime(12.0 * 3600.0); Controler controller = environment.build(); installPrebooking(controller); - + controller.addOverridingModule(new AbstractDvrpModeModule("drt") { @Override public void install() { @@ -665,7 +672,7 @@ public double calcPickupDuration(DvrpVehicle vehicle, DrtRequest request) { return 30.0; // shorter than the dropoff duration (see below) } } - + @Override public double calcDropoffDuration(DvrpVehicle vehicle, DrtRequest request) { return 60.0; @@ -673,7 +680,7 @@ public double calcDropoffDuration(DvrpVehicle vehicle, DrtRequest request) { }); } }); - + controller.run(); { @@ -693,13 +700,14 @@ public double calcDropoffDuration(DvrpVehicle vehicle, DrtRequest request) { { RequestInfo requestInfo = environment.getRequestInfo().get("requestB1"); assertEquals(3.0, requestInfo.submissionTime, 1e-3); - assertEquals(2356.0 + 60.0, requestInfo.pickupTime, 1e-3); // NOT 30s because we need to wait for the dropoffs + assertEquals(2356.0 + 60.0, requestInfo.pickupTime, 1e-3); // NOT 30s because we need to wait for the + // dropoffs assertEquals(2753.0 + 60.0, requestInfo.dropoffTime, 1e-3); } assertEquals(3, environment.getTaskInfo().get("vehicleA").stream().filter(t -> t.type.equals("STOP")).count()); } - + @Test void intraStopTiming_dropoffTooLate() { /*- @@ -715,12 +723,12 @@ void intraStopTiming_dropoffTooLate() { .addRequest("requestA", 1, 1, 8, 8, 2000.0, 1.0) // forward .addRequest("requestB1", 8, 8, 1, 1, 2356.0, 2.0) // backward .addRequest("requestB2", 8, 8, 1, 1, 2356.0, 3.0) // backward - .configure(300.0, 2.0, 1800.0, 60.0) // + .configure(300.0, 2.0, 1800.0, 60.0) // .endTime(12.0 * 3600.0); Controler controller = environment.build(); installPrebooking(controller); - + controller.addOverridingModule(new AbstractDvrpModeModule("drt") { @Override public void install() { @@ -729,7 +737,7 @@ public void install() { public double calcPickupDuration(DvrpVehicle vehicle, DrtRequest request) { return 60.0; } - + @Override public double calcDropoffDuration(DvrpVehicle vehicle, DrtRequest request) { if (request.getPassengerIds().get(0).toString().equals("requestA")) { @@ -741,7 +749,7 @@ public double calcDropoffDuration(DvrpVehicle vehicle, DrtRequest request) { }); } }); - + controller.run(); { @@ -755,9 +763,10 @@ public double calcDropoffDuration(DvrpVehicle vehicle, DrtRequest request) { RequestInfo requestInfo = environment.getRequestInfo().get("requestB1"); assertEquals(2.0, requestInfo.submissionTime, 1e-3); assertEquals(2356.0 + 60.0, requestInfo.pickupTime, 1e-3); - assertEquals(2753.0 + 60.0 + 30.0, requestInfo.dropoffTime, 1e-3); // +30 because we wait for dropoff of A for B2 to enter + assertEquals(2753.0 + 60.0 + 30.0, requestInfo.dropoffTime, 1e-3); // +30 because we wait for dropoff of A + // for B2 to enter } - + { RequestInfo requestInfo = environment.getRequestInfo().get("requestB2"); assertEquals(3.0, requestInfo.submissionTime, 1e-3); @@ -767,4 +776,62 @@ public double calcDropoffDuration(DvrpVehicle vehicle, DrtRequest request) { assertEquals(3, environment.getTaskInfo().get("vehicleA").stream().filter(t -> t.type.equals("STOP")).count()); } + + @Test + void abortAfterRejection_onActivity() { + PrebookingTestEnvironment environment = new PrebookingTestEnvironment(utils) // + .addVehicle("vehicleA", 1, 1) // + .setVehicleCapacity(1) // + .addRequest("requestA", 1, 1, 8, 8, 2000.0, 1800.0) + .configure(10.0, 1.0, 0.0, 5.0) + .endTime(12.0 * 3600.0); + + Controler controller = environment.build(); + installPrebooking(controller); + + controller.run(); + + { + RequestInfo requestInfo = environment.getRequestInfo().get("requestA"); + assertEquals(1800.0, requestInfo.submissionTime); + assertEquals(Double.NaN, requestInfo.pickupTime, 1e-3); + assertEquals(1, requestInfo.submissionTimes.size()); + assertEquals(1, environment.getStuckInfo().size()); + } + } + + @Test + void abortAfterRejection_onLeg() { + PrebookingTestEnvironment environment = new PrebookingTestEnvironment(utils) // + .addVehicle("vehicleA", 1, 1) // + .setVehicleCapacity(1) // + .addRequest("requestA", 1, 1, 8, 8, 2000.0, 1800.0) + .configure(10.0, 1.0, 0.0, 5.0) + .endTime(12.0 * 3600.0); + + Controler controller = environment.build(); + installPrebooking(controller); + + // make sure the agent will be on a leg + for (Person person : controller.getScenario().getPopulation().getPersons().values()) { + Plan plan = person.getSelectedPlan(); + + Activity activity = PopulationUtils.createActivityFromCoord("generic", new Coord(-50000.0, -50000.0)); + activity.setEndTime(0.0); + Leg leg = PopulationUtils.createLeg("walk"); + + plan.getPlanElements().add(0, activity); + plan.getPlanElements().add(1, leg); + } + + controller.run(); + + { + RequestInfo requestInfo = environment.getRequestInfo().get("requestA"); + assertEquals(1800.0, requestInfo.submissionTime); + assertEquals(Double.NaN, requestInfo.pickupTime, 1e-3); + assertEquals(1, requestInfo.submissionTimes.size()); + assertEquals(1, environment.getStuckInfo().size()); + } + } } 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 60108070ab8..0c527bbfb8d 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 @@ -1,14 +1,26 @@ package org.matsim.contrib.drt.prebooking; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + import org.apache.commons.lang3.tuple.Pair; import org.matsim.api.core.v01.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; +import org.matsim.api.core.v01.events.PersonStuckEvent; +import org.matsim.api.core.v01.events.handler.PersonStuckEventHandler; import org.matsim.api.core.v01.network.Link; import org.matsim.api.core.v01.network.Network; import org.matsim.api.core.v01.network.NetworkFactory; import org.matsim.api.core.v01.network.Node; -import org.matsim.api.core.v01.population.*; +import org.matsim.api.core.v01.population.Activity; +import org.matsim.api.core.v01.population.Leg; +import org.matsim.api.core.v01.population.Person; +import org.matsim.api.core.v01.population.Plan; +import org.matsim.api.core.v01.population.Population; +import org.matsim.api.core.v01.population.PopulationFactory; import org.matsim.contrib.common.zones.systems.grid.square.SquareGridZoneSystemParams; import org.matsim.contrib.drt.optimizer.constraints.DefaultDrtOptimizationConstraintsSet; import org.matsim.contrib.drt.optimizer.insertion.DrtInsertionSearchParams; @@ -26,7 +38,12 @@ import org.matsim.contrib.dvrp.fleet.FleetSpecification; import org.matsim.contrib.dvrp.fleet.FleetSpecificationImpl; import org.matsim.contrib.dvrp.fleet.ImmutableDvrpVehicleSpecification; -import org.matsim.contrib.dvrp.passenger.*; +import org.matsim.contrib.dvrp.passenger.PassengerDroppedOffEvent; +import org.matsim.contrib.dvrp.passenger.PassengerDroppedOffEventHandler; +import org.matsim.contrib.dvrp.passenger.PassengerPickedUpEvent; +import org.matsim.contrib.dvrp.passenger.PassengerPickedUpEventHandler; +import org.matsim.contrib.dvrp.passenger.PassengerRequestRejectedEvent; +import org.matsim.contrib.dvrp.passenger.PassengerRequestRejectedEventHandler; import org.matsim.contrib.dvrp.run.AbstractDvrpModeModule; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; import org.matsim.contrib.dvrp.run.DvrpModule; @@ -48,11 +65,6 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.testcases.MatsimTestUtils; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - public class PrebookingTestEnvironment { private final MatsimTestUtils utils; @@ -164,6 +176,7 @@ public Controler build() { configureRequestListener(controller); configureVehicleListener(controller); + configureStuckListener(controller); return controller; } @@ -227,9 +240,9 @@ private void buildConfig(Config config) { DrtConfigGroup modeConfig = new DrtConfigGroup(); drtConfig.addParameterSet(modeConfig); modeConfig.mode = "drt"; - DefaultDrtOptimizationConstraintsSet defaultConstraintsSet = - (DefaultDrtOptimizationConstraintsSet) modeConfig.addOrGetDrtOptimizationConstraintsParams() - .addOrGetDefaultDrtOptimizationConstraintsSet(); + DefaultDrtOptimizationConstraintsSet defaultConstraintsSet = (DefaultDrtOptimizationConstraintsSet) modeConfig + .addOrGetDrtOptimizationConstraintsParams() + .addOrGetDefaultDrtOptimizationConstraintsSet(); defaultConstraintsSet.maxWaitTime = maximumWaitTime; defaultConstraintsSet.maxTravelTimeAlpha = detourRelative; defaultConstraintsSet.maxTravelTimeBeta = detourAbsolute; @@ -444,4 +457,26 @@ public void handleEvent(TaskEndedEvent event) { taskInfo.get(event.getDvrpVehicleId().toString()).getLast().endTime = event.getTime(); } } + + private final List stuckEvents = new LinkedList<>(); + + public List getStuckInfo() { + return stuckEvents; + } + + private void configureStuckListener(Controler controller) { + controller.addOverridingModule(new AbstractModule() { + @Override + public void install() { + addEventHandlerBinding().toInstance(new StuckListener()); + } + }); + } + + private class StuckListener implements PersonStuckEventHandler { + @Override + public void handleEvent(PersonStuckEvent event) { + stuckEvents.add(event); + } + } } From 500df0b04fa8ba6a0acd43c7ceac595a97d0bd03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Tue, 3 Dec 2024 20:51:11 +0100 Subject: [PATCH 47/51] feat(drt): fix letting agent stuck after rejected prebooking (#3625) From 1c0f0ff58dee32f7b11bee8d56087df005fbab3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Tue, 3 Dec 2024 21:09:02 +0100 Subject: [PATCH 48/51] feat(drt): fix letting agent stuck after rejected prebooking (#3625) From 618b67db9bbb6bb5f21347eef49a8a92f8b45f7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Tue, 3 Dec 2024 21:23:06 +0100 Subject: [PATCH 49/51] feat(ev): modularize charging strategies (#3587) * remove default logic from interface * disentangle binding for ChargingLogic and ChargingStrategy * extract factory for ChargingStrategy * read maximum soc from attributes * introduce modal bindings for charging strategies --- .../edrt/run/EDrtModeOptimizerQSimModule.java | 4 +- .../extension/edrt/run/RunEDrtScenario.java | 13 ++- .../edrt/schedule/EDrtChargingTask.java | 5 +- .../edrt/schedule/EDrtTaskFactoryImpl.java | 5 +- .../EmptyVehicleChargingScheduler.java | 21 ++-- .../dispatcher/EDrtShiftDispatcherImpl.java | 15 +-- .../run/ShiftEDrtModeOptimizerQSimModule.java | 6 +- .../schedule/ShiftEDrtTaskFactoryImpl.java | 13 +-- .../scheduler/EShiftTaskScheduler.java | 76 ++++++++----- .../eshifts/run/RunEShiftDrtScenarioIT.java | 7 +- .../RunEDrtWithServicesScenarioIT.java | 6 +- .../matsim/contrib/evrp/ChargingActivity.java | 3 +- .../org/matsim/contrib/evrp/ChargingTask.java | 3 + .../matsim/contrib/evrp/ChargingTaskImpl.java | 11 +- .../ev/charging/ChargeUpToMaxSocStrategy.java | 43 +++++++- .../ev/charging/ChargingEstimations.java | 16 ++- .../contrib/ev/charging/ChargingLogic.java | 10 +- .../contrib/ev/charging/ChargingModule.java | 27 +++-- .../contrib/ev/charging/ChargingStrategy.java | 14 ++- .../charging/ChargingWithAssignmentLogic.java | 6 +- ...hargingWithQueueingAndAssignmentLogic.java | 41 ++++--- .../charging/ChargingWithQueueingLogic.java | 102 ++++++++++-------- .../ev/charging/VehicleChargingHandler.java | 7 +- .../contrib/etaxi/ETaxiChargingTask.java | 5 +- .../matsim/contrib/etaxi/ETaxiScheduler.java | 13 ++- .../ETaxiModeOptimizerQSimModule.java | 4 +- .../assignment/AssignmentChargerPlugData.java | 2 +- .../contrib/etaxi/run/RunETaxiBenchmark.java | 8 +- .../contrib/etaxi/run/RunETaxiScenario.java | 13 ++- .../vsp/ev/UrbanVehicleChargingHandler.java | 8 +- 30 files changed, 323 insertions(+), 184 deletions(-) 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 00dabefc585..90773153294 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 @@ -59,6 +59,7 @@ import org.matsim.contrib.dvrp.schedule.ScheduleTimingUpdater; import org.matsim.contrib.dvrp.vrpagent.VrpAgentLogic; import org.matsim.contrib.dvrp.vrpagent.VrpLegFactory; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.infrastructure.ChargingInfrastructure; import org.matsim.contrib.ev.infrastructure.ChargingInfrastructureUtils; import org.matsim.core.api.experimental.events.EventsManager; @@ -116,7 +117,8 @@ protected void configureQSim() { public EmptyVehicleChargingScheduler get() { var taskFactory = getModalInstance(DrtTaskFactory.class); var chargingInfrastructure = getModalInstance(ChargingInfrastructure.class); - return new EmptyVehicleChargingScheduler(timer, taskFactory, chargingInfrastructure); + ChargingStrategy.Factory chargingStrategyFactory = getModalInstance(ChargingStrategy.Factory.class); + return new EmptyVehicleChargingScheduler(timer, taskFactory, chargingInfrastructure, chargingStrategyFactory); } }).asEagerSingleton(); diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/RunEDrtScenario.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/RunEDrtScenario.java index 741c4047786..915c5efa220 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/RunEDrtScenario.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/run/RunEDrtScenario.java @@ -22,15 +22,17 @@ import java.net.URL; +import org.matsim.contrib.drt.extension.edrt.optimizer.EDrtVehicleDataEntryFactory.EDrtVehicleDataEntryFactoryProvider; import org.matsim.contrib.drt.run.DrtConfigGroup; import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; import org.matsim.contrib.dvrp.run.AbstractDvrpModeModule; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; -import org.matsim.contrib.drt.extension.edrt.optimizer.EDrtVehicleDataEntryFactory.EDrtVehicleDataEntryFactoryProvider; +import org.matsim.contrib.dvrp.run.DvrpModes; import org.matsim.contrib.ev.EvConfigGroup; import org.matsim.contrib.ev.charging.ChargeUpToMaxSocStrategy; import org.matsim.contrib.ev.charging.ChargingLogic; import org.matsim.contrib.ev.charging.ChargingPower; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithQueueingAndAssignmentLogic; import org.matsim.contrib.ev.charging.FixedSpeedCharging; import org.matsim.contrib.ev.temperature.TemperatureService; @@ -40,6 +42,8 @@ import org.matsim.core.controler.Controler; import org.matsim.vis.otfvis.OTFVisConfigGroup; +import com.google.inject.Key; + /** * @author Michal Maciejewski (michalm) */ @@ -69,10 +73,13 @@ public void install() { controler.addOverridingModule(new AbstractModule() { @Override public void install() { - bind(ChargingLogic.Factory.class).toProvider(new ChargingWithQueueingAndAssignmentLogic.FactoryProvider( - charger -> new ChargeUpToMaxSocStrategy(charger, MAX_RELATIVE_SOC))); + bind(ChargingLogic.Factory.class).to(ChargingWithQueueingAndAssignmentLogic.Factory.class); bind(ChargingPower.Factory.class).toInstance(ev -> new FixedSpeedCharging(ev, CHARGING_SPEED_FACTOR)); bind(TemperatureService.class).toInstance(linkId -> TEMPERATURE); + + for (DrtConfigGroup drtCfg : MultiModeDrtConfigGroup.get(config).getModalElements()) { + bind(Key.get(ChargingStrategy.Factory.class, DvrpModes.mode(drtCfg.mode))).toInstance(new ChargeUpToMaxSocStrategy.Factory(MAX_RELATIVE_SOC)); + } } }); diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtChargingTask.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtChargingTask.java index e2dcfdba751..95b36f65889 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtChargingTask.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtChargingTask.java @@ -20,6 +20,7 @@ package org.matsim.contrib.drt.extension.edrt.schedule; import org.matsim.contrib.drt.schedule.DrtTaskType; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.Charger; import org.matsim.contrib.evrp.ChargingTaskImpl; @@ -27,7 +28,7 @@ public class EDrtChargingTask extends ChargingTaskImpl { public static final DrtTaskType TYPE = new DrtTaskType("CHARGING"); - public EDrtChargingTask(double beginTime, double endTime, Charger charger, ElectricVehicle ev, double totalEnergy) { - super(TYPE, beginTime, endTime, charger, ev, totalEnergy); + public EDrtChargingTask(double beginTime, double endTime, Charger charger, ElectricVehicle ev, double totalEnergy, ChargingStrategy chargingStrategy) { + super(TYPE, beginTime, endTime, charger, ev, totalEnergy, chargingStrategy); } } diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtTaskFactoryImpl.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtTaskFactoryImpl.java index 4ec83dc7a15..d99fdc6fbfe 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtTaskFactoryImpl.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/schedule/EDrtTaskFactoryImpl.java @@ -26,6 +26,7 @@ import org.matsim.contrib.dvrp.schedule.DefaultStayTask; import org.matsim.contrib.evrp.EvDvrpVehicle; import org.matsim.contrib.evrp.VrpPathEnergyConsumptions; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.Charger; @@ -59,8 +60,8 @@ public DefaultStayTask createInitialTask(DvrpVehicle vehicle, double beginTime, } public EDrtChargingTask createChargingTask(DvrpVehicle vehicle, double beginTime, double endTime, Charger charger, - double totalEnergy) { + double totalEnergy, ChargingStrategy chargingStrategy) { return new EDrtChargingTask(beginTime, endTime, charger, ((EvDvrpVehicle)vehicle).getElectricVehicle(), - totalEnergy); + totalEnergy, chargingStrategy); } } diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/scheduler/EmptyVehicleChargingScheduler.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/scheduler/EmptyVehicleChargingScheduler.java index eea29745e80..2df2ed57028 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/scheduler/EmptyVehicleChargingScheduler.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/edrt/scheduler/EmptyVehicleChargingScheduler.java @@ -47,10 +47,12 @@ public class EmptyVehicleChargingScheduler { private final MobsimTimer timer; private final EDrtTaskFactoryImpl taskFactory; private final Map, List> linkToChargersMap; + private final ChargingStrategy.Factory chargingStrategyFactory; public EmptyVehicleChargingScheduler(MobsimTimer timer, DrtTaskFactory taskFactory, - ChargingInfrastructure chargingInfrastructure) { + ChargingInfrastructure chargingInfrastructure, ChargingStrategy.Factory chargingStrategyFactory) { this.timer = timer; + this.chargingStrategyFactory = chargingStrategyFactory; this.taskFactory = (EDrtTaskFactoryImpl)taskFactory; linkToChargersMap = chargingInfrastructure.getChargers() .values() @@ -68,15 +70,16 @@ public void chargeVehicle(DvrpVehicle vehicle) { // Empty charger or at least smallest queue charger Charger charger = freeCharger.orElseGet(() -> chargers.stream().min(Comparator.comparingInt(e -> e.getLogic().getQueuedVehicles().size())).orElseThrow()); ElectricVehicle ev = ((EvDvrpVehicle)vehicle).getElectricVehicle(); - if (!charger.getLogic().getChargingStrategy().isChargingCompleted(ev)) { - chargeVehicleImpl(vehicle, charger); + ChargingStrategy strategy = chargingStrategyFactory.createStrategy(charger.getSpecification(), ev); + if (!strategy.isChargingCompleted()) { + chargeVehicleImpl(vehicle, ev, charger, strategy); } } } - private void chargeVehicleImpl(DvrpVehicle vehicle, Charger charger) { + private void chargeVehicleImpl(DvrpVehicle vehicle, ElectricVehicle ev, Charger charger, ChargingStrategy strategy) { Schedule schedule = vehicle.getSchedule(); DrtStayTask stayTask = (DrtStayTask)schedule.getCurrentTask(); if (stayTask.getTaskIdx() != schedule.getTaskCount() - 1) { @@ -86,19 +89,17 @@ private void chargeVehicleImpl(DvrpVehicle vehicle, Charger charger) { // add CHARGING TASK double beginTime = stayTask.getEndTime(); - ChargingStrategy strategy = charger.getLogic().getChargingStrategy(); - ElectricVehicle ev = ((EvDvrpVehicle)vehicle).getElectricVehicle(); - double totalEnergy = -strategy.calcRemainingEnergyToCharge(ev); + double totalEnergy = -strategy.calcRemainingEnergyToCharge(); - double chargingDuration = Math.min(strategy.calcRemainingTimeToCharge(ev), + double chargingDuration = Math.min(strategy.calcRemainingTimeToCharge(), vehicle.getServiceEndTime() - beginTime); if (chargingDuration <= 0) { return;// no charging } double endTime = beginTime + chargingDuration; - schedule.addTask(taskFactory.createChargingTask(vehicle, beginTime, endTime, charger, totalEnergy)); - ((ChargingWithAssignmentLogic)charger.getLogic()).assignVehicle(ev); + schedule.addTask(taskFactory.createChargingTask(vehicle, beginTime, endTime, charger, totalEnergy, strategy)); + ((ChargingWithAssignmentLogic)charger.getLogic()).assignVehicle(ev, strategy); // append STAY schedule.addTask(taskFactory.createStayTask(vehicle, endTime, vehicle.getServiceEndTime(), charger.getLink())); diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/dispatcher/EDrtShiftDispatcherImpl.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/dispatcher/EDrtShiftDispatcherImpl.java index ace6e8d66e0..b3469edbc2e 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/dispatcher/EDrtShiftDispatcherImpl.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/dispatcher/EDrtShiftDispatcherImpl.java @@ -42,15 +42,18 @@ public class EDrtShiftDispatcherImpl implements DrtShiftDispatcher { private final Fleet fleet; + private final ChargingStrategy.Factory chargingStrategyFactory; + public EDrtShiftDispatcherImpl(EShiftTaskScheduler shiftTaskScheduler, ChargingInfrastructure chargingInfrastructure, ShiftsParams drtShiftParams, OperationFacilities operationFacilities, - DrtShiftDispatcher delegate, Fleet fleet) { + DrtShiftDispatcher delegate, Fleet fleet, ChargingStrategy.Factory chargingStrategyFactory) { this.shiftTaskScheduler = shiftTaskScheduler; this.chargingInfrastructure = chargingInfrastructure; this.drtShiftParams = drtShiftParams; this.operationFacilities = operationFacilities; this.delegate = delegate; this.fleet = fleet; + this.chargingStrategyFactory = chargingStrategyFactory; } @Override @@ -112,18 +115,18 @@ private void checkChargingAtHub(double timeStep) { if (selectedCharger.isPresent()) { Charger selectedChargerImpl = selectedCharger.get(); - ChargingStrategy chargingStrategy = selectedChargerImpl.getLogic().getChargingStrategy(); - if (!chargingStrategy.isChargingCompleted(electricVehicle)) { + ChargingStrategy chargingStrategy = chargingStrategyFactory.createStrategy(selectedChargerImpl.getSpecification(), electricVehicle); + if (!chargingStrategy.isChargingCompleted()) { final double waitTime = ChargingEstimations .estimateMaxWaitTimeForNextVehicle(selectedChargerImpl); final double chargingTime = chargingStrategy - .calcRemainingTimeToCharge(electricVehicle); + .calcRemainingTimeToCharge(); double energy = -chargingStrategy - .calcRemainingEnergyToCharge(electricVehicle); + .calcRemainingEnergyToCharge(); final double endTime = timeStep + waitTime + chargingTime; if (endTime < currentTask.getEndTime()) { shiftTaskScheduler.chargeAtHub((WaitForShiftTask) currentTask, eShiftVehicle, - electricVehicle, selectedChargerImpl, timeStep, endTime, energy); + electricVehicle, selectedChargerImpl, timeStep, endTime, energy, chargingStrategy); } } } diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/run/ShiftEDrtModeOptimizerQSimModule.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/run/ShiftEDrtModeOptimizerQSimModule.java index 32bf96909bf..95b6feb85e3 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/run/ShiftEDrtModeOptimizerQSimModule.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/run/ShiftEDrtModeOptimizerQSimModule.java @@ -34,6 +34,7 @@ import org.matsim.contrib.dvrp.run.DvrpConfigGroup; import org.matsim.contrib.dvrp.vrpagent.VrpAgentLogic; import org.matsim.contrib.dvrp.vrpagent.VrpLegFactory; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.infrastructure.ChargingInfrastructure; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.mobsim.framework.MobsimTimer; @@ -72,7 +73,7 @@ protected void configureQSim() { drtShiftParams, new EDrtShiftStartLogic(new DefaultShiftStartLogic()), new EDrtAssignShiftToVehicleLogic(new DefaultAssignShiftToVehicleLogic(drtShiftParams), drtShiftParams), getter.getModal(ShiftScheduler.class)), - getter.getModal(Fleet.class))) + getter.getModal(Fleet.class), getter.getModal(ChargingStrategy.Factory.class))) ).asEagerSingleton(); bindModal(VehicleEntry.EntryFactory.class).toProvider(modalProvider(getter -> @@ -87,7 +88,8 @@ drtShiftParams, new EDrtShiftStartLogic(new DefaultShiftStartLogic()), getter -> new EShiftTaskScheduler(getter.getModal(Network.class), getter.getModal(TravelTime.class), getter.getModal(TravelDisutilityFactory.class).createTravelDisutility(getter.getModal(TravelTime.class)), getter.get(MobsimTimer.class), getter.getModal(ShiftDrtTaskFactory.class), drtShiftParams, getter.getModal(ChargingInfrastructure.class), - getter.getModal(OperationFacilities.class), getter.getModal(Fleet.class)) + getter.getModal(OperationFacilities.class), getter.getModal(Fleet.class), + getter.getModal(ChargingStrategy.Factory.class)) )).asEagerSingleton(); // See EDrtModeOptimizerQSimModule diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/schedule/ShiftEDrtTaskFactoryImpl.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/schedule/ShiftEDrtTaskFactoryImpl.java index b7c2657f1bf..c74713d9f73 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/schedule/ShiftEDrtTaskFactoryImpl.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/schedule/ShiftEDrtTaskFactoryImpl.java @@ -19,6 +19,7 @@ import org.matsim.contrib.dvrp.fleet.DvrpVehicle; import org.matsim.contrib.dvrp.path.VrpPathWithTravelData; import org.matsim.contrib.dvrp.schedule.DefaultStayTask; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.infrastructure.Charger; import org.matsim.contrib.evrp.ChargingTask; import org.matsim.contrib.evrp.ChargingTaskImpl; @@ -99,21 +100,21 @@ public WaitForShiftTask createWaitForShiftStayTask(DvrpVehicle vehicle, double b public WaitForShiftTask createChargingWaitForShiftStayTask(DvrpVehicle vehicle, double beginTime, double endTime, Link link, OperationFacility facility, - double totalEnergy, Charger charger) { - ChargingTask chargingTask = new ChargingTaskImpl(EDrtChargingTask.TYPE, beginTime, endTime, charger, ((EvDvrpVehicle)vehicle).getElectricVehicle(), totalEnergy); + double totalEnergy, Charger charger, ChargingStrategy strategy) { + ChargingTask chargingTask = new ChargingTaskImpl(EDrtChargingTask.TYPE, beginTime, endTime, charger, ((EvDvrpVehicle)vehicle).getElectricVehicle(), totalEnergy, strategy); return new EDrtWaitForShiftTask(beginTime, endTime, link, totalEnergy, facility, chargingTask); } public EDrtShiftBreakTaskImpl createChargingShiftBreakTask(DvrpVehicle vehicle, double beginTime, double endTime, Link link, - DrtShiftBreak shiftBreak, Charger charger, double totalEnergy, OperationFacility facility) { - ChargingTask chargingTask = new ChargingTaskImpl(EDrtChargingTask.TYPE, beginTime, endTime, charger, ((EvDvrpVehicle)vehicle).getElectricVehicle(), totalEnergy); + DrtShiftBreak shiftBreak, Charger charger, double totalEnergy, OperationFacility facility, ChargingStrategy strategy) { + ChargingTask chargingTask = new ChargingTaskImpl(EDrtChargingTask.TYPE, beginTime, endTime, charger, ((EvDvrpVehicle)vehicle).getElectricVehicle(), totalEnergy, strategy); return new EDrtShiftBreakTaskImpl(beginTime, endTime, link, shiftBreak, totalEnergy, chargingTask, facility); } public ShiftChangeOverTask createChargingShiftChangeoverTask(DvrpVehicle vehicle, double beginTime, double endTime, Link link, Charger charger, double totalEnergy, - DrtShift shift, OperationFacility facility) { - ChargingTask chargingTask = new ChargingTaskImpl(EDrtChargingTask.TYPE, beginTime, endTime, charger, ((EvDvrpVehicle)vehicle).getElectricVehicle(), totalEnergy); + DrtShift shift, OperationFacility facility, ChargingStrategy strategy) { + ChargingTask chargingTask = new ChargingTaskImpl(EDrtChargingTask.TYPE, beginTime, endTime, charger, ((EvDvrpVehicle)vehicle).getElectricVehicle(), totalEnergy, strategy); return new EDrtShiftChangeoverTaskImpl(beginTime, endTime, link, shift, totalEnergy, chargingTask, facility); } } diff --git a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/scheduler/EShiftTaskScheduler.java b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/scheduler/EShiftTaskScheduler.java index 9c5a7172282..2bc42cc1925 100644 --- a/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/scheduler/EShiftTaskScheduler.java +++ b/contribs/drt-extensions/src/main/java/org/matsim/contrib/drt/extension/operations/eshifts/scheduler/EShiftTaskScheduler.java @@ -1,5 +1,11 @@ package org.matsim.contrib.drt.extension.operations.eshifts.scheduler; +import static org.matsim.contrib.drt.schedule.DrtTaskBaseType.DRIVE; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.matsim.api.core.v01.Id; @@ -12,7 +18,11 @@ import org.matsim.contrib.drt.extension.operations.operationFacilities.OperationFacility; import org.matsim.contrib.drt.extension.operations.shifts.config.ShiftsParams; import org.matsim.contrib.drt.extension.operations.shifts.fleet.ShiftDvrpVehicle; -import org.matsim.contrib.drt.extension.operations.shifts.schedule.*; +import org.matsim.contrib.drt.extension.operations.shifts.schedule.ShiftBreakTask; +import org.matsim.contrib.drt.extension.operations.shifts.schedule.ShiftChangeOverTask; +import org.matsim.contrib.drt.extension.operations.shifts.schedule.ShiftDrtTaskFactory; +import org.matsim.contrib.drt.extension.operations.shifts.schedule.ShiftSchedules; +import org.matsim.contrib.drt.extension.operations.shifts.schedule.WaitForShiftTask; import org.matsim.contrib.drt.extension.operations.shifts.scheduler.ShiftTaskScheduler; import org.matsim.contrib.drt.extension.operations.shifts.shift.DrtShift; import org.matsim.contrib.drt.extension.operations.shifts.shift.DrtShiftBreak; @@ -23,11 +33,16 @@ import org.matsim.contrib.dvrp.fleet.Fleet; import org.matsim.contrib.dvrp.path.VrpPathWithTravelData; import org.matsim.contrib.dvrp.path.VrpPaths; -import org.matsim.contrib.dvrp.schedule.*; +import org.matsim.contrib.dvrp.schedule.DriveTask; +import org.matsim.contrib.dvrp.schedule.Schedule; +import org.matsim.contrib.dvrp.schedule.Schedules; +import org.matsim.contrib.dvrp.schedule.StayTask; +import org.matsim.contrib.dvrp.schedule.Task; import org.matsim.contrib.dvrp.tracker.OnlineDriveTaskTracker; import org.matsim.contrib.dvrp.util.LinkTimePair; import org.matsim.contrib.ev.charging.BatteryCharging; import org.matsim.contrib.ev.charging.ChargingEstimations; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithAssignmentLogic; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.Charger; @@ -38,12 +53,7 @@ import org.matsim.core.router.util.LeastCostPathCalculator; import org.matsim.core.router.util.TravelDisutility; import org.matsim.core.router.util.TravelTime; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -import static org.matsim.contrib.drt.schedule.DrtTaskBaseType.DRIVE; +import org.matsim.core.utils.collections.Tuple; /** * @author nkuehnel / MOIA @@ -61,10 +71,12 @@ public class EShiftTaskScheduler implements ShiftTaskScheduler { private final Network network; private final ChargingInfrastructure chargingInfrastructure; + private final ChargingStrategy.Factory chargingStrategyFactory; public EShiftTaskScheduler(Network network, TravelTime travelTime, TravelDisutility travelDisutility, MobsimTimer timer, ShiftDrtTaskFactory taskFactory, ShiftsParams shiftsParams, - ChargingInfrastructure chargingInfrastructure, OperationFacilities operationFacilities, Fleet fleet) { + ChargingInfrastructure chargingInfrastructure, OperationFacilities operationFacilities, Fleet fleet, + ChargingStrategy.Factory chargingStrategyFactory) { this.travelTime = travelTime; this.timer = timer; this.taskFactory = taskFactory; @@ -72,6 +84,7 @@ public EShiftTaskScheduler(Network network, TravelTime travelTime, TravelDisutil this.shiftsParams = shiftsParams; this.router = new SpeedyALTFactory().createPathCalculator(network, travelDisutility, travelTime); this.chargingInfrastructure = chargingInfrastructure; + this.chargingStrategyFactory = chargingStrategyFactory; } public void relocateForBreak(ShiftDvrpVehicle vehicle, OperationFacility breakFacility, DrtShift shift) { @@ -169,23 +182,25 @@ private void relocateForBreakImpl(ShiftDvrpVehicle vehicle, double startTime, do ShiftBreakTask dropoffStopTask; ElectricVehicle ev = ((EvDvrpVehicle) vehicle).getElectricVehicle(); - Optional charger = charge(breakFacility, ev); + Optional charger = charge(breakFacility, ev); if (charger.isPresent()) { - final Charger chargerImpl = charger.get(); + final ChargerWithStrategy chargerImpl = charger.get(); final double waitTime = ChargingEstimations - .estimateMaxWaitTimeForNextVehicle(chargerImpl); + .estimateMaxWaitTimeForNextVehicle(chargerImpl.charger); if (ev.getBattery().getCharge() / ev.getBattery().getCapacity() > shiftsParams.chargeDuringBreakThreshold || waitTime > 0) { dropoffStopTask = taskFactory.createShiftBreakTask(vehicle, startTime, endTime, link, shiftBreak, breakFacility); } else { - double energyCharge = ((BatteryCharging) ev.getChargingPower()).calcEnergyCharged(chargerImpl.getSpecification(), endTime - startTime); + ChargingStrategy strategy = chargingStrategyFactory.createStrategy(chargerImpl.charger.getSpecification(), ev); + + double energyCharge = ((BatteryCharging) ev.getChargingPower()).calcEnergyCharged(chargerImpl.charger.getSpecification(), endTime - startTime); double totalEnergy = -energyCharge; - ((ChargingWithAssignmentLogic) chargerImpl.getLogic()).assignVehicle(ev); + ((ChargingWithAssignmentLogic) chargerImpl.charger.getLogic()).assignVehicle(ev, strategy); dropoffStopTask = ((ShiftEDrtTaskFactoryImpl) taskFactory).createChargingShiftBreakTask(vehicle, - startTime, endTime, link, shiftBreak, chargerImpl, totalEnergy, breakFacility); + startTime, endTime, link, shiftBreak, chargerImpl.charger, totalEnergy, breakFacility, chargerImpl.strategy); } } else { dropoffStopTask = taskFactory.createShiftBreakTask(vehicle, startTime, @@ -202,7 +217,7 @@ private void relocateForBreakImpl(ShiftDvrpVehicle vehicle, double startTime, do shiftBreak.schedule(Math.min(latestDetourArrival, latestTimeConstraintArrival)); } - private Optional charge(OperationFacility breakFacility, ElectricVehicle electricVehicle) { + private Optional charge(OperationFacility breakFacility, ElectricVehicle electricVehicle) { if (chargingInfrastructure != null) { List> chargerIds = breakFacility.getChargers(); if (!chargerIds.isEmpty()) { @@ -218,16 +233,19 @@ private Optional charge(OperationFacility breakFacility, ElectricVehicl return Double.compare(waitTime, waitTime2); }); if (selectedCharger.isPresent()) { - if (selectedCharger.get().getLogic().getChargingStrategy().isChargingCompleted(electricVehicle)) { + ChargingStrategy strategy = chargingStrategyFactory.createStrategy(selectedCharger.get().getSpecification(), electricVehicle); + if (strategy.isChargingCompleted()) { return Optional.empty(); } + return Optional.of(new ChargerWithStrategy(selectedCharger.get(), strategy)); } - return selectedCharger; } } return Optional.empty(); } + private record ChargerWithStrategy(Charger charger, ChargingStrategy strategy) {} + public void relocateForShiftChange(DvrpVehicle vehicle, Link link, DrtShift shift, OperationFacility breakFacility) { final Schedule schedule = vehicle.getSchedule(); @@ -318,24 +336,24 @@ private void appendShiftChange(DvrpVehicle vehicle, DrtShift shift, OperationFac // append SHIFT_CHANGEOVER task ElectricVehicle ev = ((EvDvrpVehicle) vehicle).getElectricVehicle(); - Optional charger = charge(breakFacility, ev); + Optional charger = charge(breakFacility, ev); if (charger.isPresent()) { - Charger chargingImpl = charger.get(); - + ChargerWithStrategy chargingImpl = charger.get(); + final double waitTime = ChargingEstimations - .estimateMaxWaitTimeForNextVehicle(chargingImpl); + .estimateMaxWaitTimeForNextVehicle(chargingImpl.charger); if (ev.getBattery().getCharge() / ev.getBattery().getCapacity() < shiftsParams.chargeDuringBreakThreshold - || ((ChargingWithAssignmentLogic) chargingImpl.getLogic()).getAssignedVehicles().contains(ev) + || ((ChargingWithAssignmentLogic) chargingImpl.charger.getLogic()).isAssigned(ev) || waitTime > 0) { dropoffStopTask = taskFactory.createShiftChangeoverTask(vehicle, startTime, endTime, link, shift, breakFacility); } else { - double energyCharge = ((BatteryCharging) ev.getChargingPower()).calcEnergyCharged(chargingImpl.getSpecification(), endTime - startTime); + double energyCharge = ((BatteryCharging) ev.getChargingPower()).calcEnergyCharged(chargingImpl.charger.getSpecification(), endTime - startTime); double totalEnergy = -energyCharge; - ((ChargingWithAssignmentLogic) chargingImpl.getLogic()).assignVehicle(ev); + ((ChargingWithAssignmentLogic) chargingImpl.charger.getLogic()).assignVehicle(ev, chargingImpl.strategy); dropoffStopTask = ((ShiftEDrtTaskFactoryImpl) taskFactory).createChargingShiftChangeoverTask(vehicle, - startTime, endTime, link, chargingImpl, totalEnergy, shift, breakFacility); + startTime, endTime, link, chargingImpl.charger, totalEnergy, shift, breakFacility, chargingImpl.strategy); } } else { dropoffStopTask = taskFactory.createShiftChangeoverTask(vehicle, startTime, @@ -470,12 +488,12 @@ private void updateShiftChangeImpl(DvrpVehicle vehicle, VrpPathWithTravelData vr public void chargeAtHub(WaitForShiftTask currentTask, ShiftDvrpVehicle vehicle, ElectricVehicle electricVehicle, Charger charger, double beginTime, - double endTime, double energy) { + double endTime, double energy, ChargingStrategy strategy) { final double initialEndTime = currentTask.getEndTime(); currentTask.setEndTime(beginTime); - ((ChargingWithAssignmentLogic) charger.getLogic()).assignVehicle(electricVehicle); + ((ChargingWithAssignmentLogic) charger.getLogic()).assignVehicle(electricVehicle, strategy); final WaitForShiftTask chargingWaitForShiftTask = ((ShiftEDrtTaskFactoryImpl) taskFactory).createChargingWaitForShiftStayTask(vehicle, - beginTime, endTime, currentTask.getLink(), currentTask.getFacility(), energy, charger); + beginTime, endTime, currentTask.getLink(), currentTask.getFacility(), energy, charger, strategy); final WaitForShiftTask waitForShiftTask = taskFactory.createWaitForShiftStayTask(vehicle, endTime, initialEndTime, currentTask.getLink(), currentTask.getFacility()); 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 a137d932fe5..a65091c6102 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 @@ -17,6 +17,7 @@ import org.matsim.contrib.drt.run.DrtConfigGroup; import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; +import org.matsim.contrib.dvrp.run.DvrpModes; import org.matsim.contrib.ev.EvConfigGroup; import org.matsim.contrib.ev.charging.*; import org.matsim.contrib.ev.temperature.TemperatureService; @@ -32,6 +33,8 @@ import org.matsim.core.controler.OutputDirectoryHierarchy; import org.matsim.examples.ExamplesUtils; +import com.google.inject.Key; + import java.util.HashSet; import java.util.Set; @@ -177,8 +180,8 @@ void test() { controler.addOverridingModule(new AbstractModule() { @Override public void install() { - bind(ChargingLogic.Factory.class).toProvider(new ChargingWithQueueingAndAssignmentLogic.FactoryProvider( - charger -> new ChargeUpToMaxSocStrategy(charger, MAX_RELATIVE_SOC))); + bind(ChargingLogic.Factory.class).to(ChargingWithQueueingAndAssignmentLogic.Factory.class); + bind(Key.get(ChargingStrategy.Factory.class, DvrpModes.mode(drtConfigGroup.mode))).toInstance(new ChargeUpToMaxSocStrategy.Factory(MAX_RELATIVE_SOC)); bind(ChargingPower.Factory.class).toInstance(FastThenSlowCharging::new); bind(TemperatureService.class).toInstance(linkId -> TEMPERATURE); } diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/services/RunEDrtWithServicesScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/services/RunEDrtWithServicesScenarioIT.java index b16dca56807..da8b28c6c82 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/services/RunEDrtWithServicesScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/services/RunEDrtWithServicesScenarioIT.java @@ -14,6 +14,7 @@ import org.matsim.contrib.drt.run.MultiModeDrtConfigGroup; import org.matsim.contrib.dvrp.fleet.DvrpVehicle; import org.matsim.contrib.dvrp.run.AbstractDvrpModeModule; +import org.matsim.contrib.dvrp.run.DvrpModes; import org.matsim.contrib.ev.charging.*; import org.matsim.contrib.ev.temperature.TemperatureService; import org.matsim.core.config.Config; @@ -22,6 +23,8 @@ import org.matsim.core.controler.Controler; import org.matsim.testcases.MatsimTestUtils; +import com.google.inject.Key; + public class RunEDrtWithServicesScenarioIT { public static final double MINIMUM_RELATIVE_SOC = 0.2; public static final double MAX_SOC = 1.0; @@ -77,7 +80,8 @@ public void install() { controler.addOverridingModule(new AbstractModule() { @Override public void install() { - bind(ChargingLogic.Factory.class).toProvider(new ChargingWithQueueingAndAssignmentLogic.FactoryProvider(charger -> new ChargeUpToMaxSocStrategy(charger, MAX_SOC))); + bind(ChargingLogic.Factory.class).to(ChargingWithQueueingAndAssignmentLogic.Factory.class); + bind(Key.get(ChargingStrategy.Factory.class, DvrpModes.mode(drtConfigGroup.mode))).toInstance(new ChargeUpToMaxSocStrategy.Factory(MAX_SOC)); bind(ChargingPower.Factory.class).toInstance(ev -> new FixedSpeedCharging(ev, RELATIVE_SPEED)); bind(TemperatureService.class).toInstance(linkId -> TEMPERATURE); } diff --git a/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingActivity.java b/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingActivity.java index 05217bf940e..8c1cb0adee3 100644 --- a/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingActivity.java +++ b/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingActivity.java @@ -21,6 +21,7 @@ package org.matsim.contrib.evrp; import org.matsim.contrib.dynagent.DynActivity; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithAssignmentLogic; import org.matsim.contrib.ev.fleet.ElectricVehicle; @@ -64,7 +65,7 @@ private void initialize(double now) { ChargingWithAssignmentLogic logic = chargingTask.getChargingLogic(); ElectricVehicle ev = chargingTask.getElectricVehicle(); logic.unassignVehicle(ev); - logic.addVehicle(ev, new DvrpChargingListener(this), now); + logic.addVehicle(ev, chargingTask.getChargingStrategy(), new DvrpChargingListener(this), now); state = State.added; } diff --git a/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTask.java b/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTask.java index 21ad8303ae5..7326e1bedd9 100644 --- a/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTask.java +++ b/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTask.java @@ -20,6 +20,7 @@ package org.matsim.contrib.evrp; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithAssignmentLogic; import org.matsim.contrib.ev.fleet.ElectricVehicle; @@ -29,6 +30,8 @@ public interface ChargingTask extends ETask { ChargingWithAssignmentLogic getChargingLogic(); + ChargingStrategy getChargingStrategy(); + ElectricVehicle getElectricVehicle(); double getChargingStartedTime(); diff --git a/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTaskImpl.java b/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTaskImpl.java index 969fa50da00..8cbd525cbea 100644 --- a/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTaskImpl.java +++ b/contribs/dvrp/src/main/java/org/matsim/contrib/evrp/ChargingTaskImpl.java @@ -24,6 +24,7 @@ import com.google.common.base.Preconditions; import org.matsim.contrib.dvrp.schedule.DefaultStayTask; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithAssignmentLogic; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.Charger; @@ -33,18 +34,20 @@ */ public class ChargingTaskImpl extends DefaultStayTask implements ChargingTask { private final ChargingWithAssignmentLogic chargingLogic; + private final ChargingStrategy chargingStrategy; private final ElectricVehicle ev; private Double chargingStartedTime; private final double totalEnergy; public ChargingTaskImpl(TaskType taskType, double beginTime, double endTime, Charger charger, ElectricVehicle ev, - double totalEnergy) { + double totalEnergy, ChargingStrategy chargingStrategy) { super(taskType, beginTime, endTime, charger.getLink()); Preconditions.checkArgument(totalEnergy < 0, "Total energy consumption is not negative: %s", totalEnergy); this.chargingLogic = (ChargingWithAssignmentLogic)charger.getLogic(); this.ev = ev; this.totalEnergy = totalEnergy; + this.chargingStrategy = chargingStrategy; } @Override @@ -57,6 +60,11 @@ public ChargingWithAssignmentLogic getChargingLogic() { return chargingLogic; } + @Override + public ChargingStrategy getChargingStrategy() { + return chargingStrategy; + } + @Override public ElectricVehicle getElectricVehicle() { return ev; @@ -76,6 +84,7 @@ public double getChargingStartedTime() { public String toString() { return MoreObjects.toStringHelper(this) .add("chargingLogic", chargingLogic) + .add("chargingStrategy", chargingStrategy) .add("ev", ev) .add("chargingStartedTime", chargingStartedTime) .add("totalEnergy", totalEnergy) diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargeUpToMaxSocStrategy.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargeUpToMaxSocStrategy.java index 85760aabefc..3703a7b0794 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargeUpToMaxSocStrategy.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargeUpToMaxSocStrategy.java @@ -23,30 +23,65 @@ import org.matsim.contrib.ev.fleet.Battery; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.ChargerSpecification; +import org.matsim.vehicles.Vehicle; /** * @author Michal Maciejewski (michalm) + * @author Sebastian Hörl (sebhoerl), IRT SystemX */ public class ChargeUpToMaxSocStrategy implements ChargingStrategy { + static public final String MAXIMUM_SOC_VEHICLE_ATTRIBUTE = "maximumSoc"; + + private final ElectricVehicle ev; private final ChargerSpecification charger; private final double maxSoc; - public ChargeUpToMaxSocStrategy(ChargerSpecification charger, double maxSoc) { + public ChargeUpToMaxSocStrategy(ChargerSpecification charger, ElectricVehicle ev, double maxSoc) { if (maxSoc < 0 || maxSoc > 1) { throw new IllegalArgumentException(); } this.charger = charger; this.maxSoc = maxSoc; + this.ev = ev; } @Override - public double calcRemainingEnergyToCharge(ElectricVehicle ev) { + public double calcRemainingEnergyToCharge() { Battery battery = ev.getBattery(); return maxSoc * battery.getCapacity() - battery.getCharge(); } @Override - public double calcRemainingTimeToCharge(ElectricVehicle ev) { - return ((BatteryCharging)ev.getChargingPower()).calcChargingTime(charger, calcRemainingEnergyToCharge(ev)); + public double calcRemainingTimeToCharge() { + return ((BatteryCharging)ev.getChargingPower()).calcChargingTime(charger, calcRemainingEnergyToCharge()); + } + + @Override + public boolean isChargingCompleted() { + return calcRemainingEnergyToCharge() <= 0; + } + + static public class Factory implements ChargingStrategy.Factory { + private final double maxSoc; + + public Factory(double maxSoc) { + this.maxSoc = maxSoc; + } + + @Override + public ChargingStrategy createStrategy(ChargerSpecification charger, ElectricVehicle ev) { + double vehicleMaximumSoc = maxSoc; + + Vehicle vehicle = ev.getVehicleSpecification().getMatsimVehicle(); + if (vehicle != null) { + Double value = (Double) vehicle.getAttributes().getAttribute(MAXIMUM_SOC_VEHICLE_ATTRIBUTE); + + if (value != null) { + vehicleMaximumSoc = value; + } + } + + return new ChargeUpToMaxSocStrategy(charger, ev, vehicleMaximumSoc); + } } } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingEstimations.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingEstimations.java index 5c0499f3bbf..502573d8bb2 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingEstimations.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingEstimations.java @@ -20,7 +20,7 @@ import java.util.stream.Stream; -import org.matsim.contrib.ev.fleet.ElectricVehicle; +import org.matsim.contrib.ev.charging.ChargingLogic.ChargingVehicle; import org.matsim.contrib.ev.infrastructure.Charger; /** @@ -38,20 +38,18 @@ public static double estimateMaxWaitTimeForNextVehicle(Charger charger) { } public static double estimateTotalTimeToCharge(ChargingLogic logic) { - return estimateTotalTimeToCharge(logic.getChargingStrategy(), - Stream.concat(logic.getPluggedVehicles().stream(), logic.getQueuedVehicles().stream())); + return estimateTotalTimeToCharge(Stream.concat(logic.getPluggedVehicles().stream(), logic.getQueuedVehicles().stream())); } public static double estimateTotalEnergyToCharge(ChargingLogic logic) { - return estimateTotalEnergyToCharge(logic.getChargingStrategy(), - Stream.concat(logic.getPluggedVehicles().stream(), logic.getQueuedVehicles().stream())); + return estimateTotalEnergyToCharge(Stream.concat(logic.getPluggedVehicles().stream(), logic.getQueuedVehicles().stream())); } - public static double estimateTotalTimeToCharge(ChargingStrategy strategy, Stream vehicles) { - return vehicles.mapToDouble(strategy::calcRemainingTimeToCharge).sum(); + public static double estimateTotalTimeToCharge(Stream vehicles) { + return vehicles.map(ChargingVehicle::strategy).mapToDouble(ChargingStrategy::calcRemainingTimeToCharge).sum(); } - public static double estimateTotalEnergyToCharge(ChargingStrategy strategy, Stream vehicles) { - return vehicles.mapToDouble(strategy::calcRemainingEnergyToCharge).sum(); + public static double estimateTotalEnergyToCharge(Stream vehicles) { + return vehicles.map(ChargingVehicle::strategy).mapToDouble(ChargingStrategy::calcRemainingEnergyToCharge).sum(); } } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingLogic.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingLogic.java index 854947741e0..de274606326 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingLogic.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingLogic.java @@ -29,17 +29,17 @@ interface Factory { ChargingLogic create(ChargerSpecification charger); } - void addVehicle(ElectricVehicle ev, double now); + void addVehicle(ElectricVehicle ev, ChargingStrategy strategy, double now); - void addVehicle(ElectricVehicle ev, ChargingListener chargingListener, double now); + void addVehicle(ElectricVehicle ev, ChargingStrategy strategy, ChargingListener chargingListener, double now); void removeVehicle(ElectricVehicle ev, double now); void chargeVehicles(double chargePeriod, double now); - Collection getPluggedVehicles(); + Collection getPluggedVehicles(); - Collection getQueuedVehicles(); + Collection getQueuedVehicles(); - ChargingStrategy getChargingStrategy(); + record ChargingVehicle(ElectricVehicle ev, ChargingStrategy strategy) {} } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingModule.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingModule.java index 7b42877507d..430484e4943 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingModule.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingModule.java @@ -20,14 +20,13 @@ package org.matsim.contrib.ev.charging; -import com.google.inject.Singleton; import org.matsim.contrib.ev.EvModule; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.core.controler.AbstractModule; import org.matsim.core.mobsim.qsim.AbstractQSimModule; -import com.google.inject.Inject; -import com.google.inject.Provider; +import com.google.inject.Provides; +import com.google.inject.Singleton; /** * @author Michal Maciejewski (michalm) @@ -35,13 +34,11 @@ public class ChargingModule extends AbstractModule { @Override public void install() { - // The following returns a charging logic for a given charger specification. Needs to be a provider, since the eventsManager needs to be inserted. - bind(ChargingLogic.Factory.class).toProvider(new Provider<>() { - @Inject private EventsManager eventsManager; - @Override public ChargingLogic.Factory get() { - return charger -> new ChargingWithQueueingLogic(charger, new ChargeUpToMaxSocStrategy(charger, 1.), eventsManager); - } - }); + // By default, charging logic with queue is used + bind(ChargingLogic.Factory.class).to(ChargingWithQueueingLogic.Factory.class); + + // By default, charging strategy that chargers to 100% is used + bind(ChargingStrategy.Factory.class).toInstance(new ChargeUpToMaxSocStrategy.Factory(1.0)); // The following returns the charging power/speed for a vehicle: bind(ChargingPower.Factory.class).toInstance(ev -> new FixedSpeedCharging(ev, 1)); @@ -58,4 +55,14 @@ public void install() { // this.addMobsimListenerBinding().to( ChargingHandler.class ).in( Singleton.class ); // does not work since ChargingInfrastructure is not available. } + + @Provides @Singleton + ChargingWithQueueingLogic.Factory provideChargingWithQueueingLogicFactory(EventsManager eventsManager) { + return new ChargingWithQueueingLogic.Factory(eventsManager); + } + + @Provides @Singleton + ChargingWithQueueingAndAssignmentLogic.Factory provideChargingWithQueueingAndAssignmentLogicFactory(EventsManager eventsManager) { + return new ChargingWithQueueingAndAssignmentLogic.Factory(eventsManager); + } } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingStrategy.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingStrategy.java index 87b76bf1303..bb5717b3cc2 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingStrategy.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingStrategy.java @@ -19,17 +19,21 @@ package org.matsim.contrib.ev.charging; import org.matsim.contrib.ev.fleet.ElectricVehicle; +import org.matsim.contrib.ev.infrastructure.ChargerSpecification; /** * @author michalm + * @author Sebastian Hörl (sebhoerl), IRT SystemX */ public interface ChargingStrategy { - default boolean isChargingCompleted(ElectricVehicle ev) { - return calcRemainingEnergyToCharge(ev) <= 0; - } + boolean isChargingCompleted(); - double calcRemainingEnergyToCharge(ElectricVehicle ev); + double calcRemainingEnergyToCharge(); //XXX should include potentially longer charging if AUX remains turned on - double calcRemainingTimeToCharge(ElectricVehicle ev); + double calcRemainingTimeToCharge(); + + static public interface Factory { + ChargingStrategy createStrategy(ChargerSpecification charger, ElectricVehicle ev); + } } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithAssignmentLogic.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithAssignmentLogic.java index ceaabad797e..cd7333d9411 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithAssignmentLogic.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithAssignmentLogic.java @@ -5,9 +5,11 @@ import java.util.Collection; public interface ChargingWithAssignmentLogic extends ChargingLogic { - void assignVehicle(ElectricVehicle ev); + void assignVehicle(ElectricVehicle ev, ChargingStrategy strategy); void unassignVehicle(ElectricVehicle ev); - Collection getAssignedVehicles(); + Collection getAssignedVehicles(); + + boolean isAssigned(ElectricVehicle ev); } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingAndAssignmentLogic.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingAndAssignmentLogic.java index 5fb5cc0ae6d..a21fde69f40 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingAndAssignmentLogic.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingAndAssignmentLogic.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; -import java.util.function.Function; import org.matsim.api.core.v01.Id; import org.matsim.contrib.ev.fleet.ElectricVehicle; @@ -31,21 +30,18 @@ import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.vehicles.Vehicle; -import com.google.inject.Inject; -import com.google.inject.Provider; - public class ChargingWithQueueingAndAssignmentLogic extends ChargingWithQueueingLogic implements ChargingWithAssignmentLogic { - private final Map, ElectricVehicle> assignedVehicles = new LinkedHashMap<>(); + private final Map, ChargingVehicle> assignedVehicles = new LinkedHashMap<>(); - public ChargingWithQueueingAndAssignmentLogic(ChargerSpecification charger, ChargingStrategy chargingStrategy, - EventsManager eventsManager) { - super(charger, chargingStrategy, eventsManager); + public ChargingWithQueueingAndAssignmentLogic(ChargerSpecification charger, EventsManager eventsManager) { + super(charger, eventsManager); } @Override - public void assignVehicle(ElectricVehicle ev) { - if (assignedVehicles.put(ev.getId(), ev) != null) { + public void assignVehicle(ElectricVehicle ev, ChargingStrategy strategy) { + ChargingVehicle cv = new ChargingVehicle(ev, strategy); + if (assignedVehicles.put(ev.getId(), cv) != null) { throw new IllegalArgumentException("Vehicle is already assigned: " + ev.getId()); } } @@ -57,28 +53,29 @@ public void unassignVehicle(ElectricVehicle ev) { } } - private final Collection unmodifiableAssignedVehicles = Collections.unmodifiableCollection( + @Override + public boolean isAssigned(ElectricVehicle ev) { + return assignedVehicles.containsKey(ev.getId()); + } + + private final Collection unmodifiableAssignedVehicles = Collections.unmodifiableCollection( assignedVehicles.values()); @Override - public Collection getAssignedVehicles() { + public Collection getAssignedVehicles() { return unmodifiableAssignedVehicles; } - public static class FactoryProvider implements Provider { - @Inject - private EventsManager eventsManager; - - private final Function chargingStrategyCreator; + static public class Factory implements ChargingLogic.Factory { + private final EventsManager eventsManager; - public FactoryProvider(Function chargingStrategyCreator) { - this.chargingStrategyCreator = chargingStrategyCreator; + public Factory(EventsManager eventsManager) { + this.eventsManager = eventsManager; } @Override - public ChargingLogic.Factory get() { - return charger -> new ChargingWithQueueingAndAssignmentLogic(charger, - chargingStrategyCreator.apply(charger), eventsManager); + public ChargingLogic create(ChargerSpecification charger) { + return new ChargingWithQueueingAndAssignmentLogic(charger, eventsManager); } } } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingLogic.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingLogic.java index 8cf57733532..515a586a4c2 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingLogic.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/ChargingWithQueueingLogic.java @@ -19,49 +19,55 @@ package org.matsim.contrib.ev.charging; -import com.google.common.base.Preconditions; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Objects; +import java.util.Queue; +import java.util.concurrent.LinkedBlockingQueue; + import org.matsim.api.core.v01.Id; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.ChargerSpecification; import org.matsim.core.api.experimental.events.EventsManager; import org.matsim.vehicles.Vehicle; -import java.util.*; -import java.util.concurrent.LinkedBlockingQueue; +import com.google.common.base.Preconditions; public class ChargingWithQueueingLogic implements ChargingLogic { protected final ChargerSpecification charger; - private final ChargingStrategy chargingStrategy; private final EventsManager eventsManager; - private final Map, ElectricVehicle> pluggedVehicles = new LinkedHashMap<>(); - private final Queue queuedVehicles = new LinkedList<>(); - private final Queue arrivingVehicles = new LinkedBlockingQueue<>(); + private final Map, ChargingVehicle> pluggedVehicles = new LinkedHashMap<>(); + private final Queue queuedVehicles = new LinkedList<>(); + private final Queue arrivingVehicles = new LinkedBlockingQueue<>(); private final Map, ChargingListener> listeners = new LinkedHashMap<>(); - public ChargingWithQueueingLogic(ChargerSpecification charger, ChargingStrategy chargingStrategy, EventsManager eventsManager) { - this.chargingStrategy = Objects.requireNonNull(chargingStrategy); + public ChargingWithQueueingLogic(ChargerSpecification charger, EventsManager eventsManager) { this.charger = Objects.requireNonNull(charger); this.eventsManager = Objects.requireNonNull(eventsManager); } @Override public void chargeVehicles(double chargePeriod, double now) { - Iterator evIter = pluggedVehicles.values().iterator(); - while (evIter.hasNext()) { - ElectricVehicle ev = evIter.next(); + Iterator cvIter = pluggedVehicles.values().iterator(); + while (cvIter.hasNext()) { + ChargingVehicle cv = cvIter.next(); // with fast charging, we charge around 4% of SOC per minute, // so when updating SOC every 10 seconds, SOC increases by less then 1% - double oldCharge = ev.getBattery().getCharge(); - double energy = ev.getChargingPower().calcChargingPower(charger) * chargePeriod; - double newCharge = Math.min(oldCharge + energy, ev.getBattery().getCapacity()); - ev.getBattery().setCharge(newCharge); - eventsManager.processEvent(new EnergyChargedEvent(now, charger.getId(), ev.getId(), newCharge - oldCharge, newCharge)); - - if (chargingStrategy.isChargingCompleted(ev)) { - evIter.remove(); - eventsManager.processEvent(new ChargingEndEvent(now, charger.getId(), ev.getId(), ev.getBattery().getCharge())); - listeners.remove(ev.getId()).notifyChargingEnded(ev, now); + double oldCharge = cv.ev().getBattery().getCharge(); + double energy = cv.ev().getChargingPower().calcChargingPower(charger) * chargePeriod; + double newCharge = Math.min(oldCharge + energy, cv.ev().getBattery().getCapacity()); + cv.ev().getBattery().setCharge(newCharge); + eventsManager.processEvent(new EnergyChargedEvent(now, charger.getId(), cv.ev().getId(), newCharge - oldCharge, newCharge)); + + if (cv.strategy().isChargingCompleted()) { + cvIter.remove(); + eventsManager.processEvent(new ChargingEndEvent(now, charger.getId(), cv.ev().getId(), cv.ev().getBattery().getCharge())); + listeners.remove(cv.ev().getId()).notifyChargingEnded(cv.ev(), now); } } @@ -72,25 +78,25 @@ public void chargeVehicles(double chargePeriod, double now) { var arrivingVehiclesIter = arrivingVehicles.iterator(); while (arrivingVehiclesIter.hasNext()) { - var ev = arrivingVehiclesIter.next(); + var cv = arrivingVehiclesIter.next(); if (pluggedVehicles.size() < charger.getPlugCount()) { - plugVehicle(ev, now); + plugVehicle(cv, now); } else { - queueVehicle(ev, now); + queueVehicle(cv, now); } arrivingVehiclesIter.remove(); } } @Override - public void addVehicle(ElectricVehicle ev, double now) { - addVehicle(ev, new ChargingListener() { + public void addVehicle(ElectricVehicle ev, ChargingStrategy strategy, double now) { + addVehicle(ev, strategy, new ChargingListener() { }, now); } @Override - public void addVehicle(ElectricVehicle ev, ChargingListener chargingListener, double now) { - arrivingVehicles.add(ev); + public void addVehicle(ElectricVehicle ev, ChargingStrategy strategy, ChargingListener chargingListener, double now) { + arrivingVehicles.add(new ChargingVehicle(ev, strategy)); listeners.put(ev.getId(), chargingListener); } @@ -111,36 +117,44 @@ public void removeVehicle(ElectricVehicle ev, double now) { } } - private void queueVehicle(ElectricVehicle ev, double now) { - queuedVehicles.add(ev); - eventsManager.processEvent(new QueuedAtChargerEvent(now, charger.getId(), ev.getId())); - listeners.get(ev.getId()).notifyVehicleQueued(ev, now); + private void queueVehicle(ChargingVehicle cv, double now) { + queuedVehicles.add(cv); + eventsManager.processEvent(new QueuedAtChargerEvent(now, charger.getId(), cv.ev().getId())); + listeners.get(cv.ev().getId()).notifyVehicleQueued(cv.ev(), now); } - private void plugVehicle(ElectricVehicle ev, double now) { - if (pluggedVehicles.put(ev.getId(), ev) != null) { + private void plugVehicle(ChargingVehicle cv, double now) { + if (pluggedVehicles.put(cv.ev().getId(), cv) != null) { throw new IllegalArgumentException(); } - eventsManager.processEvent(new ChargingStartEvent(now, charger.getId(), ev.getId(), ev.getBattery().getCharge())); - listeners.get(ev.getId()).notifyChargingStarted(ev, now); + eventsManager.processEvent(new ChargingStartEvent(now, charger.getId(), cv.ev().getId(), cv.ev().getBattery().getCharge())); + listeners.get(cv.ev().getId()).notifyChargingStarted(cv.ev(), now); } - private final Collection unmodifiablePluggedVehicles = Collections.unmodifiableCollection(pluggedVehicles.values()); + private final Collection unmodifiablePluggedVehicles = Collections.unmodifiableCollection(pluggedVehicles.values()); @Override - public Collection getPluggedVehicles() { + public Collection getPluggedVehicles() { return unmodifiablePluggedVehicles; } - private final Collection unmodifiableQueuedVehicles = Collections.unmodifiableCollection(queuedVehicles); + private final Collection unmodifiableQueuedVehicles = Collections.unmodifiableCollection(queuedVehicles); @Override - public Collection getQueuedVehicles() { + public Collection getQueuedVehicles() { return unmodifiableQueuedVehicles; } - @Override - public ChargingStrategy getChargingStrategy() { - return chargingStrategy; + static public class Factory implements ChargingLogic.Factory { + private final EventsManager eventsManager; + + public Factory(EventsManager eventsManager) { + this.eventsManager = eventsManager; + } + + @Override + public ChargingLogic create(ChargerSpecification charger) { + return new ChargingWithQueueingLogic(charger, eventsManager); + } } } diff --git a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/VehicleChargingHandler.java b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/VehicleChargingHandler.java index d206a50c875..15431cea1fe 100644 --- a/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/VehicleChargingHandler.java +++ b/contribs/ev/src/main/java/org/matsim/contrib/ev/charging/VehicleChargingHandler.java @@ -86,11 +86,14 @@ public class VehicleChargingHandler private final ImmutableListMultimap, Charger> chargersAtLinks; private final EvConfigGroup evCfg; + private final ChargingStrategy.Factory strategyFactory; + @Inject - VehicleChargingHandler(ChargingInfrastructure chargingInfrastructure, ElectricFleet electricFleet, EvConfigGroup evConfigGroup) { + VehicleChargingHandler(ChargingInfrastructure chargingInfrastructure, ElectricFleet electricFleet, EvConfigGroup evConfigGroup, ChargingStrategy.Factory strategyFactory) { this.chargingInfrastructure = chargingInfrastructure; this.electricFleet = electricFleet; this.evCfg = evConfigGroup; + this.strategyFactory = strategyFactory; chargersAtLinks = ChargingInfrastructureUtils.getChargersAtLinks(chargingInfrastructure ); } @@ -112,7 +115,7 @@ public void handleEvent(ActivityStartEvent event) { .filter(ch -> ev.getChargerTypes().contains(ch.getChargerType())) .findAny() .get(); - c.getLogic().addVehicle(ev, event.getTime()); + c.getLogic().addVehicle(ev, strategyFactory.createStrategy(c.getSpecification(), ev), event.getTime()); vehiclesAtChargers.put(evId, c.getId()); } } diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiChargingTask.java b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiChargingTask.java index 8f7f9b018ca..afb1b839bd5 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiChargingTask.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiChargingTask.java @@ -20,6 +20,7 @@ package org.matsim.contrib.etaxi; import org.matsim.contrib.evrp.ChargingTaskImpl; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.Charger; import org.matsim.contrib.taxi.schedule.TaxiTaskType; @@ -28,7 +29,7 @@ public class ETaxiChargingTask extends ChargingTaskImpl { public static final TaxiTaskType TYPE = new TaxiTaskType("CHARGING"); public ETaxiChargingTask(double beginTime, double endTime, Charger charger, ElectricVehicle ev, - double totalEnergy) { - super(TYPE, beginTime, endTime, charger, ev, totalEnergy); + double totalEnergy, ChargingStrategy chargingStrategy) { + super(TYPE, beginTime, endTime, charger, ev, totalEnergy, chargingStrategy); } } diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiScheduler.java b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiScheduler.java index 79999d4b140..16850cf1004 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiScheduler.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/ETaxiScheduler.java @@ -34,6 +34,7 @@ import org.matsim.contrib.dvrp.schedule.Schedules; import org.matsim.contrib.dvrp.schedule.Task; import org.matsim.contrib.ev.charging.ChargingEstimations; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithAssignmentLogic; import org.matsim.contrib.ev.fleet.ElectricVehicle; import org.matsim.contrib.ev.infrastructure.Charger; @@ -50,10 +51,13 @@ public class ETaxiScheduler extends TaxiScheduler { public static final TaxiTaskType DRIVE_TO_CHARGER = new TaxiTaskType("DRIVE_TO_CHARGER", EMPTY_DRIVE); + private final ChargingStrategy.Factory chargingStrategyFactory; + public ETaxiScheduler(TaxiConfigGroup taxiCfg, Fleet fleet, TaxiScheduleInquiry taxiScheduleInquiry, TravelTime travelTime, Supplier routerCreator, EventsManager eventsManager, - MobsimTimer mobsimTimer) { + MobsimTimer mobsimTimer, ChargingStrategy.Factory chargingStrategyFactory) { super(taxiCfg, fleet, taxiScheduleInquiry, travelTime, routerCreator, eventsManager, mobsimTimer); + this.chargingStrategyFactory = chargingStrategyFactory; } // FIXME underestimated due to the ongoing AUX/drive consumption @@ -65,12 +69,13 @@ public void scheduleCharging(DvrpVehicle vehicle, ElectricVehicle ev, Charger ch divertOrAppendDrive(schedule, vrpPath, DRIVE_TO_CHARGER); ChargingWithAssignmentLogic logic = (ChargingWithAssignmentLogic)charger.getLogic(); + ChargingStrategy strategy = chargingStrategyFactory.createStrategy(charger.getSpecification(), ev); double chargingEndTime = vrpPath.getArrivalTime() + ChargingEstimations.estimateMaxWaitTimeForNextVehicle( charger)// TODO not precise!!! - + logic.getChargingStrategy().calcRemainingTimeToCharge(ev);// TODO not precise !!! (SOC will be lower) + + strategy.calcRemainingTimeToCharge();// TODO not precise !!! (SOC will be lower) schedule.addTask(new ETaxiChargingTask(vrpPath.getArrivalTime(), chargingEndTime, charger, ev, - -logic.getChargingStrategy().calcRemainingEnergyToCharge(ev)));// TODO not precise !!! (ditto) - logic.assignVehicle(ev); + -strategy.calcRemainingEnergyToCharge(), strategy));// TODO not precise !!! (ditto) + logic.assignVehicle(ev, strategy); appendStayTask(vehicle); } diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/ETaxiModeOptimizerQSimModule.java b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/ETaxiModeOptimizerQSimModule.java index 5860bea3890..a713f20796c 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/ETaxiModeOptimizerQSimModule.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/ETaxiModeOptimizerQSimModule.java @@ -34,6 +34,7 @@ import org.matsim.contrib.etaxi.ETaxiActionCreator; import org.matsim.contrib.etaxi.ETaxiScheduler; import org.matsim.contrib.etaxi.util.ETaxiStayTaskEndTimeCalculator; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.infrastructure.ChargingInfrastructure; import org.matsim.contrib.ev.infrastructure.ChargingInfrastructureUtils; import org.matsim.contrib.taxi.analysis.TaxiEventSequenceCollector; @@ -113,8 +114,9 @@ public ETaxiScheduler get() { var speedyALTFactory = new SpeedyALTFactory(); Supplier routerCreator = () -> speedyALTFactory.createPathCalculator( network, travelDisutility, travelTime); + ChargingStrategy.Factory chargingStrategyFactory = getModalInstance(ChargingStrategy.Factory.class); return new ETaxiScheduler(taxiCfg, fleet, taxiScheduleInquiry, travelTime, routerCreator, - events, timer); + events, timer, chargingStrategyFactory); } }); diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/assignment/AssignmentChargerPlugData.java b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/assignment/AssignmentChargerPlugData.java index 6f3a1105fc3..3d3e4b720e8 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/assignment/AssignmentChargerPlugData.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/optimizer/assignment/AssignmentChargerPlugData.java @@ -71,7 +71,7 @@ static AssignmentDestinationData create(double currentTime, Iterabl } // does not include AUX+driving for assigned vehs - double assignedWorkload = ChargingEstimations.estimateTotalTimeToCharge(logic.getChargingStrategy(), + double assignedWorkload = ChargingEstimations.estimateTotalTimeToCharge( Streams.concat(logic.getPluggedVehicles().stream(), logic.getQueuedVehicles().stream(), logic.getAssignedVehicles().stream())); diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiBenchmark.java b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiBenchmark.java index 5e67a5e2105..68d20b5263b 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiBenchmark.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiBenchmark.java @@ -27,6 +27,7 @@ import org.matsim.contrib.dvrp.fleet.FleetSpecification; import org.matsim.contrib.dvrp.run.AbstractDvrpModeModule; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; +import org.matsim.contrib.dvrp.run.DvrpModes; import org.matsim.contrib.dvrp.run.DvrpQSimComponents; import org.matsim.contrib.ev.EvConfigGroup; import org.matsim.contrib.ev.EvModule; @@ -34,6 +35,7 @@ import org.matsim.contrib.ev.charging.ChargingEventSequenceCollector; import org.matsim.contrib.ev.charging.ChargingLogic; import org.matsim.contrib.ev.charging.ChargingPower; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithQueueingAndAssignmentLogic; import org.matsim.contrib.ev.charging.FixedSpeedCharging; import org.matsim.contrib.ev.discharging.IdleDischargingHandler; @@ -53,6 +55,8 @@ import org.matsim.core.mobsim.qsim.AbstractQSimModule; import org.matsim.core.scenario.ScenarioUtils; +import com.google.inject.Key; + /** * For a fair and consistent benchmarking of taxi dispatching algorithms we assume that link travel times are * deterministic. To simulate this property, we remove (1) all other traffic, and (2) link capacity constraints (e.g. by @@ -111,8 +115,8 @@ protected void configureQSim() { controler.addOverridingModule(new AbstractModule() { @Override public void install() { - bind(ChargingLogic.Factory.class).toProvider(new ChargingWithQueueingAndAssignmentLogic.FactoryProvider( - charger -> new ChargeUpToMaxSocStrategy(charger, MAX_SOC))); + bind(ChargingLogic.Factory.class).to(ChargingWithQueueingAndAssignmentLogic.Factory.class); + bind(Key.get(ChargingStrategy.Factory.class, DvrpModes.mode(mode))).toInstance(new ChargeUpToMaxSocStrategy.Factory(MAX_SOC)); //TODO switch to VariableSpeedCharging for Nissan bind(ChargingPower.Factory.class).toInstance(ev -> new FixedSpeedCharging(ev, CHARGING_SPEED_FACTOR)); bind(TemperatureService.class).toInstance(linkId -> TEMPERATURE); diff --git a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiScenario.java b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiScenario.java index f5598174103..bd266b4b0f2 100644 --- a/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiScenario.java +++ b/contribs/taxi/src/main/java/org/matsim/contrib/etaxi/run/RunETaxiScenario.java @@ -23,6 +23,7 @@ import org.matsim.api.core.v01.Scenario; import org.matsim.contrib.dvrp.run.DvrpConfigGroup; +import org.matsim.contrib.dvrp.run.DvrpModes; import org.matsim.contrib.dvrp.run.DvrpModule; import org.matsim.contrib.dvrp.run.DvrpQSimComponents; import org.matsim.contrib.ev.EvConfigGroup; @@ -30,12 +31,13 @@ import org.matsim.contrib.ev.charging.ChargeUpToMaxSocStrategy; import org.matsim.contrib.ev.charging.ChargingLogic; import org.matsim.contrib.ev.charging.ChargingPower; +import org.matsim.contrib.ev.charging.ChargingStrategy; import org.matsim.contrib.ev.charging.ChargingWithQueueingAndAssignmentLogic; import org.matsim.contrib.ev.charging.FixedSpeedCharging; import org.matsim.contrib.ev.discharging.IdleDischargingHandler; +import org.matsim.contrib.ev.temperature.TemperatureService; import org.matsim.contrib.evrp.EvDvrpFleetQSimModule; import org.matsim.contrib.evrp.OperatingVehicleProvider; -import org.matsim.contrib.ev.temperature.TemperatureService; import org.matsim.contrib.otfvis.OTFVisLiveModule; import org.matsim.contrib.taxi.run.MultiModeTaxiConfigGroup; import org.matsim.contrib.taxi.run.TaxiConfigGroup; @@ -48,6 +50,8 @@ import org.matsim.core.scenario.ScenarioUtils; import org.matsim.vis.otfvis.OTFVisConfigGroup; +import com.google.inject.Key; + public class RunETaxiScenario { private static final double CHARGING_SPEED_FACTOR = 1.5; // > 1 in this example private static final double MAX_SOC = 0.8; // charge up to 80% SOC @@ -91,11 +95,14 @@ protected void configureQSim() { controler.addOverridingModule(new AbstractModule() { @Override public void install() { - bind(ChargingLogic.Factory.class).toProvider(new ChargingWithQueueingAndAssignmentLogic.FactoryProvider( - charger -> new ChargeUpToMaxSocStrategy(charger, MAX_SOC))); + bind(ChargingLogic.Factory.class).to(ChargingWithQueueingAndAssignmentLogic.Factory.class); //TODO switch to VariableSpeedCharging for Nissan bind(ChargingPower.Factory.class).toInstance(ev -> new FixedSpeedCharging(ev, CHARGING_SPEED_FACTOR)); bind(TemperatureService.class).toInstance(linkId -> TEMPERATURE); + + for (TaxiConfigGroup taxiCfg : multiModeTaxiConfig.getModalElements()) { + bind(Key.get(ChargingStrategy.Factory.class, DvrpModes.mode(taxiCfg.getMode()))).toInstance(new ChargeUpToMaxSocStrategy.Factory(MAX_SOC)); + } } }); diff --git a/contribs/vsp/src/main/java/playground/vsp/ev/UrbanVehicleChargingHandler.java b/contribs/vsp/src/main/java/playground/vsp/ev/UrbanVehicleChargingHandler.java index 592722998fe..8e40eb18120 100644 --- a/contribs/vsp/src/main/java/playground/vsp/ev/UrbanVehicleChargingHandler.java +++ b/contribs/vsp/src/main/java/playground/vsp/ev/UrbanVehicleChargingHandler.java @@ -61,13 +61,16 @@ class UrbanVehicleChargingHandler private final ElectricFleet electricFleet; private final ImmutableListMultimap, Charger> chargersAtLinks; + private final ChargingStrategy.Factory chargingStrategyFactory; + private Map, Map, Tuple, Id>>> chargingProcedures = new HashMap<>(); @Inject - UrbanVehicleChargingHandler(ChargingInfrastructure chargingInfrastructure, ElectricFleet electricFleet) { + UrbanVehicleChargingHandler(ChargingInfrastructure chargingInfrastructure, ElectricFleet electricFleet, ChargingStrategy.Factory chargingStrategyFactory) { this.chargingInfrastructure = chargingInfrastructure; this.electricFleet = electricFleet; this.chargersAtLinks = ChargingInfrastructureUtils.getChargersAtLinks(chargingInfrastructure ); + this.chargingStrategyFactory = chargingStrategyFactory; } /** @@ -89,7 +92,8 @@ public void handleEvent(ActivityStartEvent event) { .findAny() .get(); - charger.getLogic().addVehicle(ev, event.getTime()); + ChargingStrategy strategy = chargingStrategyFactory.createStrategy(charger.getSpecification(), ev); + charger.getLogic().addVehicle(ev, strategy, event.getTime()); Map, Tuple, Id>> proceduresOnLink = this.chargingProcedures.get(event.getLinkId()); if(proceduresOnLink != null && proceduresOnLink.containsKey(event.getPersonId())){ throw new RuntimeException("person " + event.getPersonId() + " tries to charge 2 vehicles at the same time on link " + event.getLinkId() + From f9eae62d6168b20ece53c13a245c87097b95deb5 Mon Sep 17 00:00:00 2001 From: rakow Date: Thu, 5 Dec 2024 12:25:07 +0100 Subject: [PATCH 50/51] Improve PT pseudo network with loop links (#3628) * option to use different pseudo networks * fix issues in the pseudo network with loop links creator, added test case * update gtfs converter and merge stop option * update gtfs2matsim * update gtfs2matsim --- contribs/application/pom.xml | 2 +- .../pt/CreateTransitScheduleFromGtfs.java | 61 +++++++++++++------ .../CreatePseudoNetworkWithLoopLinks.java | 53 +++++++++++----- .../CreatePseudoNetworkWithLoopLinksTest.java | 28 +++++++++ 4 files changed, 108 insertions(+), 36 deletions(-) create mode 100644 matsim/src/test/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinksTest.java diff --git a/contribs/application/pom.xml b/contribs/application/pom.xml index b2b75824e01..b427dfbfcf9 100644 --- a/contribs/application/pom.xml +++ b/contribs/application/pom.xml @@ -87,7 +87,7 @@ com.github.matsim-org gtfs2matsim - 47b0802a29 + 19f1676fc6 diff --git a/contribs/application/src/main/java/org/matsim/application/prepare/pt/CreateTransitScheduleFromGtfs.java b/contribs/application/src/main/java/org/matsim/application/prepare/pt/CreateTransitScheduleFromGtfs.java index ddbe0e7868a..cef7709361e 100644 --- a/contribs/application/src/main/java/org/matsim/application/prepare/pt/CreateTransitScheduleFromGtfs.java +++ b/contribs/application/src/main/java/org/matsim/application/prepare/pt/CreateTransitScheduleFromGtfs.java @@ -25,6 +25,7 @@ import org.matsim.core.utils.io.IOUtils; import org.matsim.pt.transitSchedule.api.*; import org.matsim.pt.utils.CreatePseudoNetwork; +import org.matsim.pt.utils.CreatePseudoNetworkWithLoopLinks; import org.matsim.pt.utils.TransitScheduleValidator; import org.matsim.vehicles.*; import picocli.CommandLine; @@ -32,7 +33,10 @@ import java.io.File; import java.nio.file.Path; import java.time.LocalDate; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -85,8 +89,8 @@ public class CreateTransitScheduleFromGtfs implements MATSimAppCommand { @CommandLine.Option(names = "--transform-schedule", description = "Fully qualified class name to a Consumer to be executed after the schedule was created", arity = "0..*", split = ",") private List> transformSchedule; - @CommandLine.Option(names = "--merge-stops", description = "Whether stops should be merged by coordinate") - private boolean mergeStops; + @CommandLine.Option(names = "--merge-stops", description = "Whether stops should be merged by coordinate", defaultValue = "doNotMerge") + private GtfsConverter.MergeGtfsStops mergeStops; @CommandLine.Option(names = "--prefix", description = "Prefixes to add to the gtfs ids. Required if multiple inputs are used and ids are not unique.", split = ",") private List prefixes = new ArrayList<>(); @@ -100,10 +104,29 @@ public class CreateTransitScheduleFromGtfs implements MATSimAppCommand { @CommandLine.Option(names = "--shp-crs", description = "Overwrite coordinate system of the shape file") private String shpCrs; + @CommandLine.Option(names = "--pseudo-network", description = "Define how the pseudo network should be created", defaultValue = "singleLinkBetweenStops") + private PseudoNetwork pseudoNetwork; + + public static void main(String[] args) { System.exit(new CommandLine(new CreateTransitScheduleFromGtfs()).execute(args)); } + private static void addHbefaMapping(VehicleType vehicleType, HbefaVehicleCategory category) { + EngineInformation carEngineInformation = vehicleType.getEngineInformation(); + VehicleUtils.setHbefaVehicleCategory(carEngineInformation, String.valueOf(category)); + VehicleUtils.setHbefaTechnology(carEngineInformation, "average"); + VehicleUtils.setHbefaSizeClass(carEngineInformation, "average"); + VehicleUtils.setHbefaEmissionsConcept(carEngineInformation, "average"); + vehicleType.setNetworkMode(TransportMode.pt); + } + + private static void increaseLinkFreespeedIfLower(Link link, double newFreespeed) { + if (link.getFreespeed() < newFreespeed) { + link.setFreespeed(newFreespeed); + } + } + @Override public Integer call() throws Exception { @@ -237,14 +260,19 @@ private Predicate createFilter(int i) throws Exception { /** * Creates the pt scenario and network. */ - private static Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network network, TransitSchedule schedule, String ptNetworkIdentifier) { + private Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network network, TransitSchedule schedule, String ptNetworkIdentifier) { ScenarioUtils.ScenarioBuilder builder = new ScenarioUtils.ScenarioBuilder(ConfigUtils.createConfig()); builder.setNetwork(network); builder.setTransitSchedule(schedule); Scenario scenario = builder.build(); // add pseudo network for pt - new CreatePseudoNetwork(scenario.getTransitSchedule(), scenario.getNetwork(), ptNetworkIdentifier, 0.1, 100000.0).createNetwork(); + switch (pseudoNetwork) { + case singleLinkBetweenStops -> + new CreatePseudoNetwork(scenario.getTransitSchedule(), scenario.getNetwork(), ptNetworkIdentifier, 0.1, 100000.0).createNetwork(); + case withLoopLinks -> + new CreatePseudoNetworkWithLoopLinks(scenario.getTransitSchedule(), scenario.getNetwork(), ptNetworkIdentifier, 0.1, 100000.0).createNetwork(); + } // create TransitVehicle types // see https://svn.vsp.tu-berlin.de/repos/public-svn/publications/vspwp/2014/14-24/ for veh capacities @@ -481,20 +509,15 @@ private static Scenario getScenarioWithPseudoPtNetworkAndTransitVehicles(Network return scenario; } - private static void addHbefaMapping(VehicleType vehicleType, HbefaVehicleCategory category) { - EngineInformation carEngineInformation = vehicleType.getEngineInformation(); - VehicleUtils.setHbefaVehicleCategory(carEngineInformation, String.valueOf(category)); - VehicleUtils.setHbefaTechnology(carEngineInformation, "average"); - VehicleUtils.setHbefaSizeClass(carEngineInformation, "average"); - VehicleUtils.setHbefaEmissionsConcept(carEngineInformation, "average"); - vehicleType.setNetworkMode(TransportMode.pt); - } - - private static void increaseLinkFreespeedIfLower(Link link, double newFreespeed) { - if (link.getFreespeed() < newFreespeed) { - link.setFreespeed(newFreespeed); - } + public enum PseudoNetwork { + /** + * Create links between all stops and possibly duplicate stops. + */ + singleLinkBetweenStops, + /** + * Create a pseudo network with loop links at each stop. + */ + withLoopLinks, } - } diff --git a/matsim/src/main/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinks.java b/matsim/src/main/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinks.java index d0532315137..02ea9efcf79 100644 --- a/matsim/src/main/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinks.java +++ b/matsim/src/main/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinks.java @@ -20,7 +20,6 @@ package org.matsim.pt.utils; -import com.google.common.annotations.Beta; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.TransportMode; import org.matsim.api.core.v01.network.Link; @@ -40,11 +39,8 @@ * is assigned to a loop link, located in a node with the same coordinates as the stop. * The stop facility ID is used for node and link IDs. * - * @author mrieser, davibicudo - * - * @implNote THis functionality might be merged with {@link CreatePseudoNetwork}. + * @author mrieser, davibicudo, rakow */ -@Beta public class CreatePseudoNetworkWithLoopLinks { private final TransitSchedule schedule; @@ -82,23 +78,29 @@ public void createNetwork() { List> toBeRemoved = new LinkedList<>(); for (TransitLine tLine : this.schedule.getTransitLines().values()) { for (TransitRoute tRoute : tLine.getRoutes().values()) { - ArrayList> routeLinks = new ArrayList<>(); + + if (tRoute.getStops().size() < 2) { + System.err.println("Line " + tLine.getId() + " route " + tRoute.getId() + " has less than two stops. Removing this route from schedule."); + toBeRemoved.add(new Tuple<>(tLine, tRoute)); + continue; + } + + List> routeLinks = new ArrayList<>(); TransitRouteStop prevStop = null; + for (TransitRouteStop stop : tRoute.getStops()) { if (prevStop != null) { Link link = getNetworkLink(prevStop, stop); routeLinks.add(link.getId()); } + + // Add the loop links of all stops to the route + routeLinks.add(getLoopLink(stop.getStopFacility()).getId()); prevStop = stop; } - if (!routeLinks.isEmpty()) { - NetworkRoute route = RouteUtils.createNetworkRoute(routeLinks); - tRoute.setRoute(route); - } else { - System.err.println("Line " + tLine.getId() + " route " + tRoute.getId() + " has less than two stops. Removing this route from schedule."); - toBeRemoved.add(new Tuple<>(tLine, tRoute)); - } + NetworkRoute route = RouteUtils.createNetworkRoute(routeLinks); + tRoute.setRoute(route); } } @@ -114,6 +116,14 @@ private void createStopNodesAndLoopLinks() { this.nodes.put(stop, node); Link loopLink = this.network.getFactory().createLink(Id.createLinkId (this.prefix + stop.getId()), node, node); + // Loop links needs to have a length so that the travel time is not zero + loopLink.setLength(1); + loopLink.setFreespeed(linkFreeSpeed); + loopLink.setCapacity(linkCapacity); + // Ensure enough vehicles can be placed on the loop link + loopLink.setNumberOfLanes(linkCapacity); + loopLink.setAllowedModes(transitModes); + stop.setLinkId(loopLink.getId()); this.network.addLink(loopLink); Tuple connection = new Tuple<>(node, node); @@ -121,6 +131,15 @@ private void createStopNodesAndLoopLinks() { } } + /** + * Get the loop link for a stop facility. + */ + private Link getLoopLink(final TransitStopFacility stop) { + Node node = this.nodes.get(stop); + Tuple connection = new Tuple<>(node, node); + return this.links.get(connection); + } + private Link getNetworkLink(final TransitRouteStop fromStop, final TransitRouteStop toStop) { TransitStopFacility fromFacility = fromStop.getStopFacility(); TransitStopFacility toFacility = toStop.getStopFacility(); @@ -137,13 +156,15 @@ private Link createAndAddLink(Tuple connection) { Node fromNode = connection.getFirst(); Node toNode = connection.getSecond(); Link link; - link = this.network.getFactory().createLink(Id.createLinkId(this.prefix + fromNode.getId() + "-" + toNode.getId()), fromNode, - toNode); - link.setLength(CoordUtils.calcEuclideanDistance(fromNode.getCoord(), toNode.getCoord())); + link = this.network.getFactory().createLink(Id.createLinkId(fromNode.getId() + "-" + toNode.getId()), + fromNode, toNode); + double dist = CoordUtils.calcEuclideanDistance(fromNode.getCoord(), toNode.getCoord()); + link.setLength(dist); link.setFreespeed(linkFreeSpeed); link.setCapacity(linkCapacity); link.setNumberOfLanes(1); + this.network.addLink(link); link.setAllowedModes(this.transitModes); this.links.put(connection, link); diff --git a/matsim/src/test/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinksTest.java b/matsim/src/test/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinksTest.java new file mode 100644 index 00000000000..431c0c87bcd --- /dev/null +++ b/matsim/src/test/java/org/matsim/pt/utils/CreatePseudoNetworkWithLoopLinksTest.java @@ -0,0 +1,28 @@ +package org.matsim.pt.utils; + +import org.junit.jupiter.api.Test; +import org.matsim.api.core.v01.Scenario; +import org.matsim.core.config.ConfigUtils; +import org.matsim.core.scenario.ScenarioUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +class CreatePseudoNetworkWithLoopLinksTest { + + @Test + void createValidSchedule() { + + Scenario scenario = ScenarioUtils.loadScenario(ConfigUtils.loadConfig("test/scenarios/pt-tutorial/0.config.xml")); + + CreatePseudoNetworkWithLoopLinks creator = new CreatePseudoNetworkWithLoopLinks(scenario.getTransitSchedule(), scenario.getNetwork(), "pt_"); + creator.createNetwork(); + + + TransitScheduleValidator.ValidationResult result = TransitScheduleValidator.validateAll(scenario.getTransitSchedule(), scenario.getNetwork()); + + assertThat(result.getWarnings()).isEmpty(); + assertThat(result.getErrors()).isEmpty(); + assertThat(result.isValid()).isTrue(); + + } +} From 14f15b2043206fad054e46a8844021d73da4cb5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20H=C3=B6rl?= Date: Fri, 6 Dec 2024 00:15:16 +0100 Subject: [PATCH 51/51] fix(drt): names in attribute-based prebooking (#3629) * fix(drt): names in attribute-based prebooking * fix test and add setter --- .../run/RunPrebookingShiftDrtScenarioIT.java | 24 +++++++-------- .../logic/AttributeBasedPrebookingLogic.java | 30 +++++++++++++++---- .../prebooking/PrebookingTestEnvironment.java | 4 +-- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunPrebookingShiftDrtScenarioIT.java b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunPrebookingShiftDrtScenarioIT.java index 61e3a64a97a..e4286bed31c 100644 --- a/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunPrebookingShiftDrtScenarioIT.java +++ b/contribs/drt-extensions/src/test/java/org/matsim/contrib/drt/extension/operations/shifts/run/RunPrebookingShiftDrtScenarioIT.java @@ -280,8 +280,8 @@ private void preparePopulation(Scenario scenario) { Plan plan = factory.createPlan(); Activity start = factory.createActivityFromLinkId("start", Id.createLinkId(1)); start.setEndTime(5000); - start.getAttributes().putAttribute("prebooking:submissionTime" + "drt", 1800.); - start.getAttributes().putAttribute("prebooking:plannedDepartureTime" + "drt", 5000.); + AttributeBasedPrebookingLogic.setSubmissionTime("drt", start, 1800.0); + AttributeBasedPrebookingLogic.setPlannedDepartureTime("drt", start, 5000.0); plan.addActivity(start); plan.addLeg(factory.createLeg("drt")); plan.addActivity(factory.createActivityFromLinkId("end", Id.createLinkId(2))); @@ -295,8 +295,8 @@ private void preparePopulation(Scenario scenario) { Plan plan = factory.createPlan(); Activity start = factory.createActivityFromLinkId("start", Id.createLinkId(1)); start.setEndTime(5000); - start.getAttributes().putAttribute("prebooking:submissionTime" + "drt", 900.); - start.getAttributes().putAttribute("prebooking:plannedDepartureTime" + "drt", 5005.); + AttributeBasedPrebookingLogic.setSubmissionTime("drt", start, 900.0); + AttributeBasedPrebookingLogic.setPlannedDepartureTime("drt", start, 5005.0); plan.addActivity(start); plan.addLeg(factory.createLeg("drt")); plan.addActivity(factory.createActivityFromLinkId("end", Id.createLinkId(2))); @@ -310,8 +310,8 @@ private void preparePopulation(Scenario scenario) { Plan plan = factory.createPlan(); Activity start = factory.createActivityFromLinkId("start", Id.createLinkId(1)); start.setEndTime(5000); - start.getAttributes().putAttribute("prebooking:submissionTime" + "drt", 4000.); - start.getAttributes().putAttribute("prebooking:plannedDepartureTime" + "drt", 5000.); + AttributeBasedPrebookingLogic.setSubmissionTime("drt", start, 4000.0); + AttributeBasedPrebookingLogic.setPlannedDepartureTime("drt", start, 5000.0); plan.addActivity(start); plan.addLeg(factory.createLeg("drt")); plan.addActivity(factory.createActivityFromLinkId("end", Id.createLinkId(2))); @@ -325,8 +325,8 @@ private void preparePopulation(Scenario scenario) { Plan plan = factory.createPlan(); Activity start = factory.createActivityFromLinkId("start", Id.createLinkId(1)); start.setEndTime(8000); - start.getAttributes().putAttribute("prebooking:submissionTime" + "drt", 4000.); - start.getAttributes().putAttribute("prebooking:plannedDepartureTime" + "drt", 11000.); + AttributeBasedPrebookingLogic.setSubmissionTime("drt", start, 4000.0); + AttributeBasedPrebookingLogic.setPlannedDepartureTime("drt", start, 11000.0); plan.addActivity(start); plan.addLeg(factory.createLeg("drt")); plan.addActivity(factory.createActivityFromLinkId("end", Id.createLinkId(2))); @@ -340,8 +340,8 @@ private void preparePopulation(Scenario scenario) { Plan plan = factory.createPlan(); Activity start = factory.createActivityFromLinkId("start", Id.createLinkId(1)); start.setEndTime(6000.); - start.getAttributes().putAttribute("prebooking:submissionTime" + "drt", 4000.); - start.getAttributes().putAttribute("prebooking:plannedDepartureTime" + "drt", 6000.); + AttributeBasedPrebookingLogic.setSubmissionTime("drt", start, 4000.0); + AttributeBasedPrebookingLogic.setPlannedDepartureTime("drt", start, 6000.0); plan.addActivity(start); plan.addLeg(factory.createLeg("drt")); plan.addActivity(factory.createActivityFromLinkId("end", Id.createLinkId(2))); @@ -355,8 +355,8 @@ private void preparePopulation(Scenario scenario) { Plan plan = factory.createPlan(); Activity start = factory.createActivityFromLinkId("start", Id.createLinkId(1)); start.setEndTime(6500.); - start.getAttributes().putAttribute("prebooking:submissionTime" + "drt", 4000.); - start.getAttributes().putAttribute("prebooking:plannedDepartureTime" + "drt", 6500.); + AttributeBasedPrebookingLogic.setSubmissionTime("drt", start, 4000.0); + AttributeBasedPrebookingLogic.setPlannedDepartureTime("drt", start, 6500.0); plan.addActivity(start); plan.addLeg(factory.createLeg("drt")); plan.addActivity(factory.createActivityFromLinkId("end", Id.createLinkId(2))); diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/logic/AttributeBasedPrebookingLogic.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/logic/AttributeBasedPrebookingLogic.java index a48cbe50e46..7908ca1378c 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/logic/AttributeBasedPrebookingLogic.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/logic/AttributeBasedPrebookingLogic.java @@ -2,6 +2,7 @@ import java.util.Optional; +import org.matsim.api.core.v01.population.Activity; import org.matsim.api.core.v01.population.Leg; import org.matsim.api.core.v01.population.PlanElement; import org.matsim.contrib.drt.prebooking.logic.helpers.PopulationIterator; @@ -35,23 +36,40 @@ * @author Sebastian Hörl (sebhoerl), IRT SystemX */ public class AttributeBasedPrebookingLogic implements PrebookingLogic, MobsimInitializedListener { - static private final String SUBMISSION_TIME_ATTRIBUTE_PREFIX = "prebooking:submissionTime"; - static private final String PLANNED_DEPARTURE_ATTRIBUTE_PREFIX = "prebooking:plannedDepartureTime"; + static private final String SUBMISSION_TIME_ATTRIBUTE_PREFIX = "prebooking:submissionTime:"; + static private final String PLANNED_DEPARTURE_ATTRIBUTE_PREFIX = "prebooking:plannedDepartureTime:"; - static public String getSubmissionAttribute(String mode) { + static public String getSubmissionTimeAttribute(String mode) { return SUBMISSION_TIME_ATTRIBUTE_PREFIX + mode; } - static public String getPlannedDepartureAttribute(String mode) { + static public String getPlannedDepartureTimeAttribute(String mode) { return PLANNED_DEPARTURE_ATTRIBUTE_PREFIX + mode; } static public Optional getSubmissionTime(String mode, Trip trip) { - return Optional.ofNullable((Double) trip.getTripAttributes().getAttribute(getSubmissionAttribute(mode))); + return Optional.ofNullable((Double) trip.getTripAttributes().getAttribute(getSubmissionTimeAttribute(mode))); } static public Optional getPlannedDepartureTime(String mode, Trip trip) { - return Optional.ofNullable((Double) trip.getTripAttributes().getAttribute(getPlannedDepartureAttribute(mode))); + return Optional + .ofNullable((Double) trip.getTripAttributes().getAttribute(getPlannedDepartureTimeAttribute(mode))); + } + + static public void setSubmissionTime(String mode, Trip trip, double submissionTime) { + trip.getTripAttributes().putAttribute(getSubmissionTimeAttribute(mode), submissionTime); + } + + static public void setPlannedDepartureTime(String mode, Trip trip, double plannedDepartureTime) { + trip.getTripAttributes().putAttribute(getPlannedDepartureTimeAttribute(mode), plannedDepartureTime); + } + + static public void setSubmissionTime(String mode, Activity originActivity, double submissionTime) { + originActivity.getAttributes().putAttribute(getSubmissionTimeAttribute(mode), submissionTime); + } + + static public void setPlannedDepartureTime(String mode, Activity originActivity, double plannedDepartureTime) { + originActivity.getAttributes().putAttribute(getPlannedDepartureTimeAttribute(mode), plannedDepartureTime); } private final PrebookingQueue prebookingQueue; 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 0c527bbfb8d..fcdb7ab7d7a 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 @@ -283,13 +283,13 @@ private void buildPopulation(Scenario scenario) { plan.addLeg(firstLeg); if (!Double.isNaN(request.submissionTime)) { - firstActivity.getAttributes().putAttribute(AttributeBasedPrebookingLogic.getSubmissionAttribute("drt"), + firstActivity.getAttributes().putAttribute(AttributeBasedPrebookingLogic.getSubmissionTimeAttribute("drt"), request.submissionTime); } if (!Double.isNaN(request.plannedDepartureTime)) { firstActivity.getAttributes().putAttribute( - AttributeBasedPrebookingLogic.getPlannedDepartureAttribute("drt"), + AttributeBasedPrebookingLogic.getPlannedDepartureTimeAttribute("drt"), request.plannedDepartureTime); }