reproduced
This commit is contained in:
		
							parent
							
								
									3eaa676626
								
							
						
					
					
						commit
						98e8c2e06c
					
				| @ -214,7 +214,7 @@ struct PhantomNode | ||||
|     util::Coordinate input_location; | ||||
|     unsigned short fwd_segment_position; | ||||
|     // is phantom node valid to be used as source or target
 | ||||
|   private: | ||||
|   //private:
 | ||||
|     unsigned short is_valid_forward_source : 1; | ||||
|     unsigned short is_valid_forward_target : 1; | ||||
|     unsigned short is_valid_reverse_source : 1; | ||||
|  | ||||
| @ -734,29 +734,9 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data, | ||||
|     //     }
 | ||||
|     // }
 | ||||
| 
 | ||||
|     if (!forward_heap.Empty()) | ||||
|     { | ||||
|         if (target_phantom.IsValidForwardTarget() && !target_phantom.IsValidReverseTarget()) | ||||
|         { | ||||
|             if (const auto node = | ||||
|                     forward_heap.GetHeapNodeIfWasInserted(target_phantom.forward_segment_id.id)) | ||||
|             { | ||||
|                 if (node->weight < weight_upper_bound) { | ||||
|                     return from_alias<double>(node->data.distance); | ||||
|                 }  | ||||
|                 return std::numeric_limits<double>::max(); | ||||
|             } | ||||
|         } | ||||
|         // if (target_phantom.IsValidReverseTarget()) {
 | ||||
|         //     if (const auto node =
 | ||||
|         //     forward_heap.GetHeapNodeIfWasInserted(target_phantom.reverse_segment_id.id)) {
 | ||||
|         //         return from_alias<double>(node->data.distance);
 | ||||
|         //     }
 | ||||
|         // }
 | ||||
|     } | ||||
| 
 | ||||
|     forward_heap.Clear(); | ||||
| 
 | ||||
|   //  forward_heap.Clear();
 | ||||
