68 CustomOrder<Index_, Float_, Matrix_> runner(num_dim, num_obs, batches, output, *builder, options.
num_neighbors, options.
order, options.
mass_cap, options.
num_threads);
73 AutomaticOrder<Index_, Float_, Matrix_> runner(num_dim, num_obs, batches, output, *builder, options.
num_neighbors, options.
reference_policy, options.
mass_cap, options.
num_threads);
80 CustomOrder<Index_, Float_, Matrix_> runner(num_dim, num_obs, batches, output, *builder, options.
num_neighbors, trivial_order, options.
mass_cap, options.
num_threads);
135 auto stats = internal::compute(num_dim, num_obs, batches, output, options);
136 internal::restore_order(num_dim, stats.merge_order, num_obs, output);
165 std::vector<const Float_*> batches;
166 batches.reserve(num_obs.size());
167 for (
auto n : num_obs) {
168 batches.push_back(input);
169 input +=
static_cast<std::size_t
>(n) * num_dim;
171 return compute(num_dim, num_obs, batches, output, options);
199 const BatchIndex nbatches = (num_obs ?
static_cast<BatchIndex>(*std::max_element(batch, batch + num_obs)) + 1 : 0);
200 std::vector<Index_> sizes(nbatches);
201 for (Index_ o = 0; o < num_obs; ++o) {
207 bool already_sorted =
true;
208 for (Index_ o = 1; o < num_obs; ++o) {
209 if (batch[o] < batch[o-1]) {
210 already_sorted =
false;
214 if (already_sorted) {
215 return compute(num_dim, sizes, input, output, options);
218 std::size_t accumulated = 0;
219 std::vector<std::size_t> offsets(nbatches);
221 offsets[b] = accumulated;
222 accumulated += sizes[b];
226 std::vector<Float_> tmp(num_dim *
static_cast<std::size_t
>(num_obs));
227 std::vector<const Float_*> ptrs(nbatches);
229 ptrs[b] = tmp.data() + offsets[b] * num_dim;
232 for (Index_ o = 0; o < num_obs; ++o) {
233 auto current = input +
static_cast<std::size_t
>(o) * num_dim;
234 auto& offset = offsets[batch[o]];
235 auto destination = tmp.data() + num_dim * offset;
236 std::copy_n(current, num_dim, destination);
240 auto stats = internal::compute(num_dim, sizes, ptrs, output, options);
241 internal::restore_order(num_dim, stats.merge_order, sizes, batch, output);