From f10fb77a81dd923eaad19927cabfa179e52cd287 Mon Sep 17 00:00:00 2001 From: "Daniel J. Hofmann" Date: Wed, 9 Sep 2015 18:34:09 +0200 Subject: [PATCH] Ownership: vector already owns, no need for wrapping in unique_ptr. Removes the pointless `std::unique_ptr>` usage, as a `std::vector` already owns its resources and manages them. Results in one indirection less (hint: good). --- contractor/processing_chain.cpp | 166 ++++++++++++++++---------------- contractor/processing_chain.hpp | 30 +++--- 2 files changed, 101 insertions(+), 95 deletions(-) diff --git a/contractor/processing_chain.cpp b/contractor/processing_chain.cpp index 376c8ac89..0c8824245 100644 --- a/contractor/processing_chain.cpp +++ b/contractor/processing_chain.cpp @@ -40,7 +40,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../util/graph_loader.hpp" #include "../util/integer_range.hpp" #include "../util/lua_util.hpp" -#include "../util/make_unique.hpp" #include "../util/osrm_exception.hpp" #include "../util/simple_logger.hpp" #include "../util/string_util.hpp" @@ -79,12 +78,11 @@ int Prepare::Run() TIMER_START(expansion); - auto node_based_edge_list = osrm::make_unique>();; + std::vector node_based_edge_list; DeallocatingVector edge_based_edge_list; - auto internal_to_external_node_map = osrm::make_unique>(); - auto graph_size = - BuildEdgeExpandedGraph(*internal_to_external_node_map, - *node_based_edge_list, edge_based_edge_list); + std::vector internal_to_external_node_map; + auto graph_size = BuildEdgeExpandedGraph(internal_to_external_node_map, node_based_edge_list, + edge_based_edge_list); auto number_of_node_based_nodes = graph_size.first; auto max_edge_id = graph_size.second; @@ -94,39 +92,37 @@ int Prepare::Run() SimpleLogger().Write() << "building r-tree ..."; TIMER_START(rtree); - FindComponents(max_edge_id, edge_based_edge_list, *node_based_edge_list); + FindComponents(max_edge_id, edge_based_edge_list, node_based_edge_list); - BuildRTree(*node_based_edge_list, *internal_to_external_node_map); + BuildRTree(node_based_edge_list, internal_to_external_node_map); TIMER_STOP(rtree); SimpleLogger().Write() << "writing node map ..."; - WriteNodeMapping(std::move(internal_to_external_node_map)); + WriteNodeMapping(internal_to_external_node_map); // Contracting the edge-expanded graph TIMER_START(contraction); std::vector is_core_node; - auto contracted_edge_list = osrm::make_unique>(); - ContractGraph(max_edge_id, edge_based_edge_list, *contracted_edge_list, is_core_node); + DeallocatingVector contracted_edge_list; + ContractGraph(max_edge_id, edge_based_edge_list, contracted_edge_list, is_core_node); TIMER_STOP(contraction); SimpleLogger().Write() << "Contraction took " << TIMER_SEC(contraction) << " sec"; - std::size_t number_of_used_edges = WriteContractedGraph(max_edge_id, - std::move(node_based_edge_list), - std::move(contracted_edge_list)); + std::size_t number_of_used_edges = + WriteContractedGraph(max_edge_id, node_based_edge_list, contracted_edge_list); WriteCoreNodeMarker(std::move(is_core_node)); TIMER_STOP(preparing); SimpleLogger().Write() << "Preprocessing : " << TIMER_SEC(preparing) << " seconds"; SimpleLogger().Write() << "Expansion : " << (number_of_node_based_nodes / TIMER_SEC(expansion)) - << " nodes/sec and " - << ((max_edge_id+1) / TIMER_SEC(expansion)) << " edges/sec"; + << " nodes/sec and " << ((max_edge_id + 1) / TIMER_SEC(expansion)) + << " edges/sec"; - SimpleLogger().Write() << "Contraction: " - << ((max_edge_id+1) / TIMER_SEC(contraction)) + SimpleLogger().Write() << "Contraction: " << ((max_edge_id + 1) / TIMER_SEC(contraction)) << " nodes/sec and " << number_of_used_edges / TIMER_SEC(contraction) << " edges/sec"; @@ -135,30 +131,34 @@ int Prepare::Run() return 0; } -void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector& input_edge_list, - std::vector& input_nodes) const +void Prepare::FindComponents(unsigned max_edge_id, + const DeallocatingVector &input_edge_list, + std::vector &input_nodes) const { - struct UncontractedEdgeData { }; - struct InputEdge { + struct UncontractedEdgeData + { + }; + struct InputEdge + { unsigned source; unsigned target; UncontractedEdgeData data; - bool operator<(const InputEdge& rhs) const + bool operator<(const InputEdge &rhs) const { return source < rhs.source || (source == rhs.source && target < rhs.target); } - bool operator==(const InputEdge& rhs) const + bool operator==(const InputEdge &rhs) const { - return source == rhs.source && target == rhs.target; + return source == rhs.source && target == rhs.target; } }; using UncontractedGraph = StaticGraph; std::vector edges; edges.reserve(input_edge_list.size() * 2); - for (const auto& edge : input_edge_list) + for (const auto &edge : input_edge_list) { BOOST_ASSERT_MSG(static_cast(std::max(edge.weight, 1)) > 0, "edge distance < 1"); @@ -174,7 +174,7 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector(max_edge_id+1, edges); + auto uncontractor_graph = std::make_shared(max_edge_id + 1, edges); - TarjanSCC component_search(std::const_pointer_cast(uncontractor_graph)); + TarjanSCC component_search( + std::const_pointer_cast(uncontractor_graph)); component_search.run(); - for (auto& node : input_nodes) + for (auto &node : input_nodes) { auto forward_component = component_search.get_component_id(node.forward_edge_based_node_id); BOOST_ASSERT(node.reverse_edge_based_node_id == SPECIAL_EDGEID || - forward_component == component_search.get_component_id(node.reverse_edge_based_node_id)); + forward_component == + component_search.get_component_id(node.reverse_edge_based_node_id)); const unsigned component_size = component_search.get_component_size(forward_component); const bool is_tiny_component = component_size < 1000; @@ -204,7 +206,7 @@ void Prepare::FindComponents(unsigned max_edge_id, const DeallocatingVector&& in_is_core_node) const +void Prepare::WriteCoreNodeMarker(std::vector &&in_is_core_node) const { std::vector is_core_node(in_is_core_node); std::vector unpacked_bool_flags(is_core_node.size()); @@ -213,21 +215,23 @@ void Prepare::WriteCoreNodeMarker(std::vector&& in_is_core_node) const unpacked_bool_flags[i] = is_core_node[i] ? 1 : 0; } - boost::filesystem::ofstream core_marker_output_stream(config.core_output_path, std::ios::binary); + boost::filesystem::ofstream core_marker_output_stream(config.core_output_path, + std::ios::binary); unsigned size = unpacked_bool_flags.size(); core_marker_output_stream.write((char *)&size, sizeof(unsigned)); - core_marker_output_stream.write((char *)unpacked_bool_flags.data(), sizeof(char)*unpacked_bool_flags.size()); + core_marker_output_stream.write((char *)unpacked_bool_flags.data(), + sizeof(char) * unpacked_bool_flags.size()); } std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, - std::unique_ptr> node_based_edge_list, - std::unique_ptr> contracted_edge_list) + const std::vector &node_based_edge_list, + const DeallocatingVector &contracted_edge_list) { - const unsigned crc32_value = CalculateEdgeChecksum(std::move(node_based_edge_list)); + const unsigned crc32_value = CalculateEdgeChecksum(node_based_edge_list); // Sorting contracted edges in a way that the static query graph can read some in in-place. - tbb::parallel_sort(contracted_edge_list->begin(), contracted_edge_list->end()); - const unsigned contracted_edge_count = contracted_edge_list->size(); + tbb::parallel_sort(contracted_edge_list); + const unsigned contracted_edge_count = contracted_edge_list.size(); SimpleLogger().Write() << "Serializing compacted graph of " << contracted_edge_count << " edges"; @@ -237,7 +241,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, const unsigned max_used_node_id = [&contracted_edge_list] { unsigned tmp_max = 0; - for (const QueryEdge &edge : *contracted_edge_list) + for (const QueryEdge &edge : contracted_edge_list) { BOOST_ASSERT(SPECIAL_NODEID != edge.source); BOOST_ASSERT(SPECIAL_NODEID != edge.target); @@ -247,8 +251,8 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, return tmp_max; }(); - SimpleLogger().Write(logDEBUG) << "input graph has " << (max_node_id+1) << " nodes"; - SimpleLogger().Write(logDEBUG) << "contracted graph has " << (max_used_node_id+1) << " nodes"; + SimpleLogger().Write(logDEBUG) << "input graph has " << (max_node_id + 1) << " nodes"; + SimpleLogger().Write(logDEBUG) << "contracted graph has " << (max_used_node_id + 1) << " nodes"; std::vector::NodeArrayEntry> node_array; // make sure we have at least one sentinel @@ -260,10 +264,10 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, StaticGraph::EdgeIterator last_edge; // initializing 'first_edge'-field of nodes: - for (const auto node : osrm::irange(0u, max_used_node_id+1)) + for (const auto node : osrm::irange(0u, max_used_node_id + 1)) { last_edge = edge; - while ((edge < contracted_edge_count) && ((*contracted_edge_list)[edge].source == node)) + while ((edge < contracted_edge_count) && (contracted_edge_list[edge].source == node)) { ++edge; } @@ -271,7 +275,8 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, position += edge - last_edge; // remove } - for (const auto sentinel_counter : osrm::irange(max_used_node_id+1, node_array.size())) + for (const auto sentinel_counter : + osrm::irange(max_used_node_id + 1, node_array.size())) { // sentinel element, guarded against underflow node_array[sentinel_counter].first_edge = contracted_edge_count; @@ -298,12 +303,12 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, int number_of_used_edges = 0; StaticGraph::EdgeArrayEntry current_edge; - for (const auto edge : osrm::irange(0, contracted_edge_list->size())) + for (const auto edge : osrm::irange(0, contracted_edge_list.size())) { // no eigen loops - BOOST_ASSERT((*contracted_edge_list)[edge].source != (*contracted_edge_list)[edge].target); - current_edge.target = (*contracted_edge_list)[edge].target; - current_edge.data = (*contracted_edge_list)[edge].data; + BOOST_ASSERT(contracted_edge_list[edge].source != contracted_edge_list[edge].target); + current_edge.target = contracted_edge_list[edge].target; + current_edge.data = contracted_edge_list[edge].data; // every target needs to be valid BOOST_ASSERT(current_edge.target <= max_used_node_id); @@ -311,12 +316,12 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, if (current_edge.data.distance <= 0) { SimpleLogger().Write(logWARNING) << "Edge: " << edge - << ",source: " << (*contracted_edge_list)[edge].source - << ", target: " << (*contracted_edge_list)[edge].target + << ",source: " << contracted_edge_list[edge].source + << ", target: " << contracted_edge_list[edge].target << ", dist: " << current_edge.data.distance; SimpleLogger().Write(logWARNING) << "Failed at adjacency list of node " - << (*contracted_edge_list)[edge].source << "/" + << contracted_edge_list[edge].source << "/" << node_array.size() - 1; return 1; } @@ -330,7 +335,7 @@ std::size_t Prepare::WriteContractedGraph(unsigned max_node_id, return number_of_used_edges; } -unsigned Prepare::CalculateEdgeChecksum(std::unique_ptr> node_based_edge_list) +unsigned Prepare::CalculateEdgeChecksum(const std::vector &node_based_edge_list) { RangebasedCRC32 crc32; if (crc32.using_hardware()) @@ -342,7 +347,7 @@ unsigned Prepare::CalculateEdgeChecksum(std::unique_ptr Prepare::LoadRestrictionMap() { - boost::filesystem::ifstream input_stream(config.restrictions_path, std::ios::in | std::ios::binary); + boost::filesystem::ifstream input_stream(config.restrictions_path, + std::ios::in | std::ios::binary); std::vector restriction_list; loadRestrictionsFromFile(input_stream, restriction_list); @@ -411,17 +416,17 @@ std::shared_ptr Prepare::LoadRestrictionMap() std::shared_ptr Prepare::LoadNodeBasedGraph(std::unordered_set &barrier_nodes, std::unordered_set &traffic_lights, - std::vector& internal_to_external_node_map) + std::vector &internal_to_external_node_map) { std::vector edge_list; - boost::filesystem::ifstream input_stream(config.osrm_input_path, std::ios::in | std::ios::binary); + boost::filesystem::ifstream input_stream(config.osrm_input_path, + std::ios::in | std::ios::binary); std::vector barrier_list; std::vector traffic_light_list; - NodeID number_of_node_based_nodes = loadNodesFromFile(input_stream, - barrier_list, traffic_light_list, - internal_to_external_node_map); + NodeID number_of_node_based_nodes = loadNodesFromFile( + input_stream, barrier_list, traffic_light_list, internal_to_external_node_map); SimpleLogger().Write() << " - " << barrier_list.size() << " bollard nodes, " << traffic_light_list.size() << " traffic lights"; @@ -446,7 +451,6 @@ Prepare::LoadNodeBasedGraph(std::unordered_set &barrier_nodes, return NodeBasedDynamicGraphFromEdges(number_of_node_based_nodes, edge_list); } - /** \brief Building an edge-expanded graph from node-based input and turn restrictions */ @@ -465,20 +469,18 @@ Prepare::BuildEdgeExpandedGraph(std::vector &internal_to_external_nod std::unordered_set traffic_lights; auto restriction_map = LoadRestrictionMap(); - auto node_based_graph = LoadNodeBasedGraph(barrier_nodes, traffic_lights, internal_to_external_node_map); - + auto node_based_graph = + LoadNodeBasedGraph(barrier_nodes, traffic_lights, internal_to_external_node_map); CompressedEdgeContainer compressed_edge_container; GraphCompressor graph_compressor(speed_profile); - graph_compressor.Compress(barrier_nodes, traffic_lights, *restriction_map, *node_based_graph, compressed_edge_container); + graph_compressor.Compress(barrier_nodes, traffic_lights, *restriction_map, *node_based_graph, + compressed_edge_container); - EdgeBasedGraphFactory edge_based_graph_factory(node_based_graph, - compressed_edge_container, - barrier_nodes, - traffic_lights, - std::const_pointer_cast(restriction_map), - internal_to_external_node_map, - speed_profile); + EdgeBasedGraphFactory edge_based_graph_factory( + node_based_graph, compressed_edge_container, barrier_nodes, traffic_lights, + std::const_pointer_cast(restriction_map), + internal_to_external_node_map, speed_profile); compressed_edge_container.SerializeInternalVector(config.geometry_output_path); @@ -497,9 +499,9 @@ Prepare::BuildEdgeExpandedGraph(std::vector &internal_to_external_nod \brief Build contracted graph. */ void Prepare::ContractGraph(const unsigned max_edge_id, - DeallocatingVector& edge_based_edge_list, - DeallocatingVector& contracted_edge_list, - std::vector& is_core_node) + DeallocatingVector &edge_based_edge_list, + DeallocatingVector &contracted_edge_list, + std::vector &is_core_node) { Contractor contractor(max_edge_id + 1, edge_based_edge_list); contractor.Run(config.core_factor); @@ -510,14 +512,14 @@ void Prepare::ContractGraph(const unsigned max_edge_id, /** \brief Writing info on original (node-based) nodes */ -void Prepare::WriteNodeMapping(std::unique_ptr> internal_to_external_node_map) +void Prepare::WriteNodeMapping(const std::vector &internal_to_external_node_map) { boost::filesystem::ofstream node_stream(config.node_output_path, std::ios::binary); - const unsigned size_of_mapping = internal_to_external_node_map->size(); + const unsigned size_of_mapping = internal_to_external_node_map.size(); node_stream.write((char *)&size_of_mapping, sizeof(unsigned)); if (size_of_mapping > 0) { - node_stream.write((char *) internal_to_external_node_map->data(), + node_stream.write((char *)internal_to_external_node_map.data(), size_of_mapping * sizeof(QueryNode)); } node_stream.close(); @@ -528,8 +530,10 @@ void Prepare::WriteNodeMapping(std::unique_ptr> internal_ Saves tree into '.ramIndex' and leaves into '.fileIndex'. */ -void Prepare::BuildRTree(const std::vector &node_based_edge_list, const std::vector& internal_to_external_node_map) +void Prepare::BuildRTree(const std::vector &node_based_edge_list, + const std::vector &internal_to_external_node_map) { StaticRTree(node_based_edge_list, config.rtree_nodes_output_path.c_str(), - config.rtree_leafs_output_path.c_str(), internal_to_external_node_map); + config.rtree_leafs_output_path.c_str(), + internal_to_external_node_map); } diff --git a/contractor/processing_chain.hpp b/contractor/processing_chain.hpp index 63560ebf9..4e12baf6d 100644 --- a/contractor/processing_chain.hpp +++ b/contractor/processing_chain.hpp @@ -58,30 +58,32 @@ class Prepare int Run(); protected: - void SetupScriptingEnvironment(lua_State *myLuaState, - SpeedProfileProperties &speed_profile); - unsigned CalculateEdgeChecksum(std::unique_ptr> node_based_edge_list); + void SetupScriptingEnvironment(lua_State *myLuaState, SpeedProfileProperties &speed_profile); + unsigned CalculateEdgeChecksum(const std::vector &node_based_edge_list); void ContractGraph(const unsigned max_edge_id, - DeallocatingVector& edge_based_edge_list, - DeallocatingVector& contracted_edge_list, - std::vector& is_core_node); - void WriteCoreNodeMarker(std::vector&& is_core_node) const; + DeallocatingVector &edge_based_edge_list, + DeallocatingVector &contracted_edge_list, + std::vector &is_core_node); + void WriteCoreNodeMarker(std::vector &&is_core_node) const; std::size_t WriteContractedGraph(unsigned number_of_edge_based_nodes, - std::unique_ptr> node_based_edge_list, - std::unique_ptr> contracted_edge_list); + const std::vector &node_based_edge_list, + const DeallocatingVector &contracted_edge_list); std::shared_ptr LoadRestrictionMap(); std::shared_ptr LoadNodeBasedGraph(std::unordered_set &barrier_nodes, std::unordered_set &traffic_lights, - std::vector& internal_to_external_node_map); + std::vector &internal_to_external_node_map); std::pair BuildEdgeExpandedGraph(std::vector &internal_to_external_node_map, - std::vector &node_based_edge_list, - DeallocatingVector &edge_based_edge_list); - void WriteNodeMapping(std::unique_ptr> internal_to_external_node_map); - void FindComponents(unsigned max_edge_id, const DeallocatingVector& edges, std::vector& nodes) const; + std::vector &node_based_edge_list, + DeallocatingVector &edge_based_edge_list); + void WriteNodeMapping(const std::vector &internal_to_external_node_map); + void FindComponents(unsigned max_edge_id, + const DeallocatingVector &edges, + std::vector &nodes) const; void BuildRTree(const std::vector &node_based_edge_list, const std::vector &internal_to_external_node_map); + private: ContractorConfig config; };