LCOV - code coverage report
Current view: top level - app/src/Static/supply - BPRNotConvexNetwork_Loader.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 52 53 98.1 %
Date: 2023-08-17 16:45:52 Functions: 4 4 100.0 %

          Line data    Source code
       1             : #include <cmath>
       2             : #include <iostream>
       3             : #include <numeric>
       4             : #include <set>
       5             : #include <stdexcept>
       6             : #include <tuple>
       7             : 
       8             : #include "Alg/Flow/EdmondsKarp.hpp"
       9             : #include "Alg/Graph.hpp"
      10             : #include "Alg/ShortestPath/BFS.hpp"
      11             : #include "Static/supply/BPRNetwork.hpp"
      12             : #include "Static/supply/BPRNotConvexNetwork.hpp"
      13             : #include "data/SUMO/Network.hpp"
      14             : #include "data/SUMO/NetworkTAZ.hpp"
      15             : #include "data/SUMO/SUMO.hpp"
      16             : 
      17             : using namespace std;
      18             : using namespace Static;
      19             : using namespace utils;
      20             : 
      21             : typedef SUMO::Network::Edge::Lane Lane;
      22             : typedef SUMO::Speed               Speed;
      23             : typedef SUMO::Length              Length;
      24             : 
      25           3 : BPRNotConvexNetwork *BPRNotConvexNetwork::Loader<SUMO::NetworkTAZs>::load(const SUMO::NetworkTAZs &sumo) {
      26           3 :     clear();
      27             : 
      28           3 :     networkNotConvex = new BPRNotConvexNetwork();
      29           3 :     network          = networkNotConvex;
      30             : 
      31           3 :     addNormalEdges(sumo);
      32             : 
      33           3 :     addConnections(sumo);
      34             : 
      35           3 :     iterateCapacities(sumo);
      36             : 
      37           3 :     addTAZs(sumo);
      38             : 
      39       11397 :     for(const auto &[eID, t]: connectionEdges) {
      40       11394 :         const auto &[e, fromID, toID] = t;
      41       26794 :         if(connectionMap.count(fromID) && connectionMap.at(fromID).count(toID)) {
      42           0 :             throw logic_error("BPRNotConvexNetwork::Loader<SUMO::NetworkTAZs>::load: Connection already exists in connectionMap");
      43             :         }
      44       11394 :         connectionMap[fromID][toID] = eID;
      45             :     }
      46             : 
      47       11397 :     for(auto &[eID, _]: connectionEdges) {
      48       11394 :         addConnectionConflicts(sumo, eID);
      49             :     }
      50             : 
      51           3 :     return networkNotConvex;
      52             : }
      53             : 
      54       11394 : void BPRNotConvexNetwork::Loader<SUMO::NetworkTAZs>::addConnectionConflicts(const SUMO::NetworkTAZs &sumo, const Edge::ID &eID) {
      55       11394 :     auto &[e_, fromID, toID] = connectionEdges.at(eID);
      56       11394 :     ConnectionEdge *e        = dynamic_cast<ConnectionEdge *>(e_);
      57       11394 :     assert(e != nullptr);
      58             : 
      59       11394 :     const SUMO::Network::Edge &from = sumo.network.getEdge(fromID);
      60       11394 :     const SUMO::Network::Edge &to   = sumo.network.getEdge(toID);
      61             : 
      62       21133 :     const vector<reference_wrapper<const SUMO::Network::Connection>> fromToConnections = sumo.network.getConnections(from, to);
      63             : 
      64       23080 :     for(const SUMO::Network::Connection &conn: fromToConnections) {
      65       13341 :         if(conn.tl) {
      66        1655 :             e->conflicts.clear();
      67        1655 :             return;
      68             :         }
      69             : 
      70       23372 :         vector<reference_wrapper<const SUMO::Network::Connection>> response = conn.getRequest().getResponse();
      71             : 
      72       23372 :         vector<pair<const Edge *, double>> conf;
      73             : 
      74       18907 :         for(const SUMO::Network::Connection &r: response) {
      75        7221 :             ConnectionEdge::ID cID = connectionMap.at(r.from.id).at(r.to.id);
      76        7221 :             ConnectionEdge    *c   = dynamic_cast<ConnectionEdge *>(get<0>(connectionEdges.at(cID)));
      77        7221 :             assert(c != nullptr);
      78             : 
      79        7221 :             size_t n = getNumberLanes(sumo, *c);
      80        7221 :             assert(n > 0);
      81             : 
      82        7221 :             conf.push_back({c, 1.0 / (double)n});
      83             :         }
      84             : 
      85       11686 :         e->conflicts.push_back(conf);
      86             :     }
      87             : }
      88             : 
      89        7221 : size_t BPRNotConvexNetwork::Loader<SUMO::NetworkTAZs>::getNumberLanes(const SUMO::NetworkTAZs &sumo, const ConnectionEdge &e) const {
      90        7221 :     const SUMO::Network::Edge::ID &fromID = adapter.fromNodeToSumoEdge(e.u);
      91       14442 :     const SUMO::Network::Edge::ID &toID   = adapter.fromNodeToSumoEdge(e.v);
      92             : 
      93        7221 :     vector<reference_wrapper<const SUMO::Network::Connection>> connections = sumo.network.getConnections(
      94        7221 :         sumo.network.getEdge(fromID),
      95             :         sumo.network.getEdge(toID)
      96       14442 :     );
      97       14442 :     set<SUMO::Index> fromLanes;
      98        7221 :     set<SUMO::Index> toLanes;
      99       15981 :     for(const SUMO::Network::Connection &connection: connections) {
     100        8760 :         fromLanes.insert(connection.fromLane().index);
     101        8760 :         toLanes.insert(connection.toLane().index);
     102             :     }
     103       14442 :     return min(fromLanes.size(), toLanes.size());
     104             : }
     105             : 
     106           3 : void BPRNotConvexNetwork::Loader<SUMO::NetworkTAZs>::clear() {
     107           3 :     BPRNetwork::Loader<SUMO::NetworkTAZs>::clear();
     108           3 :     connectionMap.clear();
     109           3 : }

Generated by: LCOV version 1.14