From 5fc269c50aeb5b1ff8122085fdb1d2a54e472048 Mon Sep 17 00:00:00 2001 From: Siarhei Fedartsou Date: Mon, 29 Jul 2024 20:11:24 +0200 Subject: [PATCH] POC of one-to-many bidirectional routing in map-matching --- .../routing_algorithms/routing_base_mld.hpp | 43 ++------- scripts/ci/run_benchmarks.sh | 94 +++++++++---------- .../routing_algorithms/map_matching.cpp | 56 ++++++++--- 3 files changed, 100 insertions(+), 93 deletions(-) diff --git a/include/engine/routing_algorithms/routing_base_mld.hpp b/include/engine/routing_algorithms/routing_base_mld.hpp index 726b68a74..7bee0d0d5 100644 --- a/include/engine/routing_algorithms/routing_base_mld.hpp +++ b/include/engine/routing_algorithms/routing_base_mld.hpp @@ -778,38 +778,6 @@ double getNetworkDistance(SearchEngineData &engine_working_data, return from_alias(distance); } -template -auto routingStep2(const DataFacade &facade, Heap &forward_heap, const Args &...args) -{ - const auto heapNode = forward_heap.DeleteMinGetHeapNode(); - // const auto weight = heapNode.weight; - - BOOST_ASSERT(!facade.ExcludeNode(heapNode.node)); - - // // Upper bound for the path source -> target with - // // weight(source -> node) = weight weight(to -> target) ≤ reverse_weight - // // is weight + reverse_weight - // // More tighter upper bound requires additional condition reverse_heap.WasRemoved(to) - // // with weight(to -> target) = reverse_weight and all weights ≥ 0 - // const auto reverseHeapNode = reverse_heap.GetHeapNodeIfWasInserted(heapNode.node); - // if (reverseHeapNode) - // { - // auto reverse_weight = reverseHeapNode->weight; - // auto path_weight = weight + reverse_weight; - - // if (!shouldForceStep(force_step_nodes, heapNode, *reverseHeapNode) && - // (path_weight >= EdgeWeight{0}) && (path_weight < path_upper_bound)) - // { - // middle_node = heapNode.node; - // path_upper_bound = path_weight; - // } - // } - - // Relax outgoing edges from node - relaxOutgoingEdges(facade, forward_heap, heapNode, args...); - - return heapNode; -} template std::vector>> @@ -858,7 +826,8 @@ runSearch2(const DataFacade &facade, return cont; }; - while (shouldContinue()) + bool cont = shouldContinue(); + while (cont) { if (!forward_heap.Empty()) { @@ -894,8 +863,15 @@ runSearch2(const DataFacade &facade, if (!forward_heap.Empty()) forward_heap_min = forward_heap.MinKey(); } + + cont = false; for (size_t i = 0; i < candidatesCount; ++i) { + if ((forward_heap.Size() + reverse_heap[i]->Size() > 0) && + (forward_heap_min + reverse_heap_mins[i]) < weights[i]) + { + cont = true; + } if (!reverse_heap[i]->Empty() && (forward_heap_min + reverse_heap_mins[i]) < weights[i]) { const auto heapNode = reverse_heap[i]->DeleteMinGetHeapNode(); @@ -930,6 +906,7 @@ runSearch2(const DataFacade &facade, }; std::vector>> results; + results.reserve(candidatesCount); for (size_t i = 0; i < candidatesCount; ++i) { if (weights[i] >= weight_upper_bound || SPECIAL_NODEID == middles[i]) diff --git a/scripts/ci/run_benchmarks.sh b/scripts/ci/run_benchmarks.sh index 5b092471d..77455ad85 100755 --- a/scripts/ci/run_benchmarks.sh +++ b/scripts/ci/run_benchmarks.sh @@ -54,22 +54,22 @@ function run_benchmarks_for_folder { BENCHMARKS_FOLDER="$BINARIES_FOLDER/src/benchmarks" - echo "Running match-bench MLD" - $BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/match_mld.bench" - echo "Running match-bench CH" - $BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/match_ch.bench" - echo "Running route-bench MLD" - $BENCHMARKS_FOLDER/route-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/route_mld.bench" - echo "Running route-bench CH" - $BENCHMARKS_FOLDER/route-bench "$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/route_ch.bench" - echo "Running alias" - $BENCHMARKS_FOLDER/alias-bench > "$RESULTS_FOLDER/alias.bench" - echo "Running json-render-bench" - $BENCHMARKS_FOLDER/json-render-bench "$FOLDER/test/data/portugal_to_korea.json" > "$RESULTS_FOLDER/json-render.bench" - echo "Running packedvector-bench" - $BENCHMARKS_FOLDER/packedvector-bench > "$RESULTS_FOLDER/packedvector.bench" - echo "Running rtree-bench" - $BENCHMARKS_FOLDER/rtree-bench "$FOLDER/test/data/monaco.osrm.ramIndex" "$FOLDER/test/data/monaco.osrm.fileIndex" "$FOLDER/test/data/monaco.osrm.nbg_nodes" > "$RESULTS_FOLDER/rtree.bench" + # echo "Running match-bench MLD" + # $BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/match_mld.bench" + # echo "Running match-bench CH" + # $BENCHMARKS_FOLDER/match-bench "$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/match_ch.bench" + # echo "Running route-bench MLD" + # $BENCHMARKS_FOLDER/route-bench "$FOLDER/test/data/mld/monaco.osrm" mld > "$RESULTS_FOLDER/route_mld.bench" + # echo "Running route-bench CH" + # $BENCHMARKS_FOLDER/route-bench "$FOLDER/test/data/ch/monaco.osrm" ch > "$RESULTS_FOLDER/route_ch.bench" + # echo "Running alias" + # $BENCHMARKS_FOLDER/alias-bench > "$RESULTS_FOLDER/alias.bench" + # echo "Running json-render-bench" + # $BENCHMARKS_FOLDER/json-render-bench "$FOLDER/test/data/portugal_to_korea.json" > "$RESULTS_FOLDER/json-render.bench" + # echo "Running packedvector-bench" + # $BENCHMARKS_FOLDER/packedvector-bench > "$RESULTS_FOLDER/packedvector.bench" + # echo "Running rtree-bench" + # $BENCHMARKS_FOLDER/rtree-bench "$FOLDER/test/data/monaco.osrm.ramIndex" "$FOLDER/test/data/monaco.osrm.fileIndex" "$FOLDER/test/data/monaco.osrm.nbg_nodes" > "$RESULTS_FOLDER/rtree.bench" cp -rf $OSM_PBF $FOLDER/data.osm.pbf @@ -83,19 +83,19 @@ function run_benchmarks_for_folder { measure_peak_ram_and_time "$BINARIES_FOLDER/osrm-contract $FOLDER/data.osrm" "$RESULTS_FOLDER/osrm_contract.bench" + # for ALGORITHM in ch mld; do + # for BENCH in nearest table trip route match; do + # echo "Running node $BENCH $ALGORITHM" + # START=$(date +%s.%N) + # node $SCRIPTS_FOLDER/scripts/ci/bench.js $FOLDER/lib/binding/node_osrm.node $FOLDER/data.osrm $ALGORITHM $BENCH $GPS_TRACES > "$RESULTS_FOLDER/node_${BENCH}_${ALGORITHM}.bench" 5 + # END=$(date +%s.%N) + # DIFF=$(echo "$END - $START" | bc) + # echo "Took: ${DIFF}s" + # done + # done + for ALGORITHM in ch mld; do - for BENCH in nearest table trip route match; do - echo "Running node $BENCH $ALGORITHM" - START=$(date +%s.%N) - node $SCRIPTS_FOLDER/scripts/ci/bench.js $FOLDER/lib/binding/node_osrm.node $FOLDER/data.osrm $ALGORITHM $BENCH $GPS_TRACES > "$RESULTS_FOLDER/node_${BENCH}_${ALGORITHM}.bench" 5 - END=$(date +%s.%N) - DIFF=$(echo "$END - $START" | bc) - echo "Took: ${DIFF}s" - done - done - - for ALGORITHM in ch mld; do - for BENCH in nearest table trip route match; do + for BENCH in match; do echo "Running random $BENCH $ALGORITHM" START=$(date +%s.%N) $BENCHMARKS_FOLDER/bench "$FOLDER/data.osrm" $ALGORITHM $GPS_TRACES ${BENCH} > "$RESULTS_FOLDER/random_${BENCH}_${ALGORITHM}.bench" 5 || true @@ -106,28 +106,28 @@ function run_benchmarks_for_folder { done - for ALGORITHM in ch mld; do - $BINARIES_FOLDER/osrm-routed --algorithm $ALGORITHM $FOLDER/data.osrm > /dev/null 2>&1 & - OSRM_ROUTED_PID=$! + # for ALGORITHM in ch mld; do + # $BINARIES_FOLDER/osrm-routed --algorithm $ALGORITHM $FOLDER/data.osrm > /dev/null 2>&1 & + # OSRM_ROUTED_PID=$! - # wait for osrm-routed to start - if ! curl --retry-delay 3 --retry 10 --retry-all-errors "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true" > /dev/null 2>&1; then - echo "osrm-routed failed to start for algorithm $ALGORITHM" - kill -9 $OSRM_ROUTED_PID - continue - fi + # # wait for osrm-routed to start + # if ! curl --retry-delay 3 --retry 10 --retry-all-errors "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true" > /dev/null 2>&1; then + # echo "osrm-routed failed to start for algorithm $ALGORITHM" + # kill -9 $OSRM_ROUTED_PID + # continue + # fi - for METHOD in route nearest trip table match; do - echo "Running e2e benchmark for $METHOD $ALGORITHM" - START=$(date +%s.%N) - python3 $SCRIPTS_FOLDER/scripts/ci/e2e_benchmark.py --host http://localhost:5000 --method $METHOD --iterations 5 --num_requests 1000 --gps_traces_file_path $GPS_TRACES > $RESULTS_FOLDER/e2e_${METHOD}_${ALGORITHM}.bench - END=$(date +%s.%N) - DIFF=$(echo "$END - $START" | bc) - echo "Took: ${DIFF}s" - done + # for METHOD in route nearest trip table match; do + # echo "Running e2e benchmark for $METHOD $ALGORITHM" + # START=$(date +%s.%N) + # python3 $SCRIPTS_FOLDER/scripts/ci/e2e_benchmark.py --host http://localhost:5000 --method $METHOD --iterations 5 --num_requests 1000 --gps_traces_file_path $GPS_TRACES > $RESULTS_FOLDER/e2e_${METHOD}_${ALGORITHM}.bench + # END=$(date +%s.%N) + # DIFF=$(echo "$END - $START" | bc) + # echo "Took: ${DIFF}s" + # done - kill -9 $OSRM_ROUTED_PID - done + # kill -9 $OSRM_ROUTED_PID + # done } run_benchmarks_for_folder diff --git a/src/engine/routing_algorithms/map_matching.cpp b/src/engine/routing_algorithms/map_matching.cpp index ca0315247..d13403efc 100644 --- a/src/engine/routing_algorithms/map_matching.cpp +++ b/src/engine/routing_algorithms/map_matching.cpp @@ -336,7 +336,48 @@ SubMatchingList mapMatching(SearchEngineData &engine_working_data, } // TIMER_START(NEW_DIST); -#if 1 + +#define MODE 2 + +#if MODE == 0 + auto new_distances = + getNetworkDistances(engine_working_data, + facade, + forward_heap, + reverse_heaps, + prev_unbroken_timestamps_list[s].phantom_node, + target_phantom_nodes, + weight_upper_bound); + std::vector old_distances; + + for (const auto &pn : target_phantom_nodes) + { + double network_distance = + getNetworkDistance(engine_working_data, + facade, + forward_heap, + reverse_heap, + prev_unbroken_timestamps_list[s].phantom_node, + pn, + weight_upper_bound); + old_distances.push_back(network_distance); + } + + for (size_t i = 0; i < old_distances.size(); ++i) + { + if (std::abs(old_distances[i] - new_distances[i]) > 0.01) + { + // 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; + // std::exit(1); + } + } + + auto distances = old_distances; +#elif MODE == 1 (void)reverse_heap; auto distances = getNetworkDistances(engine_working_data, @@ -370,18 +411,7 @@ SubMatchingList mapMatching(SearchEngineData &engine_working_data, // std::cerr << "Old: " << TIMER_MSEC(OLD_DIST) << " New: " << TIMER_MSEC(NEW_DIST) // << std::endl; - // for (size_t i = 0; i < old_distances.size(); ++i) - // { - // if (std::abs(old_distances[i] - new_distances[i]) > 0.01) - // { - // // 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; - // // std::exit(1); - // } - // } + size_t distance_index = 0; for (const auto s_prime : util::irange(0UL, current_viterbi.size())) {