mirror of
https://gitcode.com/gh_mirrors/ope/OpenFace.git
synced 2026-05-16 12:17:57 +00:00
67 lines
1.8 KiB
C++
67 lines
1.8 KiB
C++
// Copyright (C) 2013 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_AVERAGE_PREcISION_Hh_
|
|
#define DLIB_AVERAGE_PREcISION_Hh_
|
|
|
|
#include "average_precision_abstract.h"
|
|
#include <vector>
|
|
|
|
|
|
namespace dlib
|
|
{
|
|
namespace impl
|
|
{
|
|
inline bool get_bool_part (
|
|
const bool& b
|
|
) { return b; }
|
|
|
|
template <typename T>
|
|
bool get_bool_part(const std::pair<T,bool>& item) { return item.second; }
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
template <typename T, typename alloc>
|
|
double average_precision (
|
|
const std::vector<T,alloc>& items,
|
|
unsigned long missing_relevant_items = 0
|
|
)
|
|
{
|
|
using namespace dlib::impl;
|
|
double relevant_count = 0;
|
|
// find the precision values
|
|
std::vector<double> precision;
|
|
for (unsigned long i = 0; i < items.size(); ++i)
|
|
{
|
|
if (get_bool_part(items[i]))
|
|
{
|
|
++relevant_count;
|
|
precision.push_back(relevant_count / (i+1));
|
|
}
|
|
}
|
|
|
|
double precision_sum = 0;
|
|
double max_val = 0;
|
|
// now sum over the interpolated precision values
|
|
for (std::vector<double>::reverse_iterator i = precision.rbegin(); i != precision.rend(); ++i)
|
|
{
|
|
max_val = std::max(max_val, *i);
|
|
precision_sum += max_val;
|
|
}
|
|
|
|
|
|
relevant_count += missing_relevant_items;
|
|
|
|
if (relevant_count != 0)
|
|
return precision_sum/relevant_count;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_AVERAGE_PREcISION_Hh_
|
|
|