Direct Graphical Models  v.1.7.0
KDTree.h
1 // K-Dimensional Tree class interface
2 // Written by Sergey Kosov in 2017 for Project X
3 // Inspired by http://codereview.stackexchange.com/questions/110225/k-d-tree-implementation-in-c11
4 #pragma once
5 
6 #include "types.h"
7 #include "KDNode.h"
8 
9 namespace DirectGraphicalModels
10 {
11  // ================================ k-D Tree Class ================================
17  class CKDTree
18  {
19  public:
23  DllExport CKDTree(void) : m_root(nullptr) {}
29  DllExport CKDTree(Mat &keys, Mat &values) : m_root(nullptr) { build(keys, values); }
30  DllExport CKDTree(const CKDTree &) = delete;
31  DllExport ~CKDTree(void) {}
32 
33  DllExport bool operator=(const CKDTree) = delete;
34 
38  DllExport void reset(void) { m_root.reset(); }
43  DllExport void save(const std::string &fileName) const;
48  DllExport void load(const std::string &fileName);
55  DllExport void build(Mat &keys, Mat &values);
61  DllExport std::shared_ptr<const CKDNode> findNearestNeighbor(const Mat &key) const { return findNearestNeighbors(key, 1).front(); }
68  DllExport std::vector<std::shared_ptr<const CKDNode>> findNearestNeighbors(const Mat &key, size_t maxNeighbors) const;
73  DllExport std::shared_ptr<const CKDNode> getRoot(void) const { return m_root; }
74 
75 
76  private:
77  std::shared_ptr<CKDNode> loadTree(FILE *pFile, int k);
78  std::shared_ptr<CKDNode> buildTree(Mat &data, pair_mat_t &boundingBox);
79  std::shared_ptr<const CKDNode> findNearestNode(const Mat &key) const;
80 
81 
82  private:
83  std::shared_ptr<CKDNode> m_root;
84  };
85 }
bool operator=(const CKDTree)=delete
std::shared_ptr< const CKDNode > findNearestNeighbor(const Mat &key) const
Finds the nearest neighbor to the key.
Definition: KDTree.h:61
std::shared_ptr< const CKDNode > findNearestNode(const Mat &key) const
Definition: KDTree.cpp:225
std::shared_ptr< CKDNode > buildTree(Mat &data, pair_mat_t &boundingBox)
Definition: KDTree.cpp:179
std::shared_ptr< CKDNode > loadTree(FILE *pFile, int k)
Definition: KDTree.cpp:146
Class implementing k-D Tree data structure.
Definition: KDTree.h:17
std::shared_ptr< CKDNode > m_root
Definition: KDTree.h:83
std::shared_ptr< const CKDNode > getRoot(void) const
Returns pointer to the root of the tree.
Definition: KDTree.h:73
void build(Mat &keys, Mat &values)
Builds a k-d tree on keys with corresponding values.
Definition: KDTree.cpp:90
void reset(void)
Resets the tree.
Definition: KDTree.h:38
std::vector< std::shared_ptr< const CKDNode > > findNearestNeighbors(const Mat &key, size_t maxNeighbors) const
Finds up to maxNeighbors nearest neighbors to the key.
Definition: KDTree.cpp:117
CKDTree(void)
Default constructor.
Definition: KDTree.h:23
void load(const std::string &fileName)
Loads a tree from the file.
Definition: KDTree.cpp:80
void save(const std::string &fileName) const
Saves the tree into a file.
Definition: KDTree.cpp:65
CKDTree(Mat &keys, Mat &values)
Constructor.
Definition: KDTree.h:29