From ee8e0f890add1fb0037ca68fdda5b4c4025e4e71 Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Sat, 11 May 2024 16:30:43 +0200 Subject: [PATCH] Optimise path distance calculation in MLD map matching (#6876) --- .github/workflows/osrm-backend.yml | 3 +- CHANGELOG.md | 2 ++ .../routing_algorithms/routing_base_mld.hpp | 33 +++++++++++++++++-- src/benchmarks/match.cpp | 3 ++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/.github/workflows/osrm-backend.yml b/.github/workflows/osrm-backend.yml index 421a33ddc..e6dc8fca9 100644 --- a/.github/workflows/osrm-backend.yml +++ b/.github/workflows/osrm-backend.yml @@ -518,7 +518,8 @@ jobs: make --jobs=${JOBS} benchmarks ./src/benchmarks/alias-bench ./src/benchmarks/json-render-bench ../src/benchmarks/portugal_to_korea.json - ./src/benchmarks/match-bench ../test/data/ch/monaco.osrm + ./src/benchmarks/match-bench ../test/data/ch/monaco.osrm ch + ./src/benchmarks/match-bench ../test/data/mld/monaco.osrm mld ./src/benchmarks/packedvector-bench ./src/benchmarks/rtree-bench ../test/data/monaco.osrm.ramIndex ../test/data/monaco.osrm.fileIndex ../test/data/monaco.osrm.nbg_nodes popd diff --git a/CHANGELOG.md b/CHANGELOG.md index 56e2da05e..a736d3040 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ - FIXED: Fix bug when searching for maneuver overrides [#6739](https://github.com/Project-OSRM/osrm-backend/pull/6739) - FIXED: Remove force-loop checks for routes with u-turns [#6858](https://github.com/Project-OSRM/osrm-backend/pull/6858) - FIXED: Correctly check runtime search conditions for forcing routing steps [#6866](https://github.com/Project-OSRM/osrm-backend/pull/6866) + - Map Matching: + - CHANGED: Optimise path distance calculation in MLD map matching. [#6876](https://github.com/Project-OSRM/osrm-backend/pull/6876) - Debug tiles: - FIXED: Ensure speed layer features have unique ids. [#6726](https://github.com/Project-OSRM/osrm-backend/pull/6726) diff --git a/include/engine/routing_algorithms/routing_base_mld.hpp b/include/engine/routing_algorithms/routing_base_mld.hpp index 330983626..b85ce5496 100644 --- a/include/engine/routing_algorithms/routing_base_mld.hpp +++ b/include/engine/routing_algorithms/routing_base_mld.hpp @@ -613,11 +613,38 @@ double getNetworkDistance(SearchEngineData &engine_working_data, return std::numeric_limits::max(); } - std::vector unpacked_path; + BOOST_ASSERT(unpacked_nodes.size() >= 1); - annotatePath(facade, endpoints, unpacked_nodes, unpacked_edges, unpacked_path); + EdgeDistance distance = {0.0}; - return getPathDistance(facade, unpacked_path, source_phantom, target_phantom); + if (source_phantom.forward_segment_id.id == unpacked_nodes.front()) + { + BOOST_ASSERT(source_phantom.forward_segment_id.enabled); + distance = EdgeDistance{0} - source_phantom.GetForwardDistance(); + } + else if (source_phantom.reverse_segment_id.id == unpacked_nodes.front()) + { + BOOST_ASSERT(source_phantom.reverse_segment_id.enabled); + distance = EdgeDistance{0} - source_phantom.GetReverseDistance(); + } + + for (size_t index = 0; index < unpacked_nodes.size() - 1; ++index) + { + distance += facade.GetNodeDistance(unpacked_nodes[index]); + } + + if (target_phantom.forward_segment_id.id == unpacked_nodes.back()) + { + BOOST_ASSERT(target_phantom.forward_segment_id.enabled); + distance += target_phantom.GetForwardDistance(); + } + else if (target_phantom.reverse_segment_id.id == unpacked_nodes.back()) + { + BOOST_ASSERT(target_phantom.reverse_segment_id.enabled); + distance += target_phantom.GetReverseDistance(); + } + + return from_alias(distance); } } // namespace osrm::engine::routing_algorithms::mld diff --git a/src/benchmarks/match.cpp b/src/benchmarks/match.cpp index 932820e88..caed1a00b 100644 --- a/src/benchmarks/match.cpp +++ b/src/benchmarks/match.cpp @@ -1,3 +1,4 @@ +#include "engine/engine_config.hpp" #include "util/timing_util.hpp" #include "osrm/match_parameters.hpp" @@ -32,6 +33,8 @@ try // Configure based on a .osrm base path, and no datasets in shared mem from osrm-datastore EngineConfig config; config.storage_config = {argv[1]}; + config.algorithm = (argc > 2 && std::string{argv[2]} == "mld") ? EngineConfig::Algorithm::MLD + : EngineConfig::Algorithm::CH; config.use_shared_memory = false; // Routing machine with several services (such as Route, Table, Nearest, Trip, Match)