Program Listing for File tree-builder.h

Return to documentation for file (algorithms/loopclosure/vocabulary-tree/include/vocabulary-tree/tree-builder.h)

// Original code Copyright Willowgarage as part of ROS, adapted here (BSD).
// http://ros.org/wiki/vocabulary_tree
#ifndef VOCABULARY_TREE_TREE_BUILDER_H_
#define VOCABULARY_TREE_TREE_BUILDER_H_

#include <deque>
#include <vector>

#include <vocabulary-tree/mutable-tree.h>
#include <vocabulary-tree/simple-kmeans.h>

namespace loop_closure {

// Class for building a new vocabulary by hierarchically clustering
// a set of training features.
template <class Feature, class Distance = distance::L2<Feature>,
          class FeatureAllocator = typename DefaultAllocator<Feature>::type>
class TreeBuilder {
 public:
  typedef MutableVocabularyTree<Feature, Distance, FeatureAllocator> Tree;
  typedef SimpleKmeans<Feature, Distance, FeatureAllocator> Kmeans;
  typedef std::vector<Feature, FeatureAllocator> FeatureVector;

  // - zero Object representing zero in the feature space
  // - d    Functor for calculating squared distance
  TreeBuilder(const Feature& zero = Feature(), Distance d = Distance());

  // Build a new vocabulary tree.
  // The number of words in the resulting vocabulary is at most k ^ levels.
  // - training_features The set of training features to cluster.
  // - k                 The branching factor, or max children of any node.
  // - levels            The number of levels in the tree.
  void Build(
      const FeatureVector& training_features, uint32_t k, uint32_t levels);

  // Get the built vocabulary tree.
  const Tree& tree() const {
    return tree_;
  }

  // Get the k-means clusterer.
  Kmeans& kmeans() {
    return kmeans_;
  }

  // Get the k-means clusterer.
  const Kmeans& kmeans() const {
    return kmeans_;
  }

 protected:
  Tree tree_;
  Kmeans kmeans_;
  Feature zero_;
  Distance distance_;
};
}  // namespace loop_closure

#include "impl/tree-builder-inl.h"
#endif  // VOCABULARY_TREE_TREE_BUILDER_H_