From 1de031ed0643cd03081b6c9c44edf6d20f7aad9b Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Tue, 11 Apr 2017 16:37:07 +0200 Subject: [PATCH] Remove {forward,reverse}_core_heap arguments from search interface --- .../routing_algorithms/routing_base_ch.hpp | 54 ++++--------------- .../routing_algorithms/routing_base_mld.hpp | 23 ++++---- .../direct_shortest_path.cpp | 13 ++--- .../routing_algorithms/map_matching.cpp | 8 +-- .../routing_algorithms/routing_base_ch.cpp | 41 +++++++------- .../routing_algorithms/shortest_path.cpp | 50 +++++------------ 6 files changed, 64 insertions(+), 125 deletions(-) diff --git a/include/engine/routing_algorithms/routing_base_ch.hpp b/include/engine/routing_algorithms/routing_base_ch.hpp index e8b3d76c1..c1d6bb3d5 100644 --- a/include/engine/routing_algorithms/routing_base_ch.hpp +++ b/include/engine/routing_algorithms/routing_base_ch.hpp @@ -350,63 +350,29 @@ void retrievePackedPathFromSingleHeap(const SearchEngineData::QueryHe // && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset()) // requires // a force loop, if the heaps have been initialized with positive offsets. -void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, +void search(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, std::int32_t &weight, std::vector &packed_leg, const bool force_loop_forward, const bool force_loop_reverse, + const PhantomNodes &phantom_nodes, const int duration_upper_bound = INVALID_EDGE_WEIGHT); -// Alias to be compatible with the overload for CoreCH that needs 4 heaps -inline void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, - SearchEngineData::QueryHeap &forward_heap, - SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap &, - SearchEngineData::QueryHeap &, - EdgeWeight &weight, - std::vector &packed_leg, - const bool force_loop_forward, - const bool force_loop_reverse, - const PhantomNodes & /*phantom_nodes*/, - const int duration_upper_bound = INVALID_EDGE_WEIGHT) -{ - search(facade, - forward_heap, - reverse_heap, - weight, - packed_leg, - force_loop_forward, - force_loop_reverse, - duration_upper_bound); -} - // Requires the heaps for be empty // If heaps should be adjusted to be initialized outside of this function, // the addition of force_loop parameters might be required double -getNetworkDistance(const datafacade::ContiguousInternalMemoryDataFacade &facade, +getNetworkDistance(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, const PhantomNode &source_phantom, const PhantomNode &target_phantom, int duration_upper_bound = INVALID_EDGE_WEIGHT); -// Alias to be compatible with the overload for CoreCH that needs 4 heaps -inline double -getNetworkDistance(const datafacade::ContiguousInternalMemoryDataFacade &facade, - SearchEngineData::QueryHeap &forward_heap, - SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap &, - SearchEngineData::QueryHeap &, - const PhantomNode &source_phantom, - const PhantomNode &target_phantom, - int duration_upper_bound = INVALID_EDGE_WEIGHT) -{ - return getNetworkDistance( - facade, forward_heap, reverse_heap, source_phantom, target_phantom, duration_upper_bound); -} } // namespace ch namespace corech @@ -420,11 +386,10 @@ namespace corech // && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset()) // requires // a force loop, if the heaps have been initialized with positive offsets. -void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, +void search(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap &forward_core_heap, - SearchEngineData::QueryHeap &reverse_core_heap, int &weight, std::vector &packed_leg, const bool force_loop_forward, @@ -436,11 +401,10 @@ void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, +getNetworkDistance(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap &forward_core_heap, - SearchEngineData::QueryHeap &reverse_core_heap, const PhantomNode &source_phantom, const PhantomNode &target_phantom, int duration_upper_bound = INVALID_EDGE_WEIGHT); diff --git a/include/engine/routing_algorithms/routing_base_mld.hpp b/include/engine/routing_algorithms/routing_base_mld.hpp index b3b000640..852d8dfd0 100644 --- a/include/engine/routing_algorithms/routing_base_mld.hpp +++ b/include/engine/routing_algorithms/routing_base_mld.hpp @@ -181,7 +181,8 @@ void routingStep(const datafacade::ContiguousInternalMemoryDataFacade template std::tuple> -search(const datafacade::ContiguousInternalMemoryDataFacade &facade, +search(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, const bool force_loop_forward, @@ -293,7 +294,8 @@ search(const datafacade::ContiguousInternalMemoryDataFacade &facade, NodeID subpath_source, subpath_target; std::vector subpath; std::tie(subpath_weight, subpath_source, subpath_target, subpath) = - search(facade, + search(engine_working_data, + facade, forward_heap, reverse_heap, force_loop_forward, @@ -311,12 +313,12 @@ search(const datafacade::ContiguousInternalMemoryDataFacade &facade, return std::make_tuple(weight, source_node, target_node, std::move(unpacked_path)); } +// TODO reorder parameters // Alias to be compatible with the overload for CoreCH that needs 4 heaps for shortest path search -inline void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, +inline void search(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap &, - SearchEngineData::QueryHeap &, EdgeWeight &weight, std::vector &packed_leg, const bool force_loop_forward, @@ -326,7 +328,8 @@ inline void search(const datafacade::ContiguousInternalMemoryDataFacade unpacked_edges; - std::tie(weight, source_node, target_node, unpacked_edges) = mld::search(facade, + std::tie(weight, source_node, target_node, unpacked_edges) = mld::search(engine_working_data, + facade, forward_heap, reverse_heap, force_loop_forward, @@ -372,11 +375,10 @@ void unpackPath(const FacadeT &facade, } inline double -getNetworkDistance(const datafacade::ContiguousInternalMemoryDataFacade &facade, +getNetworkDistance(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap & /*forward_core_heap*/, - SearchEngineData::QueryHeap & /*reverse_core_heap*/, const PhantomNode &source_phantom, const PhantomNode &target_phantom, EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT) @@ -390,7 +392,8 @@ getNetworkDistance(const datafacade::ContiguousInternalMemoryDataFacade unpacked_edges; - std::tie(weight, source_node, target_node, unpacked_edges) = search(facade, + std::tie(weight, source_node, target_node, unpacked_edges) = search(engine_working_data, + facade, forward_heap, reverse_heap, DO_NOT_FORCE_LOOPS, diff --git a/src/engine/routing_algorithms/direct_shortest_path.cpp b/src/engine/routing_algorithms/direct_shortest_path.cpp index c5a594097..2acae65fc 100644 --- a/src/engine/routing_algorithms/direct_shortest_path.cpp +++ b/src/engine/routing_algorithms/direct_shortest_path.cpp @@ -62,25 +62,19 @@ InternalRouteResult directShortestPathSearchImpl( const PhantomNodes &phantom_nodes) { engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); - engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); auto &forward_heap = *engine_working_data.forward_heap_1; auto &reverse_heap = *engine_working_data.reverse_heap_1; - auto &forward_core_heap = *engine_working_data.forward_heap_2; - auto &reverse_core_heap = *engine_working_data.reverse_heap_2; forward_heap.Clear(); reverse_heap.Clear(); - forward_core_heap.Clear(); - reverse_core_heap.Clear(); EdgeWeight weight = INVALID_EDGE_WEIGHT; std::vector packed_leg; insertNodesInHeaps(forward_heap, reverse_heap, phantom_nodes); - search(facade, + search(engine_working_data, + facade, forward_heap, reverse_heap, - forward_core_heap, - reverse_core_heap, weight, packed_leg, DO_NOT_FORCE_LOOPS, @@ -140,7 +134,8 @@ InternalRouteResult directShortestPathSearch( EdgeWeight weight; NodeID source_node, target_node; std::vector unpacked_edges; - std::tie(weight, source_node, target_node, unpacked_edges) = mld::search(facade, + std::tie(weight, source_node, target_node, unpacked_edges) = mld::search(engine_working_data, + facade, forward_heap, reverse_heap, DO_NOT_FORCE_LOOPS, diff --git a/src/engine/routing_algorithms/map_matching.cpp b/src/engine/routing_algorithms/map_matching.cpp index 6fb4f79ac..1c3975d1c 100644 --- a/src/engine/routing_algorithms/map_matching.cpp +++ b/src/engine/routing_algorithms/map_matching.cpp @@ -143,12 +143,9 @@ SubMatchingList mapMatching(SearchEngineData &engine_working_data, const auto nodes_number = facade.GetNumberOfNodes(); engine_working_data.InitializeOrClearFirstThreadLocalStorage(nodes_number); - engine_working_data.InitializeOrClearSecondThreadLocalStorage(nodes_number); auto &forward_heap = *engine_working_data.forward_heap_1; auto &reverse_heap = *engine_working_data.reverse_heap_1; - auto &forward_core_heap = *engine_working_data.forward_heap_2; - auto &reverse_core_heap = *engine_working_data.reverse_heap_2; std::size_t breakage_begin = map_matching::INVALID_STATE; std::vector split_points; @@ -220,11 +217,10 @@ SubMatchingList mapMatching(SearchEngineData &engine_working_data, } double network_distance = - getNetworkDistance(facade, + getNetworkDistance(engine_working_data, + facade, forward_heap, reverse_heap, - forward_core_heap, - reverse_core_heap, prev_unbroken_timestamps_list[s].phantom_node, current_timestamps_list[s_prime].phantom_node, weight_upper_bound); diff --git a/src/engine/routing_algorithms/routing_base_ch.cpp b/src/engine/routing_algorithms/routing_base_ch.cpp index f7c533c09..c064664b4 100644 --- a/src/engine/routing_algorithms/routing_base_ch.cpp +++ b/src/engine/routing_algorithms/routing_base_ch.cpp @@ -71,13 +71,15 @@ void retrievePackedPathFromSingleHeap(const SearchEngineData::QueryHe // && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset()) // requires // a force loop, if the heaps have been initialized with positive offsets. -void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, +void search(SearchEngineData & /*engine_working_data*/, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, EdgeWeight &weight, std::vector &packed_leg, const bool force_loop_forward, const bool force_loop_reverse, + const PhantomNodes & /*phantom_nodes*/, const EdgeWeight weight_upper_bound) { NodeID middle = SPECIAL_NODEID; @@ -142,7 +144,8 @@ void search(const datafacade::ContiguousInternalMemoryDataFacade &fac // Requires the heaps for be empty // If heaps should be adjusted to be initialized outside of this function, // the addition of force_loop parameters might be required -double getNetworkDistance(const datafacade::ContiguousInternalMemoryDataFacade &facade, +double getNetworkDistance(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, const PhantomNode &source_phantom, @@ -180,13 +183,15 @@ double getNetworkDistance(const datafacade::ContiguousInternalMemoryDataFacade packed_path; - search(facade, + search(engine_working_data, + facade, forward_heap, reverse_heap, weight, packed_path, DO_NOT_FORCE_LOOPS, DO_NOT_FORCE_LOOPS, + {source_phantom, target_phantom}, weight_upper_bound); if (weight == INVALID_EDGE_WEIGHT) @@ -216,11 +221,10 @@ namespace corech // && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset()) // requires // a force loop, if the heaps have been initialized with positive offsets. -void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, - SearchEngineData::QueryHeap &forward_heap, - SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap &forward_core_heap, - SearchEngineData::QueryHeap &reverse_core_heap, +void search(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, + SearchEngineData::QueryHeap &forward_heap, + SearchEngineData::QueryHeap &reverse_heap, EdgeWeight &weight, std::vector &packed_leg, const bool force_loop_forward, @@ -286,7 +290,7 @@ void search(const datafacade::ContiguousInternalMemoryDataFacade &fac } const auto insertInCoreHeap = [](const CoreEntryPoint &p, - SearchEngineData::QueryHeap &core_heap) { + SearchEngineData::QueryHeap &core_heap) { NodeID id; EdgeWeight weight; NodeID parent; @@ -295,13 +299,16 @@ void search(const datafacade::ContiguousInternalMemoryDataFacade &fac core_heap.Insert(id, weight, parent); }; - forward_core_heap.Clear(); + engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); + + auto &forward_core_heap = *engine_working_data.forward_heap_2; + auto &reverse_core_heap = *engine_working_data.reverse_heap_2; + for (const auto &p : forward_entry_points) { insertInCoreHeap(p, forward_core_heap); } - reverse_core_heap.Clear(); for (const auto &p : reverse_entry_points) { insertInCoreHeap(p, reverse_core_heap); @@ -395,29 +402,25 @@ void search(const datafacade::ContiguousInternalMemoryDataFacade &fac // Requires the heaps for be empty // If heaps should be adjusted to be initialized outside of this function, // the addition of force_loop parameters might be required -double getNetworkDistance(const datafacade::ContiguousInternalMemoryDataFacade &facade, +double getNetworkDistance(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, SearchEngineData::QueryHeap &forward_heap, SearchEngineData::QueryHeap &reverse_heap, - SearchEngineData::QueryHeap &forward_core_heap, - SearchEngineData::QueryHeap &reverse_core_heap, const PhantomNode &source_phantom, const PhantomNode &target_phantom, EdgeWeight weight_upper_bound) { forward_heap.Clear(); reverse_heap.Clear(); - forward_core_heap.Clear(); - reverse_core_heap.Clear(); insertNodesInHeaps(forward_heap, reverse_heap, {source_phantom, target_phantom}); EdgeWeight weight = INVALID_EDGE_WEIGHT; std::vector packed_path; - search(facade, + search(engine_working_data, + facade, forward_heap, reverse_heap, - forward_core_heap, - reverse_core_heap, weight, packed_path, DO_NOT_FORCE_LOOPS, diff --git a/src/engine/routing_algorithms/shortest_path.cpp b/src/engine/routing_algorithms/shortest_path.cpp index bfa28c0a4..8c11b772a 100644 --- a/src/engine/routing_algorithms/shortest_path.cpp +++ b/src/engine/routing_algorithms/shortest_path.cpp @@ -21,11 +21,10 @@ const static constexpr bool DO_NOT_FORCE_LOOP = false; // allows a uturn at the target_phantom // searches source forward/reverse -> target forward/reverse template -void searchWithUTurn(const datafacade::ContiguousInternalMemoryDataFacade &facade, +void searchWithUTurn(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, typename SearchEngineData::QueryHeap &forward_heap, typename SearchEngineData::QueryHeap &reverse_heap, - typename SearchEngineData::QueryHeap &forward_core_heap, - typename SearchEngineData::QueryHeap &reverse_core_heap, const bool search_from_forward_node, const bool search_from_reverse_node, const bool search_to_forward_node, @@ -75,15 +74,10 @@ void searchWithUTurn(const datafacade::ContiguousInternalMemoryDataFacade target forward // source forward/reverse -> target reverse template -void search(const datafacade::ContiguousInternalMemoryDataFacade &facade, +void search(SearchEngineData &engine_working_data, + const datafacade::ContiguousInternalMemoryDataFacade &facade, typename SearchEngineData::QueryHeap &forward_heap, typename SearchEngineData::QueryHeap &reverse_heap, - typename SearchEngineData::QueryHeap &forward_core_heap, - typename SearchEngineData::QueryHeap &reverse_core_heap, const bool search_from_forward_node, const bool search_from_reverse_node, const bool search_to_forward_node, @@ -144,15 +137,10 @@ void search(const datafacade::ContiguousInternalMemoryDataFacade &fac BOOST_ASSERT(forward_heap.Size() > 0); BOOST_ASSERT(reverse_heap.Size() > 0); - forward_core_heap.Clear(); - reverse_core_heap.Clear(); - BOOST_ASSERT(forward_core_heap.Size() == 0); - BOOST_ASSERT(reverse_core_heap.Size() == 0); - search(facade, + search(engine_working_data, + facade, forward_heap, reverse_heap, - forward_core_heap, - reverse_core_heap, new_total_weight_to_forward, leg_packed_path_forward, needsLoopForward(source_phantom, target_phantom), @@ -183,15 +171,10 @@ void search(const datafacade::ContiguousInternalMemoryDataFacade &fac } BOOST_ASSERT(forward_heap.Size() > 0); BOOST_ASSERT(reverse_heap.Size() > 0); - forward_core_heap.Clear(); - reverse_core_heap.Clear(); - BOOST_ASSERT(forward_core_heap.Size() == 0); - BOOST_ASSERT(reverse_core_heap.Size() == 0); - search(facade, + search(engine_working_data, + facade, forward_heap, reverse_heap, - forward_core_heap, - reverse_core_heap, new_total_weight_to_reverse, leg_packed_path_reverse, routing_algorithms::DO_NOT_FORCE_LOOP, @@ -246,12 +229,9 @@ shortestPathSearch(SearchEngineData &engine_working_data, : facade.GetContinueStraightDefault()); engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); - engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); auto &forward_heap = *engine_working_data.forward_heap_1; auto &reverse_heap = *engine_working_data.reverse_heap_1; - auto &forward_core_heap = *engine_working_data.forward_heap_2; - auto &reverse_core_heap = *engine_working_data.reverse_heap_2; int total_weight_to_forward = 0; int total_weight_to_reverse = 0; @@ -294,11 +274,10 @@ shortestPathSearch(SearchEngineData &engine_working_data, { if (allow_uturn_at_waypoint) { - searchWithUTurn(facade, + searchWithUTurn(engine_working_data, + facade, forward_heap, reverse_heap, - forward_core_heap, - reverse_core_heap, search_from_forward_node, search_from_reverse_node, search_to_forward_node, @@ -331,11 +310,10 @@ shortestPathSearch(SearchEngineData &engine_working_data, } else { - search(facade, + search(engine_working_data, + facade, forward_heap, reverse_heap, - forward_core_heap, - reverse_core_heap, search_from_forward_node, search_from_reverse_node, search_to_forward_node,