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 : }