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

This commit is contained in:
Siarhei Fedartsou 2024-07-29 19:53:44 +02:00
parent 4a34c86544
commit 2e2ce1d421
5 changed files with 121 additions and 108 deletions

View File

@ -460,8 +460,8 @@ void search(SearchEngineData<Algorithm> &engine_working_data,
duration_upper_bound);
}
inline std::vector<double>
getNetworkDistances(SearchEngineData<Algorithm> &,
inline std::vector<double> getNetworkDistances(
SearchEngineData<Algorithm> &,
const DataFacade<ch::Algorithm> &,
SearchEngineData<Algorithm>::QueryHeap &,
const std::vector<std::unique_ptr<typename SearchEngineData<Algorithm>::QueryHeap>> &,

View File

@ -147,7 +147,6 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition,
// std::cerr << "NEW!!! " << (int)node_level << std::endl;
return node_level;
}
// Unrestricted search with a single phantom node and a vector of phantom nodes:
@ -463,9 +462,12 @@ void routingStep(const DataFacade<Algorithm> &facade,
BOOST_ASSERT(!facade.ExcludeNode(heapNode.node));
if (DIRECTION == FORWARD_DIRECTION) {
if (DIRECTION == FORWARD_DIRECTION)
{
// std::cerr << "FORWARDO " << heapNode.node << std::endl;
} else {
}
else
{
// std::cerr << "REVERSEO " << heapNode.node << std::endl;
}
@ -846,7 +848,8 @@ runSearch2(const DataFacade<Algorithm> &facade,
bool cont = false;
for (size_t i = 0; i < candidatesCount; ++i)
{
if ((forward_heap_min + reverse_heap_mins[i]) < weights[i])
if ((forward_heap.Size() + reverse_heap[i]->Size() > 0) &&
(forward_heap_min + reverse_heap_mins[i]) < weights[i])
{
cont = true;
break;
@ -855,13 +858,7 @@ runSearch2(const DataFacade<Algorithm> &facade,
return cont;
};
while ((forward_heap.Size() + std::accumulate(reverse_heap.begin(),
reverse_heap.end(),
0,
[](auto sum, const auto &heap)
{ return sum + heap->Size(); }) >
0) &&
shouldContinue())
while (shouldContinue())
{
if (!forward_heap.Empty())
{
@ -885,9 +882,9 @@ runSearch2(const DataFacade<Algorithm> &facade,
weights[i] = path_weight;
// auto distance =
// forward_heap.GetData(middles[i]).distance + reverse_heap[i]->GetData(middles[i]).distance;
// forward_heap.GetData(middles[i]).distance +
// reverse_heap[i]->GetData(middles[i]).distance;
// std::cerr << "RFOUNDN " << i <<" " << distance << std::endl;
}
}
}
@ -918,12 +915,13 @@ runSearch2(const DataFacade<Algorithm> &facade,
weights[i] = path_weight;
// auto distance =
// forward_heap.GetData(middles[i]).distance + reverse_heap[i]->GetData(middles[i]).distance;
// forward_heap.GetData(middles[i]).distance +
// reverse_heap[i]->GetData(middles[i]).distance;
// std::cerr << "FFOUNDN " << i << " " << distance << std::endl;
}
}
relaxOutgoingEdges<REVERSE_DIRECTION>(facade, *reverse_heap[i], heapNode, candidates);
relaxOutgoingEdges<REVERSE_DIRECTION>(
facade, *reverse_heap[i], heapNode, candidates);
if (!reverse_heap[i]->Empty())
reverse_heap_mins[i] = reverse_heap[i]->MinKey();
@ -990,8 +988,13 @@ std::vector<EdgeDistance> searchDistance2(
EdgeWeight weight_upper_bound,
const PhantomEndpointCandidates &candidates)
{
auto searchResults = runSearch2(
facade, forward_heap, reverse_heaps, candidatesCount, force_step_nodes, weight_upper_bound, candidates);
auto searchResults = runSearch2(facade,
forward_heap,
reverse_heaps,
candidatesCount,
force_step_nodes,
weight_upper_bound,
candidates);
std::vector<EdgeDistance> res;
for (size_t i = 0; i < searchResults.size(); ++i)
{
@ -1013,11 +1016,12 @@ std::vector<EdgeDistance> searchDistance2(
return res;
}
template <typename Algorithm>
std::vector<double>
getNetworkDistances(SearchEngineData<Algorithm> &engine_working_data,
std::vector<double> getNetworkDistances(
SearchEngineData<Algorithm> &engine_working_data,
const DataFacade<Algorithm> &facade,
typename SearchEngineData<Algorithm>::MapMatchingQueryHeap &forward_heap,
const std::vector<std::unique_ptr<typename SearchEngineData<Algorithm>::MapMatchingQueryHeap>> &reverse_heaps,
const std::vector<std::unique_ptr<typename SearchEngineData<Algorithm>::MapMatchingQueryHeap>>
&reverse_heaps,
const PhantomNode &source_phantom,
const std::vector<PhantomNode> &target_phantoms,
EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT)
@ -1085,7 +1089,6 @@ getNetworkDistances(SearchEngineData<Algorithm> &engine_working_data,
source_phantomes.push_back(source_phantom);
PhantomEndpointCandidates phantom_candidates{source_phantomes, target_phantoms};
auto distances2 = searchDistance2(engine_working_data,
facade,
forward_heap,

View File

@ -395,9 +395,9 @@ void runMatchBenchmark(const OSRM &osrm, const GPSTraces &gpsTraces, int iterati
std::optional<size_t> radius = std::nullopt;
};
std::vector<Benchmark> benchmarks = {{"500 matches, default radius", 10},
/*{"500 matches, radius=10", 10},
{"500 matches, radius=20", 20}*/};
std::vector<Benchmark> benchmarks = {{"500 matches, default radius"},
{"500 matches, radius=10", 10},
{"500 matches, radius=20", 20}};
runBenchmarks(benchmarks,
iterations,

View File

@ -61,18 +61,18 @@ inline void initializeHeap<mld::Algorithm>(SearchEngineData<mld::Algorithm> &eng
const auto nodes_number = facade.GetNumberOfNodes();
const auto border_nodes_number = facade.GetMaxBorderNodeID() + 1;
engine_working_data.InitializeOrClearMapMatchingThreadLocalStorage(nodes_number,
border_nodes_number,
max_candidates);
engine_working_data.InitializeOrClearMapMatchingThreadLocalStorage(
nodes_number, border_nodes_number, max_candidates);
}
#include <iostream>
#include <fstream>
#include <iostream>
template <typename T>
void saveVectorToFile(const std::vector<T>& data, const std::string& filename) {
template <typename T> void saveVectorToFile(const std::vector<T> &data, const std::string &filename)
{
std::ofstream outFile(filename, std::ios::binary);
if (!outFile) {
if (!outFile)
{
std::cerr << "Error opening file for writing: " << filename << std::endl;
return;
}
@ -80,15 +80,17 @@ void saveVectorToFile(const std::vector<T>& data, const std::string& filename) {
outFile.write(reinterpret_cast<const char *>(&size), sizeof(size));
outFile.write(reinterpret_cast<const char *>(data.data()), size * sizeof(T));
outFile.close();
if (!outFile.good()) {
if (!outFile.good())
{
std::cerr << "Error occurred at writing time!" << std::endl;
}
}
template <typename T>
bool loadVectorFromFile(std::vector<T>& data, const std::string& filename) {
template <typename T> bool loadVectorFromFile(std::vector<T> &data, const std::string &filename)
{
std::ifstream inFile(filename, std::ios::binary);
if (!inFile) {
if (!inFile)
{
std::cerr << "Error opening file for reading: " << filename << std::endl;
return false;
}
@ -97,38 +99,42 @@ bool loadVectorFromFile(std::vector<T>& data, const std::string& filename) {
data.resize(size);
inFile.read(reinterpret_cast<char *>(data.data()), size * sizeof(T));
inFile.close();
if (!inFile.good()) {
if (!inFile.good())
{
std::cerr << "Error occurred at reading time!" << std::endl;
return false;
}
return true;
}
template <typename T>
void saveStructToFile(const T& data, const std::string& filename) {
template <typename T> void saveStructToFile(const T &data, const std::string &filename)
{
std::ofstream outFile(filename, std::ios::binary);
if (!outFile) {
if (!outFile)
{
std::cerr << "Error opening file for writing: " << filename << std::endl;
return;
}
outFile.write(reinterpret_cast<const char *>(&data), sizeof(T));
outFile.close();
if (!outFile.good()) {
if (!outFile.good())
{
std::cerr << "Error occurred at writing time!" << std::endl;
}
}
template <typename T>
bool loadStructFromFile(T& data, const std::string& filename) {
template <typename T> bool loadStructFromFile(T &data, const std::string &filename)
{
std::ifstream inFile(filename, std::ios::binary);
if (!inFile) {
if (!inFile)
{
std::cerr << "Error opening file for reading: " << filename << std::endl;
return false;
}
inFile.read(reinterpret_cast<char *>(&data), sizeof(T));
inFile.close();
if (!inFile.good()) {
if (!inFile.good())
{
std::cerr << "Error occurred at reading time!" << std::endl;
return false;
}
@ -368,7 +374,8 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data,
// {
// if (std::abs(old_distances[i] - new_distances[i]) > 0.01)
// {
// // saveStructToFile(prev_unbroken_timestamps_list[s].phantom_node, "source.bin");
// // saveStructToFile(prev_unbroken_timestamps_list[s].phantom_node,
// "source.bin");
// // saveVectorToFile(target_phantom_nodes, "target.bin");
// // std::cerr << "OOPS " << old_distances[i] << " " << new_distances[i]
// // << std::endl;

View File

@ -15,7 +15,8 @@ thread_local SearchEngineData<CH>::SearchEngineHeapPtr
SearchEngineData<CH>::map_matching_forward_heap_1;
thread_local SearchEngineData<CH>::SearchEngineHeapPtr
SearchEngineData<CH>::map_matching_reverse_heap_1;
thread_local std::vector<typename SearchEngineData<CH>::SearchEngineHeapPtr> SearchEngineData<CH>::map_matching_reverse_heaps;
thread_local std::vector<typename SearchEngineData<CH>::SearchEngineHeapPtr>
SearchEngineData<CH>::map_matching_reverse_heaps;
thread_local SearchEngineData<CH>::ManyToManyHeapPtr SearchEngineData<CH>::many_to_many_heap;
@ -124,7 +125,8 @@ thread_local SearchEngineData<MLD>::MapMatchingHeapPtr
thread_local SearchEngineData<MLD>::MapMatchingHeapPtr
SearchEngineData<MLD>::map_matching_reverse_heap_1;
thread_local SearchEngineData<MLD>::ManyToManyHeapPtr SearchEngineData<MLD>::many_to_many_heap;
thread_local std::vector<typename SearchEngineData<MLD>::MapMatchingHeapPtr> SearchEngineData<MLD>::map_matching_reverse_heaps;
thread_local std::vector<typename SearchEngineData<MLD>::MapMatchingHeapPtr>
SearchEngineData<MLD>::map_matching_reverse_heaps;
void SearchEngineData<MLD>::InitializeOrClearMapMatchingThreadLocalStorage(
unsigned number_of_nodes, unsigned number_of_boundary_nodes, size_t max_candidates)
@ -149,14 +151,15 @@ void SearchEngineData<MLD>::InitializeOrClearMapMatchingThreadLocalStorage(
new MapMatchingQueryHeap(number_of_nodes, number_of_boundary_nodes));
}
if (max_candidates > map_matching_reverse_heaps.size()) {
if (max_candidates > map_matching_reverse_heaps.size())
{
size_t to_add = max_candidates - map_matching_reverse_heaps.size();
for (unsigned i = 0; i < to_add; ++i)
{
map_matching_reverse_heaps.emplace_back(new MapMatchingQueryHeap(number_of_nodes, number_of_boundary_nodes));
map_matching_reverse_heaps.emplace_back(
new MapMatchingQueryHeap(number_of_nodes, number_of_boundary_nodes));
}
}
}
void SearchEngineData<MLD>::InitializeOrClearFirstThreadLocalStorage(