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 size_t 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 size_t 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:23
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