| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #ifndef FLANN_LINEAR_INDEX_H_ |
| | #define FLANN_LINEAR_INDEX_H_ |
| |
|
| | #include "FLANN/general.h" |
| | #include "FLANN/algorithms/nn_index.h" |
| |
|
| | namespace flann |
| | { |
| |
|
| | struct LinearIndexParams : public IndexParams |
| | { |
| | LinearIndexParams() |
| | { |
| | (* this)["algorithm"] = FLANN_INDEX_LINEAR; |
| | } |
| | }; |
| |
|
| | template <typename Distance> |
| | class LinearIndex : public NNIndex<Distance> |
| | { |
| | public: |
| |
|
| | typedef typename Distance::ElementType ElementType; |
| | typedef typename Distance::ResultType DistanceType; |
| |
|
| | typedef NNIndex<Distance> BaseClass; |
| |
|
| | LinearIndex(const IndexParams& params = LinearIndexParams(), Distance d = Distance()) : |
| | BaseClass(params, d) |
| | { |
| | } |
| |
|
| | LinearIndex(const Matrix<ElementType>& input_data, const IndexParams& params = LinearIndexParams(), Distance d = Distance()) : |
| | BaseClass(params, d) |
| | { |
| | setDataset(input_data); |
| | } |
| |
|
| | LinearIndex(const LinearIndex& other) : BaseClass(other) |
| | { |
| | } |
| |
|
| | LinearIndex& operator=(LinearIndex other) |
| | { |
| | this->swap(other); |
| | return *this; |
| | } |
| |
|
| | virtual ~LinearIndex() |
| | { |
| | } |
| |
|
| | BaseClass* clone() const |
| | { |
| | return new LinearIndex(*this); |
| | } |
| |
|
| | void addPoints(const Matrix<ElementType>& points, float rebuild_threshold = 2) |
| | { |
| | assert(points.cols==veclen_); |
| | extendDataset(points); |
| | } |
| |
|
| | flann_algorithm_t getType() const |
| | { |
| | return FLANN_INDEX_LINEAR; |
| | } |
| |
|
| |
|
| | int usedMemory() const |
| | { |
| | return 0; |
| | } |
| |
|
| | template<typename Archive> |
| | void serialize(Archive& ar) |
| | { |
| | ar.setObject(this); |
| |
|
| | ar & *static_cast<NNIndex<Distance>*>(this); |
| |
|
| | if (Archive::is_loading::value) { |
| | index_params_["algorithm"] = getType(); |
| | } |
| | } |
| |
|
| | void saveIndex(FILE* stream) |
| | { |
| | serialization::SaveArchive sa(stream); |
| | sa & *this; |
| | } |
| |
|
| | void loadIndex(FILE* stream) |
| | { |
| | serialization::LoadArchive la(stream); |
| | la & *this; |
| | } |
| |
|
| | void findNeighbors(ResultSet<DistanceType>& resultSet, const ElementType* vec, const SearchParams& ) const |
| | { |
| | if (removed_) { |
| | for (size_t i = 0; i < points_.size(); ++i) { |
| | if (removed_points_.test(i)) continue; |
| | DistanceType dist = distance_(points_[i], vec, veclen_); |
| | resultSet.addPoint(dist, i); |
| | } |
| | } |
| | else { |
| | for (size_t i = 0; i < points_.size(); ++i) { |
| | DistanceType dist = distance_(points_[i], vec, veclen_); |
| | resultSet.addPoint(dist, i); |
| | } |
| | } |
| | } |
| | protected: |
| | void buildIndexImpl() |
| | { |
| | |
| | } |
| |
|
| | void freeIndex() |
| | { |
| | |
| | } |
| |
|
| | private: |
| |
|
| | USING_BASECLASS_SYMBOLS |
| | }; |
| |
|
| | } |
| |
|
| | #endif |
| |
|