56 my_neighbors = sanisizer::cast<I<
decltype(my_neighbors)> >(k);
63 while (!my_nearest.empty()) {
81 return my_nearest.top().first;
89 return my_nearest.size();
100 void add(Index_ i, Distance_ d) {
101 my_nearest.emplace(d, i);
104 }
else if (
size() == my_neighbors) {
110 template<
bool has_indices_,
bool has_distances_>
111 void report_internal(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances,
const Index_ self) {
113 assert(!my_nearest.empty());
114 const Index_ num_expected =
size() - 1;
116 if constexpr(has_indices_) {
117 output_indices->clear();
118 output_indices->reserve(num_expected);
120 if constexpr(has_distances_) {
121 output_distances->clear();
122 output_distances->reserve(num_expected);
125 bool found_self =
false;
126 while (!my_nearest.empty()) {
127 const auto& top = my_nearest.top();
128 if (!found_self && top.second == self) {
131 if constexpr(has_indices_) {
132 output_indices->push_back(top.second);
134 if constexpr(has_distances_) {
135 output_distances->push_back(top.first);
143 if constexpr(has_indices_) {
144 std::reverse(output_indices->begin(), output_indices->end());
146 if constexpr(has_distances_) {
147 std::reverse(output_distances->begin(), output_distances->end());
153 if constexpr(has_indices_) {
154 output_indices->pop_back();
156 if constexpr(has_distances_) {
157 output_distances->pop_back();
178 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances, Index_ self) {
179 if (output_indices && output_distances) {
180 report_internal<true, true>(output_indices, output_distances, self);
181 }
else if (output_indices) {
182 report_internal<true, false>(output_indices, NULL, self);
183 }
else if (output_distances) {
184 report_internal<false, true>(NULL, output_distances, self);
189 template<
bool has_indices_,
bool has_distances_>
190 void report_internal(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
191 auto position = my_nearest.size();
193 if constexpr(has_indices_) {
194 sanisizer::resize(*output_indices, position);
196 if constexpr(has_distances_) {
197 sanisizer::resize(*output_distances, position);
200 while (!my_nearest.empty()) {
201 const auto& top = my_nearest.top();
203 if constexpr(has_indices_) {
204 (*output_indices)[position] = top.second;
206 if constexpr(has_distances_) {
207 (*output_distances)[position] = top.first;
223 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
224 if (output_indices && output_distances) {
225 report_internal<true, true>(output_indices, output_distances);
226 }
else if (output_indices) {
227 report_internal<true, false>(output_indices, NULL);
228 }
else if (output_distances) {
229 report_internal<false, true>(NULL, output_distances);
234 bool my_full =
false;
235 std::priority_queue<std::pair<Distance_, Index_> > my_nearest;
236 I<
decltype(my_nearest.size())> my_neighbors = 1;
void report(std::vector< Index_ > *output_indices, std::vector< Distance_ > *output_distances, Index_ self)
Definition NeighborQueue.hpp:178