binary_space_tree.hpp
Go to the documentation of this file.
1 
11 #ifndef MLPACK_CORE_TREE_BINARY_SPACE_TREE_BINARY_SPACE_TREE_HPP
12 #define MLPACK_CORE_TREE_BINARY_SPACE_TREE_BINARY_SPACE_TREE_HPP
13 
14 #include <mlpack/prereqs.hpp>
15 
16 #include "../statistic.hpp"
17 #include "midpoint_split.hpp"
18 
19 namespace mlpack {
20 namespace tree {
21 
47 template<typename MetricType,
48  typename StatisticType = EmptyStatistic,
49  typename MatType = arma::mat,
50  template<typename BoundMetricType, typename...> class BoundType =
52  template<typename SplitBoundType, typename SplitMatType>
53  class SplitType = MidpointSplit>
55 {
56  public:
58  typedef MatType Mat;
60  typedef typename MatType::elem_type ElemType;
61 
62  typedef SplitType<BoundType<MetricType>, MatType> Split;
63 
64  private:
66  BinarySpaceTree* left;
68  BinarySpaceTree* right;
70  BinarySpaceTree* parent;
73  size_t begin;
76  size_t count;
78  BoundType<MetricType> bound;
80  StatisticType stat;
82  ElemType parentDistance;
85  ElemType furthestDescendantDistance;
87  ElemType minimumBoundDistance;
90  MatType* dataset;
91 
92  public:
95  template<typename RuleType>
97 
99  template<typename RuleType>
101 
102  template<typename RuleType>
104 
113  BinarySpaceTree(const MatType& data, const size_t maxLeafSize = 20);
114 
127  BinarySpaceTree(const MatType& data,
128  std::vector<size_t>& oldFromNew,
129  const size_t maxLeafSize = 20);
130 
146  BinarySpaceTree(const MatType& data,
147  std::vector<size_t>& oldFromNew,
148  std::vector<size_t>& newFromOld,
149  const size_t maxLeafSize = 20);
150 
160  BinarySpaceTree(MatType&& data,
161  const size_t maxLeafSize = 20);
162 
175  BinarySpaceTree(MatType&& data,
176  std::vector<size_t>& oldFromNew,
177  const size_t maxLeafSize = 20);
178 
194  BinarySpaceTree(MatType&& data,
195  std::vector<size_t>& oldFromNew,
196  std::vector<size_t>& newFromOld,
197  const size_t maxLeafSize = 20);
198 
212  const size_t begin,
213  const size_t count,
214  SplitType<BoundType<MetricType>, MatType>& splitter,
215  const size_t maxLeafSize = 20);
216 
237  const size_t begin,
238  const size_t count,
239  std::vector<size_t>& oldFromNew,
240  SplitType<BoundType<MetricType>, MatType>& splitter,
241  const size_t maxLeafSize = 20);
242 
265  const size_t begin,
266  const size_t count,
267  std::vector<size_t>& oldFromNew,
268  std::vector<size_t>& newFromOld,
269  SplitType<BoundType<MetricType>, MatType>& splitter,
270  const size_t maxLeafSize = 20);
271 
278  BinarySpaceTree(const BinarySpaceTree& other);
279 
285 
292 
299 
305  template<typename Archive>
307  Archive& ar,
309 
316 
318  const BoundType<MetricType>& Bound() const { return bound; }
320  BoundType<MetricType>& Bound() { return bound; }
321 
323  const StatisticType& Stat() const { return stat; }
325  StatisticType& Stat() { return stat; }
326 
328  bool IsLeaf() const;
329 
331  BinarySpaceTree* Left() const { return left; }
333  BinarySpaceTree*& Left() { return left; }
334 
336  BinarySpaceTree* Right() const { return right; }
338  BinarySpaceTree*& Right() { return right; }
339 
341  BinarySpaceTree* Parent() const { return parent; }
343  BinarySpaceTree*& Parent() { return parent; }
344 
346  const MatType& Dataset() const { return *dataset; }
348  MatType& Dataset() { return *dataset; }
349 
351  MetricType Metric() const { return MetricType(); }
352 
354  size_t NumChildren() const;
355 
360  template<typename VecType>
361  size_t GetNearestChild(
362  const VecType& point,
364 
369  template<typename VecType>
370  size_t GetFurthestChild(
371  const VecType& point,
373 
378  size_t GetNearestChild(const BinarySpaceTree& queryNode);
379 
384  size_t GetFurthestChild(const BinarySpaceTree& queryNode);
385 
390  ElemType FurthestPointDistance() const;
391 
399  ElemType FurthestDescendantDistance() const;
400 
402  ElemType MinimumBoundDistance() const;
403 
406  ElemType ParentDistance() const { return parentDistance; }
409  ElemType& ParentDistance() { return parentDistance; }
410 
417  BinarySpaceTree& Child(const size_t child) const;
418 
419  BinarySpaceTree*& ChildPtr(const size_t child)
420  { return (child == 0) ? left : right; }
421 
423  size_t NumPoints() const;
424 
430  size_t NumDescendants() const;
431 
439  size_t Descendant(const size_t index) const;
440 
449  size_t Point(const size_t index) const;
450 
452  ElemType MinDistance(const BinarySpaceTree& other) const
453  {
454  return bound.MinDistance(other.Bound());
455  }
456 
458  ElemType MaxDistance(const BinarySpaceTree& other) const
459  {
460  return bound.MaxDistance(other.Bound());
461  }
462 
465  {
466  return bound.RangeDistance(other.Bound());
467  }
468 
470  template<typename VecType>
471  ElemType MinDistance(const VecType& point,
473  const
474  {
475  return bound.MinDistance(point);
476  }
477 
479  template<typename VecType>
480  ElemType MaxDistance(const VecType& point,
482  const
483  {
484  return bound.MaxDistance(point);
485  }
486 
488  template<typename VecType>
490  RangeDistance(const VecType& point,
491  typename std::enable_if_t<IsVector<VecType>::value>* = 0) const
492  {
493  return bound.RangeDistance(point);
494  }
495 
497  size_t Begin() const { return begin; }
499  size_t& Begin() { return begin; }
500 
502  size_t Count() const { return count; }
504  size_t& Count() { return count; }
505 
507  void Center(arma::vec& center) const { bound.Center(center); }
508 
509  private:
516  void SplitNode(const size_t maxLeafSize,
517  SplitType<BoundType<MetricType>, MatType>& splitter);
518 
527  void SplitNode(std::vector<size_t>& oldFromNew,
528  const size_t maxLeafSize,
529  SplitType<BoundType<MetricType>, MatType>& splitter);
530 
537  template<typename BoundType2>
538  void UpdateBound(BoundType2& boundToUpdate);
539 
546  void UpdateBound(bound::HollowBallBound<MetricType>& boundToUpdate);
547 
548  protected:
555  BinarySpaceTree();
556 
558  friend class boost::serialization::access;
559 
560  public:
564  template<typename Archive>
565  void serialize(Archive& ar, const unsigned int version);
566 };
567 
568 } // namespace tree
569 } // namespace mlpack
570 
571 // Include implementation.
572 #include "binary_space_tree_impl.hpp"
573 
574 // Include everything else, if necessary.
575 #include "../binary_space_tree.hpp"
576 
577 #endif
~BinarySpaceTree()
Deletes this node, deallocating the memory for the children and calling their destructors in turn...
const MatType & Dataset() const
Get the dataset which the tree is built on.
size_t NumPoints() const
Return the number of points in this node (0 if not a leaf).
BinarySpaceTree *& Left()
Modify the left child of this node.
void serialize(Archive &ar, const unsigned int version)
Serialize the tree.
void Center(arma::vec &center) const
Store the center of the bounding region in the given vector.
typename enable_if< B, T >::type enable_if_t
Definition: prereqs.hpp:58
size_t Descendant(const size_t index) const
Return the index (with reference to the dataset) of a particular descendant of this node...
A dual-tree traverser for binary space trees; see dual_tree_traverser.hpp.
strip_type.hpp
Definition: add_to_po.hpp:21
BinarySpaceTree * Right() const
Gets the right child of this node.
BinarySpaceTree *& ChildPtr(const size_t child)
BinarySpaceTree & Child(const size_t child) const
Return the specified child (0 will be left, 1 will be right).
bool IsLeaf() const
Return whether or not this node is a leaf (true if it has no children).
The core includes that mlpack expects; standard C++ includes and Armadillo.
BinarySpaceTree * Parent() const
Gets the parent of this node.
MatType Mat
So other classes can use TreeType::Mat.
ElemType MaxDistance(const BinarySpaceTree &other) const
Return the maximum distance to another node.
ElemType MinDistance(const VecType &point, typename std::enable_if_t< IsVector< VecType >::value > *=0) const
Return the minimum distance to another point.
BinarySpaceTree *& Parent()
Modify the parent of this node.
A binary space partitioning tree, such as a KD-tree or a ball tree.
ElemType MaxDistance(const VecType &point, typename std::enable_if_t< IsVector< VecType >::value > *=0) const
Return the maximum distance to another point.
A binary space partitioning tree node is split into its left and right child.
BinarySpaceTree()
A default constructor.
size_t NumDescendants() const
Return the number of descendants of this node.
BoundType< MetricType > & Bound()
Return the bound object for this node.
size_t NumChildren() const
Return the number of children in this node.
MetricType Metric() const
Get the metric that the tree uses.
BinarySpaceTree *& Right()
Modify the right child of this node.
Hyper-rectangle bound for an L-metric.
Definition: hrectbound.hpp:54
size_t GetNearestChild(const VecType &point, typename std::enable_if_t< IsVector< VecType >::value > *=0)
Return the index of the nearest child node to the given query point.
size_t & Begin()
Modify the index of the beginning point of this subset.
MatType::elem_type ElemType
The type of element held in MatType.
MatType & Dataset()
Modify the dataset which the tree is built on. Be careful!
const BoundType< MetricType > & Bound() const
Return the bound object for this node.
ElemType MinDistance(const BinarySpaceTree &other) const
Return the minimum distance to another node.
size_t GetFurthestChild(const VecType &point, typename std::enable_if_t< IsVector< VecType >::value > *=0)
Return the index of the furthest child node to the given query point.
A single-tree traverser for binary space trees; see single_tree_traverser.hpp for implementation...
BinarySpaceTree * Left() const
Gets the left child of this node.
SplitType< BoundType< MetricType >, MatType > Split
ElemType ParentDistance() const
Return the distance from the center of this node to the center of the parent node.
StatisticType & Stat()
Return the statistic object for this node.
math::RangeType< ElemType > RangeDistance(const VecType &point, typename std::enable_if_t< IsVector< VecType >::value > *=0) const
Return the minimum and maximum distance to another point.
size_t Point(const size_t index) const
Return the index (with reference to the dataset) of a particular point in this node.
size_t & Count()
Modify the number of points in this subset.
size_t Begin() const
Return the index of the beginning point of this subset.
BinarySpaceTree & operator=(const BinarySpaceTree &other)
Copy the given BinarySaceTree.
ElemType MinimumBoundDistance() const
Return the minimum distance from the center of the node to any bound edge.
ElemType & ParentDistance()
Modify the distance from the center of this node to the center of the parent node.
const StatisticType & Stat() const
Return the statistic object for this node.
Hollow ball bound encloses a set of points at a specific distance (radius) from a specific point (cen...
math::RangeType< ElemType > RangeDistance(const BinarySpaceTree &other) const
Return the minimum and maximum distance to another node.
If value == true, then VecType is some sort of Armadillo vector or subview.
Definition: arma_traits.hpp:35
ElemType FurthestPointDistance() const
Return the furthest distance to a point held in this node.
size_t Count() const
Return the number of points in this subset.
Empty statistic if you are not interested in storing statistics in your tree.
Definition: statistic.hpp:24
ElemType FurthestDescendantDistance() const
Return the furthest possible descendant distance.