--- /dev/null
+/***********************************************************************
+ * Software License Agreement (BSD License)
+ *
+ * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
+ * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
+ *
+ * THE BSD LICENSE
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *************************************************************************/
+
+#ifndef FLANN_H
+#define FLANN_H
+
+
+#include "constants.h"
+
+
+#ifdef WIN32
+/* win32 dll export/import directives */
+#ifdef flann_EXPORTS
+#define LIBSPEC __declspec(dllexport)
+#else
+#define LIBSPEC __declspec(dllimport)
+#endif
+#else
+/* unix needs nothing */
+#define LIBSPEC
+#endif
+
+
+
+
+
+struct FLANNParameters {
+ flann_algorithm_t algorithm; // the algorithm to use (see constants.h)
+
+ int checks; // how many leafs (features) to check in one search
+ float cb_index; // cluster boundary index. Used when searching the kmeans tree
+ int trees; // number of randomized trees to use (for kdtree)
+ int branching; // branching factor (for kmeans tree)
+ int iterations; // max iterations to perform in one kmeans cluetering (kmeans tree)
+ flann_centers_init_t centers_init; // algorithm used for picking the initial cluetr centers for kmeans tree
+ float target_precision; // precision desired (used for autotuning, -1 otherwise)
+ float build_weight; // build tree time weighting factor
+ float memory_weight; // index memory weigthing factor
+ float sample_fraction; // what fraction of the dataset to use for autotuning
+
+ flann_log_level_t log_level; // determines the verbosity of each flann function
+ char* log_destination; // file where the output should go, NULL for the console
+ long random_seed; // random seed to use
+};
+
+
+
+typedef void* FLANN_INDEX; // deprecated
+typedef void* flann_index_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+Sets the log level used for all flann functions (unless
+specified in FLANNParameters for each call
+
+Params:
+ level = verbosity level (defined in constants.h)
+*/
+LIBSPEC void flann_log_verbosity(int level);
+
+
+/**
+ * Sets the distance type to use throughout FLANN.
+ * If distance type specified is MINKOWSKI, the second argument
+ * specifies which order the minkowski distance should have.
+ */
+LIBSPEC void flann_set_distance_type(flann_distance_t distance_type, int order);
+
+
+/**
+Builds and returns an index. It uses autotuning if the target_precision field of index_params
+is between 0 and 1, or the parameters specified if it's -1.
+
+Params:
+ dataset = pointer to a data set stored in row major order
+ rows = number of rows (features) in the dataset
+ cols = number of columns in the dataset (feature dimensionality)
+ speedup = speedup over linear search, estimated if using autotuning, output parameter
+ index_params = index related parameters
+ flann_params = generic flann parameters
+
+Returns: the newly created index or a number <0 for error
+*/
+LIBSPEC FLANN_INDEX flann_build_index(float* dataset,
+ int rows,
+ int cols,
+ float* speedup,
+ struct FLANNParameters* flann_params);
+
+
+
+
+
+/**
+ * Saves the index to a file. Only the index is saved into the file, the dataset corresponding to the index is not saved.
+ *
+ * @param index_id The index that should be saved
+ * @param filename The filename the index should be saved to
+ * @return Returns 0 on success, negative value on error.
+ */
+LIBSPEC int flann_save_index(FLANN_INDEX index_id,
+ char* filename);
+
+
+/**
+ * Loads an index from a file.
+ *
+ * @param filename File to load the index from.
+ * @param dataset The dataset corresponding to the index.
+ * @param rows Dataset tors
+ * @param cols Dataset columns
+ * @return
+ */
+LIBSPEC FLANN_INDEX flann_load_index(char* filename,
+ float* dataset,
+ int rows,
+ int cols);
+
+
+
+/**
+Builds an index and uses it to find nearest neighbors.
+
+Params:
+ dataset = pointer to a data set stored in row major order
+ rows = number of rows (features) in the dataset
+ cols = number of columns in the dataset (feature dimensionality)
+ testset = pointer to a query set stored in row major order
+ trows = number of rows (features) in the query dataset (same dimensionality as features in the dataset)
+ indices = pointer to matrix for the indices of the nearest neighbors of the testset features in the dataset
+ (must have trows number of rows and nn number of columns)
+ nn = how many nearest neighbors to return
+ index_params = index related parameters
+ flann_params = generic flann parameters
+
+Returns: zero or -1 for error
+*/
+LIBSPEC int flann_find_nearest_neighbors(float* dataset,
+ int rows,
+ int cols,
+ float* testset,
+ int trows,
+ int* indices,
+ float* dists,
+ int nn,
+ struct FLANNParameters* flann_params);
+
+
+
+/**
+Searches for nearest neighbors using the index provided
+
+Params:
+ index_id = the index (constructed previously using flann_build_index).
+ testset = pointer to a query set stored in row major order
+ trows = number of rows (features) in the query dataset (same dimensionality as features in the dataset)
+ indices = pointer to matrix for the indices of the nearest neighbors of the testset features in the dataset
+ (must have trows number of rows and nn number of columns)
+ nn = how many nearest neighbors to return
+ checks = number of checks to perform before the search is stopped
+ flann_params = generic flann parameters
+
+Returns: zero or a number <0 for error
+*/
+LIBSPEC int flann_find_nearest_neighbors_index(FLANN_INDEX index_id,
+ float* testset,
+ int trows,
+ int* indices,
+ float* dists,
+ int nn,
+ int checks,
+ struct FLANNParameters* flann_params);
+
+
+
+/**
+ * Performs an radius search using an already constructed index.
+ *
+ * In case of radius search, instead of always returning a predetermined
+ * number of nearest neighbours (for example the 10 nearest neighbours), the
+ * search will return all the neighbours found within a search radius
+ * of the query point.
+ *
+ * The check parameter in the function below sets the level of approximation
+ * for the search by only visiting "checks" number of features in the index
+ * (the same way as for the KNN search). A lower value for checks will give
+ * a higher search speedup at the cost of potentially not returning all the
+ * neighbours in the specified radius.
+ */
+LIBSPEC int flann_radius_search(FLANN_INDEX index_ptr, /* the index */
+ float* query, /* query point */
+ int* indices, /* array for storing the indices found (will be modified) */
+ float* dists, /* similar, but for storing distances */
+ int max_nn, /* size of arrays indices and dists */
+ float radius, /* search radius (squared radius for euclidian metric) */
+ int checks, /* number of features to check, sets the level of approximation */
+ FLANNParameters* flann_params);
+
+
+/**
+Deletes an index and releases the memory used by it.
+
+Params:
+ index_id = the index (constructed previously using flann_build_index).
+ flann_params = generic flann parameters
+
+Returns: zero or a number <0 for error
+*/
+LIBSPEC int flann_free_index(FLANN_INDEX index_id,
+ struct FLANNParameters* flann_params);
+
+/**
+Clusters the features in the dataset using a hierarchical kmeans clustering approach.
+This is significantly faster than using a flat kmeans clustering for a large number
+of clusters.
+
+Params:
+ dataset = pointer to a data set stored in row major order
+ rows = number of rows (features) in the dataset
+ cols = number of columns in the dataset (feature dimensionality)
+ clusters = number of cluster to compute
+ result = memory buffer where the output cluster centers are storred
+ index_params = used to specify the kmeans tree parameters (branching factor, max number of iterations to use)
+ flann_params = generic flann parameters
+
+Returns: number of clusters computed or a number <0 for error. This number can be different than the number of clusters requested, due to the
+ way hierarchical clusters are computed. The number of clusters returned will be the highest number of the form
+ (branch_size-1)*K+1 smaller than the number of clusters requested.
+*/
+
+LIBSPEC int flann_compute_cluster_centers(float* dataset,
+ int rows,
+ int cols,
+ int clusters,
+ float* result,
+ struct FLANNParameters* flann_params);
+
+
+#ifdef __cplusplus
+};
+
+
+#include "flann.hpp"
+
+#endif
+
+
+#endif /*FLANN_H*/