12 #ifndef MLPACK_CORE_TREE_OCTREE_OCTREE_HPP
13 #define MLPACK_CORE_TREE_OCTREE_OCTREE_HPP
16 #include "../hrectbound.hpp"
17 #include "../statistic.hpp"
23 typename StatisticType = EmptyStatistic,
24 typename MatType = arma::mat>
34 template<
typename RuleType>
38 template<
typename RuleType>
43 std::vector<Octree*> children;
76 Octree(
const MatType& data,
const size_t maxLeafSize = 20);
90 Octree(
const MatType& data,
91 std::vector<size_t>& oldFromNew,
92 const size_t maxLeafSize = 20);
109 Octree(
const MatType& data,
110 std::vector<size_t>& oldFromNew,
111 std::vector<size_t>& newFromOld,
112 const size_t maxLeafSize = 20);
122 Octree(MatType&& data,
const size_t maxLeafSize = 20);
137 std::vector<size_t>& oldFromNew,
138 const size_t maxLeafSize = 20);
156 std::vector<size_t>& oldFromNew,
157 std::vector<size_t>& newFromOld,
158 const size_t maxLeafSize = 20);
176 const arma::vec& center,
178 const size_t maxLeafSize = 20);
203 std::vector<size_t>& oldFromNew,
204 const arma::vec& center,
206 const size_t maxLeafSize = 20);
228 template<
typename Archive>
231 const typename boost::enable_if<typename Archive::is_loading>::type* = 0);
239 const MatType&
Dataset()
const {
return *dataset; }
252 const StatisticType&
Stat()
const {
return stat; }
254 StatisticType&
Stat() {
return stat; }
260 MetricType
Metric()
const {
return MetricType(); }
266 template<
typename VecType>
268 const VecType& point,
275 template<
typename VecType>
277 const VecType& point,
326 const Octree&
Child(
const size_t child)
const {
return *children[child]; }
357 size_t Point(
const size_t index)
const;
367 template<
typename VecType>
369 const VecType& point,
372 template<
typename VecType>
374 const VecType& point,
377 template<
typename VecType>
379 const VecType& point,
386 template<
typename Archive>
387 void Serialize(Archive& ar,
const unsigned int );
399 friend class boost::serialization::access;
410 void SplitNode(
const arma::vec& center,
412 const size_t maxLeafSize);
423 void SplitNode(
const arma::vec& center,
425 std::vector<size_t>& oldFromNew,
426 const size_t maxLeafSize);
434 SplitInfo(
const size_t d,
const arma::vec& c) : d(d), center(c) {}
439 const arma::vec& center;
441 template<
typename VecType>
442 static bool AssignToLeftNode(
const VecType& point,
const SplitInfo& s)
444 return point[s.d] < s.center[s.d];
453 #include "octree_impl.hpp"
ElemType ParentDistance() const
Return the distance from the center of this node to the center of the parent node.
A dual-tree traverser; see dual_tree_traverser.hpp.
Octree()
A default constructor.
MetricType Metric() const
Return the metric that this tree uses.
const MatType & Dataset() const
Return the dataset used by this node.
size_t GetFurthestChild(const VecType &point, typename boost::enable_if< IsVector< VecType > >::type *=0) const
Return the index of the furthest child node to the given query point.
ElemType FurthestPointDistance() const
Return the furthest distance to a point held in this node.
ElemType MinimumBoundDistance() const
Return the minimum distance from the center of the node to any bound edge.
MatType::elem_type ElemType
The type of element held in MatType.
The core includes that mlpack expects; standard C++ includes and Armadillo.
const bound::HRectBound< MetricType > & Bound() const
Return the bound object for this node.
bound::HRectBound< MetricType > & Bound()
Modify the bound object for this node.
const StatisticType & Stat() const
Return the statistic object for this node.
math::RangeType< ElemType > RangeDistance(const Octree &other) const
Return the minimum and maximum distance to another node.
bool IsLeaf() const
Return whether or not the node is a leaf.
Octree * Parent() const
Get the pointer to the parent.
size_t NumChildren() const
Return the number of children in this node.
void Center(arma::Col< ElemType > ¢er) const
Calculates the center of the range, placing it into the given vector.
const Octree & Child(const size_t child) const
Return the specified child.
size_t Point(const size_t index) const
Return the index (with reference to the dataset) of a particular point in this node.
~Octree()
Destroy the tree.
size_t NumPoints() const
Return the number of points in this node (0 if not a leaf).
A single-tree traverser; see single_tree_traverser.hpp.
void Serialize(Archive &ar, const unsigned int)
Serialize the tree.
ElemType & ParentDistance()
Modify the distance from the center of this node to the center of the parent node.
ElemType FurthestDescendantDistance() const
Return the furthest possible descendant distance.
void Center(arma::vec ¢er) const
Store the center of the bounding region in the given vector.
size_t GetNearestChild(const VecType &point, typename boost::enable_if< IsVector< VecType >>::type *=0) const
Return the index of the nearest child node to the given query point.
Octree & Child(const size_t child)
Return the specified child.
StatisticType & Stat()
Modify the statistic object for this node.
ElemType MinDistance(const Octree &other) const
Return the minimum distance to another node.
Octree *& Parent()
Modify the pointer to the parent (be careful!).
size_t Descendant(const size_t index) const
Return the index (with reference to the dataset) of a particular descendant.
MatType Mat
So other classes can use TreeType::Mat.
size_t NumDescendants() const
Return the number of descendants of this node.
LMetric< 2, true > EuclideanDistance
The Euclidean (L2) distance.
Octree *& ChildPtr(const size_t child)
Return the pointer to the given child.
If value == true, then VecType is some sort of Armadillo vector or subview.
ElemType MaxDistance(const Octree &other) const
Return the maximum distance to another node.