130 lines
3.0 KiB
C++
130 lines
3.0 KiB
C++
// Copyright (C) 2010 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_MR_FUNCTION_ObJECTS_Hh_
|
|
#define DLIB_MR_FUNCTION_ObJECTS_Hh_
|
|
|
|
#include "function_objects_abstract.h"
|
|
#include "../matrix.h"
|
|
#include "../svm/sparse_vector.h"
|
|
#include <cmath>
|
|
#include <limits>
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
struct squared_euclidean_distance
|
|
{
|
|
squared_euclidean_distance (
|
|
) :
|
|
lower(0),
|
|
upper(std::numeric_limits<double>::infinity())
|
|
{}
|
|
|
|
squared_euclidean_distance (
|
|
const double l,
|
|
const double u
|
|
) :
|
|
lower(l),
|
|
upper(u)
|
|
{}
|
|
|
|
const double lower;
|
|
const double upper;
|
|
|
|
template <typename sample_type>
|
|
double operator() (
|
|
const sample_type& a,
|
|
const sample_type& b
|
|
) const
|
|
{
|
|
const double len = length_squared(a-b);
|
|
if (lower <= len && len <= upper)
|
|
return len;
|
|
else
|
|
return std::numeric_limits<double>::infinity();
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
struct cosine_distance
|
|
{
|
|
template <typename sample_type>
|
|
double operator() (
|
|
const sample_type& a,
|
|
const sample_type& b
|
|
) const
|
|
{
|
|
const double temp = length(a)*length(b);
|
|
if (temp == 0)
|
|
return 0;
|
|
else
|
|
return 1-dot(a,b)/temp;
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
struct negative_dot_product_distance
|
|
{
|
|
template <typename sample_type>
|
|
double operator() (
|
|
const sample_type& a,
|
|
const sample_type& b
|
|
) const
|
|
{
|
|
return -dot(a,b);
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
struct use_weights_of_one
|
|
{
|
|
template <typename edge_type>
|
|
double operator() (
|
|
const edge_type&
|
|
) const
|
|
{
|
|
return 1;
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
struct use_gaussian_weights
|
|
{
|
|
use_gaussian_weights (
|
|
)
|
|
{
|
|
gamma = 0.1;
|
|
}
|
|
|
|
use_gaussian_weights (
|
|
double g
|
|
)
|
|
{
|
|
gamma = g;
|
|
}
|
|
|
|
double gamma;
|
|
|
|
template <typename edge_type>
|
|
double operator() (
|
|
const edge_type& e
|
|
) const
|
|
{
|
|
return std::exp(-gamma*e.distance());
|
|
}
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
#endif // DLIB_MR_FUNCTION_ObJECTS_Hh_
|
|
|
|
|