LCOV - code coverage report
Current view: top level - app/src/Dynamic/Env/Event - EventUpdateVehicle.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 53 0.0 %
Date: 2023-08-17 16:45:52 Functions: 0 3 0.0 %

          Line data    Source code
       1             : #include "Dynamic/Env/Event/EventUpdateVehicle.hpp"
       2             : 
       3             : #include <spdlog/spdlog.h>
       4             : 
       5             : #include "Dynamic/Env/Env.hpp"
       6             : #include "Dynamic/Env/Event/EventDespawnVehicle.hpp"
       7             : #include "Dynamic/Env/Event/EventMoveVehicle.hpp"
       8             : #include "Dynamic/Env/Event/EventPopQueue.hpp"
       9             : #include "Dynamic/Env/Lane.hpp"
      10             : 
      11             : using namespace std;
      12             : using namespace Dynamic;
      13             : using namespace Dynamic::Env;
      14             : 
      15             : const Length EPSILON = 1e-3;
      16             : 
      17           0 : EventUpdateVehicle::EventUpdateVehicle(Time t_, Vehicle &vehicle_):
      18           0 :     EventMoveVehicle(t_, vehicle_), vehicle(vehicle_) {}
      19             : 
      20           0 : void enqueue(Dynamic::Env::Env &env, Dynamic::Env::Vehicle &vehicle, shared_ptr<Dynamic::Env::Action> action) {
      21           0 :     vehicle.position.offset = vehicle.position.lane.queuePosition();
      22             : 
      23           0 :     vehicle.position.lane.stopped.emplace(vehicle, action);
      24             : 
      25           0 :     vehicle.lastUpdateTime = env.getTime();
      26           0 :     vehicle.lastMoveTime   = env.getTime();
      27             : 
      28           0 :     vehicle.speed = 0;
      29             : 
      30           0 :     vehicle.state = Dynamic::Env::Vehicle::State::STOPPED;
      31             : 
      32             :     // if(vehicle.position.lane.stopped.size() >= vehicle.position.lane.queueCapacity() + 10) {
      33             :     //     spdlog::warn(
      34             :     //         "[t={}] Queue size exceeded in lane {}, capacity is {}, size is {}",
      35             :     //         env.getTime(),
      36             :     //         vehicle.position.lane.idAsString(),
      37             :     //         vehicle.position.lane.queueCapacity(),
      38             :     //         vehicle.position.lane.stopped.size()
      39             :     //     );
      40             :     // }
      41             : 
      42           0 :     if(
      43           0 :         env.getDespawnTime() < numeric_limits<Time>::infinity()
      44           0 :         && vehicle.position.lane.stopped.size() == 1
      45             :     ) {
      46             :         // No need to update lastUpdateTime or lastMoveTime, as it is already done above
      47           0 :         env.pushEvent(make_shared<EventDespawnVehicle>(
      48           0 :             env.getTime() + env.getDespawnTime(),
      49           0 :             vehicle.id
      50             :         ));
      51             :     }
      52           0 : }
      53             : 
      54           0 : void EventUpdateVehicle::process(Env &env) {
      55           0 :     EventMoveVehicle::process(env);
      56             : 
      57             :     // assert(vehicle.position.offset > vehicle.position.lane.queuePosition() - EPSILON);
      58             : 
      59             :     // Not at end of edge
      60           0 :     if(vehicle.position.offset < vehicle.position.lane.queuePosition() - EPSILON) {
      61           0 :         Time Dt      = (vehicle.position.lane.queuePosition() - vehicle.position.offset) / vehicle.speed;
      62           0 :         Dt           = max(Dt, 0.0);
      63           0 :         Time tFuture = env.getTime() + Dt;
      64           0 :         env.pushEvent(make_shared<EventUpdateVehicle>(tFuture, vehicle));
      65           0 :         return;
      66             :     }
      67             : 
      68             :     // Is at end of edge; enqueue or move to next edge
      69             : 
      70           0 :     auto action = vehicle.pickConnection(env);
      71             : 
      72           0 :     if(action->connection == Connection::LEAVE) {
      73           0 :         if(vehicle.toTAZ.sinks.count(vehicle.position.lane.edge) <= 0) {  // Leaving network at wrong place
      74           0 :             spdlog::warn(
      75             :                 "Vehicle {} is leaving network at wrong place",
      76           0 :                 env.getTime(),
      77           0 :                 vehicle.id
      78             :             );
      79           0 :             action->reward(-numeric_limits<Action::Reward>::infinity());
      80             :         }
      81             : 
      82           0 :         vehicle.state = Vehicle::State::LEFT;
      83             : 
      84           0 :         assert(vehicle.position.lane.moving.erase(vehicle.id) == 1);
      85             : 
      86           0 :         return;
      87           0 :     } else if(action->connection == Connection::STOP) {
      88             :         return;
      89             :     }
      90             : 
      91           0 :     Lane &fromLane = action->connection.fromLane;
      92           0 :     Lane &toLane   = action->connection.toLane;
      93             : 
      94           0 :     assert(vehicle.position.lane == fromLane);
      95           0 :     assert(toLane.edge == action->lane.edge);
      96             : 
      97           0 :     assert(fromLane.moving.erase(vehicle.id) == 1);
      98             : 
      99             :     // Try to leave current edge
     100           0 :     if(
     101           0 :         !vehicle.position.lane.stopped.empty()
     102           0 :         || action->connection.isRed()
     103           0 :         || action->connection.toLane.isFull()
     104             :     ) {
     105             :         // Enqueue
     106           0 :         enqueue(env, vehicle, action);
     107             : 
     108           0 :         return;
     109             :     }
     110             : 
     111           0 :     Time yieldUntil = action->connection.mustYieldUntil();
     112           0 :     if(yieldUntil > env.getTime()) {
     113             :         // Must yield to higher-priority flow; enqueue and wait
     114           0 :         enqueue(env, vehicle, action);
     115             : 
     116           0 :         env.pushEvent(make_shared<EventPopQueue>(
     117             :             yieldUntil,
     118           0 :             vehicle.position.lane
     119             :         ));
     120             : 
     121           0 :         return;
     122             :     }
     123             : 
     124             :     // Move to next edge
     125           0 :     vehicle.moveToAnotherEdge(env, action);
     126             : }

Generated by: LCOV version 1.14