This change takes the existing typedefs for weight, duration and distance, and makes them proper types, using the existing Alias functionality. Primarily this is to prevent bugs where the metrics are switched, but it also adds additional documentation. For example, it now makes it clear (despite the naming of variables) that most of the trip algorithm is running on the duration metric. I've not made any changes to the casts performed between metrics and numeric types, they now just more explicit.
127 lines
4.3 KiB
C++
127 lines
4.3 KiB
C++
#ifndef SEARCH_ENGINE_DATA_HPP
|
|
#define SEARCH_ENGINE_DATA_HPP
|
|
|
|
#include "engine/algorithm.hpp"
|
|
#include "util/query_heap.hpp"
|
|
#include "util/typedefs.hpp"
|
|
|
|
#include <boost/thread/tss.hpp>
|
|
|
|
namespace osrm
|
|
{
|
|
namespace engine
|
|
{
|
|
|
|
// Algorithm-dependent heaps
|
|
// - CH algorithms use CH heaps
|
|
// - CoreCH algorithms use CH
|
|
// - MLD algorithms use MLD heaps
|
|
|
|
template <typename Algorithm> struct SearchEngineData
|
|
{
|
|
};
|
|
|
|
struct HeapData
|
|
{
|
|
NodeID parent;
|
|
/* 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)
|
|
{
|
|
}
|
|
};
|
|
|
|
template <> struct SearchEngineData<routing_algorithms::ch::Algorithm>
|
|
{
|
|
using QueryHeap = util::
|
|
QueryHeap<NodeID, NodeID, EdgeWeight, HeapData, util::UnorderedMapStorage<NodeID, int>>;
|
|
|
|
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);
|
|
|
|
void InitializeOrClearSecondThreadLocalStorage(unsigned number_of_nodes);
|
|
|
|
void InitializeOrClearThirdThreadLocalStorage(unsigned number_of_nodes);
|
|
|
|
void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes);
|
|
};
|
|
|
|
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) {}
|
|
};
|
|
|
|
struct ManyToManyMultiLayerDijkstraHeapData : MultiLayerDijkstraHeapData
|
|
{
|
|
EdgeDuration duration;
|
|
EdgeDistance distance;
|
|
ManyToManyMultiLayerDijkstraHeapData(NodeID p, EdgeDuration duration, EdgeDistance distance)
|
|
: MultiLayerDijkstraHeapData(p), duration(duration), distance(distance)
|
|
{
|
|
}
|
|
ManyToManyMultiLayerDijkstraHeapData(NodeID p,
|
|
bool from,
|
|
EdgeDuration duration,
|
|
EdgeDistance distance)
|
|
: MultiLayerDijkstraHeapData(p, from), duration(duration), distance(distance)
|
|
{
|
|
}
|
|
};
|
|
|
|
template <> struct SearchEngineData<routing_algorithms::mld::Algorithm>
|
|
{
|
|
using QueryHeap = util::QueryHeap<NodeID,
|
|
NodeID,
|
|
EdgeWeight,
|
|
MultiLayerDijkstraHeapData,
|
|
util::TwoLevelStorage<NodeID, int>>;
|
|
|
|
using ManyToManyQueryHeap = util::QueryHeap<NodeID,
|
|
NodeID,
|
|
EdgeWeight,
|
|
ManyToManyMultiLayerDijkstraHeapData,
|
|
util::TwoLevelStorage<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 ManyToManyHeapPtr many_to_many_heap;
|
|
|
|
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes,
|
|
unsigned number_of_boundary_nodes);
|
|
|
|
void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes,
|
|
unsigned number_of_boundary_nodes);
|
|
};
|
|
} // namespace engine
|
|
} // namespace osrm
|
|
|
|
#endif // SEARCH_ENGINE_DATA_HPP
|