diff --git a/NEWS.md b/NEWS.md index d3203fcb78c..600155a3ea7 100644 --- a/NEWS.md +++ b/NEWS.md @@ -20,6 +20,10 @@ milestone for 3.7.1 * [#2689](https://github.com/pgRouting/pgrouting/pull/2689) When point is a vertex, the withPoints family do not return results. +**C/C++ code enhancemet** + +* TRSP family + ### pgRouting 3.7.0 Release Notes To see all issues & pull requests closed by this release see the [Git closed diff --git a/doc/src/release_notes.rst b/doc/src/release_notes.rst index 7940148bcc7..7292ad7059e 100644 --- a/doc/src/release_notes.rst +++ b/doc/src/release_notes.rst @@ -51,6 +51,10 @@ milestone for 3.7.1 * `#2689 `__ When point is a vertex, the withPoints family do not return results. +.. rubric:: C/C++ code enhancemet + +* TRSP family + pgRouting 3.7.0 Release Notes ------------------------------------------------------------------------------- diff --git a/include/trsp/trspHandler.hpp b/include/trsp/trspHandler.hpp index 772f6666972..c601f7ae3b3 100644 --- a/include/trsp/trspHandler.hpp +++ b/include/trsp/trspHandler.hpp @@ -50,7 +50,7 @@ namespace trsp { -class Pgr_trspHandler : public pgrouting::Pgr_messages { +class TrspHandler : public pgrouting::Pgr_messages { /** * Used in the priority queue */ @@ -101,104 +101,54 @@ class Pgr_trspHandler : public pgrouting::Pgr_messages { public: - Pgr_trspHandler( + TrspHandler( std::vector &edges, const std::vector &new_edges, const bool directed, const std::vector &ruleList); - Pgr_trspHandler( + + TrspHandler( std::vector &edges, const bool directed, const std::vector &ruleList); - Pgr_trspHandler( - Edge_t *edges, - const size_t edge_count, - const bool directed, - const std::vector &ruleList); - Pgr_trspHandler( - Edge_t *edges, - const size_t edge_count, - const std::vector &new_edges, - const bool directed, - const std::vector &ruleList); - - Pgr_trspHandler(void) = delete; - ~Pgr_trspHandler(void) = default; - - - Path process( - const int64_t start_vertex, - const int64_t end_vertex); - - std::deque process( - const std::map> &combinations); - - std::deque process( - const std::vector sources, - const std::vector targets); + ~TrspHandler(void) = default; + std::deque process(const std::map>&); void clear(); private: - void construct_graph(const std::vector&, const bool); - void construct_graph( - Edge_t *edges, - const size_t edge_count, - const bool directed); + void construct_graph(const std::vector&, const std::vector&, const bool); - void add_point_edges( - const std::vector &new_edges, - const bool directed); - - int initialize_restrictions( - const std::vector &ruleList); + int initialize_restrictions(const std::vector&); void initialize_que(); - Path process_trsp( - size_t edge_count); + Path process(const int64_t, const int64_t); + + Path process_trsp(size_t edge_count); EdgeInfo dijkstra_exploration(); + void explore(int64_t, const EdgeInfo, bool); - void explore( - int64_t cur_node, - const EdgeInfo cur_edge, - bool isStart); + double getRestrictionCost(int64_t, const EdgeInfo&, bool); - double getRestrictionCost( - int64_t cur_node, - const EdgeInfo &new_edge, - bool isStart); - bool addEdge(Edge_t edgeIn, bool); + bool addEdge(Edge_t, bool); - void connectStartEdge( - size_t firstEdge_idx, - size_t secondEdge_idx); + void connectStartEdge(size_t, size_t); - void connectEndEdge( - size_t firstEdge_idx, - size_t secondEdge_idx); + void connectEndEdge(size_t, size_t); - double construct_path(int64_t ed_id, Position pos); + double construct_path(int64_t, Position); - void renumber_edges(Edge_t*, const size_t); - void renumber_edges(Edge_t*, const size_t, std::vector&); void renumber_edges(std::vector&); void renumber_edges(std::vector&, std::vector&); - void add_to_que( - double cost, - size_t e_idx, - bool isStart); + void add_to_que(double, size_t, bool); - double get_tot_cost( - double cost, - size_t edge_idx, - bool isStart); + double get_tot_cost(double, size_t, bool); private: std::vector m_edges; @@ -226,7 +176,7 @@ class Pgr_trspHandler : public pgrouting::Pgr_messages { /* * Used in dijkstra_exploration */ - int64_t current_node; + int64_t m_current_node; Path m_path; @@ -238,7 +188,7 @@ class Pgr_trspHandler : public pgrouting::Pgr_messages { /* * priority queue */ - std::priority_queue, std::greater > que; + std::priority_queue, std::greater> m_que; }; diff --git a/src/trsp/trspHandler.cpp b/src/trsp/trspHandler.cpp index 29963e5407b..b14f472b954 100644 --- a/src/trsp/trspHandler.cpp +++ b/src/trsp/trspHandler.cpp @@ -42,8 +42,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. namespace pgrouting { namespace trsp { -// ------------------------------------------------------------------------- -Pgr_trspHandler::Pgr_trspHandler( +TrspHandler::TrspHandler( std::vector &edges, const bool directed, const std::vector &ruleList) : @@ -55,29 +54,10 @@ Pgr_trspHandler::Pgr_trspHandler( m_idx_to_id[id.second] = id.first; } - construct_graph(edges, directed); + construct_graph(edges, std::vector(), directed); } -Pgr_trspHandler::Pgr_trspHandler( - Edge_t *edges, - const size_t edge_count, - const bool directed, - const std::vector &ruleList) : - m_ruleTable() { - initialize_restrictions(ruleList); - - renumber_edges(edges, edge_count); - for (const auto& id : m_id_to_idx) { - m_idx_to_id[id.second] = id.first; - } - - construct_graph( - edges, - edge_count, - directed); -} - -Pgr_trspHandler::Pgr_trspHandler( +TrspHandler::TrspHandler( std::vector &edges, const std::vector &new_edges, const bool directed, @@ -92,44 +72,14 @@ Pgr_trspHandler::Pgr_trspHandler( m_idx_to_id[id.second] = id.first; } - construct_graph( - edges, - directed); - add_point_edges( - point_edges, - directed); -} - -Pgr_trspHandler::Pgr_trspHandler( - Edge_t *edges, - const size_t edge_count, - const std::vector &new_edges, - const bool directed, - const std::vector &ruleList) : - m_ruleTable() { - initialize_restrictions(ruleList); - - auto point_edges = new_edges; - renumber_edges(edges, edge_count, point_edges); - - for (const auto& id : m_id_to_idx) { - m_idx_to_id[id.second] = id.first; - } - - construct_graph( - edges, - edge_count, - directed); - add_point_edges( - point_edges, - directed); + construct_graph(edges, point_edges, directed); } // ------------------------------------------------------------------------- void -Pgr_trspHandler::renumber_edges(std::vector &edges) { +TrspHandler::renumber_edges(std::vector &edges) { int64_t idx(0); for (auto &e : edges) { if (m_id_to_idx.find(e.source) == m_id_to_idx.end()) { @@ -145,27 +95,9 @@ Pgr_trspHandler::renumber_edges(std::vector &edges) { } } -void -Pgr_trspHandler::renumber_edges( - Edge_t *edges, - size_t total_edges) { - int64_t idx(0); - for (size_t i = 0; i < total_edges; ++i) { - if (m_id_to_idx.find(edges[i].source) == m_id_to_idx.end()) { - m_id_to_idx[edges[i].source] = idx; - ++idx; - } - if (m_id_to_idx.find(edges[i].target) == m_id_to_idx.end()) { - m_id_to_idx[edges[i].target] = idx; - ++idx; - } - edges[i].source = m_id_to_idx.at(edges[i].source); - edges[i].target = m_id_to_idx.at(edges[i].target); - } -} void -Pgr_trspHandler::renumber_edges( +TrspHandler::renumber_edges( std::vector &edges, std::vector &new_edges) { int64_t idx(0); @@ -195,42 +127,10 @@ Pgr_trspHandler::renumber_edges( } } -void -Pgr_trspHandler::renumber_edges( - Edge_t *edges, - size_t total_edges, - std::vector& new_edges) { - int64_t idx(0); - for (size_t i = 0; i < total_edges; ++i) { - if (m_id_to_idx.find(edges[i].source) == m_id_to_idx.end()) { - m_id_to_idx[edges[i].source] = idx; - ++idx; - } - if (m_id_to_idx.find(edges[i].target) == m_id_to_idx.end()) { - m_id_to_idx[edges[i].target] = idx; - ++idx; - } - edges[i].source = m_id_to_idx.at(edges[i].source); - edges[i].target = m_id_to_idx.at(edges[i].target); - } - for (auto &e : new_edges) { - if (m_id_to_idx.find(e.source) == m_id_to_idx.end()) { - m_id_to_idx[e.source] = idx; - ++idx; - } - if (m_id_to_idx.find(e.target) == m_id_to_idx.end()) { - m_id_to_idx[e.target] = idx; - ++idx; - } - e.source = m_id_to_idx.at(e.source); - e.target = m_id_to_idx.at(e.target); - } -} - // ------------------------------------------------------------------------- -void Pgr_trspHandler::clear() { +void TrspHandler::clear() { m_parent.clear(); m_dCost.clear(); m_path.clear(); @@ -238,7 +138,7 @@ void Pgr_trspHandler::clear() { // ------------------------------------------------------------------------- -double Pgr_trspHandler::construct_path(int64_t ed_id, Position pos) { +double TrspHandler::construct_path(int64_t ed_id, Position pos) { if (pos == ILLEGAL) return (std::numeric_limits::max)(); pgassert(pos != ILLEGAL); @@ -282,7 +182,7 @@ double Pgr_trspHandler::construct_path(int64_t ed_id, Position pos) { // ------------------------------------------------------------------------- -double Pgr_trspHandler::getRestrictionCost( +double TrspHandler::getRestrictionCost( int64_t edge_ind, const EdgeInfo &edge, bool isStart) { @@ -315,7 +215,7 @@ double Pgr_trspHandler::getRestrictionCost( } -double Pgr_trspHandler::get_tot_cost( +double TrspHandler::get_tot_cost( double cost, size_t edge_idx, bool isStart) { @@ -329,7 +229,7 @@ double Pgr_trspHandler::get_tot_cost( // ------------------------------------------------------------------------- -void Pgr_trspHandler::explore( +void TrspHandler::explore( int64_t cur_node, const EdgeInfo cur_edge, bool isStart) { @@ -380,7 +280,7 @@ void Pgr_trspHandler::explore( // ------------------------------------------------------------------------- -int Pgr_trspHandler::initialize_restrictions( +int TrspHandler::initialize_restrictions( const std::vector &ruleList) { for (const auto &rule : ruleList) { auto dest_edge_id = rule.dest_id(); @@ -402,7 +302,7 @@ int Pgr_trspHandler::initialize_restrictions( * */ Path -Pgr_trspHandler::process( +TrspHandler::process( const int64_t start_vertex, const int64_t end_vertex) { if (m_id_to_idx.find(start_vertex) == m_id_to_idx.end() @@ -438,7 +338,7 @@ Pgr_trspHandler::process( * */ std::deque -Pgr_trspHandler::process( +TrspHandler::process( const std::map> &combinations ) { std::deque paths; @@ -451,77 +351,40 @@ Pgr_trspHandler::process( return paths; } -/** process - * - * does many to many processisng - * - */ -std::deque -Pgr_trspHandler::process( - const std::vector sources, - const std::vector targets) { - std::deque paths; - for (const auto &s : sources) { - for (const auto &t : targets) { - paths.push_back(process(s, t)); - } - } - - std::sort(paths.begin(), paths.end(), - [](const Path &e1, const Path &e2)->bool { - return e1.end_id() < e2.end_id(); - }); - std::stable_sort(paths.begin(), paths.end(), - [](const Path &e1, const Path &e2)->bool { - return e1.start_id() < e2.start_id(); - }); - return paths; -} - - -void Pgr_trspHandler::add_to_que( - double cost, - size_t e_idx, - bool isStart) { - que.push(std::make_pair(cost, - std::make_pair(e_idx, isStart))); -} - - // ------------------------------------------------------------------------- +void TrspHandler::add_to_que(double cost, size_t e_idx, bool isStart) { + m_que.push(std::make_pair(cost, std::make_pair(e_idx, isStart))); +} -void Pgr_trspHandler::initialize_que() { +void TrspHandler::initialize_que() { /* * For each adjacent edge to the start_vertex */ for (const auto source : m_adjacency[m_start_vertex]) { EdgeInfo &cur_edge = m_edges[source]; - if (cur_edge.startNode() == m_start_vertex - && cur_edge.cost() >= 0.0) { + if (cur_edge.startNode() == m_start_vertex && cur_edge.cost() >= 0.0) { m_dCost[cur_edge.idx()].endCost = cur_edge.cost(); m_parent[cur_edge.idx()].v_pos[0] = ILLEGAL; add_to_que(cur_edge.cost(), cur_edge.idx(), true); } - if (cur_edge.endNode() == m_start_vertex - && cur_edge.r_cost() >= 0.0) { - m_dCost[cur_edge.idx()].startCost = - cur_edge.r_cost(); + if (cur_edge.endNode() == m_start_vertex && cur_edge.r_cost() >= 0.0) { + m_dCost[cur_edge.idx()].startCost = cur_edge.r_cost(); m_parent[cur_edge.idx()].v_pos[1] = ILLEGAL; add_to_que(cur_edge.r_cost(), cur_edge.idx(), false); } } } -EdgeInfo Pgr_trspHandler::dijkstra_exploration() { +EdgeInfo TrspHandler::dijkstra_exploration() { EdgeInfo cur_edge; - pgassert(current_node == m_start_vertex); + pgassert(m_current_node == m_start_vertex); - while (!que.empty()) { - auto cur_pos = que.top(); - que.pop(); + while (!m_que.empty()) { + auto cur_pos = m_que.top(); + m_que.pop(); auto cure_idxex = cur_pos.second.first; cur_edge = m_edges[static_cast(cure_idxex)]; @@ -530,18 +393,18 @@ EdgeInfo Pgr_trspHandler::dijkstra_exploration() { /* * explore edges connected to end node */ - current_node = cur_edge.endNode(); + m_current_node = cur_edge.endNode(); if (cur_edge.cost() < 0.0) continue; - if (current_node == m_end_vertex) break; - explore(current_node, cur_edge, false); + if (m_current_node == m_end_vertex) break; + explore(m_current_node, cur_edge, false); } else { /* * explore edges connected to start node */ - current_node = cur_edge.startNode(); + m_current_node = cur_edge.startNode(); if (cur_edge.r_cost() < 0.0) continue; - if (current_node == m_end_vertex) break; - explore(current_node, cur_edge, true); + if (m_current_node == m_end_vertex) break; + explore(m_current_node, cur_edge, true); } } return cur_edge; @@ -551,7 +414,7 @@ EdgeInfo Pgr_trspHandler::dijkstra_exploration() { Path -Pgr_trspHandler::process_trsp( +TrspHandler::process_trsp( size_t edge_count) { pgassert(m_path.start_id() == m_start_vertex); pgassert(m_path.end_id() == m_end_vertex); @@ -562,25 +425,21 @@ Pgr_trspHandler::process_trsp( initialize_que(); - current_node = m_start_vertex; + m_current_node = m_start_vertex; pgassert(m_path.start_id() == m_start_vertex); auto cur_edge = dijkstra_exploration(); pgassert(m_path.start_id() == m_start_vertex); - if (current_node != m_end_vertex) { + if (m_current_node != m_end_vertex) { Path result(m_start_vertex, m_end_vertex); return result.renumber_vertices(m_idx_to_id);; } pgassert(m_path.start_id() == m_start_vertex); - if (current_node == cur_edge.startNode()) { - construct_path(static_cast(cur_edge.idx()), C_EDGE); - } else { - construct_path(static_cast(cur_edge.idx()), RC_EDGE); - } + construct_path(static_cast(cur_edge.idx()), m_current_node == cur_edge.startNode()? C_EDGE : RC_EDGE); Path_t pelement = {}; pelement.node = m_end_vertex; @@ -593,41 +452,23 @@ Pgr_trspHandler::process_trsp( } - - - -// ------------------------------------------------------------------------- -void Pgr_trspHandler::construct_graph( +void TrspHandler::construct_graph( const std::vector &edges, + const std::vector &new_edges, const bool directed) { for (const auto &e : edges) { addEdge(e, directed); } - m_mapEdgeId2Index.clear(); -} - -void Pgr_trspHandler::construct_graph( - Edge_t* edges, - const size_t edge_count, - const bool directed) { - for (size_t i = 0; i < edge_count; i++) { - addEdge(edges[i], directed); + for (const auto &e : new_edges) { + addEdge(e, directed); } m_mapEdgeId2Index.clear(); } -void Pgr_trspHandler::add_point_edges( - const std::vector &new_edges, - const bool directed) { - for (auto current_edge : new_edges) { - addEdge(current_edge, directed); - } - m_mapEdgeId2Index.clear(); -} // ------------------------------------------------------------------------- -void Pgr_trspHandler::connectStartEdge( +void TrspHandler::connectStartEdge( size_t firstEdge_idx, size_t secondEdge_idx) { EdgeInfo &firstEdge = m_edges[firstEdge_idx]; @@ -650,7 +491,7 @@ void Pgr_trspHandler::connectStartEdge( // ------------------------------------------------------------------------- -void Pgr_trspHandler::connectEndEdge( +void TrspHandler::connectEndEdge( size_t firstEdge_idx, size_t secondEdge_idx) { EdgeInfo &firstEdge = m_edges[firstEdge_idx]; @@ -673,7 +514,7 @@ void Pgr_trspHandler::connectEndEdge( // ------------------------------------------------------------------------- -bool Pgr_trspHandler::addEdge(Edge_t edgeIn, bool directed) { +bool TrspHandler::addEdge(Edge_t edgeIn, bool directed) { /* * making all "cost" > 0 */ @@ -682,33 +523,33 @@ bool Pgr_trspHandler::addEdge(Edge_t edgeIn, bool directed) { std::swap(edgeIn.source, edgeIn.target); } - if (!directed) { - if (edgeIn.reverse_cost < 0) { - edgeIn.reverse_cost = edgeIn.cost; - } + /* This gives a value to reverse_cost when:" + * graph is undirected + * reverse_cost is negative + */ + if (!directed && edgeIn.reverse_cost < 0) { + edgeIn.reverse_cost = edgeIn.cost; } - /* * the index of this new edge in the edges container is * m_edges.size() */ EdgeInfo edge(edgeIn, m_edges.size()); - + /* + * Add to the set of edges + */ m_edges.push_back(edge); - EdgeInfo &newEdge = m_edges[m_edges.size()-1]; - - /* * Searching the start node for connectivity */ auto itNodeMap = m_adjacency.find(edgeIn.source); if (itNodeMap != m_adjacency.end()) { - for (const auto e_idx : itNodeMap->second) { + for (const auto &e_idx : itNodeMap->second) { connectStartEdge(edge.idx(), e_idx); } } @@ -719,7 +560,7 @@ bool Pgr_trspHandler::addEdge(Edge_t edgeIn, bool directed) { */ itNodeMap = m_adjacency.find(edgeIn.target); if (itNodeMap != m_adjacency.end()) { - for (const auto e_idx : itNodeMap->second) { + for (const auto &e_idx : itNodeMap->second) { connectEndEdge(edge.idx(), e_idx); } } diff --git a/src/trsp/trspVia_driver.cpp b/src/trsp/trspVia_driver.cpp index 9c5a0cf39b2..a80124bbfd3 100644 --- a/src/trsp/trspVia_driver.cpp +++ b/src/trsp/trspVia_driver.cpp @@ -239,7 +239,7 @@ pgr_do_trspVia( auto new_combinations = pgrouting::utilities::get_combinations(paths, ruleList); if (!new_combinations.empty()) { - pgrouting::trsp::Pgr_trspHandler gdef(edges, directed, ruleList); + pgrouting::trsp::TrspHandler gdef(edges, directed, ruleList); auto new_paths = gdef.process(new_combinations); paths.insert(paths.end(), new_paths.begin(), new_paths.end()); } diff --git a/src/trsp/trspVia_withPoints_driver.cpp b/src/trsp/trspVia_withPoints_driver.cpp index 5c057cb13f7..a0bdabd0757 100644 --- a/src/trsp/trspVia_withPoints_driver.cpp +++ b/src/trsp/trspVia_withPoints_driver.cpp @@ -261,7 +261,7 @@ pgr_do_trspVia_withPoints( auto new_combinations = pgrouting::utilities::get_combinations(paths, ruleList); if (!new_combinations.empty()) { - pgrouting::trsp::Pgr_trspHandler gdef( + pgrouting::trsp::TrspHandler gdef( edges, pg_graph.new_edges(), directed, diff --git a/src/trsp/trsp_driver.cpp b/src/trsp/trsp_driver.cpp index c9b289565cc..56a1bf8c8e8 100644 --- a/src/trsp/trsp_driver.cpp +++ b/src/trsp/trsp_driver.cpp @@ -202,7 +202,7 @@ pgr_do_trsp( auto new_combinations = pgrouting::utilities::get_combinations(paths, ruleList); if (!new_combinations.empty()) { - pgrouting::trsp::Pgr_trspHandler gdef( + pgrouting::trsp::TrspHandler gdef( edges, directed, ruleList); diff --git a/src/trsp/trsp_withPoints_driver.cpp b/src/trsp/trsp_withPoints_driver.cpp index 0bcc7453b55..ba5b7a63ff2 100644 --- a/src/trsp/trsp_withPoints_driver.cpp +++ b/src/trsp/trsp_withPoints_driver.cpp @@ -230,7 +230,7 @@ pgr_do_trsp_withPoints( auto new_combinations = pgrouting::utilities::get_combinations(paths, ruleList); if (!new_combinations.empty()) { - pgrouting::trsp::Pgr_trspHandler gdef( + pgrouting::trsp::TrspHandler gdef( edges, pg_graph.new_edges(), directed,