diff --git a/include/engine/routing_algorithms/routing_base_ch.hpp b/include/engine/routing_algorithms/routing_base_ch.hpp index 004d7e376..f6872293c 100644 --- a/include/engine/routing_algorithms/routing_base_ch.hpp +++ b/include/engine/routing_algorithms/routing_base_ch.hpp @@ -460,14 +460,14 @@ void search(SearchEngineData &engine_working_data, duration_upper_bound); } -inline std::vector -getNetworkDistances(SearchEngineData &, - const DataFacade &, - SearchEngineData::QueryHeap &, - const std::vector::QueryHeap>> &, - const PhantomNode &, - const std::vector &, - EdgeWeight /*duration_upper_bound*/ = INVALID_EDGE_WEIGHT) +inline std::vector getNetworkDistances( + SearchEngineData &, + const DataFacade &, + SearchEngineData::QueryHeap &, + const std::vector::QueryHeap>> &, + const PhantomNode &, + const std::vector &, + EdgeWeight /*duration_upper_bound*/ = INVALID_EDGE_WEIGHT) { std::vector distances; return distances; diff --git a/include/engine/routing_algorithms/routing_base_mld.hpp b/include/engine/routing_algorithms/routing_base_mld.hpp index 334e3b830..726b68a74 100644 --- a/include/engine/routing_algorithms/routing_base_mld.hpp +++ b/include/engine/routing_algorithms/routing_base_mld.hpp @@ -39,11 +39,11 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition, }; auto res = std::min(std::min(level(source.forward_segment_id, target.forward_segment_id), - level(source.forward_segment_id, target.reverse_segment_id)), - std::min(level(source.reverse_segment_id, target.forward_segment_id), - level(source.reverse_segment_id, target.reverse_segment_id))); + level(source.forward_segment_id, target.reverse_segment_id)), + std::min(level(source.reverse_segment_id, target.forward_segment_id), + level(source.reverse_segment_id, target.reverse_segment_id))); - // std::cerr << "OLD!!! " << (int)res << std::endl; + // std::cerr << "OLD!!! " << (int)res << std::endl; return res; } @@ -95,7 +95,7 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition, getNodeQueryLevel(partition, node, source, target)); })); }); - // std::cerr << "NEW " << (int)min_level << std::endl; + // std::cerr << "NEW " << (int)min_level << std::endl; return min_level; } @@ -144,10 +144,9 @@ inline LevelID getNodeQueryLevel(const MultiLevelPartition &partition, highest_different_level(phantom_node.reverse_segment_id)); return std::min(current_level, highest_level); }); - - // std::cerr << "NEW!!! " << (int)node_level << std::endl; - return node_level; + // 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,10 +462,13 @@ void routingStep(const DataFacade &facade, BOOST_ASSERT(!facade.ExcludeNode(heapNode.node)); - if (DIRECTION == FORWARD_DIRECTION) { - // std::cerr << "FORWARDO " << heapNode.node << std::endl; - } else { - //std::cerr << "REVERSEO " << heapNode.node << std::endl; + if (DIRECTION == FORWARD_DIRECTION) + { + // std::cerr << "FORWARDO " << heapNode.node << std::endl; + } + else + { + // std::cerr << "REVERSEO " << heapNode.node << std::endl; } // Upper bound for the path source -> target with @@ -656,7 +658,7 @@ searchDistance(SearchEngineData &, auto [middle, _] = *searchResult; - // std::cerr << "old " << middle << std::endl; + // std::cerr << "old " << middle << std::endl; auto distance = forward_heap.GetData(middle).distance + reverse_heap.GetData(middle).distance; return distance; @@ -817,7 +819,7 @@ runSearch2(const DataFacade &facade, size_t candidatesCount, const std::vector &force_step_nodes, EdgeWeight weight_upper_bound, - const PhantomEndpointCandidates& candidates) + const PhantomEndpointCandidates &candidates) { // if (forward_heap.Empty() || reverse_heap.Empty()) // { @@ -846,7 +848,8 @@ runSearch2(const DataFacade &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,19 +858,13 @@ runSearch2(const DataFacade &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()) { const auto heapNode = forward_heap.DeleteMinGetHeapNode(); - // std::cerr << "FORWARDN " << heapNode.node << std::endl; - //auto heapNode = routingStep2(facade, forward_heap, args...); + // std::cerr << "FORWARDN " << heapNode.node << std::endl; + // auto heapNode = routingStep2(facade, forward_heap, args...); for (size_t i = 0; i < candidatesCount; ++i) { @@ -884,10 +881,10 @@ runSearch2(const DataFacade &facade, middles[i] = heapNode.node; weights[i] = path_weight; - // auto distance = - // forward_heap.GetData(middles[i]).distance + reverse_heap[i]->GetData(middles[i]).distance; - // std::cerr << "RFOUNDN " << i <<" " << distance << std::endl; - + // auto distance = + // forward_heap.GetData(middles[i]).distance + + // reverse_heap[i]->GetData(middles[i]).distance; + // std::cerr << "RFOUNDN " << i <<" " << distance << std::endl; } } } @@ -902,8 +899,8 @@ runSearch2(const DataFacade &facade, if (!reverse_heap[i]->Empty() && (forward_heap_min + reverse_heap_mins[i]) < weights[i]) { const auto heapNode = reverse_heap[i]->DeleteMinGetHeapNode(); - //std::cerr << "REVERSEN " << i << " " << heapNode.node << std::endl; - + // std::cerr << "REVERSEN " << i << " " << heapNode.node << std::endl; + const auto reverseHeapNode = forward_heap.GetHeapNodeIfWasInserted(heapNode.node); if (reverseHeapNode) { @@ -917,13 +914,14 @@ runSearch2(const DataFacade &facade, middles[i] = heapNode.node; weights[i] = path_weight; - // auto distance = - // forward_heap.GetData(middles[i]).distance + reverse_heap[i]->GetData(middles[i]).distance; - // std::cerr << "FFOUNDN " << i << " " << distance << std::endl; - + // auto distance = + // forward_heap.GetData(middles[i]).distance + + // reverse_heap[i]->GetData(middles[i]).distance; + // std::cerr << "FFOUNDN " << i << " " << distance << std::endl; } } - relaxOutgoingEdges(facade, *reverse_heap[i], heapNode, candidates); + relaxOutgoingEdges( + facade, *reverse_heap[i], heapNode, candidates); if (!reverse_heap[i]->Empty()) reverse_heap_mins[i] = reverse_heap[i]->MinKey(); @@ -988,10 +986,15 @@ std::vector searchDistance2( size_t candidatesCount, const std::vector &force_step_nodes, EdgeWeight weight_upper_bound, - const PhantomEndpointCandidates& candidates) + 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 res; for (size_t i = 0; i < searchResults.size(); ++i) { @@ -1003,7 +1006,7 @@ std::vector searchDistance2( { auto [middle, _] = *searchResults[i]; - //std::cerr << "new " << i << " " << middle << std::endl; + // std::cerr << "new " << i << " " << middle << std::endl; auto distance = forward_heap.GetData(middle).distance + reverse_heaps[i]->GetData(middle).distance; @@ -1013,14 +1016,15 @@ std::vector searchDistance2( return res; } template -std::vector -getNetworkDistances(SearchEngineData &engine_working_data, - const DataFacade &facade, - typename SearchEngineData::MapMatchingQueryHeap &forward_heap, - const std::vector::MapMatchingQueryHeap>> &reverse_heaps, - const PhantomNode &source_phantom, - const std::vector &target_phantoms, - EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT) +std::vector getNetworkDistances( + SearchEngineData &engine_working_data, + const DataFacade &facade, + typename SearchEngineData::MapMatchingQueryHeap &forward_heap, + const std::vector::MapMatchingQueryHeap>> + &reverse_heaps, + const PhantomNode &source_phantom, + const std::vector &target_phantoms, + EdgeWeight weight_upper_bound = INVALID_EDGE_WEIGHT) { forward_heap.Clear(); for (const auto &heap : reverse_heaps) @@ -1085,7 +1089,6 @@ getNetworkDistances(SearchEngineData &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, diff --git a/src/benchmarks/bench.cpp b/src/benchmarks/bench.cpp index b0621e29e..86b263a6b 100644 --- a/src/benchmarks/bench.cpp +++ b/src/benchmarks/bench.cpp @@ -395,9 +395,9 @@ void runMatchBenchmark(const OSRM &osrm, const GPSTraces &gpsTraces, int iterati std::optional radius = std::nullopt; }; - std::vector benchmarks = {{"500 matches, default radius", 10}, - /*{"500 matches, radius=10", 10}, - {"500 matches, radius=20", 20}*/}; + std::vector benchmarks = {{"500 matches, default radius"}, + {"500 matches, radius=10", 10}, + {"500 matches, radius=20", 20}}; runBenchmarks(benchmarks, iterations, diff --git a/src/engine/routing_algorithms/map_matching.cpp b/src/engine/routing_algorithms/map_matching.cpp index 4de3a1794..ca0315247 100644 --- a/src/engine/routing_algorithms/map_matching.cpp +++ b/src/engine/routing_algorithms/map_matching.cpp @@ -61,74 +61,80 @@ inline void initializeHeap(SearchEngineData &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 #include +#include -template -void saveVectorToFile(const std::vector& data, const std::string& filename) { +template void saveVectorToFile(const std::vector &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; } size_t size = data.size(); - outFile.write(reinterpret_cast(&size), sizeof(size)); - outFile.write(reinterpret_cast(data.data()), size * sizeof(T)); + outFile.write(reinterpret_cast(&size), sizeof(size)); + outFile.write(reinterpret_cast(data.data()), size * sizeof(T)); outFile.close(); - if (!outFile.good()) { + if (!outFile.good()) + { std::cerr << "Error occurred at writing time!" << std::endl; } } -template -bool loadVectorFromFile(std::vector& data, const std::string& filename) { +template bool loadVectorFromFile(std::vector &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; } size_t size; - inFile.read(reinterpret_cast(&size), sizeof(size)); + inFile.read(reinterpret_cast(&size), sizeof(size)); data.resize(size); - inFile.read(reinterpret_cast(data.data()), size * sizeof(T)); + inFile.read(reinterpret_cast(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 -void saveStructToFile(const T& data, const std::string& filename) { +template 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(&data), sizeof(T)); + outFile.write(reinterpret_cast(&data), sizeof(T)); outFile.close(); - if (!outFile.good()) { + if (!outFile.good()) + { std::cerr << "Error occurred at writing time!" << std::endl; } } - -template -bool loadStructFromFile(T& data, const std::string& filename) { +template 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(&data), sizeof(T)); + inFile.read(reinterpret_cast(&data), sizeof(T)); inFile.close(); - if (!inFile.good()) { + if (!inFile.good()) + { std::cerr << "Error occurred at reading time!" << std::endl; return false; } @@ -304,20 +310,20 @@ SubMatchingList mapMatching(SearchEngineData &engine_working_data, { continue; } - - // PhantomNode source; - // loadStructFromFile(source, "source.bin"); - std::vector target_phantom_nodes; - // loadVectorFromFile(target_phantom_nodes, "target.bin"); - // target_phantom_nodes.erase(target_phantom_nodes.begin()); - // target_phantom_nodes.erase(target_phantom_nodes.begin()); - // target_phantom_nodes.erase(target_phantom_nodes.begin()); - // target_phantom_nodes.erase(target_phantom_nodes.begin()); - // target_phantom_nodes.pop_back(); - // target_phantom_nodes.pop_back(); - // target_phantom_nodes.erase(target_phantom_nodes.begin() + 1); - -// target_phantom_nodes.push_back(target); + + // PhantomNode source; + // loadStructFromFile(source, "source.bin"); + std::vector target_phantom_nodes; + // loadVectorFromFile(target_phantom_nodes, "target.bin"); + // target_phantom_nodes.erase(target_phantom_nodes.begin()); + // target_phantom_nodes.erase(target_phantom_nodes.begin()); + // target_phantom_nodes.erase(target_phantom_nodes.begin()); + // target_phantom_nodes.erase(target_phantom_nodes.begin()); + // target_phantom_nodes.pop_back(); + // target_phantom_nodes.pop_back(); + // target_phantom_nodes.erase(target_phantom_nodes.begin() + 1); + + // target_phantom_nodes.push_back(target); for (const auto s_prime : util::irange(0UL, current_viterbi.size())) { const double emission_pr = emission_log_probabilities[t][s_prime]; @@ -329,8 +335,8 @@ SubMatchingList mapMatching(SearchEngineData &engine_working_data, target_phantom_nodes.push_back(current_timestamps_list[s_prime].phantom_node); } - // TIMER_START(NEW_DIST); - #if 1 +// TIMER_START(NEW_DIST); +#if 1 (void)reverse_heap; auto distances = getNetworkDistances(engine_working_data, @@ -368,7 +374,8 @@ SubMatchingList mapMatching(SearchEngineData &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; diff --git a/src/engine/search_engine_data.cpp b/src/engine/search_engine_data.cpp index f96ef448f..5392a0f28 100644 --- a/src/engine/search_engine_data.cpp +++ b/src/engine/search_engine_data.cpp @@ -15,7 +15,8 @@ thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::map_matching_forward_heap_1; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::map_matching_reverse_heap_1; -thread_local std::vector::SearchEngineHeapPtr> SearchEngineData::map_matching_reverse_heaps; +thread_local std::vector::SearchEngineHeapPtr> + SearchEngineData::map_matching_reverse_heaps; thread_local SearchEngineData::ManyToManyHeapPtr SearchEngineData::many_to_many_heap; @@ -124,7 +125,8 @@ thread_local SearchEngineData::MapMatchingHeapPtr thread_local SearchEngineData::MapMatchingHeapPtr SearchEngineData::map_matching_reverse_heap_1; thread_local SearchEngineData::ManyToManyHeapPtr SearchEngineData::many_to_many_heap; -thread_local std::vector::MapMatchingHeapPtr> SearchEngineData::map_matching_reverse_heaps; +thread_local std::vector::MapMatchingHeapPtr> + SearchEngineData::map_matching_reverse_heaps; void SearchEngineData::InitializeOrClearMapMatchingThreadLocalStorage( unsigned number_of_nodes, unsigned number_of_boundary_nodes, size_t max_candidates) @@ -149,14 +151,15 @@ void SearchEngineData::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::InitializeOrClearFirstThreadLocalStorage(