Program Listing for File CoverTree.hpp
↰ Return to documentation for file (include\DimRedTools\CoverTree.hpp
)
#ifndef DIMREDTOOLS_INCLUDE_DIMREDTOOLS_COVERTREE_HPP_
#define DIMREDTOOLS_INCLUDE_DIMREDTOOLS_COVERTREE_HPP_
#include "DimRedTools.hpp"
#include <cfloat>
namespace dim_red {
class CoverTree : public NearestNeighbors {
public:
CoverTree(const Eigen::Ref<const Matrix> &x, double base = 1.3,
const std::string &metric = "euclidean");
~CoverTree();
std::pair<Vector, IntVector> query(const Eigen::Ref<const Vector> &point, int k,
bool sort_results = true) const override;
std::pair<Vector, IntVector> queryRadius(const Eigen::Ref<const Vector> &point, double radius,
bool sort_results = false) const override;
private:
struct Node {
const int point;
const double max_distance = 0.0;
const std::vector<Node *> *const children = nullptr;
Node(const Node &) = delete;
};
struct DistanceSet {
const int point;
std::vector<double> distances;
DistanceSet(const DistanceSet &) = delete;
};
struct DistanceNode {
const double distance;
const Node *node;
};
void deleteNode(Node *node) const;
Node *build();
Node *batchInsert(int point, int max_scale, int top_scale,
std::vector<DistanceSet *> *point_set,
std::vector<DistanceSet *> *consumed_set) const;
double getCoverRadius(int scale) const;
int getScale(double value) const;
double maxDistance(const std::vector<DistanceSet *> &v) const;
void split(int max_scale, std::vector<DistanceSet *> *point_set,
std::vector<DistanceSet *> *far_set) const;
void distanceSplit(int new_point, int max_scale, std::vector<DistanceSet *> *point_set,
std::vector<DistanceSet *> *new_point_set) const;
std::pair<Vector, IntVector> search(const Eigen::Ref<const Vector> &point, int k, double radius,
bool k_nearest, bool sort_results) const;
const Eigen::Ref<const Matrix> data_;
Metric distance_;
double base_;
double inv_log_base_;
Node *root_;
};
} // namespace dim_red
#endif // DIMREDTOOLS_INCLUDE_DIMREDTOOLS_COVERTREE_HPP_