34 #ifndef AIMS_MATH_KNN_H 35 #define AIMS_MATH_KNN_H 57 virtual inline const std::string &
name(
void)
const 63 const double *v2,
unsigned int dim)
const = 0;
66 const std::vector<double> &v2)
const 68 return (*
this)(&v1[0], &v2[0], v1.size());
84 const double *v2,
unsigned int dim)
const 88 for (
unsigned int i = 0; i < dim; ++i)
102 _name =
"squared_euclidian";
107 const double *v2,
unsigned int dim)
const 111 for (
unsigned int i = 0; i < dim; ++i)
130 const double *v2,
unsigned int dim)
const 134 for (
unsigned int i = 0; i < dim; ++i)
135 s += fabs(v1[i] - v2[i]);
146 _name =
"tchebychev";
151 const double *v2,
unsigned int dim)
const 153 double d = 0.,
max = 0.;
155 for (
unsigned int i = 0; i < dim; ++i)
157 d = fabs(v1[i] - v2[i]);
174 Database(
double *data,
unsigned int size,
unsigned int dim);
177 void init(
double *data,
unsigned int size,
unsigned int dim);
178 int search(
const std::vector<double> &v,
179 unsigned int dim)
const;
180 int search_with_hole(
const std::vector<double> &v,
181 unsigned int dim)
const;
194 _data = (
double *) malloc(
sizeof(
double) * _dim);
195 memcpy(_data, v._data,
sizeof(
double) * _dim);
231 if (_own_data) ::free(_data);
257 _data = (
double *)malloc(
sizeof(
double)* _dim);
260 memcpy(_data, v._data,
sizeof(
double) * _dim);
276 return v1(_dim) < v2(_dim);
296 _db(db), _ind(ind), _vector(
Vector(db, _ind)){}
298 _vector(it._vector) {};
310 return _ind != it._ind;
315 return _ind == it._ind;
320 if (_ind < _db->size()) ++_ind;
327 if (_ind < _db->size()) _ind++;
346 return _ind - it._ind;
351 return _ind + it._ind;
366 for(
unsigned i=0; i<ind; ++i )
373 _vector.
update(_db, _ind);
379 return _ind < it._ind;
384 return _ind <= it._ind;
389 return _ind > it._ind;
394 return _ind >= it._ind;
413 inline unsigned int size(
void)
const 418 inline unsigned int dim(
void)
const 423 inline double operator()(
unsigned int x,
unsigned int y)
const 425 return _data[x * _dim + y];
430 return &_data[ind * _dim];
435 return &_data[ind * _dim];
438 double variance_along_dim(
unsigned int dim)
const;
440 void sort(
unsigned int dim);
442 inline const std::vector<bool> &
holes()
const 447 inline void setHole(
unsigned int ind,
bool status)
449 _holes[ind] = status;
454 _holes = std::vector<bool>(_size,
false);
479 _key(key), _value(value) {};
503 return _key < h._key;
508 return _key > h._key;
516 Heap(
unsigned int n) : _n(0), _limit(n),
521 void exchange(
unsigned int a,
unsigned int b);
522 void erase_worst(
void);
523 void insert(
double key,
const void *value);
524 std::pair<std::vector<unsigned int>, std::vector<double> >
534 return _list[0].key();
540 std::vector<MiniHeap> _list;
548 _db(db), _k(k), _distance(distance), _distance_n(-1) {};
551 virtual std::pair<std::vector<unsigned int>, std::vector<double> >
552 find(
const std::vector<double> &v) = 0;
570 Knn(db, k, distance) {};
573 virtual std::pair<std::vector<unsigned int>, std::vector<double> >
574 find(
const std::vector<double> &v);
582 Knn(db, k, distance) {};
585 virtual void precompute(
void) = 0;
586 virtual std::pair<std::vector<unsigned int>, std::vector<double> >
587 find(
const std::vector<double> &v) = 0;
598 virtual void precompute(
void);
599 std::pair<std::vector<unsigned int>, std::vector<double> >
600 find(
const std::vector<double> &v);
603 unsigned int _best_dim;
const double * operator[](unsigned int ind) const
virtual const std::string & name(void) const
double operator()(unsigned int x, unsigned int y) const
float max(float x, float y)
MiniHeap(const MiniHeap &h)
bool operator<(const iterator &it)
virtual ~TchebychevDistance()
iterator operator++(void)
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
MultiDatabase(double *data, unsigned int n, unsigned int dim)
unsigned int dim(void) const
int _distance_n
number of computed distance
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
iterator operator-(unsigned int ind)
virtual ~EuclidianDistance()
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
iterator operator--(void)
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
std::vector< bool > _holes
double operator()(unsigned int dim) const
void setHole(unsigned int ind, bool status)
void update(Database *db, unsigned int ind)
virtual ~KnnGlobalFriedman()
bool operator>=(const iterator &it)
MiniHeap(double key, const void *value)
SquaredEuclidianDistance()
KnnFriedman(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
bool operator==(const iterator &it)
Database & _db
database wrapper of data
double * operator[](unsigned int ind)
iterator(const iterator &it)
Distance * _distance
distance used in nearest neighbours computations
KnnBruteForce(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
virtual double operator()(const std::vector< double > &v1, const std::vector< double > &v2) const
bool operator<(const HalfEdge &x, const HalfEdge &y)
KnnGlobalFriedman(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
const std::vector< bool > & holes() const
std::ptrdiff_t difference_type
const MiniHeap & operator[](unsigned int ind) const
int operator+(const iterator &it)
iterator operator+(unsigned int ind)
bool operator<=(const iterator &it)
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const =0
virtual ~SquaredEuclidianDistance()
bool operator!=(const iterator &it)
void update(const Vector &v)
virtual ~ManhattanDistance()
DatabaseCompare(unsigned int dim)
bool operator()(const Vector &v1, const Vector &v2) const
void init(Database *db, unsigned int ind)
unsigned int size(void) const
bool operator>(const iterator &it)
std::bidirectional_iterator_tag iterator_category
const void * value() const
iterator(Database *db, unsigned int ind=0)
int operator-(const iterator &it)
const double * operator*(void) const
Knn(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
unsigned int _k
k : number of nearest neighbours
Vector(Database *db, unsigned int ind)