-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfunction_objects.h
More file actions
129 lines (106 loc) · 2.96 KB
/
Copy pathfunction_objects.h
File metadata and controls
129 lines (106 loc) · 2.96 KB
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
// 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_