vantage_point_split.hpp
Go to the documentation of this file.
1 
13 #ifndef MLPACK_CORE_TREE_BINARY_SPACE_TREE_VANTAGE_POINT_SPLIT_HPP
14 #define MLPACK_CORE_TREE_BINARY_SPACE_TREE_VANTAGE_POINT_SPLIT_HPP
15 
16 #include <mlpack/prereqs.hpp>
19 
20 namespace mlpack {
21 namespace tree {
22 
29 template<typename BoundType,
30  typename MatType = arma::mat,
31  size_t MaxNumSamples = 100>
33 {
34  public:
36  typedef typename MatType::elem_type ElemType;
38  typedef typename BoundType::MetricType MetricType;
40  struct SplitInfo
41  {
43  arma::Col<ElemType> vantagePoint;
45  ElemType mu;
47  const MetricType* metric;
48 
50  mu(0),
51  metric(NULL)
52  { }
53 
54  template<typename VecType>
55  SplitInfo(const MetricType& metric, const VecType& vantagePoint,
56  ElemType mu) :
57  vantagePoint(vantagePoint),
58  mu(mu),
59  metric(&metric)
60  { }
61  };
62 
74  static bool SplitNode(const BoundType& bound,
75  MatType& data,
76  const size_t begin,
77  const size_t count,
78  SplitInfo& splitInfo);
79 
92  static size_t PerformSplit(MatType& data,
93  const size_t begin,
94  const size_t count,
95  const SplitInfo& splitInfo)
96  {
97  return split::PerformSplit<MatType, VantagePointSplit>(data, begin, count,
98  splitInfo);
99  }
100 
116  static size_t PerformSplit(MatType& data,
117  const size_t begin,
118  const size_t count,
119  const SplitInfo& splitInfo,
120  std::vector<size_t>& oldFromNew)
121  {
122  return split::PerformSplit<MatType, VantagePointSplit>(data, begin, count,
123  splitInfo, oldFromNew);
124  }
125 
135  template<typename VecType>
136  static bool AssignToLeftNode(const VecType& point,
137  const SplitInfo& splitInfo)
138  {
139  return (splitInfo.metric->Evaluate(splitInfo.vantagePoint, point) <
140  splitInfo.mu);
141  }
142 
143  private:
161  static void SelectVantagePoint(const MetricType& metric,
162  const MatType& data,
163  const size_t begin,
164  const size_t count,
165  size_t& vantagePoint,
166  ElemType& mu);
167 };
168 
169 } // namespace tree
170 } // namespace mlpack
171 
172 // Include implementation.
173 #include "vantage_point_split_impl.hpp"
174 
175 #endif // MLPACK_CORE_TREE_BINARY_SPACE_TREE_VANTAGE_POINT_SPLIT_HPP
BoundType::MetricType MetricType
The bounding shape type.
Linear algebra utility functions, generally performed on matrices or vectors.
The core includes that mlpack expects; standard C++ includes and Armadillo.
static bool AssignToLeftNode(const VecType &point, const SplitInfo &splitInfo)
Indicates that a point should be assigned to the left subtree.
SplitInfo(const MetricType &metric, const VecType &vantagePoint, ElemType mu)
MatType::elem_type ElemType
The matrix element type.
A struct that contains an information about the split.
static size_t PerformSplit(MatType &data, const size_t begin, const size_t count, const SplitInfo &splitInfo)
Perform the split process according to the information about the split.
The class splits a binary space partitioning tree node according to the median distance to the vantag...
static bool SplitNode(const BoundType &bound, MatType &data, const size_t begin, const size_t count, SplitInfo &splitInfo)
Split the node according to the distance to a vantage point.
constexpr auto data(Container const &container) noexcept -> decltype(container.data())
Definition: iterator.hpp:79
arma::Col< ElemType > vantagePoint
The vantage point.
Miscellaneous math random-related routines.
auto count(Range &&rng, T const &value) -> enable_if_t< is_range< Range >::value, decltype(::std::count(::std::begin(::core::forward< Range >(rng)), ::std::end(::core::forward< Range >(rng)), value)) >
Definition: algorithm.hpp:225
ElemType mu
The median distance according to which the node will be split.
const MetricType * metric
An instance of the MetricType class.
static size_t PerformSplit(MatType &data, const size_t begin, const size_t count, const SplitInfo &splitInfo, std::vector< size_t > &oldFromNew)
Perform the split process according to the information about the split and return the list of changed...