| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef FLANN_COMPOSITE_INDEX_H_ |
| | #define FLANN_COMPOSITE_INDEX_H_ |
| |
|
| | #include "FLANN/general.h" |
| | #include "FLANN/algorithms/nn_index.h" |
| | #include "FLANN/algorithms/kdtree_index.h" |
| | #include "FLANN/algorithms/kmeans_index.h" |
| |
|
| | namespace flann |
| | { |
| |
|
| | |
| | |
| | |
| | struct CompositeIndexParams : public IndexParams |
| | { |
| | CompositeIndexParams(int trees = 4, int branching = 32, int iterations = 11, |
| | flann_centers_init_t centers_init = FLANN_CENTERS_RANDOM, float cb_index = 0.2 ) |
| | { |
| | (*this)["algorithm"] = FLANN_INDEX_KMEANS; |
| | |
| | (*this)["trees"] = trees; |
| | |
| | (*this)["branching"] = branching; |
| | |
| | (*this)["iterations"] = iterations; |
| | |
| | (*this)["centers_init"] = centers_init; |
| | |
| | (*this)["cb_index"] = cb_index; |
| | } |
| | }; |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | template <typename Distance> |
| | class CompositeIndex : public NNIndex<Distance> |
| | { |
| | public: |
| | typedef typename Distance::ElementType ElementType; |
| | typedef typename Distance::ResultType DistanceType; |
| |
|
| | typedef NNIndex<Distance> BaseClass; |
| |
|
| | typedef bool needs_kdtree_distance; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | CompositeIndex(const IndexParams& params = CompositeIndexParams(), Distance d = Distance()) : |
| | BaseClass(params, d) |
| | { |
| | kdtree_index_ = new KDTreeIndex<Distance>(params, d); |
| | kmeans_index_ = new KMeansIndex<Distance>(params, d); |
| |
|
| | } |
| |
|
| | CompositeIndex(const Matrix<ElementType>& inputData, const IndexParams& params = CompositeIndexParams(), |
| | Distance d = Distance()) : BaseClass(params, d) |
| | { |
| | kdtree_index_ = new KDTreeIndex<Distance>(inputData, params, d); |
| | kmeans_index_ = new KMeansIndex<Distance>(inputData, params, d); |
| | } |
| |
|
| | CompositeIndex(const CompositeIndex& other) : BaseClass(other), |
| | kmeans_index_(other.kmeans_index_), kdtree_index_(other.kdtree_index_) |
| | { |
| | } |
| |
|
| | CompositeIndex& operator=(CompositeIndex other) |
| | { |
| | this->swap(other); |
| | return *this; |
| | } |
| |
|
| | virtual ~CompositeIndex() |
| | { |
| | delete kdtree_index_; |
| | delete kmeans_index_; |
| | } |
| |
|
| | BaseClass* clone() const |
| | { |
| | return new CompositeIndex(*this); |
| | } |
| |
|
| | |
| | |
| | |
| | flann_algorithm_t getType() const |
| | { |
| | return FLANN_INDEX_COMPOSITE; |
| | } |
| |
|
| | |
| | |
| | |
| | size_t size() const |
| | { |
| | return kdtree_index_->size(); |
| | } |
| |
|
| | |
| | |
| | |
| | size_t veclen() const |
| | { |
| | return kdtree_index_->veclen(); |
| | } |
| |
|
| | |
| | |
| | |
| | int usedMemory() const |
| | { |
| | return kmeans_index_->usedMemory() + kdtree_index_->usedMemory(); |
| | } |
| |
|
| | using NNIndex<Distance>::buildIndex; |
| | |
| | |
| | |
| | void buildIndex() |
| | { |
| | Logger::info("Building kmeans tree...\n"); |
| | kmeans_index_->buildIndex(); |
| | Logger::info("Building kdtree tree...\n"); |
| | kdtree_index_->buildIndex(); |
| | } |
| |
|
| | void addPoints(const Matrix<ElementType>& points, float rebuild_threshold = 2) |
| | { |
| | kmeans_index_->addPoints(points, rebuild_threshold); |
| | kdtree_index_->addPoints(points, rebuild_threshold); |
| | } |
| |
|
| | void removePoint(size_t index) |
| | { |
| | kmeans_index_->removePoint(index); |
| | kdtree_index_->removePoint(index); |
| | } |
| |
|
| |
|
| | |
| | |
| | |
| | |
| | void saveIndex(FILE* stream) |
| | { |
| | kmeans_index_->saveIndex(stream); |
| | kdtree_index_->saveIndex(stream); |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void loadIndex(FILE* stream) |
| | { |
| | kmeans_index_->loadIndex(stream); |
| | kdtree_index_->loadIndex(stream); |
| | } |
| |
|
| | |
| | |
| | |
| | void findNeighbors(ResultSet<DistanceType>& result, const ElementType* vec, const SearchParams& searchParams) const |
| | { |
| | kmeans_index_->findNeighbors(result, vec, searchParams); |
| | kdtree_index_->findNeighbors(result, vec, searchParams); |
| | } |
| |
|
| | protected: |
| | void swap(CompositeIndex& other) |
| | { |
| | std::swap(kmeans_index_, other.kmeans_index_); |
| | std::swap(kdtree_index_, other.kdtree_index_); |
| | } |
| |
|
| | void buildIndexImpl() |
| | { |
| | |
| | } |
| |
|
| | void freeIndex() |
| | { |
| | |
| | } |
| |
|
| |
|
| | private: |
| | |
| | KMeansIndex<Distance>* kmeans_index_; |
| |
|
| | |
| | KDTreeIndex<Distance>* kdtree_index_; |
| | }; |
| |
|
| | } |
| |
|
| | #endif |
| |
|