From d66cc125aab12bae941886a46c78d4e8e23a355b Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Fri, 31 Mar 2017 21:53:39 +0200 Subject: [PATCH] make first heaps algorithm-aware --- include/engine/search_engine_data.hpp | 37 +++++++++++-- .../routing_algorithms/alternative_path.cpp | 11 ++-- .../direct_shortest_path.cpp | 19 ++++--- .../routing_algorithms/map_matching.cpp | 13 +++-- .../routing_algorithms/shortest_path.cpp | 11 ++-- src/engine/search_engine_data.cpp | 55 +++++++++++-------- 6 files changed, 92 insertions(+), 54 deletions(-) diff --git a/include/engine/search_engine_data.hpp b/include/engine/search_engine_data.hpp index 57edf2427..18f616ae1 100644 --- a/include/engine/search_engine_data.hpp +++ b/include/engine/search_engine_data.hpp @@ -3,7 +3,7 @@ #include -#include "partition/multi_level_partition.hpp" +#include "engine/algorithm.hpp" #include "util/binary_heap.hpp" #include "util/typedefs.hpp" @@ -53,25 +53,50 @@ struct SearchEngineData using MultiLayerDijkstraHeapPtr = boost::thread_specific_ptr; +private: static SearchEngineHeapPtr forward_heap_1; static SearchEngineHeapPtr reverse_heap_1; + static MultiLayerDijkstraHeapPtr mld_forward_heap; + static MultiLayerDijkstraHeapPtr mld_reverse_heap; + +public: static SearchEngineHeapPtr forward_heap_2; static SearchEngineHeapPtr reverse_heap_2; static SearchEngineHeapPtr forward_heap_3; static SearchEngineHeapPtr reverse_heap_3; static ManyToManyHeapPtr many_to_many_heap; - static MultiLayerDijkstraHeapPtr mld_forward_heap; - static MultiLayerDijkstraHeapPtr mld_reverse_heap; - void InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes); + template + void InitializeOrClearFirstThreadLocalStorage(Algorithm, const unsigned number_of_nodes); + + template auto GetForwardHeapPtr(Algorithm) const + { + return forward_heap_1.get(); + } + + template auto GetReverseHeapPtr(Algorithm) const + { + return reverse_heap_1.get(); + } + + void InitializeOrClearFirstThreadLocalStorage(routing_algorithms::mld::Algorithm, + const unsigned number_of_nodes); + + auto GetForwardHeapPtr(routing_algorithms::mld::Algorithm) const + { + return mld_forward_heap.get(); + } + + auto GetReverseHeapPtr(routing_algorithms::mld::Algorithm) const + { + return mld_reverse_heap.get(); + } void InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes); void InitializeOrClearThirdThreadLocalStorage(const unsigned number_of_nodes); void InitializeOrClearManyToManyThreadLocalStorage(const unsigned number_of_nodes); - - void InitializeOrClearMultiLayerDijkstraThreadLocalStorage(const unsigned number_of_nodes); }; } } diff --git a/src/engine/routing_algorithms/alternative_path.cpp b/src/engine/routing_algorithms/alternative_path.cpp index fe84df78b..0d58e373a 100644 --- a/src/engine/routing_algorithms/alternative_path.cpp +++ b/src/engine/routing_algorithms/alternative_path.cpp @@ -164,8 +164,8 @@ void computeLengthAndSharingOfViaPath( { engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); - QueryHeap &existing_forward_heap = *engine_working_data.forward_heap_1; - QueryHeap &existing_reverse_heap = *engine_working_data.reverse_heap_1; + auto &existing_forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{}); + auto &existing_reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{}); QueryHeap &new_forward_heap = *engine_working_data.forward_heap_2; QueryHeap &new_reverse_heap = *engine_working_data.reverse_heap_2; @@ -575,12 +575,13 @@ alternativePathSearch(SearchEngineData &engine_working_data, std::vector reverse_search_space; // Init queues, semi-expensive because access to TSS invokes a sys-call - engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); + engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{}, + facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearThirdThreadLocalStorage(facade.GetNumberOfNodes()); - QueryHeap &forward_heap1 = *(engine_working_data.forward_heap_1); - QueryHeap &reverse_heap1 = *(engine_working_data.reverse_heap_1); + auto &forward_heap1 = *engine_working_data.GetForwardHeapPtr(Algorithm{}); + auto &reverse_heap1 = *engine_working_data.GetReverseHeapPtr(Algorithm{}); QueryHeap &forward_heap2 = *(engine_working_data.forward_heap_2); QueryHeap &reverse_heap2 = *(engine_working_data.reverse_heap_2); diff --git a/src/engine/routing_algorithms/direct_shortest_path.cpp b/src/engine/routing_algorithms/direct_shortest_path.cpp index ec45460a8..657d91e8a 100644 --- a/src/engine/routing_algorithms/direct_shortest_path.cpp +++ b/src/engine/routing_algorithms/direct_shortest_path.cpp @@ -55,16 +55,17 @@ namespace ch /// by the previous route. /// This variation is only an optimazation for graphs with slow queries, for example /// not fully contracted graphs. -template +template InternalRouteResult directShortestPathSearchImpl( SearchEngineData &engine_working_data, - const datafacade::ContiguousInternalMemoryDataFacade &facade, + const datafacade::ContiguousInternalMemoryDataFacade &facade, const PhantomNodes &phantom_nodes) { - engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); + engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{}, + 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_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{}); + auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{}); auto &forward_core_heap = *(engine_working_data.forward_heap_2); auto &reverse_core_heap = *(engine_working_data.reverse_heap_2); forward_heap.Clear(); @@ -130,10 +131,10 @@ InternalRouteResult directShortestPathSearch( const datafacade::ContiguousInternalMemoryDataFacade &facade, const PhantomNodes &phantom_nodes) { - engine_working_data.InitializeOrClearMultiLayerDijkstraThreadLocalStorage( - facade.GetNumberOfNodes()); - auto &forward_heap = *(engine_working_data.mld_forward_heap); - auto &reverse_heap = *(engine_working_data.mld_reverse_heap); + engine_working_data.InitializeOrClearFirstThreadLocalStorage(mld::Algorithm{}, + facade.GetNumberOfNodes()); + auto &forward_heap = *engine_working_data.GetForwardHeapPtr(mld::Algorithm{}); + auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(mld::Algorithm{}); forward_heap.Clear(); reverse_heap.Clear(); insertNodesInHeaps(forward_heap, reverse_heap, phantom_nodes); diff --git a/src/engine/routing_algorithms/map_matching.cpp b/src/engine/routing_algorithms/map_matching.cpp index 3240082cd..d83cded1e 100644 --- a/src/engine/routing_algorithms/map_matching.cpp +++ b/src/engine/routing_algorithms/map_matching.cpp @@ -47,10 +47,10 @@ unsigned getMedianSampleTime(const std::vector ×tamps) } } -template +template SubMatchingList mapMatchingImpl(SearchEngineData &engine_working_data, - const datafacade::ContiguousInternalMemoryDataFacade &facade, + const datafacade::ContiguousInternalMemoryDataFacade &facade, const CandidateLists &candidates_list, const std::vector &trace_coordinates, const std::vector &trace_timestamps, @@ -141,11 +141,12 @@ mapMatchingImpl(SearchEngineData &engine_working_data, return sub_matchings; } - engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); - engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); + const auto nodes_number = facade.GetNumberOfNodes(); + engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{}, 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_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{}); + auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{}); auto &forward_core_heap = *(engine_working_data.forward_heap_2); auto &reverse_core_heap = *(engine_working_data.reverse_heap_2); diff --git a/src/engine/routing_algorithms/shortest_path.cpp b/src/engine/routing_algorithms/shortest_path.cpp index 4b2fcede3..158c5bc40 100644 --- a/src/engine/routing_algorithms/shortest_path.cpp +++ b/src/engine/routing_algorithms/shortest_path.cpp @@ -228,10 +228,10 @@ void unpackLegs(const datafacade::ContiguousInternalMemoryDataFacade +template InternalRouteResult shortestPathSearchImpl(SearchEngineData &engine_working_data, - const datafacade::ContiguousInternalMemoryDataFacade &facade, + const datafacade::ContiguousInternalMemoryDataFacade &facade, const std::vector &phantom_nodes_vector, const boost::optional continue_straight_at_waypoint) { @@ -241,11 +241,12 @@ shortestPathSearchImpl(SearchEngineData &engine_working_data, !(continue_straight_at_waypoint ? *continue_straight_at_waypoint : facade.GetContinueStraightDefault()); - engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes()); + engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{}, + facade.GetNumberOfNodes()); engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes()); - QueryHeap &forward_heap = *(engine_working_data.forward_heap_1); - QueryHeap &reverse_heap = *(engine_working_data.reverse_heap_1); + auto &forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{}); + auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{}); QueryHeap &forward_core_heap = *(engine_working_data.forward_heap_2); QueryHeap &reverse_core_heap = *(engine_working_data.reverse_heap_2); diff --git a/src/engine/search_engine_data.cpp b/src/engine/search_engine_data.cpp index 9e299fc99..a1f6cf9e9 100644 --- a/src/engine/search_engine_data.cpp +++ b/src/engine/search_engine_data.cpp @@ -18,7 +18,9 @@ SearchEngineData::ManyToManyHeapPtr SearchEngineData::many_to_many_heap; SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_forward_heap; SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_reverse_heap; -void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes) +template +void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(Algorithm, + const unsigned number_of_nodes) { if (forward_heap_1.get()) { @@ -39,6 +41,35 @@ void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(const unsigned n } } +template void +SearchEngineData::InitializeOrClearFirstThreadLocalStorage(routing_algorithms::ch::Algorithm, + const unsigned number_of_nodes); +template void +SearchEngineData::InitializeOrClearFirstThreadLocalStorage(routing_algorithms::corech::Algorithm, + const unsigned number_of_nodes); + +void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(routing_algorithms::mld::Algorithm, + const unsigned number_of_nodes) +{ + if (mld_forward_heap.get()) + { + mld_forward_heap->Clear(); + } + else + { + mld_forward_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes)); + } + + if (mld_reverse_heap.get()) + { + mld_reverse_heap->Clear(); + } + else + { + mld_reverse_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes)); + } +} + void SearchEngineData::InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes) { if (forward_heap_2.get()) @@ -92,27 +123,5 @@ void SearchEngineData::InitializeOrClearManyToManyThreadLocalStorage(const unsig many_to_many_heap.reset(new ManyToManyQueryHeap(number_of_nodes)); } } - -void SearchEngineData::InitializeOrClearMultiLayerDijkstraThreadLocalStorage( - const unsigned number_of_nodes) -{ - if (mld_forward_heap.get()) - { - mld_forward_heap->Clear(); - } - else - { - mld_forward_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes)); - } - - if (mld_reverse_heap.get()) - { - mld_reverse_heap->Clear(); - } - else - { - mld_reverse_heap.reset(new MultiLayerDijkstraHeap(number_of_nodes)); - } -} } }