knncolle
Collection of KNN methods in C++
Loading...
Searching...
No Matches
report_all_neighbors.hpp
Go to the documentation of this file.
1#ifndef KNNCOLLE_REPORT_ALL_NEIGHBORS_HPP
2#define KNNCOLLE_REPORT_ALL_NEIGHBORS_HPP
3
4#include <algorithm>
5#include <vector>
6
12namespace knncolle {
13
22template<typename Index_>
24 return (count ? count - 1 : 0);
25}
26
30namespace internal {
31
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());
35
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);
40 }
41 if constexpr(do_distances_) {
42 output_distances->clear();
43 output_distances->reserve(target_size);
44 }
45
46 for (const auto& an : all_neighbors) {
47 if (an.second != i) {
48 if constexpr(do_indices_) {
49 output_indices->push_back(an.second);
50 }
51 if constexpr(do_distances_) {
52 output_distances->push_back(an.first);
53 }
54 }
55 }
56}
57
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());
61
62 size_t target_size = all_neighbors.size();
63 if constexpr(do_indices_) {
64 output_indices->clear();
65 output_indices->reserve(target_size);
66 }
67 if constexpr(do_distances_) {
68 output_distances->clear();
69 output_distances->reserve(target_size);
70 }
71
72 for (const auto& an : all_neighbors) {
73 if constexpr(do_indices_) {
74 output_indices->push_back(an.second);
75 }
76 if constexpr(do_distances_) {
77 output_distances->push_back(an.first);
78 }
79 }
80}
81
82}
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);
113 }
114}
115
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);
140 }
141}
142
143}
144
145#endif
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