52 my_neighbors = sanisizer::cast<I<
decltype(my_neighbors)> >(sanisizer::attest_gez(k));
59 while (!my_nearest.empty()) {
77 return my_nearest.top().first;
88 void add(Index_ i, Distance_ d) {
90 my_nearest.emplace(d, i);
91 if (my_nearest.size() == my_neighbors) {
95 my_nearest.emplace(d, i);
102 template<
bool has_indices_,
bool has_distances_>
103 void report_internal(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances,
const Index_ self) {
106 assert(!my_nearest.empty());
107 const Index_ num_expected = my_nearest.size() - 1;
109 if constexpr(has_indices_) {
110 output_indices->clear();
111 output_indices->reserve(num_expected);
113 if constexpr(has_distances_) {
114 output_distances->clear();
115 output_distances->reserve(num_expected);
118 bool found_self =
false;
119 while (!my_nearest.empty()) {
120 const auto& top = my_nearest.top();
121 if (!found_self && top.second == self) {
124 if constexpr(has_indices_) {
125 output_indices->push_back(top.second);
127 if constexpr(has_distances_) {
128 output_distances->push_back(top.first);
136 if constexpr(has_indices_) {
137 std::reverse(output_indices->begin(), output_indices->end());
139 if constexpr(has_distances_) {
140 std::reverse(output_distances->begin(), output_distances->end());
146 if constexpr(has_indices_) {
147 output_indices->pop_back();
149 if constexpr(has_distances_) {
150 output_distances->pop_back();
168 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances, Index_ self) {
169 if (output_indices && output_distances) {
170 report_internal<true, true>(output_indices, output_distances, self);
171 }
else if (output_indices) {
172 report_internal<true, false>(output_indices, NULL, self);
173 }
else if (output_distances) {
174 report_internal<false, true>(NULL, output_distances, self);
179 template<
bool has_indices_,
bool has_distances_>
180 void report_internal(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
181 auto position = my_nearest.size();
183 if constexpr(has_indices_) {
184 sanisizer::resize(*output_indices, position);
186 if constexpr(has_distances_) {
187 sanisizer::resize(*output_distances, position);
190 while (!my_nearest.empty()) {
191 const auto& top = my_nearest.top();
193 if constexpr(has_indices_) {
194 (*output_indices)[position] = top.second;
196 if constexpr(has_distances_) {
197 (*output_distances)[position] = top.first;
214 void report(std::vector<Index_>* output_indices, std::vector<Distance_>* output_distances) {
215 if (output_indices && output_distances) {
216 report_internal<true, true>(output_indices, output_distances);
217 }
else if (output_indices) {
218 report_internal<true, false>(output_indices, NULL);
219 }
else if (output_distances) {
220 report_internal<false, true>(NULL, output_distances);
225 bool my_full =
false;
226 std::priority_queue<std::pair<Distance_, Index_> > my_nearest;
227 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:168