From 5924acd2641721f644a8ecddf2e3b20502bee49c Mon Sep 17 00:00:00 2001 From: Theresa Ziemke Date: Wed, 28 Aug 2024 15:51:55 +0200 Subject: [PATCH 1/8] bind NewScoreAssigner as singleton ...before it was created newly each iteration such that MSA counting did not work --- .../src/main/java/org/matsim/core/scoring/PlansScoringImpl.java | 2 +- .../main/java/org/matsim/core/scoring/PlansScoringModule.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java index bc774cc2c1d..a5671b0c673 100644 --- a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java +++ b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringImpl.java @@ -52,11 +52,11 @@ final class PlansScoringImpl implements PlansScoring, ScoringListener, Iteration @Inject private OutputDirectoryHierarchy controlerIO; @Inject private ScoringFunctionsForPopulation scoringFunctionsForPopulation; @Inject private ExperiencedPlansService experiencedPlansService; + @Inject private NewScoreAssigner newScoreAssigner; @Override public void notifyScoring(final ScoringEvent event) { scoringFunctionsForPopulation.finishScoringFunctions(); - NewScoreAssignerImpl newScoreAssigner = new NewScoreAssignerImpl(this.scoringConfigGroup, this.controllerConfigGroup); newScoreAssigner.assignNewScores(event.getIteration(), this.scoringFunctionsForPopulation, this.population); } diff --git a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java index 1e5f29c1114..2048613ebd5 100644 --- a/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java +++ b/matsim/src/main/java/org/matsim/core/scoring/PlansScoringModule.java @@ -32,5 +32,6 @@ public void install() { bind(ScoringFunctionsForPopulation.class).asEagerSingleton(); bind(PlansScoring.class).to(PlansScoringImpl.class); bind(ExperiencedPlansService.class).to(ExperiencedPlansServiceImpl.class).asEagerSingleton(); + bind(NewScoreAssigner.class).to(NewScoreAssignerImpl.class).asEagerSingleton(); } } From b5529694cb9e89c365d344a1fc7987b5977a8174 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Aug 2024 05:08:32 +0000 Subject: [PATCH 2/8] Bump avro.version from 1.11.3 to 1.12.0 Bumps `avro.version` from 1.11.3 to 1.12.0. Updates `org.apache.avro:avro` from 1.11.3 to 1.12.0 Updates `org.apache.avro:avro-maven-plugin` from 1.11.3 to 1.12.0 --- updated-dependencies: - dependency-name: org.apache.avro:avro dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.apache.avro:avro-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- contribs/application/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contribs/application/pom.xml b/contribs/application/pom.xml index 70a548c2dc7..4035f096a83 100644 --- a/contribs/application/pom.xml +++ b/contribs/application/pom.xml @@ -22,7 +22,7 @@ - 1.11.3 + 1.12.0 From 7776adfc2b0c963c781a5d7e6ff8d1e7ac08b6cb Mon Sep 17 00:00:00 2001 From: Kai Nagel Date: Mon, 2 Sep 2024 12:05:03 +0200 Subject: [PATCH 3/8] pass money and additionalScore events through to carrierScoringFunction --- .../carriers/controler/CarrierDriverAgent.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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/controler/CarrierDriverAgent.java index 00233bbbf18..137e576f44e 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java @@ -97,6 +97,8 @@ void handleAnEvent(Event event){ case LinkEnterEvent linkEnterEvent -> handleEvent(linkEnterEvent); case ActivityEndEvent activityEndEvent -> handleEvent(activityEndEvent); case ActivityStartEvent activityStartEvent -> handleEvent(activityStartEvent); + case PersonMoneyEvent personMoneyEvent -> handleEvent( personMoneyEvent ); + case PersonScoreEvent personScoreEvent -> handleEvent( personScoreEvent ); case null, default -> createAdditionalEvents(event, null, scheduledTour, driverId, planElementCounter); } } @@ -145,6 +147,22 @@ private void handleEvent( LinkEnterEvent event ){ createAdditionalEvents( event, null, scheduledTour, driverId, planElementCounter ); } + private void handleEvent( PersonScoreEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } +// currentRoute.add( event.getLinkId() ); +// createAdditionalEvents( event, null, scheduledTour, driverId, planElementCounter ); + } + + private void handleEvent( PersonMoneyEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } +// currentRoute.add( event.getLinkId() ); +// createAdditionalEvents( event, null, scheduledTour, driverId, planElementCounter ); + } + private void handleEvent( ActivityEndEvent event ){ if( currentActivity == null ){ Activity firstActivity = PopulationUtils.createActivityFromLinkId( event.getActType(), event.getLinkId() ); From 137b99b36ad6e50fcbe92f6fc6b885a5863be640 Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Mon, 2 Sep 2024 16:32:14 +0200 Subject: [PATCH 4/8] pass VehicleEnters/LeavesTrafficEvent events through to carrierScoringFunction --- .../controler/CarrierDriverAgent.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) 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/controler/CarrierDriverAgent.java index 137e576f44e..f234b30c599 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java @@ -97,6 +97,8 @@ void handleAnEvent(Event event){ case LinkEnterEvent linkEnterEvent -> handleEvent(linkEnterEvent); case ActivityEndEvent activityEndEvent -> handleEvent(activityEndEvent); case ActivityStartEvent activityStartEvent -> handleEvent(activityStartEvent); + case VehicleEntersTrafficEvent vehicleEntersTrafficEvent -> handleEvent(vehicleEntersTrafficEvent); + case VehicleLeavesTrafficEvent vehicleLeavesTrafficEvent -> handleEvent(vehicleLeavesTrafficEvent); case PersonMoneyEvent personMoneyEvent -> handleEvent( personMoneyEvent ); case PersonScoreEvent personScoreEvent -> handleEvent( personScoreEvent ); case null, default -> createAdditionalEvents(event, null, scheduledTour, driverId, planElementCounter); @@ -151,16 +153,25 @@ private void handleEvent( PersonScoreEvent event ){ if( scoringFunction != null ){ scoringFunction.handleEvent( event ); } -// currentRoute.add( event.getLinkId() ); -// createAdditionalEvents( event, null, scheduledTour, driverId, planElementCounter ); } private void handleEvent( PersonMoneyEvent event ){ if( scoringFunction != null ){ scoringFunction.handleEvent( event ); } -// currentRoute.add( event.getLinkId() ); -// createAdditionalEvents( event, null, scheduledTour, driverId, planElementCounter ); + } + + private void handleEvent( VehicleEntersTrafficEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } + driver2EventHandler.handleAnEvent(event); + } + + private void handleEvent( VehicleLeavesTrafficEvent event ){ + if( scoringFunction != null ){ + scoringFunction.handleEvent( event ); + } } private void handleEvent( ActivityEndEvent event ){ @@ -214,7 +225,6 @@ private void createAdditionalEvents( Event event, Activity activity, ScheduledTo // if( scoringFunction == null ){ // (means "called from LSP". kai, jul'22) - driver2EventHandler.handleAnEvent(event); Id vehicleId = driver2EventHandler.getVehicleOfDriver(driverId); // Reason why this here is needed is that the more informative objects such as ScheduledTour cannot be @@ -293,9 +303,6 @@ public void handleAnEvent(Event event){ if (event instanceof VehicleEntersTrafficEvent vehicleEntersTrafficEvent) { driver2EventHandler.handleEvent(vehicleEntersTrafficEvent); } - if (event instanceof VehicleEntersTrafficEvent vehicleEntersTrafficEvent) { - driver2EventHandler.handleEvent(vehicleEntersTrafficEvent); - } } } From 369a0313a25ed5c66bfaff9836c6a0f12f09884c Mon Sep 17 00:00:00 2001 From: Kai Martins-Turner Date: Mon, 2 Sep 2024 16:34:37 +0200 Subject: [PATCH 5/8] inline method --- .../freight/carriers/controler/CarrierDriverAgent.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) 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/controler/CarrierDriverAgent.java index f234b30c599..c7f030f3457 100644 --- a/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java +++ b/contribs/freight/src/main/java/org/matsim/freight/carriers/controler/CarrierDriverAgent.java @@ -165,7 +165,9 @@ private void handleEvent( VehicleEntersTrafficEvent event ){ if( scoringFunction != null ){ scoringFunction.handleEvent( event ); } - driver2EventHandler.handleAnEvent(event); + if ((Event) event instanceof VehicleEntersTrafficEvent vehicleEntersTrafficEvent) { + driver2EventHandler.handleEvent(vehicleEntersTrafficEvent); + } } private void handleEvent( VehicleLeavesTrafficEvent event ){ @@ -299,12 +301,6 @@ public Id getVehicleOfDriver(Id personId){ return driversVehicles.get(personId); } - public void handleAnEvent(Event event){ - if (event instanceof VehicleEntersTrafficEvent vehicleEntersTrafficEvent) { - driver2EventHandler.handleEvent(vehicleEntersTrafficEvent); - } - } - } } From d399d554339438b1dfa4d90ab221ca1050063f85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 06:02:06 +0000 Subject: [PATCH 6/8] Bump it.unimi.dsi:fastutil from 8.5.13 to 8.5.14 Bumps [it.unimi.dsi:fastutil](https://github.com/vigna/fastutil) from 8.5.13 to 8.5.14. - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/commits/8.5.14) --- updated-dependencies: - dependency-name: it.unimi.dsi:fastutil dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index be4f98f1127..f7866d67c0a 100644 --- a/pom.xml +++ b/pom.xml @@ -308,7 +308,7 @@ it.unimi.dsi fastutil - 8.5.13 + 8.5.14 From a1eb66709887c1a1fe3a32219a93b9d47555dbc0 Mon Sep 17 00:00:00 2001 From: Theresa Ziemke Date: Tue, 3 Sep 2024 11:02:27 +0200 Subject: [PATCH 7/8] add a test for msa with controller ...before there was only one which tested the msa functionality itself without a controller (only using EventsToScore and the separate binding there). This new test fails without the changes of this bugfix. --- .../core/scoring/EventsToScoreTest.java | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) diff --git a/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java b/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java index d7390a8bf70..8462f81ed19 100644 --- a/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java +++ b/matsim/src/test/java/org/matsim/core/scoring/EventsToScoreTest.java @@ -23,17 +23,39 @@ 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.Coord; import org.matsim.api.core.v01.Id; import org.matsim.api.core.v01.Scenario; +import org.matsim.api.core.v01.events.PersonDepartureEvent; import org.matsim.api.core.v01.events.PersonMoneyEvent; +import org.matsim.api.core.v01.events.handler.PersonDepartureEventHandler; +import org.matsim.api.core.v01.network.Link; +import org.matsim.api.core.v01.network.Network; +import org.matsim.api.core.v01.network.Node; 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.core.api.experimental.events.EventsManager; import org.matsim.core.config.Config; import org.matsim.core.config.ConfigUtils; +import org.matsim.core.config.groups.ReplanningConfigGroup; +import org.matsim.core.config.groups.RoutingConfigGroup; +import org.matsim.core.config.groups.ScoringConfigGroup; +import org.matsim.core.controler.AbstractModule; +import org.matsim.core.controler.Controler; +import org.matsim.core.controler.OutputDirectoryHierarchy; +import org.matsim.core.controler.events.IterationEndsEvent; +import org.matsim.core.controler.events.IterationStartsEvent; +import org.matsim.core.controler.listener.IterationEndsListener; +import org.matsim.core.controler.listener.IterationStartsListener; import org.matsim.core.events.EventsUtils; +import org.matsim.core.mobsim.framework.events.MobsimBeforeCleanupEvent; +import org.matsim.core.mobsim.framework.events.MobsimInitializedEvent; +import org.matsim.core.mobsim.framework.listeners.MobsimBeforeCleanupListener; +import org.matsim.core.mobsim.framework.listeners.MobsimInitializedListener; +import org.matsim.core.mobsim.qsim.AbstractQSimModule; import org.matsim.core.population.PopulationUtils; +import org.matsim.core.replanning.strategies.DefaultPlanStrategiesModule; import org.matsim.core.scenario.MutableScenario; import org.matsim.core.scenario.ScenarioUtils; import org.matsim.core.scoring.functions.CharyparNagelScoringFunctionFactory; @@ -158,6 +180,119 @@ void testMsaAveraging() { } } + @Test + void testMsaAveragingWithController() { + Config config = ConfigUtils.createConfig() ; + config.controller().setOverwriteFileSetting(OutputDirectoryHierarchy.OverwriteFileSetting.overwriteExistingFiles); + + config.controller().setFirstIteration(10); + config.controller().setLastIteration(110); + + config.scoring().setMarginalUtilityOfMoney(1.); + config.scoring().setFractionOfIterationsToStartScoreMSA(0.9); + + ReplanningConfigGroup.StrategySettings strat = new ReplanningConfigGroup.StrategySettings(); + strat.setStrategyName(DefaultPlanStrategiesModule.DefaultSelector.KeepLastSelected); + strat.setWeight(1.); + config.replanning().addStrategySettings(strat); + + config.routing().setNetworkRouteConsistencyCheck(RoutingConfigGroup.NetworkRouteConsistencyCheck.disable); + + Scenario scenario = ScenarioUtils.createScenario(config); + + Network network = scenario.getNetwork(); + Node node0 = network.getFactory().createNode(Id.createNodeId(0), new Coord(0, 0)); + Node node1 = network.getFactory().createNode(Id.createNodeId(1), new Coord(1, 0)); + network.addNode(node0); + network.addNode(node1); + Link link01 = network.getFactory().createLink(Id.createLinkId("0_1"), node0, node1); + network.addLink(link01); + + Population population = scenario.getPopulation(); + Person person = PopulationUtils.getFactory().createPerson(Id.create(1, Person.class)); + population.addPerson(person); + Plan plan = PopulationUtils.createPlan() ; + plan.addActivity(population.getFactory().createActivityFromLinkId("dummy", link01.getId())); + person.addPlan(plan); + + ScoringConfigGroup.ActivityParams dummyAct = new ScoringConfigGroup.ActivityParams("dummy"); + dummyAct.setScoringThisActivityAtAll(false); + config.scoring().addActivityParams(dummyAct); + + Controler controler = new Controler(scenario); + EventsManager events = controler.getEvents(); + controler.addOverridingModule(new AbstractModule() { + @Override + public void install() { + final int[] iteration = new int[1]; + this.addControlerListenerBinding().toInstance(new IterationStartsListener() { + @Override + public void notifyIterationStarts(IterationStartsEvent event) { + iteration[0] = event.getIteration(); + } + }); + this.addMobsimListenerBinding().toInstance(new MobsimInitializedListener() { + @Override + public void notifyMobsimInitialized(MobsimInitializedEvent e) { + events.processEvent(new PersonMoneyEvent(3600.0, person.getId(), iteration[0] -98, "bribe", "contractor" )); + } + }); + } + }); + controler.addControlerListener(new IterationEndsListener() { + @Override + public void notifyIterationEnds(IterationEndsEvent event) { + System.out.println( "score: " + person.getSelectedPlan().getScore() ) ; + + switch(event.getIteration()){ + case 99: + Assertions.assertEquals(1.0, person.getSelectedPlan().getScore(), 0); + break ; + case 100: + // first MSA iteration; plain score should be ok: + Assertions.assertEquals(2.0, person.getSelectedPlan().getScore(), 0); + break ; + case 101: + // second MSA iteration + // (2+3)/2 = 2.5 + Assertions.assertEquals(2.5, person.getSelectedPlan().getScore(), 0); + break ; + case 102: + // 3rd MSA iteration + // (2+3+4)/3 = 3 + Assertions.assertEquals(3.0, person.getSelectedPlan().getScore(), 0); + break ; + case 103: + // (2+3+4+5)/4 = 3.5 + Assertions.assertEquals(3.5, person.getSelectedPlan().getScore(), 0); + break ; + case 104: + Assertions.assertEquals(4.0, person.getSelectedPlan().getScore(), 0); + break ; + case 105: + Assertions.assertEquals(4.5, person.getSelectedPlan().getScore(), 0); + break ; + case 106: + Assertions.assertEquals(5.0, person.getSelectedPlan().getScore(), 0); + break ; + case 107: + Assertions.assertEquals(5.5, person.getSelectedPlan().getScore(), 0); + break ; + case 108: + Assertions.assertEquals(6.0, person.getSelectedPlan().getScore(), 0); + break ; + case 109: + Assertions.assertEquals(6.5, person.getSelectedPlan().getScore(), 0); + break ; + case 110: + Assertions.assertEquals(7.0, person.getSelectedPlan().getScore(), 0); + break ; + } + } + }); + controler.run(); + } + private static class MockScoringFunctionFactory implements ScoringFunctionFactory { @Override From 358f5bca718c3675635a04ef3b46636b5e3023d7 Mon Sep 17 00:00:00 2001 From: nkuehnel Date: Tue, 3 Sep 2024 18:50:44 +0200 Subject: [PATCH 8/8] prebooking stop: check for expected pickups to prevent pickup and abandonment in the same second --- .../contrib/drt/prebooking/PrebookingStopActivity.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java index 3c04ba985a3..e55af9e76a5 100644 --- a/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java +++ b/contribs/drt/src/main/java/org/matsim/contrib/drt/prebooking/PrebookingStopActivity.java @@ -206,8 +206,10 @@ protected void simStep(double now) { @Override public void notifyPassengersAreReadyForDeparture(List passengers, double now) { var request = getRequestForPassengers(passengers.stream().map(Identifiable::getId).toList()); - queuePickup(request, now); - expectedPickups.remove(request.getId()); + if(expectedPickups.containsKey(request.getId())) { + queuePickup(request, now); + expectedPickups.remove(request.getId()); + } } private AcceptedDrtRequest getRequestForPassengers(List> passengerIds) {