File size: 3,028 Bytes
9375c9a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
// Copyright (C) 2010 Davis E. King ([email protected])
// 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_
|