osrm-backend/include/engine/search_engine_data.hpp

124 lines
4.3 KiB
C++
Raw Normal View History

#ifndef SEARCH_ENGINE_DATA_HPP
#define SEARCH_ENGINE_DATA_HPP
2017-03-31 15:53:39 -04:00
#include "engine/algorithm.hpp"
2017-05-02 07:12:28 -04:00
#include "util/query_heap.hpp"
2016-05-27 15:05:04 -04:00
#include "util/typedefs.hpp"
2017-08-08 06:48:26 -04:00
#include <boost/thread/tss.hpp>
namespace osrm::engine
2016-01-05 10:51:13 -05:00
{
// Algorithm-dependent heaps
// - CH algorithms use CH heaps
2017-05-02 07:12:28 -04:00
// - CoreCH algorithms use CH
// - MLD algorithms use MLD heaps
2017-04-11 15:38:26 -04:00
template <typename Algorithm> struct SearchEngineData
{
};
2014-05-05 11:19:47 -04:00
struct HeapData
{
NodeID parent;
2014-05-05 11:19:47 -04:00
/* explicit */ HeapData(NodeID p) : parent(p) {}
};
struct ManyToManyHeapData : HeapData
{
EdgeDuration duration;
EdgeDistance distance;
ManyToManyHeapData(NodeID p, EdgeDuration duration, EdgeDistance distance)
: HeapData(p), duration(duration), distance(distance)
{
}
};
2017-04-11 15:38:26 -04:00
template <> struct SearchEngineData<routing_algorithms::ch::Algorithm>
2014-05-05 11:19:47 -04:00
{
using QueryHeap = util::
2017-05-02 07:12:28 -04:00
QueryHeap<NodeID, NodeID, EdgeWeight, HeapData, util::UnorderedMapStorage<NodeID, int>>;
2017-05-02 07:12:28 -04:00
using ManyToManyQueryHeap = util::QueryHeap<NodeID,
NodeID,
EdgeWeight,
ManyToManyHeapData,
util::UnorderedMapStorage<NodeID, int>>;
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
static SearchEngineHeapPtr forward_heap_1;
static SearchEngineHeapPtr reverse_heap_1;
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;
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes);
2017-03-31 15:53:39 -04:00
void InitializeOrClearSecondThreadLocalStorage(unsigned number_of_nodes);
2017-03-31 15:53:39 -04:00
void InitializeOrClearThirdThreadLocalStorage(unsigned number_of_nodes);
2017-03-31 15:53:39 -04:00
void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes);
};
2017-03-31 15:53:39 -04:00
struct MultiLayerDijkstraHeapData
{
NodeID parent;
bool from_clique_arc;
MultiLayerDijkstraHeapData(NodeID p) : parent(p), from_clique_arc(false) {}
MultiLayerDijkstraHeapData(NodeID p, bool from) : parent(p), from_clique_arc(from) {}
};
2017-03-31 15:53:39 -04:00
2017-06-27 18:48:18 -04:00
struct ManyToManyMultiLayerDijkstraHeapData : MultiLayerDijkstraHeapData
{
EdgeDuration duration;
EdgeDistance distance;
ManyToManyMultiLayerDijkstraHeapData(NodeID p, EdgeDuration duration, EdgeDistance distance)
: MultiLayerDijkstraHeapData(p), duration(duration), distance(distance)
2017-06-27 18:48:18 -04:00
{
}
ManyToManyMultiLayerDijkstraHeapData(NodeID p,
bool from,
EdgeDuration duration,
EdgeDistance distance)
: MultiLayerDijkstraHeapData(p, from), duration(duration), distance(distance)
2017-06-27 18:48:18 -04:00
{
}
};
template <> struct SearchEngineData<routing_algorithms::mld::Algorithm>
{
2017-05-02 07:12:28 -04:00
using QueryHeap = util::QueryHeap<NodeID,
NodeID,
EdgeWeight,
MultiLayerDijkstraHeapData,
util::TwoLevelStorage<NodeID, int>>;
2017-06-27 18:48:18 -04:00
using ManyToManyQueryHeap = util::QueryHeap<NodeID,
NodeID,
EdgeWeight,
ManyToManyMultiLayerDijkstraHeapData,
util::TwoLevelStorage<NodeID, int>>;
2017-06-27 18:48:18 -04:00
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
2017-06-27 18:48:18 -04:00
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
static SearchEngineHeapPtr forward_heap_1;
static SearchEngineHeapPtr reverse_heap_1;
2017-06-27 18:48:18 -04:00
static ManyToManyHeapPtr many_to_many_heap;
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes,
unsigned number_of_boundary_nodes);
2017-06-27 18:48:18 -04:00
void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes,
unsigned number_of_boundary_nodes);
};
2022-12-20 12:00:11 -05:00
} // namespace osrm::engine
2016-01-05 10:51:13 -05:00
#endif // SEARCH_ENGINE_DATA_HPP