@@ -465,7 +465,8 @@ namespace dsm {
465465 void Dynamics<Delay>::m_evolveStreet(const Id streetId,
466466 const std::unique_ptr<Street>& pStreet,
467467 bool reinsert_agents) {
468- for (auto queueIndex = 0 ; queueIndex < pStreet->nLanes (); ++queueIndex) {
468+ auto const nLanes = pStreet->nLanes ();
469+ for (auto queueIndex = 0 ; queueIndex < nLanes; ++queueIndex) {
469470 if (m_uniformDist (m_generator) > m_maxFlowPercentage ||
470471 pStreet->queue (queueIndex).empty ()) {
471472 continue ;
@@ -481,18 +482,16 @@ namespace dsm {
481482 }
482483 if (destinationNode->isTrafficLight ()) {
483484 auto & tl = dynamic_cast <TrafficLight<Delay>&>(*destinationNode);
484- if (tl.leftTurnRatio ().has_value ()) {
485- auto it = m_agentNextStreetId.find (agentId);
486- if (it == m_agentNextStreetId.end ()) {
487- if (!tl.isGreen (streetId, 0 .)) {
488- continue ;
489- }
490- } else {
491- auto const & nextStreet{m_graph.streetSet ()[m_agentNextStreetId[agentId]]};
492- auto const delta{nextStreet->deltaAngle (pStreet->angle ())};
493- if (!tl.isGreen (streetId, delta)) {
494- continue ;
495- }
485+ if (tl.leftTurnRatio ().has_value () && nLanes > 1 && queueIndex == nLanes - 1 ) {
486+ if (tl.isGreen (streetId) &&
487+ tl.counter () >
488+ tl.delay ().value ().first * (1 . - tl.leftTurnRatio ().value ().first )) {
489+ continue ;
490+ } else if (!tl.isGreen (streetId) &&
491+ tl.counter () > tl.delay ().value ().first +
492+ tl.delay ().value ().second *
493+ (1 . - tl.leftTurnRatio ().value ().second )) {
494+ continue ;
496495 }
497496 } else if (!tl.isGreen (streetId)) {
498497 continue ;
@@ -1147,10 +1146,7 @@ namespace dsm {
11471146 template <typename Delay>
11481147 requires (is_numeric_v<Delay>)
11491148 void Dynamics<Delay>::removeAgent(Size agentId) {
1150- assert ((void (" Trying to remove an agent that does not exist" ),
1151- std::erase_if (m_agents, [agentId](const auto & agent) {
1152- return agent.first == agentId;
1153- }) == 1 ));
1149+ m_agents.erase (agentId);
11541150 }
11551151
11561152 template <typename Delay>
@@ -1232,7 +1228,7 @@ namespace dsm {
12321228 std::vector<double > densities;
12331229 densities.reserve (m_graph.streetSet ().size ());
12341230 for (const auto & [streetId, street] : m_graph.streetSet ()) {
1235- densities.push_back (normalized ? street->normDensity () : street-> density ());
1231+ densities.push_back (street->density (normalized ));
12361232 }
12371233 return Measurement<double >(densities);
12381234 }
@@ -1255,9 +1251,9 @@ namespace dsm {
12551251 std::vector<double > flows;
12561252 flows.reserve (m_graph.streetSet ().size ());
12571253 for (const auto & [streetId, street] : m_graph.streetSet ()) {
1258- if (above and (street->normDensity ( ) > threshold)) {
1254+ if (above && (street->density ( true ) > threshold)) {
12591255 flows.push_back (street->density () * this ->streetMeanSpeed (streetId));
1260- } else if (!above and (street->normDensity ( ) < threshold)) {
1256+ } else if (!above && (street->density ( true ) < threshold)) {
12611257 flows.push_back (street->density () * this ->streetMeanSpeed (streetId));
12621258 }
12631259 }
@@ -1387,7 +1383,7 @@ namespace dsm {
13871383 const auto & agent{this ->m_agents [agentId]};
13881384 const auto & street{this ->m_graph .streetSet ()[agent->streetId ().value ()]};
13891385 double speed{street->maxSpeed () *
1390- (1 . - this ->m_minSpeedRateo * street->normDensity ( ))};
1386+ (1 . - this ->m_minSpeedRateo * street->density ( true ))};
13911387 if (this ->m_speedFluctuationSTD > 0 .) {
13921388 std::normal_distribution<double > speedDist{speed,
13931389 speed * this ->m_speedFluctuationSTD };
@@ -1479,11 +1475,11 @@ namespace dsm {
14791475 speeds.reserve (this ->m_graph .streetSet ().size ());
14801476 for (const auto & [streetId, street] : this ->m_graph .streetSet ()) {
14811477 if (above) {
1482- if (street->normDensity ( ) > threshold) {
1478+ if (street->density ( true ) > threshold) {
14831479 speeds.push_back (this ->streetMeanSpeed (streetId));
14841480 }
14851481 } else {
1486- if (street->normDensity ( ) < threshold) {
1482+ if (street->density ( true ) < threshold) {
14871483 speeds.push_back (this ->streetMeanSpeed (streetId));
14881484 }
14891485 }
0 commit comments