|
|
|
|
|
#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 |
|
|
|
|
|
|