| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #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 |
|
|