27 #ifndef SHARK_ALGORITHMS_NEARESTNEIGHBORS_KDTREE_H
28 #define SHARK_ALGORITHMS_NEARESTNEIGHBORS_KDTREE_H
61 template <
class InputT>
78 PointSet points(dataset);
80 std::vector<typename boost::range_iterator<PointSet>::type> elements(
m_size);
81 boost::iota(elements,boost::begin(points));
87 for(std::size_t i = 0; i !=
m_size; ++i){
95 double lower(std::size_t dim)
const{
97 if (parent == NULL)
return -1e100;
102 return parent->
lower(dim);
107 double upper(std::size_t dim)
const{
109 if (parent == NULL)
return +1e100;
114 return parent->
upper(dim);
132 for (std::size_t d = 0; d != reference.size(); d++)
134 double v = reference(d);
149 void print(
unsigned int ident = 0)
const
153 for (
unsigned int j=0; j<
m_size; j++)
155 for (
unsigned int i=0; i<ident; i++) printf(
" ");
156 printf(
"index: %d\n", (
int)this->
index(j));
161 for (
unsigned int i=0; i<ident; i++) printf(
" ");
163 for (
unsigned int i=0; i<ident; i++) printf(
" ");
165 ((self_type*)
mp_left)->print(ident + 1);
166 for (
unsigned int i=0; i<ident; i++) printf(
" ");
168 ((self_type*)
mp_right)->print(ident + 1);
184 , m_cutDim(0xffffffff)
189 template<
class Range>
191 typedef typename boost::range_iterator<Range>::type iterator;
193 iterator begin = boost::begin(points);
194 iterator end = boost::end(points);
204 std::vector<double>
distance(m_size);
205 iterator point = begin;
206 for(std::size_t i = 0; i !=
m_size; ++i,++point){
207 distance[i] =
get(**point,
m_cutDim);
211 iterator split = this->
splitList(distance,points);
216 std::size_t leftSize = split-begin;
223 boost::iterator_range<iterator>
left(begin,split);
224 boost::iterator_range<iterator>
right(split,end);
234 template<
class Range>
236 typedef typename boost::range_iterator<Range const>::type iterator;
238 iterator begin = boost::begin(points);
239 iterator end = boost::end(points);
244 std::size_t dim = L.size();
245 iterator point = begin;
247 for (std::size_t i=1; i !=
m_size; ++i,++point){
248 for (std::size_t d = 0; d != dim; d++){
249 double v = (**point)[d];
250 if (v < L[d]) L[d] = v;
251 if (v > U[d]) U[d] = v;
256 std::size_t cutDim = 0;
257 double extent = U[0] - L[0];
258 for (std::size_t d = 1; d != dim; d++)
260 double e = U[d] - L[d];
275 double funct(InputT
const& reference)
const{