From 27d97112d3f0611e2463ecc5cc3248598a69ee59 Mon Sep 17 00:00:00 2001 From: Grufoony Date: Fri, 13 Mar 2026 12:46:54 +0100 Subject: [PATCH] Bugfix: miscounting killed random agents --- src/dsf/mobility/FirstOrderDynamics.cpp | 4 +++- test/mobility/Test_dynamics.cpp | 29 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/dsf/mobility/FirstOrderDynamics.cpp b/src/dsf/mobility/FirstOrderDynamics.cpp index 7a744e1b..5e3efde5 100644 --- a/src/dsf/mobility/FirstOrderDynamics.cpp +++ b/src/dsf/mobility/FirstOrderDynamics.cpp @@ -58,7 +58,9 @@ namespace dsf::mobility { m_travelDTs.push_back({pAgent->distance(), static_cast(this->time_step() - pAgent->spawnTime())}); --m_nAgents; - ++m_nKilledAgents; + if (pAgent->isRandom() && !pAgent->hasArrived(this->time_step())) { + ++m_nKilledAgents; + } auto const& streetId = pAgent->streetId(); if (streetId.has_value()) { auto const& pStreet{this->graph().edge(streetId.value())}; diff --git a/test/mobility/Test_dynamics.cpp b/test/mobility/Test_dynamics.cpp index 4608bc43..d7e166c2 100644 --- a/test/mobility/Test_dynamics.cpp +++ b/test/mobility/Test_dynamics.cpp @@ -556,6 +556,35 @@ TEST_CASE("FirstOrderDynamics") { } } SUBCASE("Evolve") { + GIVEN("A dynamics object with one non-random agent that reaches its destination") { + Street s1{0, std::make_pair(0, 1), 13.8888888889}; + Street s2{1, std::make_pair(1, 0), 13.8888888889}; + RoadNetwork graph2; + graph2.addStreets(s1, s2); + FirstOrderDynamics dynamics{graph2, false, 69}; + dynamics.setWeightFunction(dsf::PathWeight::LENGTH); + dynamics.setSpeedFunction(dsf::SpeedFunction::LINEAR, 0.8); + dynamics.addItinerary(1, 1); + dynamics.updatePaths(); + dynamics.addAgent(dynamics.itineraries().at(1), 0); + + WHEN("We evolve until the agent reaches the destination") { + dynamics.evolve(false); + dynamics.evolve(false); + dynamics.evolve(false); + dynamics.evolve(false); + + THEN("The summary counts the agent as arrived but not killed") { + std::ostringstream oss; + dynamics.summary(oss); + const auto summaryStr = oss.str(); + + CHECK(summaryStr.find("Number of arrived agents: 1") != std::string::npos); + CHECK(summaryStr.find("Number of killed agents: 0") != std::string::npos); + CHECK(summaryStr.find("Current number of agents: 0") != std::string::npos); + } + } + } GIVEN("A dynamics object and an itinerary") { Street s1{0, std::make_pair(0, 1), 2.}; Street s2{1, std::make_pair(1, 2), 5.};