ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
kdtree.hpp
Go to the documentation of this file.
1 #ifndef __kdtree_HPP
2 #define __kdtree_HPP
3 
4 //
5 // KdTree implementation.
6 //
7 // Copyright: Christoph Dalitz, 2018
8 // Jens Wilberg, 2018
9 // License: BSD style license
10 // (see the file LICENSE for details)
11 //
12 
13 #include <cstdlib>
14 #include <queue>
15 #include <vector>
16 namespace Kdtree {
17 
18 typedef std::vector<double> CoordPoint;
19 typedef std::vector<double> DoubleVector;
20 
21 // for passing points to the constructor of kdtree
22 struct KdNode {
24  void *data;
25  KdNode(const CoordPoint &p, void *d = NULL)
26  {
27  point = p;
28  data = d;
29  }
30  KdNode() { data = NULL; }
31 };
32 typedef std::vector<KdNode> KdNodeVector;
33 
34 // base function object for search predicate in knn search
35 // returns true when the given KdNode is an admissible neighbor
36 // To define an own search predicate, derive from this class
37 // and overwrite the call operator operator()
39  virtual ~KdNodePredicate() {}
40  virtual bool operator()(const KdNode &kn) const { return true; }
41 };
42 
43 //--------------------------------------------------------
44 // private helper classes used internally by KdTree
45 //
46 // the internal node structure used by kdtree
47 class kdtree_node;
48 // base class for different distance computations
49 class DistanceMeasure;
50 // helper class for priority queue in k nearest neighbor search
51 class nn4heap {
52 public:
53  size_t dataindex; // index of actual kdnode in *allnodes*
54  double distance; // distance of this neighbor from *point*
55  nn4heap(size_t i, double d)
56  {
57  dataindex = i;
58  distance = d;
59  }
60 };
62 public:
63  bool operator()(const nn4heap &n, const nn4heap &m) { return (n.distance < m.distance); }
64 };
65 //--------------------------------------------------------
66 
67 // kdtree class
68 class KdTree {
69 private:
70  // recursive build of tree
71  kdtree_node *build_tree(size_t depth, size_t a, size_t b);
72  // helper variable for keeping track of subtree bounding box
73  CoordPoint lobound, upbound;
74  // helper variables and functions for k nearest neighbor search
75  std::priority_queue<nn4heap, std::vector<nn4heap>, compare_nn4heap> *neighborheap;
76  std::vector<size_t> range_result;
77  // helper variable to check the distance method
78  int distance_type;
79  bool neighbor_search(const CoordPoint &point, kdtree_node *node, size_t k);
80  void range_search(const CoordPoint &point, kdtree_node *node, double r);
81  bool bounds_overlap_ball(const CoordPoint &point, double dist, kdtree_node *node);
82  bool ball_within_bounds(const CoordPoint &point, double dist, kdtree_node *node);
83  // class implementing the distance computation
84  DistanceMeasure *distance;
85  // search predicate in knn searches
86  KdNodePredicate *searchpredicate;
87 
88 public:
90  size_t dimension;
92  // distance_type can be 0 (max), 1 (city block), or 2 (euklid)
93  KdTree(const KdNodeVector *nodes, int distance_type = 2);
94  ~KdTree();
95  void set_distance(int distance_type, const DoubleVector *weights = NULL);
96  void k_nearest_neighbors(const CoordPoint &point, size_t k, KdNodeVector *result, std::vector<double> *distances,
97  KdNodePredicate *pred = NULL);
98  void range_nearest_neighbors(const CoordPoint &point, double r, KdNodeVector *result);
99 };
100 
101 } // end namespace Kdtree
102 
103 #endif
Kdtree::KdNodePredicate
Definition: kdtree.hpp:38
Kdtree::nn4heap
Definition: kdtree.hpp:51
Kdtree::compare_nn4heap::operator()
bool operator()(const nn4heap &n, const nn4heap &m)
Definition: kdtree.hpp:63
Kdtree::KdTree::allnodes
KdNodeVector allnodes
Definition: kdtree.hpp:89
Kdtree::DoubleVector
std::vector< double > DoubleVector
Definition: kdtree.hpp:19
Kdtree::KdNodePredicate::~KdNodePredicate
virtual ~KdNodePredicate()
Definition: kdtree.hpp:39
Kdtree::KdTree::range_nearest_neighbors
void range_nearest_neighbors(const CoordPoint &point, double r, KdNodeVector *result)
Definition: kdtree.cxx:351
Kdtree::KdNodeVector
std::vector< KdNode > KdNodeVector
Definition: kdtree.hpp:32
Kdtree::KdNode::data
void * data
Definition: kdtree.hpp:24
Kdtree
Definition: kdtree.cxx:19
Kdtree::KdNode::KdNode
KdNode()
Definition: kdtree.hpp:30
Kdtree::nn4heap::dataindex
size_t dataindex
Definition: kdtree.hpp:53
Kdtree::KdTree::root
kdtree_node * root
Definition: kdtree.hpp:91
Kdtree::KdTree::KdTree
KdTree(const KdNodeVector *nodes, int distance_type=2)
Definition: kdtree.cxx:204
Kdtree::KdTree
Definition: kdtree.hpp:68
node
Definition: fastcluster_dm.cxx:213
Kdtree::KdNode
Definition: kdtree.hpp:22
Kdtree::KdNodePredicate::operator()
virtual bool operator()(const KdNode &kn) const
Definition: kdtree.hpp:40
Kdtree::CoordPoint
std::vector< double > CoordPoint
Definition: kdtree.hpp:18
Kdtree::KdTree::k_nearest_neighbors
void k_nearest_neighbors(const CoordPoint &point, size_t k, KdNodeVector *result, std::vector< double > *distances, KdNodePredicate *pred=NULL)
Definition: kdtree.cxx:295
Kdtree::kdtree_node
Definition: kdtree.cxx:34
Kdtree::compare_nn4heap
Definition: kdtree.hpp:61
Kdtree::KdNode::KdNode
KdNode(const CoordPoint &p, void *d=NULL)
Definition: kdtree.hpp:25
Kdtree::KdTree::dimension
size_t dimension
Definition: kdtree.hpp:90
Kdtree::KdNode::point
CoordPoint point
Definition: kdtree.hpp:23
Kdtree::KdTree::set_distance
void set_distance(int distance_type, const DoubleVector *weights=NULL)
Definition: kdtree.cxx:232
Kdtree::nn4heap::distance
double distance
Definition: kdtree.hpp:54
Kdtree::nn4heap::nn4heap
nn4heap(size_t i, double d)
Definition: kdtree.hpp:55
Kdtree::KdTree::~KdTree
~KdTree()
Definition: kdtree.cxx:197
Kdtree::DistanceMeasure
Definition: kdtree.cxx:64