|  if (forward_heap.Empty()) { | ||||
|     if (source_phantom.IsValidForwardSource()) | ||||
|     { | ||||
|         forward_heap.Insert(source_phantom.forward_segment_id.id, | ||||
| @ -770,6 +750,7 @@ double getNetworkDistance(SearchEngineData<Algorithm> &engine_working_data, | ||||
|                             EdgeWeight{0}, | ||||
|                             {source_phantom.reverse_segment_id.id, false, EdgeDistance{0}}); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|     if (target_phantom.IsValidForwardTarget()) | ||||
|     { | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #include "engine/routing_algorithms/map_matching.hpp" | ||||
| #include "engine/phantom_node.hpp" | ||||
| #include "engine/routing_algorithms/routing_base_ch.hpp" | ||||
| #include "engine/routing_algorithms/routing_base_mld.hpp" | ||||
| 
 | ||||
| @ -13,6 +14,7 @@ | ||||
| #include <cstddef> | ||||
| #include <deque> | ||||
| #include <iomanip> | ||||
| #include <limits> | ||||
| #include <memory> | ||||
| #include <numeric> | ||||
| #include <utility> | ||||
| @ -217,78 +219,96 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data, | ||||
|             const EdgeWeight weight_upper_bound = to_alias<EdgeWeight>( | ||||
|                 ((haversine_distance + max_distance_delta) / 4.) * facade.GetWeightMultiplier()); | ||||
| 
 | ||||
|             std::vector<double> old_distances; | ||||
|             for (const auto s : util::irange<std::size_t>(0UL, prev_viterbi.size())) | ||||
|             { | ||||
|                 if (prev_pruned[s]) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|            | ||||
| 
 | ||||
|                 forward_heap.Clear(); | ||||
|             std::vector<PhantomNode> test_sources; | ||||
|             std::vector<PhantomNode> test_targets; | ||||
| 
 | ||||
|                 for (const auto s_prime : util::irange<std::size_t>(0UL, current_viterbi.size())) | ||||
|                 { | ||||
|                     const double emission_pr = emission_log_probabilities[t][s_prime]; | ||||
|                     double new_value = prev_viterbi[s] + emission_pr; | ||||
|                     if (current_viterbi[s_prime] > new_value) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
|             test_sources.resize(2); | ||||
|             test_targets.resize(2); | ||||
| 
 | ||||
|                     double network_distance = | ||||
|                         getNetworkDistanceOld(engine_working_data, | ||||
|                                               facade, | ||||
|                                               forward_heap, | ||||
|                                               reverse_heap, | ||||
|                                               prev_unbroken_timestamps_list[s].phantom_node, | ||||
|                                               current_timestamps_list[s_prime].phantom_node, | ||||
|                                               weight_upper_bound); | ||||
|                     old_distances.push_back(network_distance); | ||||
|                 } | ||||
|             } | ||||
|             test_sources[0].forward_segment_id.id = 273; | ||||
|             test_sources[0].forward_segment_id.enabled = 1; | ||||
|             test_sources[0].is_valid_forward_source = true; | ||||
| 
 | ||||
|             test_sources[0].reverse_segment_id.id = 2147483647; | ||||
|             test_sources[0].reverse_segment_id.enabled = 0; | ||||
| 
 | ||||
|             test_targets[0].forward_segment_id.id = 197; | ||||
|             test_targets[0].forward_segment_id.enabled = 1; | ||||
|             test_targets[0].is_valid_forward_target = true; | ||||
| 
 | ||||
| 
 | ||||
|             test_targets[0].reverse_segment_id.id = 268; | ||||
|             test_targets[0].reverse_segment_id.enabled = 0; | ||||
| 
 | ||||
|             test_sources[1].forward_segment_id.id = 215; | ||||
|             test_sources[1].forward_segment_id.enabled = 1; | ||||
|             test_sources[0].is_valid_forward_source = true; | ||||
| 
 | ||||
| 
 | ||||
|             test_sources[1].reverse_segment_id.id = 2147483647; | ||||
|             test_sources[1].reverse_segment_id.enabled = 0; | ||||
| 
 | ||||
|             test_targets[1].forward_segment_id.id = 197; | ||||
|             test_targets[1].forward_segment_id.enabled = 0; | ||||
| 
 | ||||
|             test_targets[1].reverse_segment_id.id = 268; | ||||
|             test_targets[1].reverse_segment_id.enabled = 1; | ||||
|             test_targets[1].is_valid_reverse_target = true; | ||||
| 
 | ||||
| 
 | ||||
|             // std::vector<double> old_distances;
 | ||||
| 
 | ||||
|             // for (const auto& s: test_sources) {
 | ||||
|             //     for (const auto& t: test_targets) {
 | ||||
|             //         forward_heap.Clear();
 | ||||
|             //         double network_distance =
 | ||||
|             //             getNetworkDistanceOld(engine_working_data,
 | ||||
|             //                                facade,
 | ||||
|             //                                forward_heap,
 | ||||
|             //                                reverse_heap,
 | ||||
|             //                                s,
 | ||||
|             //                                t,
 | ||||
|             //                                weight_upper_bound);
 | ||||
|             //         old_distances.push_back(network_distance);
 | ||||
|                  | ||||
|             //     }
 | ||||
|             // }
 | ||||
| 
 | ||||
|             std::vector<double> new_distances; | ||||
|             for (const auto s : util::irange<std::size_t>(0UL, prev_viterbi.size())) | ||||
|             { | ||||
|                 if (prev_pruned[s]) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
| 
 | ||||
|                 forward_heap.Clear(); | ||||
| 
 | ||||
|                 for (const auto s_prime : util::irange<std::size_t>(0UL, current_viterbi.size())) | ||||
|                 { | ||||
|                     const double emission_pr = emission_log_probabilities[t][s_prime]; | ||||
|                     double new_value = prev_viterbi[s] + emission_pr; | ||||
|                     if (current_viterbi[s_prime] > new_value) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
| 
 | ||||
|             for (const auto& s: test_sources) { | ||||
|                     forward_heap.Clear(); | ||||
|                  | ||||
|                 for (const auto& t: test_targets) { | ||||
|                      | ||||
|                     double network_distance = | ||||
|                         getNetworkDistance(engine_working_data, | ||||
|                                            facade, | ||||
|                                            forward_heap, | ||||
|                                            reverse_heap, | ||||
|                                            prev_unbroken_timestamps_list[s].phantom_node, | ||||
|                                            current_timestamps_list[s_prime].phantom_node, | ||||
|                                            s, | ||||
|                                            t, | ||||
|                                            weight_upper_bound); | ||||
|                     new_distances.push_back(network_distance); | ||||
|                  | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             BOOST_ASSERT(old_distances.size() == new_distances.size()); | ||||
|             for (std::size_t i = 0; i < old_distances.size(); i++) | ||||
|             { | ||||
|                 if (std::abs(old_distances[i] - new_distances[i]) > 1e-3) | ||||
|                 { | ||||
|                     std::cout << "Old: " << old_distances[i] << " New: " << new_distances[i] | ||||
|                               << std::endl; | ||||
|             std::vector<double> expected = {663.997, 1533.04, std::numeric_limits<double>::max(), std::numeric_limits<double>::max()}; | ||||
|             if (new_distances.size() != expected.size()) { | ||||
|                 std::cerr << "New distances size is not equal to expected size" << std::endl; | ||||
|                 std::exit(1); | ||||
|             } | ||||
|             for (size_t index = 0; index < new_distances.size(); index++) { | ||||
|                 if (std::abs(new_distances[index] - expected[index]) > 1e-1) { | ||||
|                     std::cerr << "New: " << new_distances[index] << " Expected: " << expected[index] << std::endl; | ||||
|                     std::exit(1); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             // compute d_t for this timestamp and the next one
 | ||||
|             for (const auto s : util::irange<std::size_t>(0UL, prev_viterbi.size())) | ||||
|             { | ||||
| @ -309,7 +329,7 @@ SubMatchingList mapMatching(SearchEngineData<Algorithm> &engine_working_data, | ||||
|                     } | ||||
| 
 | ||||
|                     double network_distance = | ||||
|                         getNetworkDistance(engine_working_data, | ||||
|                         getNetworkDistanceOld(engine_working_data, | ||||
|                                            facade, | ||||
|                                            forward_heap, | ||||
|                                            reverse_heap, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user