Pure virtual sorting implementation - derived classes implement this.
214 {
215 const auto analysis_it =
input.metadata.find(
"vision_analysis");
216 if (analysis_it ==
input.metadata.end() || !analysis_it->second.has_value()) {
217 error<std::runtime_error>(
220 std::source_location::current(),
221 "VisionSorter: no vision_analysis in input metadata");
222 }
223
224 auto analysis = safe_any_cast_or_throw<VisionAnalysis>(analysis_it->second);
225
226 const bool descending = (this->
get_direction() == SortingDirection::DESCENDING);
227
228 auto sort_collection = [&]<
typename T>(std::vector<T>& coll) {
229 const size_t n = coll.size();
230 std::vector<size_t> idx(n);
231 std::iota(idx.begin(), idx.end(), 0);
232 std::stable_sort(idx.begin(), idx.end(),
233 [&](
size_t a,
size_t b) {
234 const float ka = m_key_fn
235 ? m_key_fn(a, analysis)
236 : key_for(a, coll, analysis);
237 const float kb = m_key_fn
238 ? m_key_fn(b, analysis)
239 : key_for(b, coll, analysis);
240 return descending ? ka > kb : ka < kb;
241 });
242 std::vector<T> sorted(n);
243 for (size_t i = 0; i < n; ++i)
244 sorted[i] = coll[idx[i]];
245 coll = std::move(sorted);
246 };
247
248 if (!analysis.frame.boxes.empty())
249 sort_collection(analysis.frame.boxes);
250 if (!analysis.frame.contours.empty())
251 sort_collection(analysis.frame.contours);
252
254 out.metadata =
input.metadata;
255 out.metadata["vision_analysis"] = std::move(analysis);
256 return out;
257 }
Core::GlobalInputConfig input
SortingDirection get_direction() const
Datum< OutputType > output_type
@ ComputeMatrix
Compute operations (Yantra - algorithms, matrices, DSP)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
T data
The actual computation data.