ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
flann.cpp
Go to the documentation of this file.
1 /***********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
5  * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *************************************************************************/
28 
29 #define FLANN_FIRST_MATCH
30 
31 #include "flann.h"
32 
33 
36  32, 0.0f,
37  0, -1, 0,
38  4, 4,
39  32, 11, FLANN_CENTERS_RANDOM, 0.2f,
40  0.9f, 0.01f, 0, 0.1f,
42 };
43 
44 
45 using namespace flann;
46 
47 
49 {
51 
52  params["algorithm"] = p->algorithm;
53 
54  params["checks"] = p->checks;
55  params["cb_index"] = p->cb_index;
56  params["eps"] = p->eps;
57 
58  if (p->algorithm == FLANN_INDEX_KDTREE) {
59  params["trees"] = p->trees;
60  }
61 
63  params["trees"] = p->trees;
64  params["leaf_max_size"] = p->leaf_max_size;
65  }
66 
67 #ifdef FLANN_USE_CUDA
68  if (p->algorithm == FLANN_INDEX_KDTREE_CUDA) {
69  params["leaf_max_size"] = p->leaf_max_size;
70  }
71 #endif
72 
73  if (p->algorithm == FLANN_INDEX_KMEANS) {
74  params["branching"] = p->branching;
75  params["iterations"] = p->iterations;
76  params["centers_init"] = p->centers_init;
77  }
78 
79  if (p->algorithm == FLANN_INDEX_AUTOTUNED) {
80  params["target_precision"] = p->target_precision;
81  params["build_weight"] = p->build_weight;
82  params["memory_weight"] = p->memory_weight;
83  params["sample_fraction"] = p->sample_fraction;
84  }
85 
87  params["branching"] = p->branching;
88  params["centers_init"] = p->centers_init;
89  params["trees"] = p->trees;
90  params["leaf_max_size"] = p->leaf_max_size;
91  }
92 
93  if (p->algorithm == FLANN_INDEX_LSH) {
94  params["table_number"] = p->table_number_;
95  params["key_size"] = p->key_size_;
96  params["multi_probe_level"] = p->multi_probe_level_;
97  }
98 
99  params["log_level"] = p->log_level;
100  params["random_seed"] = p->random_seed;
101 
102  return params;
103 }
104 
106 {
108  params.checks = p->checks;
109  params.eps = p->eps;
110  params.sorted = p->sorted;
111  params.max_neighbors = p->max_neighbors;
112  params.cores = p->cores;
113 
114  return params;
115 }
116 
117 
119 {
120  if (has_param(params,"algorithm")) {
121  flann_params->algorithm = get_param<flann_algorithm_t>(params,"algorithm");
122  }
123  if (has_param(params,"trees")) {
124  flann_params->trees = get_param<int>(params,"trees");
125  }
126  if (has_param(params,"leaf_max_size")) {
127  flann_params->leaf_max_size = get_param<int>(params,"leaf_max_size");
128  }
129  if (has_param(params,"branching")) {
130  flann_params->branching = get_param<int>(params,"branching");
131  }
132  if (has_param(params,"iterations")) {
133  flann_params->iterations = get_param<int>(params,"iterations");
134  }
135  if (has_param(params,"centers_init")) {
136  flann_params->centers_init = get_param<flann_centers_init_t>(params,"centers_init");
137  }
138  if (has_param(params,"target_precision")) {
139  flann_params->target_precision = get_param<float>(params,"target_precision");
140  }
141  if (has_param(params,"build_weight")) {
142  flann_params->build_weight = get_param<float>(params,"build_weight");
143  }
144  if (has_param(params,"memory_weight")) {
145  flann_params->memory_weight = get_param<float>(params,"memory_weight");
146  }
147  if (has_param(params,"sample_fraction")) {
148  flann_params->sample_fraction = get_param<float>(params,"sample_fraction");
149  }
150  if (has_param(params,"table_number")) {
151  flann_params->table_number_ = get_param<unsigned int>(params,"table_number");
152  }
153  if (has_param(params,"key_size")) {
154  flann_params->key_size_ = get_param<unsigned int>(params,"key_size");
155  }
156  if (has_param(params,"multi_probe_level")) {
157  flann_params->multi_probe_level_ = get_param<unsigned int>(params,"multi_probe_level");
158  }
159  if (has_param(params,"log_level")) {
160  flann_params->log_level = get_param<flann_log_level_t>(params,"log_level");
161  }
162  if (has_param(params,"random_seed")) {
163  flann_params->random_seed = get_param<long>(params,"random_seed");
164  }
165 }
166 
167 
169 {
170  if (p != NULL) {
172  if (p->random_seed>0) {
174  }
175  }
176 }
177 
178 
179 void flann_log_verbosity(int level)
180 {
181  flann::log_verbosity(level);
182 }
183 
186 
187 void flann_set_distance_type(flann_distance_t distance_type, int order)
188 {
189  flann_distance_type = distance_type;
190  flann_distance_order = order;
191 }
192 
193 
195  return flann_distance_type;
196 }
197 
199  return flann_distance_order;
200 }
201 
202 
203 template<typename Distance>
204 flann_index_t __flann_build_index(typename Distance::ElementType* dataset, int rows, int cols, float* speedup,
205  FLANNParameters* flann_params, Distance d = Distance())
206 {
207  typedef typename Distance::ElementType ElementType;
208  try {
209 
210  init_flann_parameters(flann_params);
211  if (flann_params == NULL) {
212  throw FLANNException("The flann_params argument must be non-null");
213  }
214  IndexParams params = create_parameters(flann_params);
215  Index<Distance>* index = new Index<Distance>(Matrix<ElementType>(dataset,rows,cols), params, d);
216  index->buildIndex();
217 
218  if (flann_params->algorithm==FLANN_INDEX_AUTOTUNED) {
219  IndexParams params = index->getParameters();
220  update_flann_parameters(params,flann_params);
221  SearchParams search_params = get_param<SearchParams>(params,"search_params");
222  *speedup = get_param<float>(params,"speedup");
223  flann_params->checks = search_params.checks;
224  flann_params->eps = search_params.eps;
225  flann_params->cb_index = get_param<float>(params,"cb_index",0.0);
226  }
227 
228  return index;
229  }
230  catch (std::runtime_error& e) {
231  Logger::error("Caught exception: %s\n",e.what());
232  return NULL;
233  }
234 }
235 
236 template<typename T>
237 flann_index_t _flann_build_index(T* dataset, int rows, int cols, float* speedup, FLANNParameters* flann_params)
238 {
240  return __flann_build_index<L2<T> >(dataset, rows, cols, speedup, flann_params);
241  }
243  return __flann_build_index<L1<T> >(dataset, rows, cols, speedup, flann_params);
244  }
246  return __flann_build_index<MinkowskiDistance<T> >(dataset, rows, cols, speedup, flann_params, MinkowskiDistance<T>(flann_distance_order));
247  }
249  return __flann_build_index<HistIntersectionDistance<T> >(dataset, rows, cols, speedup, flann_params);
250  }
252  return __flann_build_index<HellingerDistance<T> >(dataset, rows, cols, speedup, flann_params);
253  }
255  return __flann_build_index<ChiSquareDistance<T> >(dataset, rows, cols, speedup, flann_params);
256  }
258  return __flann_build_index<KL_Divergence<T> >(dataset, rows, cols, speedup, flann_params);
259  }
260  else {
261  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
262  return NULL;
263  }
264 }
265 
266 flann_index_t flann_build_index(float* dataset, int rows, int cols, float* speedup, FLANNParameters* flann_params)
267 {
268  return _flann_build_index<float>(dataset, rows, cols, speedup, flann_params);
269 }
270 
271 flann_index_t flann_build_index_float(float* dataset, int rows, int cols, float* speedup, FLANNParameters* flann_params)
272 {
273  return _flann_build_index<float>(dataset, rows, cols, speedup, flann_params);
274 }
275 
276 flann_index_t flann_build_index_double(double* dataset, int rows, int cols, float* speedup, FLANNParameters* flann_params)
277 {
278  return _flann_build_index<double>(dataset, rows, cols, speedup, flann_params);
279 }
280 
281 flann_index_t flann_build_index_byte(unsigned char* dataset, int rows, int cols, float* speedup, FLANNParameters* flann_params)
282 {
283  return _flann_build_index<unsigned char>(dataset, rows, cols, speedup, flann_params);
284 }
285 
286 flann_index_t flann_build_index_int(int* dataset, int rows, int cols, float* speedup, FLANNParameters* flann_params)
287 {
288  return _flann_build_index<int>(dataset, rows, cols, speedup, flann_params);
289 }
290 
291 template <typename Distance>
293  typename Distance::ElementType* points, int rows, int columns,
294  float rebuild_threshold) {
295  typedef typename Distance::ElementType ElementType;
296  try {
297  if (index_ptr==NULL) {
298  throw FLANNException("Invalid index");
299  }
300  Index<Distance>* index = (Index<Distance>*)index_ptr;
301  index->addPoints(Matrix<ElementType>(points, rows, columns),
302  rebuild_threshold);
303  return 0;
304  }
305  catch (std::runtime_error& e) {
306  Logger::error("Caught exception: %s\n",e.what());
307  return -1;
308  }
309  return -1;
310 }
311 
312 template <typename T>
313 int _flann_add_points(flann_index_t index_ptr, T* points, int rows, int columns,
314  float rebuild_threshold) {
316  return __flann_add_points<L2<T> >(index_ptr, points, rows, columns, rebuild_threshold);
317  }
319  return __flann_add_points<L1<T> >(index_ptr, points, rows, columns, rebuild_threshold);
320  }
322  return __flann_add_points<MinkowskiDistance<T> >(index_ptr, points, rows, columns, rebuild_threshold);
323  }
325  return __flann_add_points<HistIntersectionDistance<T> >(index_ptr, points, rows, columns, rebuild_threshold);
326  }
328  return __flann_add_points<HellingerDistance<T> >(index_ptr, points, rows, columns, rebuild_threshold);
329  }
331  return __flann_add_points<ChiSquareDistance<T> >(index_ptr, points, rows, columns, rebuild_threshold);
332  }
334  return __flann_add_points<KL_Divergence<T> >(index_ptr, points, rows, columns, rebuild_threshold);
335  }
336  else {
337  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
338  return 0;
339  }
340 }
341 
342 int flann_add_points(flann_index_t index_ptr, float* points, int rows, int columns, float rebuild_threshold)
343 {
344  return _flann_add_points<float>(index_ptr, points, rows, columns, rebuild_threshold);
345 }
346 
347 int flann_add_points_float(flann_index_t index_ptr, float* points, int rows, int columns, float rebuild_threshold)
348 {
349  return _flann_add_points<float>(index_ptr, points, rows, columns, rebuild_threshold);
350 }
351 
352 int flann_add_points_double(flann_index_t index_ptr, double* points, int rows, int columns, float rebuild_threshold)
353 {
354  return _flann_add_points<double>(index_ptr, points, rows, columns, rebuild_threshold);
355 }
356 
357 int flann_add_points_byte(flann_index_t index_ptr, unsigned char* points, int rows, int columns, float rebuild_threshold)
358 {
359  return _flann_add_points<unsigned char>(index_ptr, points, rows, columns, rebuild_threshold);
360 }
361 
362 int flann_add_points_int(flann_index_t index_ptr, int* points, int rows, int columns, float rebuild_threshold)
363 {
364  return _flann_add_points<int>(index_ptr, points, rows, columns, rebuild_threshold);
365 }
366 
367 template <typename Distance>
368 int __flann_remove_point(flann_index_t index_ptr, unsigned int point_id_uint) {
369  size_t point_id(point_id_uint);
370  try {
371  if (index_ptr==NULL) {
372  throw FLANNException("Invalid index");
373  }
374  Index<Distance>* index = (Index<Distance>*)index_ptr;
375  index->removePoint(point_id);
376  return 0;
377  }
378  catch (std::runtime_error& e) {
379  Logger::error("Caught exception: %s\n",e.what());
380  return -1;
381  }
382  return -1;
383 }
384 
385 template <typename T>
386 int _flann_remove_point(flann_index_t index_ptr, unsigned int point_id) {
388  return __flann_remove_point<L2<T> >(index_ptr, point_id);
389  }
391  return __flann_remove_point<L1<T> >(index_ptr, point_id);
392  }
394  return __flann_remove_point<MinkowskiDistance<T> >(index_ptr, point_id);
395  }
397  return __flann_remove_point<HistIntersectionDistance<T> >(index_ptr, point_id);
398  }
400  return __flann_remove_point<HellingerDistance<T> >(index_ptr, point_id);
401  }
403  return __flann_remove_point<ChiSquareDistance<T> >(index_ptr, point_id);
404  }
406  return __flann_remove_point<KL_Divergence<T> >(index_ptr, point_id);
407  }
408  else {
409  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
410  return 0;
411  }
412 }
413 
414 int flann_remove_point(flann_index_t index_ptr, unsigned int point_id)
415 {
416  return _flann_remove_point<float>(index_ptr, point_id);
417 }
418 
419 int flann_remove_point_float(flann_index_t index_ptr, unsigned int point_id)
420 {
421  return _flann_remove_point<float>(index_ptr, point_id);
422 }
423 
424 int flann_remove_point_double(flann_index_t index_ptr, unsigned int point_id)
425 {
426  return _flann_remove_point<double>(index_ptr, point_id);
427 }
428 
429 int flann_remove_point_byte(flann_index_t index_ptr, unsigned int point_id)
430 {
431  return _flann_remove_point<unsigned char>(index_ptr, point_id);
432 }
433 
434 int flann_remove_point_int(flann_index_t index_ptr, unsigned int point_id)
435 {
436  return _flann_remove_point<int>(index_ptr, point_id);
437 }
438 
439 template <typename Distance>
440 typename Distance::ElementType* __flann_get_point(flann_index_t index_ptr,
441  unsigned int point_id_uint) {
442  size_t point_id(point_id_uint);
443  try {
444  if (index_ptr==NULL) {
445  throw FLANNException("Invalid index");
446  }
447  Index<Distance>* index = (Index<Distance>*)index_ptr;
448  return index->getPoint(point_id);
449  }
450  catch (std::runtime_error& e) {
451  Logger::error("Caught exception: %s\n",e.what());
452  return NULL;
453  }
454 }
455 
456 template <typename T>
457 T* _flann_get_point(flann_index_t index_ptr, unsigned int point_id) {
459  return __flann_get_point<L2<T> >(index_ptr, point_id);
460  }
462  return __flann_get_point<L1<T> >(index_ptr, point_id);
463  }
465  return __flann_get_point<MinkowskiDistance<T> >(index_ptr, point_id);
466  }
468  return __flann_get_point<HistIntersectionDistance<T> >(index_ptr, point_id);
469  }
471  return __flann_get_point<HellingerDistance<T> >(index_ptr, point_id);
472  }
474  return __flann_get_point<ChiSquareDistance<T> >(index_ptr, point_id);
475  }
477  return __flann_get_point<KL_Divergence<T> >(index_ptr, point_id);
478  }
479  else {
480  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
481  return NULL;
482  }
483 }
484 
485 float* flann_get_point(flann_index_t index_ptr, unsigned int point_id)
486 {
487  return _flann_get_point<float>(index_ptr, point_id);
488 }
489 
490 float* flann_get_point_float(flann_index_t index_ptr, unsigned int point_id)
491 {
492  return _flann_get_point<float>(index_ptr, point_id);
493 }
494 
495 double* flann_get_point_double(flann_index_t index_ptr, unsigned int point_id)
496 {
497  return _flann_get_point<double>(index_ptr, point_id);
498 }
499 
500 unsigned char* flann_get_point_byte(flann_index_t index_ptr, unsigned int point_id)
501 {
502  return _flann_get_point<unsigned char>(index_ptr, point_id);
503 }
504 
505 int* flann_get_point_int(flann_index_t index_ptr, unsigned int point_id)
506 {
507  return _flann_get_point<int>(index_ptr, point_id);
508 }
509 
510 template <typename Distance>
511 unsigned int __flann_veclen(flann_index_t index_ptr) {
512  try {
513  if (index_ptr==NULL) {
514  throw FLANNException("Invalid index");
515  }
516  Index<Distance>* index = (Index<Distance>*)index_ptr;
517  return index->veclen();
518  }
519  catch (std::runtime_error& e) {
520  Logger::error("Caught exception: %s\n",e.what());
521  return 0;
522  }
523 }
524 
525 template <typename T>
526 unsigned int _flann_veclen(flann_index_t index_ptr) {
528  return __flann_veclen<L2<T> >(index_ptr);
529  }
531  return __flann_veclen<L1<T> >(index_ptr);
532  }
534  return __flann_veclen<MinkowskiDistance<T> >(index_ptr);
535  }
537  return __flann_veclen<HistIntersectionDistance<T> >(index_ptr);
538  }
540  return __flann_veclen<HellingerDistance<T> >(index_ptr);
541  }
543  return __flann_veclen<ChiSquareDistance<T> >(index_ptr);
544  }
546  return __flann_veclen<KL_Divergence<T> >(index_ptr);
547  }
548  else {
549  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
550  return 0;
551  }
552 }
553 
554 unsigned int flann_veclen(flann_index_t index_ptr)
555 {
556  return _flann_veclen<float>(index_ptr);
557 }
558 
559 unsigned int flann_veclen_float(flann_index_t index_ptr)
560 {
561  return _flann_veclen<float>(index_ptr);
562 }
563 
564 unsigned int flann_veclen_double(flann_index_t index_ptr)
565 {
566  return _flann_veclen<double>(index_ptr);
567 }
568 
569 unsigned int flann_veclen_byte(flann_index_t index_ptr)
570 {
571  return _flann_veclen<unsigned char>(index_ptr);
572 }
573 
574 unsigned int flann_veclen_int(flann_index_t index_ptr)
575 {
576  return _flann_veclen<int>(index_ptr);
577 }
578 
579 template <typename Distance>
580 unsigned int __flann_size(flann_index_t index_ptr) {
581  try {
582  if (index_ptr==NULL) {
583  throw FLANNException("Invalid index");
584  }
585  Index<Distance>* index = (Index<Distance>*)index_ptr;
586  return index->size();
587  }
588  catch (std::runtime_error& e) {
589  Logger::error("Caught exception: %s\n",e.what());
590  return 0;
591  }
592 }
593 
594 template <typename T>
595 unsigned int _flann_size(flann_index_t index_ptr) {
597  return __flann_size<L2<T> >(index_ptr);
598  }
600  return __flann_size<L1<T> >(index_ptr);
601  }
603  return __flann_size<MinkowskiDistance<T> >(index_ptr);
604  }
606  return __flann_size<HistIntersectionDistance<T> >(index_ptr);
607  }
609  return __flann_size<HellingerDistance<T> >(index_ptr);
610  }
612  return __flann_size<ChiSquareDistance<T> >(index_ptr);
613  }
615  return __flann_size<KL_Divergence<T> >(index_ptr);
616  }
617  else {
618  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
619  return 0;
620  }
621 }
622 
623 unsigned int flann_size(flann_index_t index_ptr)
624 {
625  return _flann_size<float>(index_ptr);
626 }
627 
628 unsigned int flann_size_float(flann_index_t index_ptr)
629 {
630  return _flann_size<float>(index_ptr);
631 }
632 
633 unsigned int flann_size_double(flann_index_t index_ptr)
634 {
635  return _flann_size<double>(index_ptr);
636 }
637 
638 unsigned int flann_size_byte(flann_index_t index_ptr)
639 {
640  return _flann_size<unsigned char>(index_ptr);
641 }
642 
643 unsigned int flann_size_int(flann_index_t index_ptr)
644 {
645  return _flann_size<int>(index_ptr);
646 }
647 
648 template <typename Distance>
650  try {
651  if (index_ptr==NULL) {
652  throw FLANNException("Invalid index");
653  }
654  Index<Distance>* index = (Index<Distance>*)index_ptr;
655  return index->usedMemory();
656  }
657  catch (std::runtime_error& e) {
658  Logger::error("Caught exception: %s\n",e.what());
659  return 0;
660  }
661 }
662 
663 template <typename T>
666  return __flann_used_memory<L2<T> >(index_ptr);
667  }
669  return __flann_used_memory<L1<T> >(index_ptr);
670  }
672  return __flann_used_memory<MinkowskiDistance<T> >(index_ptr);
673  }
675  return __flann_used_memory<HistIntersectionDistance<T> >(index_ptr);
676  }
678  return __flann_used_memory<HellingerDistance<T> >(index_ptr);
679  }
681  return __flann_used_memory<ChiSquareDistance<T> >(index_ptr);
682  }
684  return __flann_used_memory<KL_Divergence<T> >(index_ptr);
685  }
686  else {
687  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
688  return 0;
689  }
690 }
691 
693 {
694  return _flann_used_memory<float>(index_ptr);
695 }
696 
698 {
699  return _flann_used_memory<float>(index_ptr);
700 }
701 
703 {
704  return _flann_used_memory<double>(index_ptr);
705 }
706 
708 {
709  return _flann_used_memory<unsigned char>(index_ptr);
710 }
711 
713 {
714  return _flann_used_memory<int>(index_ptr);
715 }
716 
717 template<typename Distance>
719 {
720  try {
721  if (index_ptr==NULL) {
722  throw FLANNException("Invalid index");
723  }
724 
725  Index<Distance>* index = (Index<Distance>*)index_ptr;
726  index->save(filename);
727 
728  return 0;
729  }
730  catch (std::runtime_error& e) {
731  Logger::error("Caught exception: %s\n",e.what());
732  return -1;
733  }
734 }
735 
736 template<typename T>
738 {
740  return __flann_save_index<L2<T> >(index_ptr, filename);
741  }
743  return __flann_save_index<L1<T> >(index_ptr, filename);
744  }
746  return __flann_save_index<MinkowskiDistance<T> >(index_ptr, filename);
747  }
749  return __flann_save_index<HistIntersectionDistance<T> >(index_ptr, filename);
750  }
752  return __flann_save_index<HellingerDistance<T> >(index_ptr, filename);
753  }
755  return __flann_save_index<ChiSquareDistance<T> >(index_ptr, filename);
756  }
758  return __flann_save_index<KL_Divergence<T> >(index_ptr, filename);
759  }
760  else {
761  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
762  return -1;
763  }
764 }
765 
767 {
768  return _flann_save_index<float>(index_ptr, filename);
769 }
770 
772 {
773  return _flann_save_index<float>(index_ptr, filename);
774 }
775 
777 {
778  return _flann_save_index<double>(index_ptr, filename);
779 }
780 
782 {
783  return _flann_save_index<unsigned char>(index_ptr, filename);
784 }
785 
787 {
788  return _flann_save_index<int>(index_ptr, filename);
789 }
790 
791 
792 template<typename Distance>
793 flann_index_t __flann_load_index(char* filename, typename Distance::ElementType* dataset, int rows, int cols,
794  Distance d = Distance())
795 {
796  try {
798  return index;
799  }
800  catch (std::runtime_error& e) {
801  Logger::error("Caught exception: %s\n",e.what());
802  return NULL;
803  }
804 }
805 
806 template<typename T>
807 flann_index_t _flann_load_index(char* filename, T* dataset, int rows, int cols)
808 {
810  return __flann_load_index<L2<T> >(filename, dataset, rows, cols);
811  }
813  return __flann_load_index<L1<T> >(filename, dataset, rows, cols);
814  }
816  return __flann_load_index<MinkowskiDistance<T> >(filename, dataset, rows, cols, MinkowskiDistance<T>(flann_distance_order));
817  }
819  return __flann_load_index<HistIntersectionDistance<T> >(filename, dataset, rows, cols);
820  }
822  return __flann_load_index<HellingerDistance<T> >(filename, dataset, rows, cols);
823  }
825  return __flann_load_index<ChiSquareDistance<T> >(filename, dataset, rows, cols);
826  }
828  return __flann_load_index<KL_Divergence<T> >(filename, dataset, rows, cols);
829  }
830  else {
831  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
832  return NULL;
833  }
834 }
835 
836 
837 flann_index_t flann_load_index(char* filename, float* dataset, int rows, int cols)
838 {
839  return _flann_load_index<float>(filename, dataset, rows, cols);
840 }
841 
842 flann_index_t flann_load_index_float(char* filename, float* dataset, int rows, int cols)
843 {
844  return _flann_load_index<float>(filename, dataset, rows, cols);
845 }
846 
847 flann_index_t flann_load_index_double(char* filename, double* dataset, int rows, int cols)
848 {
849  return _flann_load_index<double>(filename, dataset, rows, cols);
850 }
851 
852 flann_index_t flann_load_index_byte(char* filename, unsigned char* dataset, int rows, int cols)
853 {
854  return _flann_load_index<unsigned char>(filename, dataset, rows, cols);
855 }
856 
857 flann_index_t flann_load_index_int(char* filename, int* dataset, int rows, int cols)
858 {
859  return _flann_load_index<int>(filename, dataset, rows, cols);
860 }
861 
862 
863 
864 template<typename Distance>
865 int __flann_find_nearest_neighbors(typename Distance::ElementType* dataset, int rows, int cols, typename Distance::ElementType* testset, int tcount,
866  int* result, typename Distance::ResultType* dists, int nn, FLANNParameters* flann_params, Distance d = Distance())
867 {
868  typedef typename Distance::ElementType ElementType;
869  typedef typename Distance::ResultType DistanceType;
870  try {
871  init_flann_parameters(flann_params);
872 
873  IndexParams params = create_parameters(flann_params);
874  Index<Distance>* index = new Index<Distance>(Matrix<ElementType>(dataset,rows,cols), params, d);
875  index->buildIndex();
876  Matrix<int> m_indices(result,tcount, nn);
877  Matrix<DistanceType> m_dists(dists,tcount, nn);
878  SearchParams search_params = create_search_params(flann_params);
879  index->knnSearch(Matrix<ElementType>(testset, tcount, index->veclen()),
880  m_indices,
881  m_dists, nn, search_params );
882  delete index;
883  return 0;
884  }
885  catch (std::runtime_error& e) {
886  Logger::error("Caught exception: %s\n",e.what());
887  return -1;
888  }
889 
890  return -1;
891 }
892 
893 template<typename T, typename R>
894 int _flann_find_nearest_neighbors(T* dataset, int rows, int cols, T* testset, int tcount,
895  int* result, R* dists, int nn, FLANNParameters* flann_params)
896 {
898  return __flann_find_nearest_neighbors<L2<T> >(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
899  }
901  return __flann_find_nearest_neighbors<L1<T> >(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
902  }
904  return __flann_find_nearest_neighbors<MinkowskiDistance<T> >(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params, MinkowskiDistance<T>(flann_distance_order));
905  }
907  return __flann_find_nearest_neighbors<HistIntersectionDistance<T> >(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
908  }
910  return __flann_find_nearest_neighbors<HellingerDistance<T> >(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
911  }
913  return __flann_find_nearest_neighbors<ChiSquareDistance<T> >(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
914  }
916  return __flann_find_nearest_neighbors<KL_Divergence<T> >(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
917  }
918  else {
919  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
920  return -1;
921  }
922 }
923 
924 int flann_find_nearest_neighbors(float* dataset, int rows, int cols, float* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
925 {
926  return _flann_find_nearest_neighbors(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
927 }
928 
929 int flann_find_nearest_neighbors_float(float* dataset, int rows, int cols, float* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
930 {
931  return _flann_find_nearest_neighbors(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
932 }
933 
934 int flann_find_nearest_neighbors_double(double* dataset, int rows, int cols, double* testset, int tcount, int* result, double* dists, int nn, FLANNParameters* flann_params)
935 {
936  return _flann_find_nearest_neighbors(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
937 }
938 
939 int flann_find_nearest_neighbors_byte(unsigned char* dataset, int rows, int cols, unsigned char* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
940 {
941  return _flann_find_nearest_neighbors(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
942 }
943 
944 int flann_find_nearest_neighbors_int(int* dataset, int rows, int cols, int* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
945 {
946  return _flann_find_nearest_neighbors(dataset, rows, cols, testset, tcount, result, dists, nn, flann_params);
947 }
948 
949 
950 template<typename Distance>
951 int __flann_find_nearest_neighbors_index(flann_index_t index_ptr, typename Distance::ElementType* testset, int tcount,
952  int* result, typename Distance::ResultType* dists, int nn, FLANNParameters* flann_params)
953 {
954  typedef typename Distance::ElementType ElementType;
955  typedef typename Distance::ResultType DistanceType;
956 
957  try {
958  init_flann_parameters(flann_params);
959  if (index_ptr==NULL) {
960  throw FLANNException("Invalid index");
961  }
962  Index<Distance>* index = (Index<Distance>*)index_ptr;
963 
964  Matrix<int> m_indices(result,tcount, nn);
965  Matrix<DistanceType> m_dists(dists, tcount, nn);
966 
967  SearchParams search_params = create_search_params(flann_params);
968  index->knnSearch(Matrix<ElementType>(testset, tcount, index->veclen()),
969  m_indices,
970  m_dists, nn, search_params );
971 
972  return 0;
973  }
974  catch (std::runtime_error& e) {
975  Logger::error("Caught exception: %s\n",e.what());
976  return -1;
977  }
978 
979  return -1;
980 }
981 
982 template<typename T, typename R>
983 int _flann_find_nearest_neighbors_index(flann_index_t index_ptr, T* testset, int tcount,
984  int* result, R* dists, int nn, FLANNParameters* flann_params)
985 {
987  return __flann_find_nearest_neighbors_index<L2<T> >(index_ptr, testset, tcount, result, dists, nn, flann_params);
988  }
990  return __flann_find_nearest_neighbors_index<L1<T> >(index_ptr, testset, tcount, result, dists, nn, flann_params);
991  }
993  return __flann_find_nearest_neighbors_index<MinkowskiDistance<T> >(index_ptr, testset, tcount, result, dists, nn, flann_params);
994  }
996  return __flann_find_nearest_neighbors_index<HistIntersectionDistance<T> >(index_ptr, testset, tcount, result, dists, nn, flann_params);
997  }
999  return __flann_find_nearest_neighbors_index<HellingerDistance<T> >(index_ptr, testset, tcount, result, dists, nn, flann_params);
1000  }
1002  return __flann_find_nearest_neighbors_index<ChiSquareDistance<T> >(index_ptr, testset, tcount, result, dists, nn, flann_params);
1003  }
1005  return __flann_find_nearest_neighbors_index<KL_Divergence<T> >(index_ptr, testset, tcount, result, dists, nn, flann_params);
1006  }
1007  else {
1008  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
1009  return -1;
1010  }
1011 }
1012 
1013 
1014 int flann_find_nearest_neighbors_index(flann_index_t index_ptr, float* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
1015 {
1016  return _flann_find_nearest_neighbors_index(index_ptr, testset, tcount, result, dists, nn, flann_params);
1017 }
1018 
1019 int flann_find_nearest_neighbors_index_float(flann_index_t index_ptr, float* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
1020 {
1021  return _flann_find_nearest_neighbors_index(index_ptr, testset, tcount, result, dists, nn, flann_params);
1022 }
1023 
1024 int flann_find_nearest_neighbors_index_double(flann_index_t index_ptr, double* testset, int tcount, int* result, double* dists, int nn, FLANNParameters* flann_params)
1025 {
1026  return _flann_find_nearest_neighbors_index(index_ptr, testset, tcount, result, dists, nn, flann_params);
1027 }
1028 
1029 int flann_find_nearest_neighbors_index_byte(flann_index_t index_ptr, unsigned char* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
1030 {
1031  return _flann_find_nearest_neighbors_index(index_ptr, testset, tcount, result, dists, nn, flann_params);
1032 }
1033 
1034 int flann_find_nearest_neighbors_index_int(flann_index_t index_ptr, int* testset, int tcount, int* result, float* dists, int nn, FLANNParameters* flann_params)
1035 {
1036  return _flann_find_nearest_neighbors_index(index_ptr, testset, tcount, result, dists, nn, flann_params);
1037 }
1038 
1039 
1040 template<typename Distance>
1042  typename Distance::ElementType* query,
1043  int* indices,
1044  typename Distance::ResultType* dists,
1045  int max_nn,
1046  float radius,
1047  FLANNParameters* flann_params)
1048 {
1049  typedef typename Distance::ElementType ElementType;
1050  typedef typename Distance::ResultType DistanceType;
1051 
1052  try {
1053  init_flann_parameters(flann_params);
1054  if (index_ptr==NULL) {
1055  throw FLANNException("Invalid index");
1056  }
1057  Index<Distance>* index = (Index<Distance>*)index_ptr;
1058 
1059  Matrix<int> m_indices(indices, 1, max_nn);
1060  Matrix<DistanceType> m_dists(dists, 1, max_nn);
1061  SearchParams search_params = create_search_params(flann_params);
1062  int count = index->radiusSearch(Matrix<ElementType>(query, 1, index->veclen()),
1063  m_indices,
1064  m_dists, radius, search_params );
1065 
1066 
1067  return count;
1068  }
1069  catch (std::runtime_error& e) {
1070  Logger::error("Caught exception: %s\n",e.what());
1071  return -1;
1072  }
1073 }
1074 
1075 template<typename T, typename R>
1077  T* query,
1078  int* indices,
1079  R* dists,
1080  int max_nn,
1081  float radius,
1082  FLANNParameters* flann_params)
1083 {
1085  return __flann_radius_search<L2<T> >(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1086  }
1088  return __flann_radius_search<L1<T> >(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1089  }
1091  return __flann_radius_search<MinkowskiDistance<T> >(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1092  }
1094  return __flann_radius_search<HistIntersectionDistance<T> >(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1095  }
1097  return __flann_radius_search<HellingerDistance<T> >(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1098  }
1100  return __flann_radius_search<ChiSquareDistance<T> >(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1101  }
1103  return __flann_radius_search<KL_Divergence<T> >(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1104  }
1105  else {
1106  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
1107  return -1;
1108  }
1109 }
1110 
1112  float* query,
1113  int* indices,
1114  float* dists,
1115  int max_nn,
1116  float radius,
1117  FLANNParameters* flann_params)
1118 {
1119  return _flann_radius_search(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1120 }
1121 
1123  float* query,
1124  int* indices,
1125  float* dists,
1126  int max_nn,
1127  float radius,
1128  FLANNParameters* flann_params)
1129 {
1130  return _flann_radius_search(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1131 }
1132 
1134  double* query,
1135  int* indices,
1136  double* dists,
1137  int max_nn,
1138  float radius,
1139  FLANNParameters* flann_params)
1140 {
1141  return _flann_radius_search(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1142 }
1143 
1145  unsigned char* query,
1146  int* indices,
1147  float* dists,
1148  int max_nn,
1149  float radius,
1150  FLANNParameters* flann_params)
1151 {
1152  return _flann_radius_search(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1153 }
1154 
1156  int* query,
1157  int* indices,
1158  float* dists,
1159  int max_nn,
1160  float radius,
1161  FLANNParameters* flann_params)
1162 {
1163  return _flann_radius_search(index_ptr, query, indices, dists, max_nn, radius, flann_params);
1164 }
1165 
1166 
1167 template<typename Distance>
1168 int __flann_free_index(flann_index_t index_ptr, FLANNParameters* flann_params)
1169 {
1170  try {
1171  init_flann_parameters(flann_params);
1172  if (index_ptr==NULL) {
1173  throw FLANNException("Invalid index");
1174  }
1175  Index<Distance>* index = (Index<Distance>*)index_ptr;
1176  delete index;
1177 
1178  return 0;
1179  }
1180  catch (std::runtime_error& e) {
1181  Logger::error("Caught exception: %s\n",e.what());
1182  return -1;
1183  }
1184 }
1185 
1186 template<typename T>
1187 int _flann_free_index(flann_index_t index_ptr, FLANNParameters* flann_params)
1188 {
1190  return __flann_free_index<L2<T> >(index_ptr, flann_params);
1191  }
1193  return __flann_free_index<L1<T> >(index_ptr, flann_params);
1194  }
1196  return __flann_free_index<MinkowskiDistance<T> >(index_ptr, flann_params);
1197  }
1199  return __flann_free_index<HistIntersectionDistance<T> >(index_ptr, flann_params);
1200  }
1202  return __flann_free_index<HellingerDistance<T> >(index_ptr, flann_params);
1203  }
1205  return __flann_free_index<ChiSquareDistance<T> >(index_ptr, flann_params);
1206  }
1208  return __flann_free_index<KL_Divergence<T> >(index_ptr, flann_params);
1209  }
1210  else {
1211  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
1212  return -1;
1213  }
1214 }
1215 
1216 int flann_free_index(flann_index_t index_ptr, FLANNParameters* flann_params)
1217 {
1218  return _flann_free_index<float>(index_ptr, flann_params);
1219 }
1220 
1222 {
1223  return _flann_free_index<float>(index_ptr, flann_params);
1224 }
1225 
1227 {
1228  return _flann_free_index<double>(index_ptr, flann_params);
1229 }
1230 
1232 {
1233  return _flann_free_index<unsigned char>(index_ptr, flann_params);
1234 }
1235 
1237 {
1238  return _flann_free_index<int>(index_ptr, flann_params);
1239 }
1240 
1241 
1242 template<typename Distance>
1243 int __flann_compute_cluster_centers(typename Distance::ElementType* dataset, int rows, int cols, int clusters,
1244  typename Distance::ResultType* result, FLANNParameters* flann_params, Distance d = Distance())
1245 {
1246  typedef typename Distance::ElementType ElementType;
1247  typedef typename Distance::ResultType DistanceType;
1248 
1249  try {
1250  init_flann_parameters(flann_params);
1251 
1252  Matrix<ElementType> inputData(dataset,rows,cols);
1253  KMeansIndexParams params(flann_params->branching, flann_params->iterations, flann_params->centers_init, flann_params->cb_index);
1254  Matrix<DistanceType> centers(result,clusters,cols);
1255  int clusterNum = hierarchicalClustering<Distance>(inputData, centers, params, d);
1256 
1257  return clusterNum;
1258  }
1259  catch (std::runtime_error& e) {
1260  Logger::error("Caught exception: %s\n",e.what());
1261  return -1;
1262  }
1263 }
1264 
1265 
1266 template<typename T, typename R>
1267 int _flann_compute_cluster_centers(T* dataset, int rows, int cols, int clusters, R* result, FLANNParameters* flann_params)
1268 {
1270  return __flann_compute_cluster_centers<L2<T> >(dataset, rows, cols, clusters, result, flann_params);
1271  }
1273  return __flann_compute_cluster_centers<L1<T> >(dataset, rows, cols, clusters, result, flann_params);
1274  }
1276  return __flann_compute_cluster_centers<MinkowskiDistance<T> >(dataset, rows, cols, clusters, result, flann_params, MinkowskiDistance<T>(flann_distance_order));
1277  }
1279  return __flann_compute_cluster_centers<HistIntersectionDistance<T> >(dataset, rows, cols, clusters, result, flann_params);
1280  }
1282  return __flann_compute_cluster_centers<HellingerDistance<T> >(dataset, rows, cols, clusters, result, flann_params);
1283  }
1285  return __flann_compute_cluster_centers<ChiSquareDistance<T> >(dataset, rows, cols, clusters, result, flann_params);
1286  }
1288  return __flann_compute_cluster_centers<KL_Divergence<T> >(dataset, rows, cols, clusters, result, flann_params);
1289  }
1290  else {
1291  Logger::error( "Distance type unsupported in the C bindings, use the C++ bindings instead\n");
1292  return -1;
1293  }
1294 }
1295 
1296 int flann_compute_cluster_centers(float* dataset, int rows, int cols, int clusters, float* result, FLANNParameters* flann_params)
1297 {
1298  return _flann_compute_cluster_centers(dataset, rows, cols, clusters, result, flann_params);
1299 }
1300 
1301 int flann_compute_cluster_centers_float(float* dataset, int rows, int cols, int clusters, float* result, FLANNParameters* flann_params)
1302 {
1303  return _flann_compute_cluster_centers(dataset, rows, cols, clusters, result, flann_params);
1304 }
1305 
1306 int flann_compute_cluster_centers_double(double* dataset, int rows, int cols, int clusters, double* result, FLANNParameters* flann_params)
1307 {
1308  return _flann_compute_cluster_centers(dataset, rows, cols, clusters, result, flann_params);
1309 }
1310 
1311 int flann_compute_cluster_centers_byte(unsigned char* dataset, int rows, int cols, int clusters, float* result, FLANNParameters* flann_params)
1312 {
1313  return _flann_compute_cluster_centers(dataset, rows, cols, clusters, result, flann_params);
1314 }
1315 
1316 int flann_compute_cluster_centers_int(int* dataset, int rows, int cols, int clusters, float* result, FLANNParameters* flann_params)
1317 {
1318  return _flann_compute_cluster_centers(dataset, rows, cols, clusters, result, flann_params);
1319 }
1320 
std::string filename
int count
int points
double Distance(const Point3D< Real > &p1, const Point3D< Real > &p2)
cmdLineReadable * params[]
#define NULL
core::Tensor result
Definition: VtkUtils.cpp:76
size_t size() const
Definition: flann.hpp:198
IndexParams getParameters() const
Definition: flann.hpp:223
int usedMemory() const
Definition: flann.hpp:214
void buildIndex()
Definition: flann.hpp:137
int knnSearch(const Matrix< ElementType > &queries, Matrix< size_t > &indices, Matrix< DistanceType > &dists, size_t knn, const SearchParams &params) const
Perform k-nearest neighbor search.
Definition: flann.hpp:236
size_t veclen() const
Definition: flann.hpp:190
int radiusSearch(const Matrix< ElementType > &queries, Matrix< size_t > &indices, Matrix< DistanceType > &dists, float radius, const SearchParams &params) const
Perform radius search.
Definition: flann.hpp:307
void save(std::string filename)
Definition: flann.hpp:177
void addPoints(const Matrix< ElementType > &points, float rebuild_threshold=2)
Definition: flann.hpp:149
ElementType * getPoint(size_t point_id)
Definition: flann.hpp:168
void removePoint(size_t point_id)
Definition: flann.hpp:158
static int error(const char *fmt,...)
Definition: logger.h:125
@ FLANN_LOG_NONE
Definition: defines.h:105
flann_distance_t
Definition: defines.h:114
@ FLANN_DIST_CHI_SQUARE
Definition: defines.h:123
@ FLANN_DIST_EUCLIDEAN
Definition: defines.h:115
@ FLANN_DIST_KULLBACK_LEIBLER
Definition: defines.h:124
@ FLANN_DIST_MINKOWSKI
Definition: defines.h:119
@ FLANN_DIST_HIST_INTERSECT
Definition: defines.h:121
@ FLANN_DIST_MANHATTAN
Definition: defines.h:117
@ FLANN_DIST_HELLINGER
Definition: defines.h:122
@ FLANN_INDEX_KDTREE_SINGLE
Definition: defines.h:85
@ FLANN_INDEX_KMEANS
Definition: defines.h:83
@ FLANN_INDEX_HIERARCHICAL
Definition: defines.h:86
@ FLANN_INDEX_AUTOTUNED
Definition: defines.h:92
@ FLANN_INDEX_LSH
Definition: defines.h:87
@ FLANN_INDEX_KDTREE
Definition: defines.h:82
@ FLANN_CENTERS_RANDOM
Definition: defines.h:97
int _flann_add_points(flann_index_t index_ptr, T *points, int rows, int columns, float rebuild_threshold)
Definition: flann.cpp:313
flann_index_t __flann_load_index(char *filename, typename Distance::ElementType *dataset, int rows, int cols, Distance d=Distance())
Definition: flann.cpp:793
int flann_save_index_double(flann_index_t index_ptr, char *filename)
Definition: flann.cpp:776
int flann_find_nearest_neighbors_index_byte(flann_index_t index_ptr, unsigned char *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:1029
int flann_add_points_int(flann_index_t index_ptr, int *points, int rows, int columns, float rebuild_threshold)
Definition: flann.cpp:362
int __flann_find_nearest_neighbors(typename Distance::ElementType *dataset, int rows, int cols, typename Distance::ElementType *testset, int tcount, int *result, typename Distance::ResultType *dists, int nn, FLANNParameters *flann_params, Distance d=Distance())
Definition: flann.cpp:865
flann_distance_t flann_get_distance_type()
Definition: flann.cpp:194
int __flann_save_index(flann_index_t index_ptr, char *filename)
Definition: flann.cpp:718
unsigned int flann_veclen_double(flann_index_t index_ptr)
Definition: flann.cpp:564
int flann_compute_cluster_centers_float(float *dataset, int rows, int cols, int clusters, float *result, FLANNParameters *flann_params)
Definition: flann.cpp:1301
int flann_save_index_float(flann_index_t index_ptr, char *filename)
Definition: flann.cpp:771
int flann_remove_point_float(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:419
int flann_distance_order
Definition: flann.cpp:185
int _flann_find_nearest_neighbors(T *dataset, int rows, int cols, T *testset, int tcount, int *result, R *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:894
int flann_compute_cluster_centers_double(double *dataset, int rows, int cols, int clusters, double *result, FLANNParameters *flann_params)
Definition: flann.cpp:1306
unsigned int __flann_veclen(flann_index_t index_ptr)
Definition: flann.cpp:511
int __flann_remove_point(flann_index_t index_ptr, unsigned int point_id_uint)
Definition: flann.cpp:368
int flann_add_points_double(flann_index_t index_ptr, double *points, int rows, int columns, float rebuild_threshold)
Definition: flann.cpp:352
int flann_used_memory_byte(flann_index_t index_ptr)
Definition: flann.cpp:707
int flann_free_index_byte(flann_index_t index_ptr, FLANNParameters *flann_params)
Definition: flann.cpp:1231
int flann_used_memory(flann_index_t index_ptr)
Definition: flann.cpp:692
int flann_save_index_int(flann_index_t index_ptr, char *filename)
Definition: flann.cpp:786
int __flann_free_index(flann_index_t index_ptr, FLANNParameters *flann_params)
Definition: flann.cpp:1168
float * flann_get_point(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:485
unsigned int flann_size_float(flann_index_t index_ptr)
Definition: flann.cpp:628
flann_index_t _flann_load_index(char *filename, T *dataset, int rows, int cols)
Definition: flann.cpp:807
flann_index_t flann_build_index_float(float *dataset, int rows, int cols, float *speedup, FLANNParameters *flann_params)
Definition: flann.cpp:271
unsigned int flann_veclen(flann_index_t index_ptr)
Definition: flann.cpp:554
unsigned char * flann_get_point_byte(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:500
flann_index_t flann_load_index(char *filename, float *dataset, int rows, int cols)
Definition: flann.cpp:837
void flann_set_distance_type(flann_distance_t distance_type, int order)
Definition: flann.cpp:187
int _flann_save_index(flann_index_t index_ptr, char *filename)
Definition: flann.cpp:737
double * flann_get_point_double(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:495
int flann_find_nearest_neighbors(float *dataset, int rows, int cols, float *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:924
int flann_save_index(flann_index_t index_ptr, char *filename)
Definition: flann.cpp:766
int flann_find_nearest_neighbors_byte(unsigned char *dataset, int rows, int cols, unsigned char *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:939
int flann_free_index_double(flann_index_t index_ptr, FLANNParameters *flann_params)
Definition: flann.cpp:1226
int flann_find_nearest_neighbors_index_float(flann_index_t index_ptr, float *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:1019
int flann_save_index_byte(flann_index_t index_ptr, char *filename)
Definition: flann.cpp:781
int flann_used_memory_int(flann_index_t index_ptr)
Definition: flann.cpp:712
int flann_used_memory_float(flann_index_t index_ptr)
Definition: flann.cpp:697
unsigned int flann_size_int(flann_index_t index_ptr)
Definition: flann.cpp:643
int flann_compute_cluster_centers(float *dataset, int rows, int cols, int clusters, float *result, FLANNParameters *flann_params)
Definition: flann.cpp:1296
int flann_radius_search_byte(flann_index_t index_ptr, unsigned char *query, int *indices, float *dists, int max_nn, float radius, FLANNParameters *flann_params)
Definition: flann.cpp:1144
int flann_used_memory_double(flann_index_t index_ptr)
Definition: flann.cpp:702
void update_flann_parameters(const IndexParams &params, FLANNParameters *flann_params)
Definition: flann.cpp:118
int flann_free_index_int(flann_index_t index_ptr, FLANNParameters *flann_params)
Definition: flann.cpp:1236
int _flann_radius_search(flann_index_t index_ptr, T *query, int *indices, R *dists, int max_nn, float radius, FLANNParameters *flann_params)
Definition: flann.cpp:1076
unsigned int flann_size(flann_index_t index_ptr)
Definition: flann.cpp:623
int flann_compute_cluster_centers_int(int *dataset, int rows, int cols, int clusters, float *result, FLANNParameters *flann_params)
Definition: flann.cpp:1316
flann_index_t flann_load_index_byte(char *filename, unsigned char *dataset, int rows, int cols)
Definition: flann.cpp:852
T * _flann_get_point(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:457
unsigned int __flann_size(flann_index_t index_ptr)
Definition: flann.cpp:580
struct FLANNParameters DEFAULT_FLANN_PARAMETERS
Definition: flann.cpp:34
float * flann_get_point_float(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:490
int flann_remove_point_int(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:434
int * flann_get_point_int(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:505
int flann_free_index_float(flann_index_t index_ptr, FLANNParameters *flann_params)
Definition: flann.cpp:1221
void init_flann_parameters(FLANNParameters *p)
Definition: flann.cpp:168
int __flann_used_memory(flann_index_t index_ptr)
Definition: flann.cpp:649
int flann_remove_point_byte(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:429
int flann_radius_search_double(flann_index_t index_ptr, double *query, int *indices, double *dists, int max_nn, float radius, FLANNParameters *flann_params)
Definition: flann.cpp:1133
int _flann_find_nearest_neighbors_index(flann_index_t index_ptr, T *testset, int tcount, int *result, R *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:983
flann::IndexParams create_parameters(FLANNParameters *p)
Definition: flann.cpp:48
int __flann_add_points(flann_index_t index_ptr, typename Distance::ElementType *points, int rows, int columns, float rebuild_threshold)
Definition: flann.cpp:292
flann_index_t __flann_build_index(typename Distance::ElementType *dataset, int rows, int cols, float *speedup, FLANNParameters *flann_params, Distance d=Distance())
Definition: flann.cpp:204
int __flann_find_nearest_neighbors_index(flann_index_t index_ptr, typename Distance::ElementType *testset, int tcount, int *result, typename Distance::ResultType *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:951
int flann_find_nearest_neighbors_int(int *dataset, int rows, int cols, int *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:944
int flann_find_nearest_neighbors_index_double(flann_index_t index_ptr, double *testset, int tcount, int *result, double *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:1024
void flann_log_verbosity(int level)
Definition: flann.cpp:179
int flann_radius_search(flann_index_t index_ptr, float *query, int *indices, float *dists, int max_nn, float radius, FLANNParameters *flann_params)
Definition: flann.cpp:1111
int flann_free_index(flann_index_t index_ptr, FLANNParameters *flann_params)
Definition: flann.cpp:1216
flann_index_t _flann_build_index(T *dataset, int rows, int cols, float *speedup, FLANNParameters *flann_params)
Definition: flann.cpp:237
int flann_remove_point_double(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:424
flann_index_t flann_load_index_int(char *filename, int *dataset, int rows, int cols)
Definition: flann.cpp:857
flann_distance_t flann_distance_type
Definition: flann.cpp:184
unsigned int flann_size_byte(flann_index_t index_ptr)
Definition: flann.cpp:638
flann_index_t flann_load_index_float(char *filename, float *dataset, int rows, int cols)
Definition: flann.cpp:842
Distance::ElementType * __flann_get_point(flann_index_t index_ptr, unsigned int point_id_uint)
Definition: flann.cpp:440
int flann_find_nearest_neighbors_index_int(flann_index_t index_ptr, int *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:1034
unsigned int flann_veclen_int(flann_index_t index_ptr)
Definition: flann.cpp:574
int _flann_used_memory(flann_index_t index_ptr)
Definition: flann.cpp:664
unsigned int flann_size_double(flann_index_t index_ptr)
Definition: flann.cpp:633
flann::SearchParams create_search_params(FLANNParameters *p)
Definition: flann.cpp:105
int _flann_remove_point(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:386
int __flann_compute_cluster_centers(typename Distance::ElementType *dataset, int rows, int cols, int clusters, typename Distance::ResultType *result, FLANNParameters *flann_params, Distance d=Distance())
Definition: flann.cpp:1243
flann_index_t flann_build_index_byte(unsigned char *dataset, int rows, int cols, float *speedup, FLANNParameters *flann_params)
Definition: flann.cpp:281
flann_index_t flann_build_index_int(int *dataset, int rows, int cols, float *speedup, FLANNParameters *flann_params)
Definition: flann.cpp:286
int flann_add_points(flann_index_t index_ptr, float *points, int rows, int columns, float rebuild_threshold)
Definition: flann.cpp:342
int flann_find_nearest_neighbors_index(flann_index_t index_ptr, float *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:1014
int _flann_free_index(flann_index_t index_ptr, FLANNParameters *flann_params)
Definition: flann.cpp:1187
int __flann_radius_search(flann_index_t index_ptr, typename Distance::ElementType *query, int *indices, typename Distance::ResultType *dists, int max_nn, float radius, FLANNParameters *flann_params)
Definition: flann.cpp:1041
int flann_find_nearest_neighbors_float(float *dataset, int rows, int cols, float *testset, int tcount, int *result, float *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:929
int flann_radius_search_int(flann_index_t index_ptr, int *query, int *indices, float *dists, int max_nn, float radius, FLANNParameters *flann_params)
Definition: flann.cpp:1155
flann_index_t flann_load_index_double(char *filename, double *dataset, int rows, int cols)
Definition: flann.cpp:847
int flann_add_points_byte(flann_index_t index_ptr, unsigned char *points, int rows, int columns, float rebuild_threshold)
Definition: flann.cpp:357
unsigned int _flann_veclen(flann_index_t index_ptr)
Definition: flann.cpp:526
int _flann_compute_cluster_centers(T *dataset, int rows, int cols, int clusters, R *result, FLANNParameters *flann_params)
Definition: flann.cpp:1267
unsigned int _flann_size(flann_index_t index_ptr)
Definition: flann.cpp:595
int flann_compute_cluster_centers_byte(unsigned char *dataset, int rows, int cols, int clusters, float *result, FLANNParameters *flann_params)
Definition: flann.cpp:1311
unsigned int flann_veclen_float(flann_index_t index_ptr)
Definition: flann.cpp:559
int flann_find_nearest_neighbors_double(double *dataset, int rows, int cols, double *testset, int tcount, int *result, double *dists, int nn, FLANNParameters *flann_params)
Definition: flann.cpp:934
flann_index_t flann_build_index(float *dataset, int rows, int cols, float *speedup, FLANNParameters *flann_params)
Definition: flann.cpp:266
int flann_radius_search_float(flann_index_t index_ptr, float *query, int *indices, float *dists, int max_nn, float radius, FLANNParameters *flann_params)
Definition: flann.cpp:1122
int flann_get_distance_order()
Definition: flann.cpp:198
int flann_add_points_float(flann_index_t index_ptr, float *points, int rows, int columns, float rebuild_threshold)
Definition: flann.cpp:347
int flann_remove_point(flann_index_t index_ptr, unsigned int point_id)
Definition: flann.cpp:414
flann_index_t flann_build_index_double(double *dataset, int rows, int cols, float *speedup, FLANNParameters *flann_params)
Definition: flann.cpp:276
unsigned int flann_veclen_byte(flann_index_t index_ptr)
Definition: flann.cpp:569
void * flann_index_t
Definition: flann.h:82
void seed_random(unsigned int seed)
Definition: random.h:49
bool has_param(const IndexParams &params, std::string name)
Definition: params.h:89
void log_verbosity(int level)
Definition: flann.hpp:54
std::map< std::string, any > IndexParams
Definition: params.h:51
float target_precision
Definition: flann.h:65
unsigned int key_size_
Definition: flann.h:72
int leaf_max_size
Definition: flann.h:56
float sample_fraction
Definition: flann.h:68
int iterations
Definition: flann.h:60
float eps
Definition: flann.h:49
int branching
Definition: flann.h:59
enum flann_centers_init_t centers_init
Definition: flann.h:61
float cb_index
Definition: flann.h:62
float build_weight
Definition: flann.h:66
float memory_weight
Definition: flann.h:67
int checks
Definition: flann.h:48
enum flann_log_level_t log_level
Definition: flann.h:76
enum flann_algorithm_t algorithm
Definition: flann.h:45
long random_seed
Definition: flann.h:77
unsigned int multi_probe_level_
Definition: flann.h:73
unsigned int table_number_
Definition: flann.h:71
int max_neighbors
Definition: flann.h:51
int sorted
Definition: flann.h:50