Mark suspicious transitions
This commit is contained in:
		
							parent
							
								
									61dca4a35e
								
							
						
					
					
						commit
						a372ade7ce
					
				@ -80,6 +80,7 @@ template <class CandidateLists> struct HiddenMarkovModel
 | 
				
			|||||||
    std::vector<std::vector<std::pair<unsigned, unsigned>>> parents;
 | 
					    std::vector<std::vector<std::pair<unsigned, unsigned>>> parents;
 | 
				
			||||||
    std::vector<std::vector<float>> path_lengths;
 | 
					    std::vector<std::vector<float>> path_lengths;
 | 
				
			||||||
    std::vector<std::vector<bool>> pruned;
 | 
					    std::vector<std::vector<bool>> pruned;
 | 
				
			||||||
 | 
					    std::vector<std::vector<bool>> suspicious;
 | 
				
			||||||
    std::vector<bool> breakage;
 | 
					    std::vector<bool> breakage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const CandidateLists &candidates_list;
 | 
					    const CandidateLists &candidates_list;
 | 
				
			||||||
@ -95,6 +96,7 @@ template <class CandidateLists> struct HiddenMarkovModel
 | 
				
			|||||||
            viterbi.emplace_back(l.size());
 | 
					            viterbi.emplace_back(l.size());
 | 
				
			||||||
            parents.emplace_back(l.size());
 | 
					            parents.emplace_back(l.size());
 | 
				
			||||||
            path_lengths.emplace_back(l.size());
 | 
					            path_lengths.emplace_back(l.size());
 | 
				
			||||||
 | 
					            suspicious.emplace_back(l.size());
 | 
				
			||||||
            pruned.emplace_back(l.size());
 | 
					            pruned.emplace_back(l.size());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -111,6 +113,7 @@ template <class CandidateLists> struct HiddenMarkovModel
 | 
				
			|||||||
            std::fill(viterbi[t].begin(), viterbi[t].end(), osrm::matching::IMPOSSIBLE_LOG_PROB);
 | 
					            std::fill(viterbi[t].begin(), viterbi[t].end(), osrm::matching::IMPOSSIBLE_LOG_PROB);
 | 
				
			||||||
            std::fill(parents[t].begin(), parents[t].end(), std::make_pair(0u, 0u));
 | 
					            std::fill(parents[t].begin(), parents[t].end(), std::make_pair(0u, 0u));
 | 
				
			||||||
            std::fill(path_lengths[t].begin(), path_lengths[t].end(), 0);
 | 
					            std::fill(path_lengths[t].begin(), path_lengths[t].end(), 0);
 | 
				
			||||||
 | 
					            std::fill(suspicious[t].begin(), suspicious[t].end(), true);
 | 
				
			||||||
            std::fill(pruned[t].begin(), pruned[t].end(), true);
 | 
					            std::fill(pruned[t].begin(), pruned[t].end(), true);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        std::fill(breakage.begin() + initial_timestamp, breakage.end(), true);
 | 
					        std::fill(breakage.begin() + initial_timestamp, breakage.end(), true);
 | 
				
			||||||
@ -129,6 +132,7 @@ template <class CandidateLists> struct HiddenMarkovModel
 | 
				
			|||||||
                parents[initial_timestamp][s] = std::make_pair(initial_timestamp, s);
 | 
					                parents[initial_timestamp][s] = std::make_pair(initial_timestamp, s);
 | 
				
			||||||
                pruned[initial_timestamp][s] =
 | 
					                pruned[initial_timestamp][s] =
 | 
				
			||||||
                    viterbi[initial_timestamp][s] < osrm::matching::MINIMAL_LOG_PROB;
 | 
					                    viterbi[initial_timestamp][s] < osrm::matching::MINIMAL_LOG_PROB;
 | 
				
			||||||
 | 
					                suspicious[initial_timestamp][s] = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                breakage[initial_timestamp] =
 | 
					                breakage[initial_timestamp] =
 | 
				
			||||||
                    breakage[initial_timestamp] && pruned[initial_timestamp][s];
 | 
					                    breakage[initial_timestamp] && pruned[initial_timestamp][s];
 | 
				
			||||||
 | 
				
			|||||||
@ -62,6 +62,9 @@ using SubMatchingList = std::vector<SubMatching>;
 | 
				
			|||||||
constexpr static const unsigned MAX_BROKEN_STATES = 6;
 | 
					constexpr static const unsigned MAX_BROKEN_STATES = 6;
 | 
				
			||||||
