Optimise path distance calculation in MLD map matching

This commit is contained in:
Siarhei Fedartsou 2024-05-10 20:30:14 +02:00
parent 70969186f6
commit 21ecb8c209
2 changed files with 31 additions and 3 deletions

View File

@ -650,11 +650,37 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
return std::numeric_limits<double>::max(); return std::numeric_limits<double>::max();
} }
std::vector<PathData> unpacked_path;
annotatePath(facade, endpoints, unpacked_nodes, unpacked_edges, unpacked_path);
return getPathDistance(facade, unpacked_path, source_phantom, target_phantom); EdgeDistance distance = {0.0};
if (source_phantom.forward_segment_id.id == unpacked_nodes[0])
{
BOOST_ASSERT(source_phantom.forward_segment_id.enabled);
distance = EdgeDistance{0} - source_phantom.GetForwardDistance();
}
else if (source_phantom.reverse_segment_id.id == unpacked_nodes[0])
{
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 static_cast<double>(static_cast<float>(distance));
} }
} // namespace osrm::engine::routing_algorithms::mld } // namespace osrm::engine::routing_algorithms::mld

View File

@ -1,3 +1,4 @@
#include "engine/engine_config.hpp"
#include "util/timing_util.hpp" #include "util/timing_util.hpp"
#include "osrm/match_parameters.hpp" #include "osrm/match_parameters.hpp"
@ -32,6 +33,7 @@ try
// Configure based on a .osrm base path, and no datasets in shared mem from osrm-datastore // Configure based on a .osrm base path, and no datasets in shared mem from osrm-datastore
EngineConfig config; EngineConfig config;
config.storage_config = {argv[1]}; 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; config.use_shared_memory = false;
// Routing machine with several services (such as Route, Table, Nearest, Trip, Match) // Routing machine with several services (such as Route, Table, Nearest, Trip, Match)