2014-11-28 06:13:18 -05:00
|
|
|
#ifndef SEARCH_ENGINE_DATA_HPP
|
|
|
|
#define SEARCH_ENGINE_DATA_HPP
|
2013-09-19 12:52:42 -04:00
|
|
|
|
2014-06-11 06:25:57 -04:00
|
|
|
#include <boost/thread/tss.hpp>
|
2013-06-24 14:11:53 -04:00
|
|
|
|
2017-03-31 15:53:39 -04:00
|
|
|
#include "engine/algorithm.hpp"
|
2016-01-02 11:13:44 -05:00
|
|
|
#include "util/binary_heap.hpp"
|
2016-05-27 15:05:04 -04:00
|
|
|
#include "util/typedefs.hpp"
|
2013-06-24 14:11:53 -04:00
|
|
|
|
2016-01-05 10:51:13 -05:00
|
|
|
namespace osrm
|
|
|
|
{
|
|
|
|
namespace engine
|
|
|
|
{
|
|
|
|
|
2014-05-05 11:19:47 -04:00
|
|
|
struct HeapData
|
|
|
|
{
|
2013-06-24 14:11:53 -04:00
|
|
|
NodeID parent;
|
2014-05-05 11:19:47 -04:00
|
|
|
/* explicit */ HeapData(NodeID p) : parent(p) {}
|
2013-06-24 14:11:53 -04:00
|
|
|
};
|
2013-09-19 12:52:42 -04:00
|
|
|
|
2017-01-19 16:52:09 -05:00
|
|
|
struct ManyToManyHeapData : HeapData
|
|
|
|
{
|
|
|
|
EdgeWeight duration;
|
|
|
|
ManyToManyHeapData(NodeID p, EdgeWeight duration) : HeapData(p), duration(duration) {}
|
|
|
|
};
|
|
|
|
|
2017-03-06 14:16:24 -05:00
|
|
|
struct MultiLayerDijkstraHeapData : HeapData
|
|
|
|
{
|
2017-03-15 09:36:41 -04:00
|
|
|
bool from_clique_arc;
|
|
|
|
MultiLayerDijkstraHeapData(NodeID p) : HeapData(p), from_clique_arc(false) {}
|
|
|
|
MultiLayerDijkstraHeapData(NodeID p, bool from) : HeapData(p), from_clique_arc(from) {}
|
2017-03-06 14:16:24 -05:00
|
|
|
};
|
|
|
|
|
2014-05-05 11:19:47 -04:00
|
|
|
struct SearchEngineData
|
|
|
|
{
|
2016-05-12 12:50:10 -04:00
|
|
|
using QueryHeap = util::
|
|
|
|
BinaryHeap<NodeID, NodeID, EdgeWeight, HeapData, util::UnorderedMapStorage<NodeID, int>>;
|
2014-08-19 07:01:38 -04:00
|
|
|
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
|
2013-08-20 11:05:36 -04:00
|
|
|
|
2017-01-19 16:52:09 -05:00
|
|
|
using ManyToManyQueryHeap = util::BinaryHeap<NodeID,
|
|
|
|
NodeID,
|
|
|
|
EdgeWeight,
|
|
|
|
ManyToManyHeapData,
|
|
|
|
util::UnorderedMapStorage<NodeID, int>>;
|
|
|
|
|
|
|
|
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
|
|
|
|
|
2017-03-06 14:16:24 -05:00
|
|
|
using MultiLayerDijkstraHeap = util::BinaryHeap<NodeID,
|
|
|
|
NodeID,
|
|
|
|
EdgeWeight,
|
|
|
|
MultiLayerDijkstraHeapData,
|
|
|
|
util::UnorderedMapStorage<NodeID, int>>;
|
|
|
|
|
|
|
|
using MultiLayerDijkstraHeapPtr = boost::thread_specific_ptr<MultiLayerDijkstraHeap>;
|
|
|
|
|
2017-03-31 15:53:39 -04:00
|
|
|
private:
|
2015-03-02 05:55:55 -05:00
|
|
|
static SearchEngineHeapPtr forward_heap_1;
|
|
|
|
static SearchEngineHeapPtr reverse_heap_1;
|
2017-03-31 15:53:39 -04:00
|
|
|
static MultiLayerDijkstraHeapPtr mld_forward_heap;
|
|
|
|
static MultiLayerDijkstraHeapPtr mld_reverse_heap;
|
|
|
|
|
|
|
|
public:
|
2015-03-02 05:55:55 -05:00
|
|
|
static SearchEngineHeapPtr forward_heap_2;
|
|
|
|
static SearchEngineHeapPtr reverse_heap_2;
|
|
|
|
static SearchEngineHeapPtr forward_heap_3;
|
|
|
|
static SearchEngineHeapPtr reverse_heap_3;
|
2017-01-19 16:52:09 -05:00
|
|
|
static ManyToManyHeapPtr many_to_many_heap;
|
2013-06-24 14:11:53 -04:00
|
|
|
|
2017-03-31 15:53:39 -04:00
|
|
|
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();
|
|
|
|
}
|
2013-06-24 14:11:53 -04:00
|
|
|
|
2013-09-19 12:52:42 -04:00
|
|
|
void InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes);
|
2013-06-24 14:11:53 -04:00
|
|
|
|
2013-09-19 12:52:42 -04:00
|
|
|
void InitializeOrClearThirdThreadLocalStorage(const unsigned number_of_nodes);
|
2017-01-19 16:52:09 -05:00
|
|
|
|
|
|
|
void InitializeOrClearManyToManyThreadLocalStorage(const unsigned number_of_nodes);
|
2013-06-24 14:11:53 -04:00
|
|
|
};
|
2016-01-05 10:51:13 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-11-28 06:13:18 -05:00
|
|
|
#endif // SEARCH_ENGINE_DATA_HPP
|