constexpr static const unsigned MAX_BROKEN_TIME = 60;
 | 
					constexpr static const unsigned MAX_BROKEN_TIME = 60;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					constexpr static const unsigned MAX_DISTANCE_DELTA = 500;
 | 
				
			||||||
 | 
					constexpr static const unsigned SUSPICIOUS_DISTANCE_DELTA = 100;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
constexpr static const double default_beta = 10.0;
 | 
					constexpr static const double default_beta = 10.0;
 | 
				
			||||||
constexpr static const double default_sigma_z = 4.07;
 | 
					constexpr static const double default_sigma_z = 4.07;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -168,6 +171,7 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            auto ¤t_viterbi = model.viterbi[t];
 | 
					            auto ¤t_viterbi = model.viterbi[t];
 | 
				
			||||||
            auto ¤t_pruned = model.pruned[t];
 | 
					            auto ¤t_pruned = model.pruned[t];
 | 
				
			||||||
 | 
					            auto ¤t_suspicious = model.suspicious[t];
 | 
				
			||||||
            auto ¤t_parents = model.parents[t];
 | 
					            auto ¤t_parents = model.parents[t];
 | 
				
			||||||
            auto ¤t_lengths = model.path_lengths[t];
 | 
					            auto ¤t_lengths = model.path_lengths[t];
 | 
				
			||||||
            const auto ¤t_timestamps_list = candidates_list[t];
 | 
					            const auto ¤t_timestamps_list = candidates_list[t];
 | 
				
			||||||
@ -214,7 +218,7 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
 | 
				
			|||||||
                    const auto d_t = std::abs(network_distance - great_circle_distance);
 | 
					                    const auto d_t = std::abs(network_distance - great_circle_distance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // very low probability transition -> prune
 | 
					                    // very low probability transition -> prune
 | 
				
			||||||
                    if (d_t > 500)
 | 
					                    if (d_t > osrm::matching::MAX_DISTANCE_DELTA)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        continue;
 | 
					                        continue;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@ -232,6 +236,7 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
 | 
				
			|||||||
                        current_parents[s_prime] = std::make_pair(prev_unbroken_timestamp, s);
 | 
					                        current_parents[s_prime] = std::make_pair(prev_unbroken_timestamp, s);
 | 
				
			||||||
                        current_lengths[s_prime] = network_distance;
 | 
					                        current_lengths[s_prime] = network_distance;
 | 
				
			||||||
                        current_pruned[s_prime] = false;
 | 
					                        current_pruned[s_prime] = false;
 | 
				
			||||||
 | 
					                        current_suspicious[s_prime] = d_t > osrm::matching::SUSPICIOUS_DISTANCE_DELTA;
 | 
				
			||||||
                        model.breakage[t] = false;
 | 
					                        model.breakage[t] = false;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -255,7 +260,7 @@ class MapMatching final : public BasicRoutingInterface<DataFacadeT, MapMatching<
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        matching_debug.set_viterbi(model.viterbi, model.pruned);
 | 
					        matching_debug.set_viterbi(model.viterbi, model.pruned, model.suspicious);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!prev_unbroken_timestamps.empty())
 | 
					        if (!prev_unbroken_timestamps.empty())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
				
			|||||||
@ -103,7 +103,8 @@ struct MatchingDebugInfo
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void set_viterbi(const std::vector<std::vector<double>> &viterbi,
 | 
					    void set_viterbi(const std::vector<std::vector<double>> &viterbi,
 | 
				
			||||||
                     const std::vector<std::vector<bool>> &pruned)
 | 
					                     const std::vector<std::vector<bool>> &pruned,
 | 
				
			||||||
 | 
					                     const std::vector<std::vector<bool>> &suspicious)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // json logger not enabled
 | 
					        // json logger not enabled
 | 
				
			||||||
        if (!logger)
 | 
					        if (!logger)
 | 
				
			||||||
@ -119,6 +120,8 @@ struct MatchingDebugInfo
 | 
				
			|||||||
                    osrm::json::clamp_float(viterbi[t][s_prime]);
 | 
					                    osrm::json::clamp_float(viterbi[t][s_prime]);
 | 
				
			||||||
                osrm::json::get(*object, "states", t, s_prime, "pruned") =
 | 
					                osrm::json::get(*object, "states", t, s_prime, "pruned") =
 | 
				
			||||||
                    static_cast<unsigned>(pruned[t][s_prime]);
 | 
					                    static_cast<unsigned>(pruned[t][s_prime]);
 | 
				
			||||||
 | 
					                osrm::json::get(*object, "states", t, s_prime, "suspicious") =
 | 
				
			||||||
 | 
					                    static_cast<unsigned>(suspicious[t][s_prime]);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user