11 #ifndef MLPACK_CORE_TREE_SPILL_TREE_SPILL_TREE_HPP
12 #define MLPACK_CORE_TREE_SPILL_TREE_SPILL_TREE_HPP
15 #include "../space_split/midpoint_space_split.hpp"
16 #include "../statistic.hpp"
66 template<
typename MetricType,
67 typename StatisticType = EmptyStatistic,
68 typename MatType = arma::mat,
69 template<
typename HyperplaneMetricType>
71 template<
typename SplitMetricType,
typename SplitMatType>
72 class SplitType = MidpointSpaceSplit>
81 typedef typename HyperplaneType<MetricType>::BoundType
BoundType;
95 arma::Col<size_t>* pointsIndex;
99 HyperplaneType<MetricType> hyperplane;
108 ElemType furthestDescendantDistance;
113 const MatType* dataset;
121 template<
typename RuleType,
bool Defeatist = false>
128 template<
typename RuleType,
bool Defeatist = false>
133 template<
typename RuleType>
137 template<
typename RuleType>
141 template<
typename RuleType>
145 template<
typename RuleType>
159 const double tau = 0,
160 const size_t maxLeafSize = 20,
161 const double rho = 0.7);
175 const double tau = 0,
176 const size_t maxLeafSize = 20,
177 const double rho = 0.7);
191 arma::Col<size_t>& points,
192 const double tau = 0,
193 const size_t maxLeafSize = 20,
194 const double rho = 0.7);
231 template<
typename Archive>
249 const StatisticType&
Stat()
const {
return stat; }
251 StatisticType&
Stat() {
return stat; }
272 const MatType&
Dataset()
const {
return *dataset; }
275 bool Overlap()
const {
return overlappingNode; }
278 const HyperplaneType<MetricType>&
Hyperplane()
const {
return hyperplane; }
281 MetricType
Metric()
const {
return MetricType(); }
292 template<
typename VecType>
294 const VecType& point,
303 template<
typename VecType>
305 const VecType& point,
358 {
return (child == 0) ? left : right; }
387 size_t Point(
const size_t index)
const;
392 return bound.MinDistance(other.
Bound());
398 return bound.MaxDistance(other.
Bound());
404 return bound.RangeDistance(other.
Bound());
408 template<
typename VecType>
413 return bound.MinDistance(point);
417 template<
typename VecType>
422 return bound.MaxDistance(point);
426 template<
typename VecType>
431 return bound.RangeDistance(point);
438 void Center(arma::vec& center) { bound.Center(center); }
449 void SplitNode(arma::Col<size_t>& points,
450 const size_t maxLeafSize,
464 bool SplitPoints(
const double tau,
466 const arma::Col<size_t>& points,
467 arma::Col<size_t>& leftPoints,
468 arma::Col<size_t>& rightPoints);
479 friend class boost::serialization::access;
485 template<
typename Archive>
486 void serialize(Archive& ar,
const unsigned int version);
493 #include "spill_tree_impl.hpp"
496 #include "../spill_tree.hpp"
math::RangeType< ElemType > RangeDistance(const SpillTree &other) const
Return the minimum and maximum distance to another node.
static bool HasSelfChildren()
Returns false: this tree type does not have self children.
SpillTree & operator=(const SpillTree &other)
Copy the given Spill Tree.
HyperplaneBase< bound::HRectBound< MetricType >, AxisParallelProjVector > AxisOrthogonalHyperplane
AxisOrthogonalHyperplane represents a hyperplane orthogonal to an axis.
SpillTree & Child(const size_t child) const
Return the specified child (0 will be left, 1 will be right).
typename enable_if< B, T >::type enable_if_t
size_t NumChildren() const
Return the number of children in this node.
ElemType ParentDistance() const
Return the distance from the center of this node to the center of the parent node.
MetricType Metric() const
Get the metric that the tree uses.
const HyperplaneType< MetricType > & Hyperplane() const
Get the Hyperplane instance.
const StatisticType & Stat() const
Return the statistic object for this node.
The core includes that mlpack expects; standard C++ includes and Armadillo.
A generic single-tree traverser for hybrid spill trees; see spill_single_tree_traverser.hpp for implementation.
SpillTree()
A default constructor.
const BoundType & Bound() const
Return the bound object for this node.
size_t NumDescendants() const
Return the number of descendants of this node.
const MatType & Dataset() const
Get the dataset which the tree is built on.
ElemType MaxDistance(const VecType &point, typename std::enable_if_t< IsVector< VecType >::value > *=0) const
Return the maximum distance to another point.
SpillTree *& Parent()
Modify the parent of this node.
bool Overlap() const
Distinguish overlapping nodes from non-overlapping nodes.
StatisticType & Stat()
Return the statistic object for this node.
A hybrid spill tree is a variant of binary space trees in which the children of a node can "spill ove...
A generic dual-tree traverser for hybrid spill trees; see spill_dual_tree_traverser.hpp for implementation.
SpillTree * Left() const
Gets the left child of this node.
MatType Mat
So other classes can use TreeType::Mat.
ElemType FurthestPointDistance() const
Return the furthest distance to a point held in this node.
~SpillTree()
Deletes this node, deallocating the memory for the children and calling their destructors in turn...
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 (this is an efficient estimation...
bool IsLeaf() const
Return whether or not this node is a leaf (true if it has no children).
size_t Descendant(const size_t index) const
Return the index (with reference to the dataset) of a particular descendant of this node...
void Center(arma::vec ¢er)
Store the center of the bounding region in the given vector.
SpillTree *& Left()
Modify the left child of this node.
ElemType MaxDistance(const SpillTree &other) const
Return the maximum distance to another 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.
ElemType MinDistance(const SpillTree &other) const
Return the minimum distance to another node.
ElemType & ParentDistance()
Modify the distance from the center of this node to the center of the parent node.
BoundType & Bound()
Return the bound object for this node.
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 (this is an efficient estimation ...
void serialize(Archive &ar, const unsigned int version)
Serialize the tree.
SpillTree * Parent() const
Gets the parent of this node.
HyperplaneType< MetricType >::BoundType BoundType
The bound type.
SpillTree *& ChildPtr(const size_t child)
MatType::elem_type ElemType
The type of element held in MatType.
ElemType FurthestDescendantDistance() const
Return the furthest possible descendant distance.
size_t NumPoints() const
Return the number of points in this node (0 if not a leaf).
size_t Point(const size_t index) const
Return the index (with reference to the dataset) of a particular point in this node.
SpillTree *& Right()
Modify the right child of this node.
If value == true, then VecType is some sort of Armadillo vector or subview.
ElemType MinDistance(const VecType &point, typename std::enable_if_t< IsVector< VecType >::value > *=0) const
Return the minimum distance to another point.
SpillTree * Right() const
Gets the right child of this node.
ElemType MinimumBoundDistance() const
Return the minimum distance from the center of the node to any bound edge.