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]);
179 unsigned int dim)
const;
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
442 inline const std::vector<bool> &
holes()
const
447 inline void setHole(
unsigned int ind,
bool status)
503 return _key < h._key;
508 return _key > h._key;
516 Heap(
unsigned int n) : _n(0), _limit(n),
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;
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) {};
586 virtual std::pair<std::vector<unsigned int>, std::vector<double> >
587 find(
const std::vector<double> &v) = 0;
599 std::pair<std::vector<unsigned int>, std::vector<double> >
600 find(
const std::vector<double> &v);
603 unsigned int _best_dim;
DatabaseCompare(unsigned int dim)
bool operator()(const Vector &v1, const Vector &v2) const
Vector & operator=(const Vector &v)
const double * operator*(void) const
void update(const Vector &v)
Vector(Database *db, unsigned int ind)
void update(Database *db, unsigned int ind)
double operator()(unsigned int dim) const
void init(Database *db, unsigned int ind)
int operator-(const iterator &it)
iterator operator-(unsigned int ind)
iterator operator++(void)
bool operator==(const iterator &it)
iterator operator--(void)
iterator(const iterator &it)
bool operator<(const iterator &it)
iterator & operator+=(unsigned int ind)
iterator & operator=(const iterator &it)
bool operator<=(const iterator &it)
bool operator!=(const iterator &it)
int operator+(const iterator &it)
std::bidirectional_iterator_tag iterator_category
iterator operator+(unsigned int ind)
bool operator>=(const iterator &it)
bool operator>(const iterator &it)
iterator(Database *db, unsigned int ind=0)
std::ptrdiff_t difference_type
double operator()(unsigned int x, unsigned int y) const
Database(double *data, unsigned int size, unsigned int dim)
std::vector< bool > _holes
int search(const std::vector< double > &v, unsigned int dim) const
const double * operator[](unsigned int ind) const
const std::vector< bool > & holes() const
unsigned int size(void) const
double variance_along_dim(unsigned int dim) const
void init(double *data, unsigned int size, unsigned int dim)
void setHole(unsigned int ind, bool status)
double * operator[](unsigned int ind)
unsigned int dim(void) const
void sort(unsigned int dim)
int search_with_hole(const std::vector< double > &v, unsigned int dim) const
virtual double operator()(const std::vector< double > &v1, const std::vector< double > &v2) const
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const =0
virtual const std::string & name(void) const
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
virtual ~EuclidianDistance()
bool operator>(const MiniHeap &h) const
const void * value() const
MiniHeap(double key, const void *value)
bool operator<(const MiniHeap &h) const
MiniHeap & operator=(const MiniHeap &h)
MiniHeap(const MiniHeap &h)
std::pair< std::vector< unsigned int >, std::vector< double > > toVectors(const Database &_db)
void exchange(unsigned int a, unsigned int b)
void insert(double key, const void *value)
const MiniHeap & operator[](unsigned int ind) const
KnnBruteForce(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
virtual std::pair< std::vector< unsigned int >, std::vector< double > > find(const std::vector< double > &v)
KnnFriedman(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
virtual std::pair< std::vector< unsigned int >, std::vector< double > > find(const std::vector< double > &v)=0
virtual void precompute(void)=0
std::pair< std::vector< unsigned int >, std::vector< double > > find(const std::vector< double > &v)
virtual ~KnnGlobalFriedman()
KnnGlobalFriedman(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
virtual void precompute(void)
Distance * _distance
distance used in nearest neighbours computations
Database & _db
database wrapper of data
virtual std::pair< std::vector< unsigned int >, std::vector< double > > find(const std::vector< double > &v)=0
unsigned int _k
k : number of nearest neighbours
int _distance_n
number of computed distance
Knn(Database &db, unsigned int k, Distance *distance=new SquaredEuclidianDistance())
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
virtual ~ManhattanDistance()
MultiDatabase(double *data, unsigned int n, unsigned int dim)
SquaredEuclidianDistance()
virtual ~SquaredEuclidianDistance()
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
virtual ~TchebychevDistance()
virtual double operator()(const double *v1, const double *v2, unsigned int dim) const
float max(float x, float y)