11 #ifndef MLPACK_CORE_TREE_BINARY_SPACE_TREE_BINARY_SPACE_TREE_HPP 12 #define MLPACK_CORE_TREE_BINARY_SPACE_TREE_BINARY_SPACE_TREE_HPP 16 #include "../statistic.hpp" 47 template<
typename MetricType,
49 typename MatType = arma::mat,
50 template<
typename BoundMetricType,
typename...>
class BoundType =
52 template<
typename SplitBoundType,
typename SplitMatType>
62 typedef SplitType<BoundType<MetricType>, MatType>
Split;
78 BoundType<MetricType> bound;
82 ElemType parentDistance;
85 ElemType furthestDescendantDistance;
87 ElemType minimumBoundDistance;
95 template<
typename RuleType>
99 template<
typename RuleType>
102 template<
typename RuleType>
128 std::vector<size_t>& oldFromNew,
129 const size_t maxLeafSize = 20);
147 std::vector<size_t>& oldFromNew,
148 std::vector<size_t>& newFromOld,
149 const size_t maxLeafSize = 20);
161 const size_t maxLeafSize = 20);
176 std::vector<size_t>& oldFromNew,
177 const size_t maxLeafSize = 20);
195 std::vector<size_t>& oldFromNew,
196 std::vector<size_t>& newFromOld,
197 const size_t maxLeafSize = 20);
214 SplitType<BoundType<MetricType>, MatType>& splitter,
215 const size_t maxLeafSize = 20);
239 std::vector<size_t>& oldFromNew,
240 SplitType<BoundType<MetricType>, MatType>& splitter,
241 const size_t maxLeafSize = 20);
268 std::vector<size_t>& oldFromNew,
269 std::vector<size_t>& newFromOld,
270 SplitType<BoundType<MetricType>, MatType>& splitter,
271 const size_t maxLeafSize = 20);
306 template<
typename Archive>
319 const BoundType<MetricType>&
Bound()
const {
return bound; }
321 BoundType<MetricType>&
Bound() {
return bound; }
324 const StatisticType&
Stat()
const {
return stat; }
326 StatisticType&
Stat() {
return stat; }
347 const MatType&
Dataset()
const {
return *dataset; }
352 MetricType
Metric()
const {
return MetricType(); }
361 template<
typename VecType>
363 const VecType& point,
370 template<
typename VecType>
372 const VecType& point,
421 {
return (child == 0) ? left : right; }
450 size_t Point(
const size_t index)
const;
455 return bound.MinDistance(other.
Bound());
461 return bound.MaxDistance(other.
Bound());
467 return bound.RangeDistance(other.
Bound());
471 template<
typename VecType>
476 return bound.MinDistance(point);
480 template<
typename VecType>
485 return bound.MaxDistance(point);
489 template<
typename VecType>
494 return bound.RangeDistance(point);
498 size_t Begin()
const {
return begin; }
503 size_t Count()
const {
return count; }
508 void Center(arma::vec& center)
const { bound.Center(center); }
517 void SplitNode(
const size_t maxLeafSize,
518 SplitType<BoundType<MetricType>, MatType>& splitter);
528 void SplitNode(std::vector<size_t>& oldFromNew,
529 const size_t maxLeafSize,
530 SplitType<BoundType<MetricType>, MatType>& splitter);
538 template<
typename BoundType2>
539 void UpdateBound(BoundType2& boundToUpdate);
559 friend class cereal::access;
565 template<
typename Archive>
566 void serialize(Archive& ar,
const uint32_t version);
573 #include "binary_space_tree_impl.hpp" 576 #include "../binary_space_tree.hpp" ~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 Center(arma::vec ¢er) const
Store the center of the bounding region in the given vector.
typename enable_if< B, T >::type enable_if_t
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.
Linear algebra utility functions, generally performed on matrices or vectors.
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.
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.
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.
void serialize(Archive &ar, const uint32_t version)
Serialize the tree.
Empty statistic if you are not interested in storing statistics in your tree.
ElemType FurthestDescendantDistance() const
Return the furthest possible descendant distance.