diff --git a/src/main/java/org/matsim/run/scoring/parking/BellochePenaltyFunction.java b/src/main/java/org/matsim/run/scoring/parking/BellochePenaltyFunction.java index 29b60f301..3c50007aa 100644 --- a/src/main/java/org/matsim/run/scoring/parking/BellochePenaltyFunction.java +++ b/src/main/java/org/matsim/run/scoring/parking/BellochePenaltyFunction.java @@ -8,7 +8,7 @@ import java.util.Map; -public class BellochePenaltyFunction implements PenaltyFunction { +public class BellochePenaltyFunction implements ParkingSearchTimeFunction { private static final Logger log = LogManager.getLogger(BellochePenaltyFunction.class); private final double alpha; private final double beta; @@ -19,7 +19,7 @@ public BellochePenaltyFunction(double alpha, double beta) { } @Override - public double calculatePenalty(Map, ParkingCount> parkingCount) { + public double calculateParkingSearchTime(Map, ParkingCount> parkingCount) { Tuple weightedOccK = getWeightedOccK(parkingCount); if (weightedOccK.getSecond() == 0) { diff --git a/src/main/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializer.java b/src/main/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializer.java index f9914e417..87d6f4842 100644 --- a/src/main/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializer.java +++ b/src/main/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializer.java @@ -11,8 +11,8 @@ import java.util.*; import java.util.stream.Collectors; -import static org.matsim.run.scoring.parking.ParkingObserver.LINK_OFF_STREET_SPOTS; -import static org.matsim.run.scoring.parking.ParkingObserver.LINK_ON_STREET_SPOTS; +import static org.matsim.run.scoring.parking.ParkingTimeEstimator.LINK_OFF_STREET_SPOTS; +import static org.matsim.run.scoring.parking.ParkingTimeEstimator.LINK_ON_STREET_SPOTS; public class EventBasedParkingCapacityInitializer implements ParkingCapacityInitializer { @Inject diff --git a/src/main/java/org/matsim/run/scoring/parking/ParkingModule.java b/src/main/java/org/matsim/run/scoring/parking/ParkingModule.java index f9058bcc0..bb6c67286 100644 --- a/src/main/java/org/matsim/run/scoring/parking/ParkingModule.java +++ b/src/main/java/org/matsim/run/scoring/parking/ParkingModule.java @@ -16,12 +16,12 @@ public void install() { // bind parking classes bind(KernelFunction.class).to(ConstantKernelFunction.class); - bind(PenaltyFunction.class).toInstance(new BellochePenaltyFunction(0.4, -6)); + bind(ParkingSearchTimeFunction.class).toInstance(new BellochePenaltyFunction(0.4, -6)); bind(ParkingCapacityInitializer.class).to(ZeroParkingCapacityInitializer.class); - bind(ParkingObserver.class).in(Singleton.class); + bind(ParkingTimeEstimator.class).in(Singleton.class); bind(ParkingEventsHandler.class).in(Singleton.class); addEventHandlerBinding().to(ParkingEventsHandler.class); - addControlerListenerBinding().to(ParkingObserver.class); + addControlerListenerBinding().to(ParkingTimeEstimator.class); } } diff --git a/src/main/java/org/matsim/run/scoring/parking/PenaltyFunction.java b/src/main/java/org/matsim/run/scoring/parking/ParkingSearchTimeFunction.java similarity index 54% rename from src/main/java/org/matsim/run/scoring/parking/PenaltyFunction.java rename to src/main/java/org/matsim/run/scoring/parking/ParkingSearchTimeFunction.java index 41379b642..12010d4e9 100644 --- a/src/main/java/org/matsim/run/scoring/parking/PenaltyFunction.java +++ b/src/main/java/org/matsim/run/scoring/parking/ParkingSearchTimeFunction.java @@ -5,6 +5,6 @@ import java.util.Map; -public interface PenaltyFunction { - double calculatePenalty(Map, ParkingCount> parkingCount); +public interface ParkingSearchTimeFunction { + double calculateParkingSearchTime(Map, ParkingCount> parkingCount); } diff --git a/src/main/java/org/matsim/run/scoring/parking/ParkingObserver.java b/src/main/java/org/matsim/run/scoring/parking/ParkingTimeEstimator.java similarity index 95% rename from src/main/java/org/matsim/run/scoring/parking/ParkingObserver.java rename to src/main/java/org/matsim/run/scoring/parking/ParkingTimeEstimator.java index 2a036e080..23c5399b1 100644 --- a/src/main/java/org/matsim/run/scoring/parking/ParkingObserver.java +++ b/src/main/java/org/matsim/run/scoring/parking/ParkingTimeEstimator.java @@ -17,25 +17,31 @@ import java.util.*; -public class ParkingObserver implements AfterMobsimListener { +public class ParkingTimeEstimator implements AfterMobsimListener { static final String LINK_ON_STREET_SPOTS = "onstreet_spots"; static final String LINK_OFF_STREET_SPOTS = "offstreet_spots"; @Inject Network network; + @Inject KernelFunction kernelFunction; + @Inject - PenaltyFunction penaltyFunction; + ParkingSearchTimeFunction parkingSearchTimeFunction; + @Inject EventsManager eventsManager; + @Inject ActivityEstimator activityEstimator; + @Inject LegEstimator legEstimator; @Inject ParkingCapacityInitializer parkingCapacityInitializer; + @Inject ParkingEventsHandler parkingEventsHandler; @@ -55,6 +61,30 @@ public void notifyAfterMobsim(AfterMobsimEvent event) { run(); } + private void initializeParking() { + int counter = 0; + indexByLinkId = new HashMap<>(network.getLinks().size()); + + for (Id id : network.getLinks().keySet()) { + indexByLinkId.put(id, counter++); + } + + int linkCount = network.getLinks().size(); + capacity = new int[linkCount]; + parkingCount = new int[linkCount]; + + Map, ParkingCapacityInitializer.ParkingInitialCapacity> initialize = + parkingCapacityInitializer.initialize(parkingEventsHandler.getVehicleEntersTrafficEvents(), parkingEventsHandler.getVehicleLeavesTrafficEvents()); + + for (Link link : network.getLinks().values()) { + ParkingCapacityInitializer.ParkingInitialCapacity parkingInitialCapacity = initialize.get(link.getId()); + int index = indexByLinkId.get(link.getId()); + + capacity[index] = parkingInitialCapacity.capacity(); + parkingCount[index] = parkingInitialCapacity.initial(); + } + } + private void run() { List vehicleLeavesTrafficEvents = parkingEventsHandler.getVehicleLeavesTrafficEvents(); List vehicleEntersTrafficEvents = parkingEventsHandler.getVehicleEntersTrafficEvents(); @@ -92,7 +122,7 @@ private void handleEvent(VehicleLeavesTrafficEvent event) { Map, Double> weightedLinks = kernelFunction.calculateKernel(network.getLinks().get(event.getLinkId()), kernelDistance); Map, ParkingCount> parkingCounts = applyWeights(weightedLinks); - double penalty = penaltyFunction.calculatePenalty(parkingCounts); + double penalty = parkingSearchTimeFunction.calculateParkingSearchTime(parkingCounts); applyPenalty(event.getTime(), event.getPersonId(), penalty, event.getLinkId()); parkVehicle(event.getLinkId()); @@ -115,7 +145,7 @@ private Map, ParkingCount> applyWeights(Map, Double> weightedL return result; } - private void applyPenalty(double time, Id personId, double penaltyInSec, Id linkId) { + private void applyPenalty(double time, Id personId, double parkingSearchTime, Id linkId) { //TODO convert penalty to money double score = 0.0; @@ -123,28 +153,4 @@ private void applyPenalty(double time, Id personId, double penaltyInSec, PersonScoreEvent personScoreEvent = new PersonScoreEvent(time, personId, score, "parking"); eventsManager.processEvent(personScoreEvent); } - - private void initializeParking() { - int counter = 0; - indexByLinkId = new HashMap<>(network.getLinks().size()); - - for (Id id : network.getLinks().keySet()) { - indexByLinkId.put(id, counter++); - } - - int linkCount = network.getLinks().size(); - capacity = new int[linkCount]; - parkingCount = new int[linkCount]; - - Map, ParkingCapacityInitializer.ParkingInitialCapacity> initialize = - parkingCapacityInitializer.initialize(parkingEventsHandler.getVehicleEntersTrafficEvents(), parkingEventsHandler.getVehicleLeavesTrafficEvents()); - - for (Link link : network.getLinks().values()) { - ParkingCapacityInitializer.ParkingInitialCapacity parkingInitialCapacity = initialize.get(link.getId()); - int index = indexByLinkId.get(link.getId()); - - capacity[index] = parkingInitialCapacity.capacity(); - parkingCount[index] = parkingInitialCapacity.initial(); - } - } } diff --git a/src/main/java/org/matsim/run/scoring/parking/ZeroParkingCapacityInitializer.java b/src/main/java/org/matsim/run/scoring/parking/ZeroParkingCapacityInitializer.java index c3046345a..fa70872d4 100644 --- a/src/main/java/org/matsim/run/scoring/parking/ZeroParkingCapacityInitializer.java +++ b/src/main/java/org/matsim/run/scoring/parking/ZeroParkingCapacityInitializer.java @@ -12,8 +12,8 @@ import java.util.Map; import java.util.Optional; -import static org.matsim.run.scoring.parking.ParkingObserver.LINK_OFF_STREET_SPOTS; -import static org.matsim.run.scoring.parking.ParkingObserver.LINK_ON_STREET_SPOTS; +import static org.matsim.run.scoring.parking.ParkingTimeEstimator.LINK_OFF_STREET_SPOTS; +import static org.matsim.run.scoring.parking.ParkingTimeEstimator.LINK_ON_STREET_SPOTS; public class ZeroParkingCapacityInitializer implements ParkingCapacityInitializer { private Network network; diff --git a/src/test/java/org/matsim/run/scoring/parking/BellochePenaltyFunctionTest.java b/src/test/java/org/matsim/run/scoring/parking/BellocheParkingSearchTimeFunctionTest.java similarity index 68% rename from src/test/java/org/matsim/run/scoring/parking/BellochePenaltyFunctionTest.java rename to src/test/java/org/matsim/run/scoring/parking/BellocheParkingSearchTimeFunctionTest.java index 1f59214d7..5d1d81005 100644 --- a/src/test/java/org/matsim/run/scoring/parking/BellochePenaltyFunctionTest.java +++ b/src/test/java/org/matsim/run/scoring/parking/BellocheParkingSearchTimeFunctionTest.java @@ -7,26 +7,26 @@ import java.util.Map; -class BellochePenaltyFunctionTest { +class BellocheParkingSearchTimeFunctionTest { @Test void everyLinkFull() { BellochePenaltyFunction bellochePenaltyFunction = new BellochePenaltyFunction(0.4, -6); - double penalty = bellochePenaltyFunction.calculatePenalty(Map.of(getDummyLinkId(), new ParkingCount(1, 1, 1))); + double penalty = bellochePenaltyFunction.calculateParkingSearchTime(Map.of(getDummyLinkId(), new ParkingCount(1, 1, 1))); Assertions.assertEquals(0.4 * Math.exp(6), penalty); //161.37 } @Test void everyLinkEmpty() { BellochePenaltyFunction bellochePenaltyFunction = new BellochePenaltyFunction(0.4, -6); - double penalty = bellochePenaltyFunction.calculatePenalty(Map.of(getDummyLinkId(), new ParkingCount(0, 1, 1))); + double penalty = bellochePenaltyFunction.calculateParkingSearchTime(Map.of(getDummyLinkId(), new ParkingCount(0, 1, 1))); Assertions.assertEquals(0.4, penalty); } @Test void zeroCapacity() { BellochePenaltyFunction bellochePenaltyFunction = new BellochePenaltyFunction(0.4, -6); - double penalty = bellochePenaltyFunction.calculatePenalty(Map.of(getDummyLinkId(), new ParkingCount(0, 0, 1))); + double penalty = bellochePenaltyFunction.calculateParkingSearchTime(Map.of(getDummyLinkId(), new ParkingCount(0, 0, 1))); Assertions.assertEquals(0.4 * Math.exp(6), penalty); //161.37 } @@ -40,7 +40,7 @@ void weightedSum() { double weight2 = 0.8; BellochePenaltyFunction bellochePenaltyFunction = new BellochePenaltyFunction(0.4, -6); - double penalty = bellochePenaltyFunction.calculatePenalty(Map.of(getDummyLinkId(), new ParkingCount(occ1, cap1, weight1), Id.createLinkId("dummyLinkId2"), new ParkingCount(occ2, cap2, weight2))); + double penalty = bellochePenaltyFunction.calculateParkingSearchTime(Map.of(getDummyLinkId(), new ParkingCount(occ1, cap1, weight1), Id.createLinkId("dummyLinkId2"), new ParkingCount(occ2, cap2, weight2))); double weightedOcc = occ1 * weight1 + occ2 * weight2; double weightedK = cap1 * weight1 + cap2 * weight2; diff --git a/src/test/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializerTest.java b/src/test/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializerTest.java index 4bc549e70..81aa6fa39 100644 --- a/src/test/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializerTest.java +++ b/src/test/java/org/matsim/run/scoring/parking/EventBasedParkingCapacityInitializerTest.java @@ -111,8 +111,8 @@ private Network getNetwork() { // Chessboard network has 10x10 nodes, starting from (0,0) to (9000,9000). The distance between two adjacent nodes is 1000 on the x- or y-axis. Network network = NetworkUtils.readNetwork(testUtils.getPackageInputDirectory() + "./chessboard_network.xml"); network.getLinks().values().forEach(l -> { - l.getAttributes().putAttribute(ParkingObserver.LINK_ON_STREET_SPOTS, Integer.valueOf(l.getId().toString())); - l.getAttributes().putAttribute(ParkingObserver.LINK_OFF_STREET_SPOTS, 0); + l.getAttributes().putAttribute(ParkingTimeEstimator.LINK_ON_STREET_SPOTS, Integer.valueOf(l.getId().toString())); + l.getAttributes().putAttribute(ParkingTimeEstimator.LINK_OFF_STREET_SPOTS, 0); }); return network; diff --git a/src/test/java/org/matsim/run/scoring/parking/ParkingObserverTest.java b/src/test/java/org/matsim/run/scoring/parking/ParkingTimeEstimatorTest.java similarity index 94% rename from src/test/java/org/matsim/run/scoring/parking/ParkingObserverTest.java rename to src/test/java/org/matsim/run/scoring/parking/ParkingTimeEstimatorTest.java index f5ef88556..738d2d80f 100644 --- a/src/test/java/org/matsim/run/scoring/parking/ParkingObserverTest.java +++ b/src/test/java/org/matsim/run/scoring/parking/ParkingTimeEstimatorTest.java @@ -25,7 +25,7 @@ import java.util.List; -class ParkingObserverTest { +class ParkingTimeEstimatorTest { @RegisterExtension MatsimTestUtils testUtils = new MatsimTestUtils(); @@ -87,7 +87,7 @@ void testScoreEvents_onlyOffStreetSpots() { } private void runAndCheckEvents() { - injector.getInstance(ParkingObserver.class).notifyAfterMobsim(new AfterMobsimEvent(null, 0, false)); + injector.getInstance(ParkingTimeEstimator.class).notifyAfterMobsim(new AfterMobsimEvent(null, 0, false)); injector.getInstance(TestHandler.class).checkAllEventsProcessed(); } @@ -117,9 +117,9 @@ public void install() { private void prepareNetwork(Network network, boolean offStreet) { network.getLinks().values().forEach(l -> { - l.getAttributes().putAttribute(ParkingObserver.LINK_ON_STREET_SPOTS, 1); + l.getAttributes().putAttribute(ParkingTimeEstimator.LINK_ON_STREET_SPOTS, 1); if (offStreet) { - l.getAttributes().putAttribute(ParkingObserver.LINK_OFF_STREET_SPOTS, 1); + l.getAttributes().putAttribute(ParkingTimeEstimator.LINK_OFF_STREET_SPOTS, 1); } }); }