59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
|
#ifndef ENGINE_MAP_MATCHING_CONFIDENCE_HPP
|
||
|
#define ENGINE_MAP_MATCHING_CONFIDENCE_HPP
|
||
|
|
||
|
#include "engine/map_matching/bayes_classifier.hpp"
|
||
|
|
||
|
#include <cmath>
|
||
|
|
||
|
namespace osrm
|
||
|
{
|
||
|
namespace engine
|
||
|
{
|
||
|
namespace map_matching
|
||
|
{
|
||
|
|
||
|
struct MatchingConfidence
|
||
|
{
|
||
|
private:
|
||
|
using ClassifierT = BayesClassifier<LaplaceDistribution, LaplaceDistribution, double>;
|
||
|
using TraceClassification = ClassifierT::ClassificationT;
|
||
|
|
||
|
public:
|
||
|
MatchingConfidence()
|
||
|
: // the values were derived from fitting a laplace distribution
|
||
|
// to the values of manually classified traces
|
||
|
classifier(map_matching::LaplaceDistribution(0.005986, 0.016646),
|
||
|
map_matching::LaplaceDistribution(0.054385, 0.458432),
|
||
|
0.696774) // valid apriori probability
|
||
|
{
|
||
|
}
|
||
|
|
||
|
double operator()(const float trace_length, const float matched_length) const
|
||
|
{
|
||
|
const double distance_feature = -std::log(trace_length) + std::log(matched_length);
|
||
|
|
||
|
// matched to the same point
|
||
|
if (!std::isfinite(distance_feature))
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
const auto label_with_confidence = classifier.classify(distance_feature);
|
||
|
if (label_with_confidence.first == ClassifierT::ClassLabel::POSITIVE)
|
||
|
{
|
||
|
return label_with_confidence.second;
|
||
|
}
|
||
|
|
||
|
BOOST_ASSERT(label_with_confidence.first == ClassifierT::ClassLabel::NEGATIVE);
|
||
|
return 1 - label_with_confidence.second;
|
||
|
}
|
||
|
private:
|
||
|
|
||
|
ClassifierT classifier;
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|