1#ifndef KNNCOLLE_REPORT_ALL_NEIGHBORS_HPP 
    2#define KNNCOLLE_REPORT_ALL_NEIGHBORS_HPP 
   22template<
typename Index_>
 
   24    return (count ? count - 1 : 0);
 
 
   32template<
bool do_indices_, 
bool do_distances_, 
typename Distance_, 
typename Index_>
 
   33void report_all_neighbors_raw(std::vector<std::pair<Distance_, Index_> >& all_neighbors, std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances, Index_ i) {
 
   34    std::sort(all_neighbors.begin(), all_neighbors.end());
 
   36    auto target_size = count_all_neighbors_without_self(all_neighbors.size());
 
   37    if constexpr(do_indices_) {
 
   38        output_indices->clear();
 
   39        output_indices->reserve(target_size);
 
   41    if constexpr(do_distances_) {
 
   42        output_distances->clear();
 
   43        output_distances->reserve(target_size);
 
   46    for (
const auto& an : all_neighbors) {
 
   48            if constexpr(do_indices_) {
 
   49                output_indices->push_back(an.second);
 
   51            if constexpr(do_distances_) {
 
   52                output_distances->push_back(an.first);
 
   58template<
bool do_indices_, 
bool do_distances_, 
typename Distance_, 
typename Index_>
 
   59void report_all_neighbors_raw(std::vector<std::pair<Distance_, Index_> >& all_neighbors, std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
 
   60    std::sort(all_neighbors.begin(), all_neighbors.end());
 
   62    auto target_size = all_neighbors.size();
 
   63    if constexpr(do_indices_) {
 
   64        output_indices->clear();
 
   65        output_indices->reserve(target_size);
 
   67    if constexpr(do_distances_) {
 
   68        output_distances->clear();
 
   69        output_distances->reserve(target_size);
 
   72    for (
const auto& an : all_neighbors) {
 
   73        if constexpr(do_indices_) {
 
   74            output_indices->push_back(an.second);
 
   76        if constexpr(do_distances_) {
 
   77            output_distances->push_back(an.first);
 
  105template<
typename Distance_, 
typename Index_>
 
  106void report_all_neighbors(std::vector<std::pair<Distance_, Index_> >& all_neighbors, std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances, Index_ self) {
 
  107    if (output_indices && output_distances) {
 
  108        internal::report_all_neighbors_raw<true, true>(all_neighbors, output_indices, output_distances, self);
 
  109    } 
else if (output_indices) {
 
  110        internal::report_all_neighbors_raw<true, false>(all_neighbors, output_indices, output_distances, self);
 
  111    } 
else if (output_distances) {
 
  112        internal::report_all_neighbors_raw<false, true>(all_neighbors, output_indices, output_distances, self);
 
 
  132template<
typename Distance_, 
typename Index_>
 
  133void report_all_neighbors(std::vector<std::pair<Distance_, Index_> >& all_neighbors, std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
 
  134    if (output_indices && output_distances) {
 
  135        internal::report_all_neighbors_raw<true, true>(all_neighbors, output_indices, output_distances);
 
  136    } 
else if (output_indices) {
 
  137        internal::report_all_neighbors_raw<true, false>(all_neighbors, output_indices, output_distances);
 
  138    } 
else if (output_distances) {
 
  139        internal::report_all_neighbors_raw<false, true>(all_neighbors, output_indices, output_distances);
 
 
Collection of KNN algorithms.
Definition Bruteforce.hpp:24
 
Index_ count_all_neighbors_without_self(Index_ count)
Definition report_all_neighbors.hpp:23
 
void report_all_neighbors(std::vector< std::pair< Distance_, Index_ > > &all_neighbors, std::vector< Index_ > *output_indices, std::vector< Distance_ > *output_distances, Index_ self)
Definition report_all_neighbors.hpp:106