make first heaps algorithm-aware
This commit is contained in:
parent
3fc0fc65f9
commit
d66cc125aa
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include <boost/thread/tss.hpp>
|
#include <boost/thread/tss.hpp>
|
||||||
|
|
||||||
#include "partition/multi_level_partition.hpp"
|
#include "engine/algorithm.hpp"
|
||||||
#include "util/binary_heap.hpp"
|
#include "util/binary_heap.hpp"
|
||||||
#include "util/typedefs.hpp"
|
#include "util/typedefs.hpp"
|
||||||
|
|
||||||
@ -53,25 +53,50 @@ struct SearchEngineData
|
|||||||
|
|
||||||
using MultiLayerDijkstraHeapPtr = boost::thread_specific_ptr<MultiLayerDijkstraHeap>;
|
using MultiLayerDijkstraHeapPtr = boost::thread_specific_ptr<MultiLayerDijkstraHeap>;
|
||||||
|
|
||||||
|
private:
|
||||||
static SearchEngineHeapPtr forward_heap_1;
|
static SearchEngineHeapPtr forward_heap_1;
|
||||||
static SearchEngineHeapPtr reverse_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 forward_heap_2;
|
||||||
static SearchEngineHeapPtr reverse_heap_2;
|
static SearchEngineHeapPtr reverse_heap_2;
|
||||||
static SearchEngineHeapPtr forward_heap_3;
|
static SearchEngineHeapPtr forward_heap_3;
|
||||||
static SearchEngineHeapPtr reverse_heap_3;
|
static SearchEngineHeapPtr reverse_heap_3;
|
||||||
static ManyToManyHeapPtr many_to_many_heap;
|
static ManyToManyHeapPtr many_to_many_heap;
|
||||||
static MultiLayerDijkstraHeapPtr mld_forward_heap;
|
|
||||||
static MultiLayerDijkstraHeapPtr mld_reverse_heap;
|
|
||||||
|
|
||||||
void InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes);
|
template <typename Algorithm>
|
||||||
|
void InitializeOrClearFirstThreadLocalStorage(Algorithm, const unsigned number_of_nodes);
|
||||||
|
|
||||||
|
template <typename Algorithm> auto GetForwardHeapPtr(Algorithm) const
|
||||||
|
{
|
||||||
|
return forward_heap_1.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Algorithm> 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 InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes);
|
||||||
|
|
||||||
void InitializeOrClearThirdThreadLocalStorage(const unsigned number_of_nodes);
|
void InitializeOrClearThirdThreadLocalStorage(const unsigned number_of_nodes);
|
||||||
|
|
||||||
void InitializeOrClearManyToManyThreadLocalStorage(const unsigned number_of_nodes);
|
void InitializeOrClearManyToManyThreadLocalStorage(const unsigned number_of_nodes);
|
||||||
|
|
||||||
void InitializeOrClearMultiLayerDijkstraThreadLocalStorage(const unsigned number_of_nodes);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -164,8 +164,8 @@ void computeLengthAndSharingOfViaPath(
|
|||||||
{
|
{
|
||||||
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
|
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
|
||||||
|
|
||||||
QueryHeap &existing_forward_heap = *engine_working_data.forward_heap_1;
|
auto &existing_forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
|
||||||
QueryHeap &existing_reverse_heap = *engine_working_data.reverse_heap_1;
|
auto &existing_reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
|
||||||
QueryHeap &new_forward_heap = *engine_working_data.forward_heap_2;
|
QueryHeap &new_forward_heap = *engine_working_data.forward_heap_2;
|
||||||
QueryHeap &new_reverse_heap = *engine_working_data.reverse_heap_2;
|
QueryHeap &new_reverse_heap = *engine_working_data.reverse_heap_2;
|
||||||
|
|
||||||
@ -575,12 +575,13 @@ alternativePathSearch(SearchEngineData &engine_working_data,
|
|||||||
std::vector<SearchSpaceEdge> reverse_search_space;
|
std::vector<SearchSpaceEdge> reverse_search_space;
|
||||||
|
|
||||||
// Init queues, semi-expensive because access to TSS invokes a sys-call
|
// 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.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
|
||||||
engine_working_data.InitializeOrClearThirdThreadLocalStorage(facade.GetNumberOfNodes());
|
engine_working_data.InitializeOrClearThirdThreadLocalStorage(facade.GetNumberOfNodes());
|
||||||
|
|
||||||
QueryHeap &forward_heap1 = *(engine_working_data.forward_heap_1);
|
auto &forward_heap1 = *engine_working_data.GetForwardHeapPtr(Algorithm{});
|
||||||
QueryHeap &reverse_heap1 = *(engine_working_data.reverse_heap_1);
|
auto &reverse_heap1 = *engine_working_data.GetReverseHeapPtr(Algorithm{});
|
||||||
QueryHeap &forward_heap2 = *(engine_working_data.forward_heap_2);
|
QueryHeap &forward_heap2 = *(engine_working_data.forward_heap_2);
|
||||||
QueryHeap &reverse_heap2 = *(engine_working_data.reverse_heap_2);
|
QueryHeap &reverse_heap2 = *(engine_working_data.reverse_heap_2);
|
||||||
|
|
||||||
|
@ -55,16 +55,17 @@ namespace ch
|
|||||||
/// by the previous route.
|
/// by the previous route.
|
||||||
/// This variation is only an optimazation for graphs with slow queries, for example
|
/// This variation is only an optimazation for graphs with slow queries, for example
|
||||||
/// not fully contracted graphs.
|
/// not fully contracted graphs.
|
||||||
template <typename AlgorithmT>
|
template <typename Algorithm>
|
||||||
InternalRouteResult directShortestPathSearchImpl(
|
InternalRouteResult directShortestPathSearchImpl(
|
||||||
SearchEngineData &engine_working_data,
|
SearchEngineData &engine_working_data,
|
||||||
const datafacade::ContiguousInternalMemoryDataFacade<AlgorithmT> &facade,
|
const datafacade::ContiguousInternalMemoryDataFacade<Algorithm> &facade,
|
||||||
const PhantomNodes &phantom_nodes)
|
const PhantomNodes &phantom_nodes)
|
||||||
{
|
{
|
||||||
engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes());
|
engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{},
|
||||||
|
facade.GetNumberOfNodes());
|
||||||
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
|
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
|
||||||
auto &forward_heap = *(engine_working_data.forward_heap_1);
|
auto &forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
|
||||||
auto &reverse_heap = *(engine_working_data.reverse_heap_1);
|
auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
|
||||||
auto &forward_core_heap = *(engine_working_data.forward_heap_2);
|
auto &forward_core_heap = *(engine_working_data.forward_heap_2);
|
||||||
auto &reverse_core_heap = *(engine_working_data.reverse_heap_2);
|
auto &reverse_core_heap = *(engine_working_data.reverse_heap_2);
|
||||||
forward_heap.Clear();
|
forward_heap.Clear();
|
||||||
@ -130,10 +131,10 @@ InternalRouteResult directShortestPathSearch(
|
|||||||
const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade,
|
const datafacade::ContiguousInternalMemoryDataFacade<mld::Algorithm> &facade,
|
||||||
const PhantomNodes &phantom_nodes)
|
const PhantomNodes &phantom_nodes)
|
||||||
{
|
{
|
||||||
engine_working_data.InitializeOrClearMultiLayerDijkstraThreadLocalStorage(
|
engine_working_data.InitializeOrClearFirstThreadLocalStorage(mld::Algorithm{},
|
||||||
facade.GetNumberOfNodes());
|
facade.GetNumberOfNodes());
|
||||||
auto &forward_heap = *(engine_working_data.mld_forward_heap);
|
auto &forward_heap = *engine_working_data.GetForwardHeapPtr(mld::Algorithm{});
|
||||||
auto &reverse_heap = *(engine_working_data.mld_reverse_heap);
|
auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(mld::Algorithm{});
|
||||||
forward_heap.Clear();
|
forward_heap.Clear();
|
||||||
reverse_heap.Clear();
|
reverse_heap.Clear();
|
||||||
insertNodesInHeaps(forward_heap, reverse_heap, phantom_nodes);
|
insertNodesInHeaps(forward_heap, reverse_heap, phantom_nodes);
|
||||||
|
@ -47,10 +47,10 @@ unsigned getMedianSampleTime(const std::vector<unsigned> ×tamps)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename AlgorithmT>
|
template <typename Algorithm>
|
||||||
SubMatchingList
|
SubMatchingList
|
||||||
mapMatchingImpl(SearchEngineData &engine_working_data,
|
mapMatchingImpl(SearchEngineData &engine_working_data,
|
||||||
const datafacade::ContiguousInternalMemoryDataFacade<AlgorithmT> &facade,
|
const datafacade::ContiguousInternalMemoryDataFacade<Algorithm> &facade,
|
||||||
const CandidateLists &candidates_list,
|
const CandidateLists &candidates_list,
|
||||||
const std::vector<util::Coordinate> &trace_coordinates,
|
const std::vector<util::Coordinate> &trace_coordinates,
|
||||||
const std::vector<unsigned> &trace_timestamps,
|
const std::vector<unsigned> &trace_timestamps,
|
||||||
@ -141,11 +141,12 @@ mapMatchingImpl(SearchEngineData &engine_working_data,
|
|||||||
return sub_matchings;
|
return sub_matchings;
|
||||||
}
|
}
|
||||||
|
|
||||||
engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes());
|
const auto nodes_number = facade.GetNumberOfNodes();
|
||||||
engine_working_data.InitializeOrClearSecondThreadLocalStorage(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 &forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
|
||||||
auto &reverse_heap = *(engine_working_data.reverse_heap_1);
|
auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
|
||||||
auto &forward_core_heap = *(engine_working_data.forward_heap_2);
|
auto &forward_core_heap = *(engine_working_data.forward_heap_2);
|
||||||
auto &reverse_core_heap = *(engine_working_data.reverse_heap_2);
|
auto &reverse_core_heap = *(engine_working_data.reverse_heap_2);
|
||||||
|
|
||||||
|
@ -228,10 +228,10 @@ void unpackLegs(const datafacade::ContiguousInternalMemoryDataFacade<ch::Algorit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename AlgorithmT>
|
template <typename Algorithm>
|
||||||
InternalRouteResult
|
InternalRouteResult
|
||||||
shortestPathSearchImpl(SearchEngineData &engine_working_data,
|
shortestPathSearchImpl(SearchEngineData &engine_working_data,
|
||||||
const datafacade::ContiguousInternalMemoryDataFacade<AlgorithmT> &facade,
|
const datafacade::ContiguousInternalMemoryDataFacade<Algorithm> &facade,
|
||||||
const std::vector<PhantomNodes> &phantom_nodes_vector,
|
const std::vector<PhantomNodes> &phantom_nodes_vector,
|
||||||
const boost::optional<bool> continue_straight_at_waypoint)
|
const boost::optional<bool> continue_straight_at_waypoint)
|
||||||
{
|
{
|
||||||
@ -241,11 +241,12 @@ shortestPathSearchImpl(SearchEngineData &engine_working_data,
|
|||||||
!(continue_straight_at_waypoint ? *continue_straight_at_waypoint
|
!(continue_straight_at_waypoint ? *continue_straight_at_waypoint
|
||||||
: facade.GetContinueStraightDefault());
|
: facade.GetContinueStraightDefault());
|
||||||
|
|
||||||
engine_working_data.InitializeOrClearFirstThreadLocalStorage(facade.GetNumberOfNodes());
|
engine_working_data.InitializeOrClearFirstThreadLocalStorage(Algorithm{},
|
||||||
|
facade.GetNumberOfNodes());
|
||||||
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
|
engine_working_data.InitializeOrClearSecondThreadLocalStorage(facade.GetNumberOfNodes());
|
||||||
|
|
||||||
QueryHeap &forward_heap = *(engine_working_data.forward_heap_1);
|
auto &forward_heap = *engine_working_data.GetForwardHeapPtr(Algorithm{});
|
||||||
QueryHeap &reverse_heap = *(engine_working_data.reverse_heap_1);
|
auto &reverse_heap = *engine_working_data.GetReverseHeapPtr(Algorithm{});
|
||||||
QueryHeap &forward_core_heap = *(engine_working_data.forward_heap_2);
|
QueryHeap &forward_core_heap = *(engine_working_data.forward_heap_2);
|
||||||
QueryHeap &reverse_core_heap = *(engine_working_data.reverse_heap_2);
|
QueryHeap &reverse_core_heap = *(engine_working_data.reverse_heap_2);
|
||||||
|
|
||||||
|
@ -18,7 +18,9 @@ SearchEngineData::ManyToManyHeapPtr SearchEngineData::many_to_many_heap;
|
|||||||
SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_forward_heap;
|
SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_forward_heap;
|
||||||
SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_reverse_heap;
|
SearchEngineData::MultiLayerDijkstraHeapPtr SearchEngineData::mld_reverse_heap;
|
||||||
|
|
||||||
void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes)
|
template <typename Algorithm>
|
||||||
|
void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(Algorithm,
|
||||||
|
const unsigned number_of_nodes)
|
||||||
{
|
{
|
||||||
if (forward_heap_1.get())
|
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)
|
void SearchEngineData::InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes)
|
||||||
{
|
{
|
||||||
if (forward_heap_2.get())
|
if (forward_heap_2.get())
|
||||||
@ -92,27 +123,5 @@ void SearchEngineData::InitializeOrClearManyToManyThreadLocalStorage(const unsig
|
|||||||
many_to_many_heap.reset(new ManyToManyQueryHeap(number_of_nodes));
|
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user