format code
This commit is contained in:
parent
aa06029801
commit
fcb7dd2a21
@ -97,7 +97,6 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
|
|||||||
const std::vector<std::size_t> &phantom_indices)
|
const std::vector<std::size_t> &phantom_indices)
|
||||||
{
|
{
|
||||||
auto min_level = [&partition, node](const PhantomNode &phantom_node) {
|
auto min_level = [&partition, node](const PhantomNode &phantom_node) {
|
||||||
|
|
||||||
const auto &forward_segment = phantom_node.forward_segment_id;
|
const auto &forward_segment = phantom_node.forward_segment_id;
|
||||||
const auto forward_level =
|
const auto forward_level =
|
||||||
forward_segment.enabled ? partition.GetHighestDifferentLevel(node, forward_segment.id)
|
forward_segment.enabled ? partition.GetHighestDifferentLevel(node, forward_segment.id)
|
||||||
@ -120,7 +119,7 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
} // namespace
|
||||||
|
|
||||||
// Heaps only record for each node its predecessor ("parent") on the shortest path.
|
// Heaps only record for each node its predecessor ("parent") on the shortest path.
|
||||||
// For re-constructing the actual path we need to trace back all parent "pointers".
|
// For re-constructing the actual path we need to trace back all parent "pointers".
|
||||||
@ -243,7 +242,8 @@ void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
|
|||||||
if (DIRECTION == FORWARD_DIRECTION)
|
if (DIRECTION == FORWARD_DIRECTION)
|
||||||
{
|
{
|
||||||
// Shortcuts in forward direction
|
// Shortcuts in forward direction
|
||||||
const auto &cell = cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
|
const auto &cell =
|
||||||
|
cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
|
||||||
auto destination = cell.GetDestinationNodes().begin();
|
auto destination = cell.GetDestinationNodes().begin();
|
||||||
for (auto shortcut_weight : cell.GetOutWeight(heapNode.node))
|
for (auto shortcut_weight : cell.GetOutWeight(heapNode.node))
|
||||||
{
|
{
|
||||||
@ -272,7 +272,8 @@ void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Shortcuts in backward direction
|
// Shortcuts in backward direction
|
||||||
const auto &cell = cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
|
const auto &cell =
|
||||||
|
cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
|
||||||
auto source = cell.GetSourceNodes().begin();
|
auto source = cell.GetSourceNodes().begin();
|
||||||
for (auto shortcut_weight : cell.GetInWeight(heapNode.node))
|
for (auto shortcut_weight : cell.GetInWeight(heapNode.node))
|
||||||
{
|
{
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#define OSRM_UTIL_QUERY_HEAP_HPP
|
#define OSRM_UTIL_QUERY_HEAP_HPP
|
||||||
|
|
||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/optional.hpp>
|
|
||||||
#include <boost/heap/d_ary_heap.hpp>
|
#include <boost/heap/d_ary_heap.hpp>
|
||||||
|
#include <boost/optional.hpp>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
@ -196,7 +196,6 @@ template <typename NodeID,
|
|||||||
class QueryHeap
|
class QueryHeap
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
using HeapData = std::pair<Weight, Key>;
|
using HeapData = std::pair<Weight, Key>;
|
||||||
using HeapContainer = boost::heap::d_ary_heap<HeapData,
|
using HeapContainer = boost::heap::d_ary_heap<HeapData,
|
||||||
boost::heap::arity<4>,
|
boost::heap::arity<4>,
|
||||||
@ -297,7 +296,8 @@ class QueryHeap
|
|||||||
boost::optional<HeapNode &> GetHeapNodeIfWasInserted(const NodeID node)
|
boost::optional<HeapNode &> GetHeapNodeIfWasInserted(const NodeID node)
|
||||||
{
|
{
|
||||||
const auto index = node_index.peek_index(node);
|
const auto index = node_index.peek_index(node);
|
||||||
if (index >= static_cast<decltype(index)>(inserted_nodes.size()) || inserted_nodes[index].node!=node)
|
if (index >= static_cast<decltype(index)>(inserted_nodes.size()) ||
|
||||||
|
inserted_nodes[index].node != node)
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -307,15 +307,14 @@ class QueryHeap
|
|||||||
boost::optional<const HeapNode &> GetHeapNodeIfWasInserted(const NodeID node) const
|
boost::optional<const HeapNode &> GetHeapNodeIfWasInserted(const NodeID node) const
|
||||||
{
|
{
|
||||||
const auto index = node_index.peek_index(node);
|
const auto index = node_index.peek_index(node);
|
||||||
if (index >= static_cast<decltype(index)>(inserted_nodes.size()) || inserted_nodes[index].node!=node)
|
if (index >= static_cast<decltype(index)>(inserted_nodes.size()) ||
|
||||||
|
inserted_nodes[index].node != node)
|
||||||
{
|
{
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
return inserted_nodes[index];
|
return inserted_nodes[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NodeID Min() const
|
NodeID Min() const
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(!heap.empty());
|
BOOST_ASSERT(!heap.empty());
|
||||||
@ -375,7 +374,7 @@ class QueryHeap
|
|||||||
HeapContainer heap;
|
HeapContainer heap;
|
||||||
IndexStorage node_index;
|
IndexStorage node_index;
|
||||||
};
|
};
|
||||||
}
|
} // namespace util
|
||||||
}
|
} // namespace osrm
|
||||||
|
|
||||||
#endif // OSRM_UTIL_QUERY_HEAP_HPP
|
#endif // OSRM_UTIL_QUERY_HEAP_HPP
|
||||||
|
@ -47,7 +47,7 @@ void relaxNode(ContractorHeap &heap,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // namespace
|
||||||
|
|
||||||
void search(ContractorHeap &heap,
|
void search(ContractorHeap &heap,
|
||||||
const ContractorGraph &graph,
|
const ContractorGraph &graph,
|
||||||
@ -85,5 +85,5 @@ void search(ContractorHeap &heap,
|
|||||||
relaxNode(heap, graph, node, node_weight, forbidden_node);
|
relaxNode(heap, graph, node, node_weight, forbidden_node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} // namespace contractor
|
||||||
}
|
} // namespace osrm
|
||||||
|
@ -62,7 +62,8 @@ void alternativeRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
QueryHeap &forward_heap = DIRECTION == FORWARD_DIRECTION ? heap1 : heap2;
|
QueryHeap &forward_heap = DIRECTION == FORWARD_DIRECTION ? heap1 : heap2;
|
||||||
QueryHeap &reverse_heap = DIRECTION == FORWARD_DIRECTION ? heap2 : heap1;
|
QueryHeap &reverse_heap = DIRECTION == FORWARD_DIRECTION ? heap2 : heap1;
|
||||||
|
|
||||||
// Take a copy (no ref &) of the extracted node because otherwise could be modified later if toHeapNode is the same
|
// Take a copy (no ref &) of the extracted node because otherwise could be modified later if
|
||||||
|
// toHeapNode is the same
|
||||||
const auto heapNode = forward_heap.DeleteMinGetHeapNode();
|
const auto heapNode = forward_heap.DeleteMinGetHeapNode();
|
||||||
|
|
||||||
const auto scaled_weight =
|
const auto scaled_weight =
|
||||||
@ -561,7 +562,7 @@ bool viaNodeCandidatePassesTTest(SearchEngineData<Algorithm> &engine_working_dat
|
|||||||
}
|
}
|
||||||
return (upper_bound <= t_test_path_weight);
|
return (upper_bound <= t_test_path_weight);
|
||||||
}
|
}
|
||||||
} // anon. namespace
|
} // namespace
|
||||||
|
|
||||||
InternalManyRoutesResult alternativePathSearch(SearchEngineData<Algorithm> &engine_working_data,
|
InternalManyRoutesResult alternativePathSearch(SearchEngineData<Algorithm> &engine_working_data,
|
||||||
const DataFacade<Algorithm> &facade,
|
const DataFacade<Algorithm> &facade,
|
||||||
@ -856,4 +857,4 @@ InternalManyRoutesResult alternativePathSearch(SearchEngineData<Algorithm> &engi
|
|||||||
|
|
||||||
} // namespace routing_algorithms
|
} // namespace routing_algorithms
|
||||||
} // namespace engine
|
} // namespace engine
|
||||||
} // namespace osrm}
|
} // namespace osrm
|
||||||
|
@ -45,7 +45,8 @@ inline bool addLoopWeight(const DataFacade<ch::Algorithm> &facade,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool DIRECTION>
|
template <bool DIRECTION>
|
||||||
void relaxOutgoingEdges(const DataFacade<Algorithm> &facade,
|
void relaxOutgoingEdges(
|
||||||
|
const DataFacade<Algorithm> &facade,
|
||||||
const typename SearchEngineData<Algorithm>::ManyToManyQueryHeap::HeapNode &heapNode,
|
const typename SearchEngineData<Algorithm>::ManyToManyQueryHeap::HeapNode &heapNode,
|
||||||
typename SearchEngineData<Algorithm>::ManyToManyQueryHeap &query_heap,
|
typename SearchEngineData<Algorithm>::ManyToManyQueryHeap &query_heap,
|
||||||
const PhantomNode &)
|
const PhantomNode &)
|
||||||
@ -100,7 +101,8 @@ void forwardRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
std::vector<NodeID> &middle_nodes_table,
|
std::vector<NodeID> &middle_nodes_table,
|
||||||
const PhantomNode &phantom_node)
|
const PhantomNode &phantom_node)
|
||||||
{
|
{
|
||||||
// Take a copy of the extracted node because otherwise could be modified later if toHeapNode is the same
|
// Take a copy of the extracted node because otherwise could be modified later if toHeapNode is
|
||||||
|
// the same
|
||||||
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
||||||
|
|
||||||
// Check if each encountered node has an entry
|
// Check if each encountered node has an entry
|
||||||
@ -149,8 +151,7 @@ void forwardRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
relaxOutgoingEdges<FORWARD_DIRECTION>(
|
relaxOutgoingEdges<FORWARD_DIRECTION>(facade, heapNode, query_heap, phantom_node);
|
||||||
facade, heapNode, query_heap, phantom_node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void backwardRoutingStep(const DataFacade<Algorithm> &facade,
|
void backwardRoutingStep(const DataFacade<Algorithm> &facade,
|
||||||
@ -159,15 +160,19 @@ void backwardRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
std::vector<NodeBucket> &search_space_with_buckets,
|
std::vector<NodeBucket> &search_space_with_buckets,
|
||||||
const PhantomNode &phantom_node)
|
const PhantomNode &phantom_node)
|
||||||
{
|
{
|
||||||
// Take a copy (no ref &) of the extracted node because otherwise could be modified later if toHeapNode is the same
|
// Take a copy (no ref &) of the extracted node because otherwise could be modified later if
|
||||||
|
// toHeapNode is the same
|
||||||
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
||||||
|
|
||||||
// Store settled nodes in search space bucket
|
// Store settled nodes in search space bucket
|
||||||
search_space_with_buckets.emplace_back(
|
search_space_with_buckets.emplace_back(heapNode.node,
|
||||||
heapNode.node, heapNode.data.parent, column_index, heapNode.weight, heapNode.data.duration, heapNode.data.distance);
|
heapNode.data.parent,
|
||||||
|
column_index,
|
||||||
|
heapNode.weight,
|
||||||
|
heapNode.data.duration,
|
||||||
|
heapNode.data.distance);
|
||||||
|
|
||||||
relaxOutgoingEdges<REVERSE_DIRECTION>(
|
relaxOutgoingEdges<REVERSE_DIRECTION>(facade, heapNode, query_heap, phantom_node);
|
||||||
facade, heapNode, query_heap, phantom_node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ch
|
} // namespace ch
|
||||||
|
@ -92,7 +92,8 @@ void relaxBorderEdges(const DataFacade<mld::Algorithm> &facade,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <bool DIRECTION, typename... Args>
|
template <bool DIRECTION, typename... Args>
|
||||||
void relaxOutgoingEdges(const DataFacade<mld::Algorithm> &facade,
|
void relaxOutgoingEdges(
|
||||||
|
const DataFacade<mld::Algorithm> &facade,
|
||||||
const typename SearchEngineData<mld::Algorithm>::ManyToManyQueryHeap::HeapNode &heapNode,
|
const typename SearchEngineData<mld::Algorithm>::ManyToManyQueryHeap::HeapNode &heapNode,
|
||||||
typename SearchEngineData<mld::Algorithm>::ManyToManyQueryHeap &query_heap,
|
typename SearchEngineData<mld::Algorithm>::ManyToManyQueryHeap &query_heap,
|
||||||
Args... args)
|
Args... args)
|
||||||
@ -110,7 +111,6 @@ void relaxOutgoingEdges(const DataFacade<mld::Algorithm> &facade,
|
|||||||
const auto &cells = facade.GetCellStorage();
|
const auto &cells = facade.GetCellStorage();
|
||||||
const auto &metric = facade.GetCellMetric();
|
const auto &metric = facade.GetCellMetric();
|
||||||
|
|
||||||
|
|
||||||
if (level >= 1 && !heapNode.data.from_clique_arc)
|
if (level >= 1 && !heapNode.data.from_clique_arc)
|
||||||
{
|
{
|
||||||
const auto &cell = cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
|
const auto &cell = cells.GetCell(metric, level, partition.GetCell(level, heapNode.node));
|
||||||
@ -134,7 +134,8 @@ void relaxOutgoingEdges(const DataFacade<mld::Algorithm> &facade,
|
|||||||
const auto toHeapNode = query_heap.GetHeapNodeIfWasInserted(to);
|
const auto toHeapNode = query_heap.GetHeapNodeIfWasInserted(to);
|
||||||
if (!toHeapNode)
|
if (!toHeapNode)
|
||||||
{
|
{
|
||||||
query_heap.Insert(to, to_weight, {heapNode.node, true, to_duration, to_distance});
|
query_heap.Insert(
|
||||||
|
to, to_weight, {heapNode.node, true, to_duration, to_distance});
|
||||||
}
|
}
|
||||||
else if (std::tie(to_weight, to_duration, to_distance, heapNode.node) <
|
else if (std::tie(to_weight, to_duration, to_distance, heapNode.node) <
|
||||||
std::tie(toHeapNode->weight,
|
std::tie(toHeapNode->weight,
|
||||||
@ -174,7 +175,8 @@ void relaxOutgoingEdges(const DataFacade<mld::Algorithm> &facade,
|
|||||||
const auto toHeapNode = query_heap.GetHeapNodeIfWasInserted(to);
|
const auto toHeapNode = query_heap.GetHeapNodeIfWasInserted(to);
|
||||||
if (!toHeapNode)
|
if (!toHeapNode)
|
||||||
{
|
{
|
||||||
query_heap.Insert(to, to_weight, {heapNode.node, true, to_duration, to_distance});
|
query_heap.Insert(
|
||||||
|
to, to_weight, {heapNode.node, true, to_duration, to_distance});
|
||||||
}
|
}
|
||||||
else if (std::tie(to_weight, to_duration, to_distance, heapNode.node) <
|
else if (std::tie(to_weight, to_duration, to_distance, heapNode.node) <
|
||||||
std::tie(toHeapNode->weight,
|
std::tie(toHeapNode->weight,
|
||||||
@ -196,7 +198,13 @@ void relaxOutgoingEdges(const DataFacade<mld::Algorithm> &facade,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
relaxBorderEdges<DIRECTION>(facade, heapNode.node, heapNode.weight, heapNode.data.duration, heapNode.data.distance, query_heap, level);
|
relaxBorderEdges<DIRECTION>(facade,
|
||||||
|
heapNode.node,
|
||||||
|
heapNode.weight,
|
||||||
|
heapNode.data.duration,
|
||||||
|
heapNode.data.distance,
|
||||||
|
query_heap,
|
||||||
|
level);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -376,15 +384,12 @@ oneToManySearch(SearchEngineData<Algorithm> &engine_working_data,
|
|||||||
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
||||||
|
|
||||||
// Update values
|
// Update values
|
||||||
update_values(heapNode.node, heapNode.weight, heapNode.data.duration, heapNode.data.distance);
|
update_values(
|
||||||
|
heapNode.node, heapNode.weight, heapNode.data.duration, heapNode.data.distance);
|
||||||
|
|
||||||
// Relax outgoing edges
|
// Relax outgoing edges
|
||||||
relaxOutgoingEdges<DIRECTION>(facade,
|
relaxOutgoingEdges<DIRECTION>(
|
||||||
heapNode,
|
facade, heapNode, query_heap, phantom_nodes, phantom_index, phantom_indices);
|
||||||
query_heap,
|
|
||||||
phantom_nodes,
|
|
||||||
phantom_index,
|
|
||||||
phantom_indices);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_pair(durations, distances_table);
|
return std::make_pair(durations, distances_table);
|
||||||
@ -406,7 +411,8 @@ void forwardRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
std::vector<NodeID> &middle_nodes_table,
|
std::vector<NodeID> &middle_nodes_table,
|
||||||
const PhantomNode &phantom_node)
|
const PhantomNode &phantom_node)
|
||||||
{
|
{
|
||||||
// Take a copy of the extracted node because otherwise could be modified later if toHeapNode is the same
|
// Take a copy of the extracted node because otherwise could be modified later if toHeapNode is
|
||||||
|
// the same
|
||||||
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
||||||
|
|
||||||
// Check if each encountered node has an entry
|
// Check if each encountered node has an entry
|
||||||
@ -439,8 +445,7 @@ void forwardRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
auto new_duration = heapNode.data.duration + target_duration;
|
auto new_duration = heapNode.data.duration + target_duration;
|
||||||
auto new_distance = heapNode.data.distance + target_distance;
|
auto new_distance = heapNode.data.distance + target_distance;
|
||||||
|
|
||||||
if (new_weight >= 0 &&
|
if (new_weight >= 0 && std::tie(new_weight, new_duration, new_distance) <
|
||||||
std::tie(new_weight, new_duration, new_distance) <
|
|
||||||
std::tie(current_weight, current_duration, current_distance))
|
std::tie(current_weight, current_duration, current_distance))
|
||||||
{
|
{
|
||||||
current_weight = new_weight;
|
current_weight = new_weight;
|
||||||
@ -450,8 +455,7 @@ void forwardRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
relaxOutgoingEdges<DIRECTION>(
|
relaxOutgoingEdges<DIRECTION>(facade, heapNode, query_heap, phantom_node);
|
||||||
facade, heapNode, query_heap, phantom_node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool DIRECTION>
|
template <bool DIRECTION>
|
||||||
@ -461,21 +465,23 @@ void backwardRoutingStep(const DataFacade<Algorithm> &facade,
|
|||||||
std::vector<NodeBucket> &search_space_with_buckets,
|
std::vector<NodeBucket> &search_space_with_buckets,
|
||||||
const PhantomNode &phantom_node)
|
const PhantomNode &phantom_node)
|
||||||
{
|
{
|
||||||
// Take a copy of the extracted node because otherwise could be modified later if toHeapNode is the same
|
// Take a copy of the extracted node because otherwise could be modified later if toHeapNode is
|
||||||
|
// the same
|
||||||
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
const auto heapNode = query_heap.DeleteMinGetHeapNode();
|
||||||
|
|
||||||
// Store settled nodes in search space bucket
|
// Store settled nodes in search space bucket
|
||||||
search_space_with_buckets.emplace_back(
|
search_space_with_buckets.emplace_back(heapNode.node,
|
||||||
heapNode.node, heapNode.data.parent, heapNode.data.from_clique_arc, column_idx, heapNode.weight, heapNode.data.duration, heapNode.data.distance);
|
heapNode.data.parent,
|
||||||
|
heapNode.data.from_clique_arc,
|
||||||
|
column_idx,
|
||||||
|
heapNode.weight,
|
||||||
|
heapNode.data.duration,
|
||||||
|
heapNode.data.distance);
|
||||||
|
|
||||||
const auto &partition = facade.GetMultiLevelPartition();
|
const auto &partition = facade.GetMultiLevelPartition();
|
||||||
const auto maximal_level = partition.GetNumberOfLevels() - 1;
|
const auto maximal_level = partition.GetNumberOfLevels() - 1;
|
||||||
|
|
||||||
relaxOutgoingEdges<!DIRECTION>(facade,
|
relaxOutgoingEdges<!DIRECTION>(facade, heapNode, query_heap, phantom_node, maximal_level);
|
||||||
heapNode,
|
|
||||||
query_heap,
|
|
||||||
phantom_node,
|
|
||||||
maximal_level);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool DIRECTION>
|
template <bool DIRECTION>
|
||||||
|
Loading…
Reference in New Issue
Block a user