Commit 3bd364fc authored by Adil Ibragimov's avatar Adil Ibragimov

fixing accum_dist and operator() mismatching for HellingerDistance and KL_Divergence

parent 32b25de5
...@@ -595,7 +595,7 @@ struct HellingerDistance ...@@ -595,7 +595,7 @@ struct HellingerDistance
typedef typename Accumulator<T>::Type ResultType; typedef typename Accumulator<T>::Type ResultType;
/** /**
* Compute the histogram intersection distance * Compute the Hellinger distance
*/ */
template <typename Iterator1, typename Iterator2> template <typename Iterator1, typename Iterator2>
ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const ResultType operator()(Iterator1 a, Iterator2 b, size_t size, ResultType /*worst_dist*/ = -1) const
...@@ -628,7 +628,8 @@ struct HellingerDistance ...@@ -628,7 +628,8 @@ struct HellingerDistance
template <typename U, typename V> template <typename U, typename V>
inline ResultType accum_dist(const U& a, const V& b, int) const inline ResultType accum_dist(const U& a, const V& b, int) const
{ {
return sqrt(static_cast<ResultType>(a)) - sqrt(static_cast<ResultType>(b)); ResultType diff = sqrt(static_cast<ResultType>(a)) - sqrt(static_cast<ResultType>(b));
return diff * diff;
} }
}; };
...@@ -729,9 +730,11 @@ struct KL_Divergence ...@@ -729,9 +730,11 @@ struct KL_Divergence
inline ResultType accum_dist(const U& a, const V& b, int) const inline ResultType accum_dist(const U& a, const V& b, int) const
{ {
ResultType result = ResultType(); ResultType result = ResultType();
ResultType ratio = (ResultType)(a / b); if( *b != 0 ) {
if (ratio>0) { ResultType ratio = (ResultType)(a / b);
result = a * log(ratio); if (ratio>0) {
result = a * log(ratio);
}
} }
return result; return result;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment