POC of one-to-many bidirectional routing in map-matching

This commit is contained in:
Siarhei Fedartsou 2024-07-29 20:59:26 +02:00
parent ed49564e27
commit d76d5e7d5f

View File

@ -780,7 +780,7 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data,
template <typename Algorithm, typename Heap> template <typename Algorithm, typename Heap>
std::vector<std::optional<std::pair<NodeID, EdgeWeight>>> std::vector<NodeID>
runSearch2(const DataFacade<Algorithm> &facade, runSearch2(const DataFacade<Algorithm> &facade,
Heap &forward_heap, Heap &forward_heap,
const std::vector<std::unique_ptr<Heap>> &reverse_heap, const std::vector<std::unique_ptr<Heap>> &reverse_heap,
@ -905,20 +905,21 @@ runSearch2(const DataFacade<Algorithm> &facade,
} }
}; };
std::vector<std::optional<std::pair<NodeID, EdgeWeight>>> results; return middles;
results.reserve(candidatesCount); // std::vector<std::optional<std::pair<NodeID, EdgeWeight>>> results;
for (size_t i = 0; i < candidatesCount; ++i) // results.reserve(candidatesCount);
{ // for (size_t i = 0; i < candidatesCount; ++i)
if (weights[i] >= weight_upper_bound || SPECIAL_NODEID == middles[i]) // {
{ // if (weights[i] >= weight_upper_bound || SPECIAL_NODEID == middles[i])
results.push_back({}); // {
} // results.push_back({});
else // }
{ // else
results.push_back({{middles[i], weights[i]}}); // {
} // results.push_back({{middles[i], weights[i]}});
} // }
return results; // }
// return results;
// // run two-Target Dijkstra routing step. // // run two-Target Dijkstra routing step.
// NodeID middle = SPECIAL_NODEID; // NodeID middle = SPECIAL_NODEID;
@ -954,7 +955,7 @@ runSearch2(const DataFacade<Algorithm> &facade,
} }
template <typename Algorithm> template <typename Algorithm>
std::vector<EdgeDistance> searchDistance2( std::vector<double> searchDistance2(
SearchEngineData<Algorithm> &, SearchEngineData<Algorithm> &,
const DataFacade<Algorithm> &facade, const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &forward_heap, typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &forward_heap,
@ -972,22 +973,23 @@ std::vector<EdgeDistance> searchDistance2(
force_step_nodes, force_step_nodes,
weight_upper_bound, weight_upper_bound,
candidates); candidates);
std::vector<EdgeDistance> res; std::vector<double> res;
res.reserve(candidatesCount);
for (size_t i = 0; i < searchResults.size(); ++i) for (size_t i = 0; i < searchResults.size(); ++i)
{ {
if (!searchResults[i]) if (searchResults[i] == SPECIAL_NODEID)
{ {
res.push_back(INVALID_EDGE_DISTANCE); res.push_back(std::numeric_limits<double>::max());
} }
else else
{ {
auto [middle, _] = *searchResults[i]; auto middle = searchResults[i];
// std::cerr << "new " << i << " " << middle << std::endl; // std::cerr << "new " << i << " " << middle << std::endl;
auto distance = auto distance =
forward_heap.GetData(middle).distance + reverse_heaps[i]->GetData(middle).distance; forward_heap.GetData(middle).distance + reverse_heaps[i]->GetData(middle).distance;
res.push_back(distance); res.push_back(from_alias<double>(distance));
} }
} }
return res; return res;
@ -1066,7 +1068,7 @@ std::vector<double> getNetworkDistances(
source_phantomes.push_back(source_phantom); source_phantomes.push_back(source_phantom);
PhantomEndpointCandidates phantom_candidates{source_phantomes, target_phantoms}; PhantomEndpointCandidates phantom_candidates{source_phantomes, target_phantoms};
auto distances2 = searchDistance2(engine_working_data, auto distances = searchDistance2(engine_working_data,
facade, facade,
forward_heap, forward_heap,
reverse_heaps, reverse_heaps,
@ -1074,48 +1076,7 @@ std::vector<double> getNetworkDistances(
{}, {},
weight_upper_bound, weight_upper_bound,
phantom_candidates); phantom_candidates);
std::vector<double> distances;
for (auto d : distances2)
{
if (d == INVALID_EDGE_DISTANCE)
{
distances.push_back(std::numeric_limits<double>::max());
}
else
{
distances.push_back(from_alias<double>(d));
}
}
return distances; return distances;
// for (const auto &target_phantom : target_phantoms)
// {
// // forward_heap.Clear();
// // auto& reverse_heap = *reverse_heaps[0];
// // reverse_heap.Clear();
// // const PhantomEndpoints endpoints{source_phantom, target_phantom};
// auto distance = searchDistance2(
// engine_working_data, facade, forward_heap, reverse_heap, {}, weight_upper_bound,
// endpoints);
// // if (distance == INVALID_EDGE_DISTANCE)
// // {
// // distances.push_back(std::numeric_limits<double>::max());
// // } else {
// // distances.push_back(from_alias<double>(distance));
// // }
// // return from_alias<double>(distance);
// auto distance = getNetworkDistance(engine_working_data,
// facade,
// forward_heap,
// *reverse_heaps[0],
// source_phantom,
// target_phantom,
// weight_upper_bound);
// distances.push_back(distance);
// }
// return distances;
} }
} // namespace osrm::engine::routing_algorithms::mld } // namespace osrm::engine::routing_algorithms::mld