From e7be271c432cc1a9b5c25d285d9f047ec095601e Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Fri, 29 Sep 2017 10:02:01 +0200 Subject: [PATCH] Optimize MLD one-to-many getNodeQueryLevel --- .../routing_algorithms/many_to_many.cpp | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/engine/routing_algorithms/many_to_many.cpp b/src/engine/routing_algorithms/many_to_many.cpp index 5dfb9a262..50992a645 100644 --- a/src/engine/routing_algorithms/many_to_many.cpp +++ b/src/engine/routing_algorithms/many_to_many.cpp @@ -143,24 +143,27 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition, const std::size_t phantom_index, const std::vector &phantom_indices) { - auto level = [&partition, node](const SegmentID &source, const SegmentID &target) { - if (source.enabled && target.enabled) - return partition.GetQueryLevel(source.id, target.id, node); - return INVALID_LEVEL_ID; + auto min_level = [&partition, node](const PhantomNode &phantom_node) { + + const auto &forward_segment = phantom_node.forward_segment_id; + const auto forward_level = + forward_segment.enabled ? partition.GetHighestDifferentLevel(node, forward_segment.id) + : INVALID_LEVEL_ID; + + const auto &reverse_segment = phantom_node.reverse_segment_id; + const auto reverse_level = + reverse_segment.enabled ? partition.GetHighestDifferentLevel(node, reverse_segment.id) + : INVALID_LEVEL_ID; + + return std::min(forward_level, reverse_level); }; - const auto &source_phantom = phantom_nodes[phantom_index]; - - auto result = INVALID_LEVEL_ID; + // Get minimum level over all phantoms of the highest different level with respect to node + // This is equivalent to min_{∀ source, target} partition.GetQueryLevel(source, node, target) + auto result = min_level(phantom_nodes[phantom_index]); for (const auto &index : phantom_indices) { - const auto &target_phantom = phantom_nodes[index]; - auto min_level = std::min( - std::min(level(source_phantom.forward_segment_id, target_phantom.forward_segment_id), - level(source_phantom.forward_segment_id, target_phantom.reverse_segment_id)), - std::min(level(source_phantom.reverse_segment_id, target_phantom.forward_segment_id), - level(source_phantom.reverse_segment_id, target_phantom.reverse_segment_id))); - result = std::min(result, min_level); + result = std::min(result, min_level(phantom_nodes[index])); } return result; }