1#ifndef WEIGHTEDLOWESS_SORTBY_HPP
2#define WEIGHTEDLOWESS_SORTBY_HPP
9#include <initializer_list>
12#include "sanisizer/sanisizer.hpp"
34 std::vector<std::size_t> my_permutation;
35 bool my_sorted =
true;
43 template<
typename Sortable_>
44 SortBy(
const std::size_t num_points,
const Sortable_* x) {
59 template<
typename Sortable_>
60 void set(
const std::size_t num_points,
const Sortable_* x) {
62 my_sorted = std::is_sorted(x, x + num_points);
64 sanisizer::resize(my_permutation, num_points);
65 std::iota(my_permutation.begin(), my_permutation.end(),
static_cast<std::size_t
>(0));
66 std::sort(my_permutation.begin(), my_permutation.end(), [&](std::size_t left, std::size_t right) ->
bool { return x[left] < x[right]; });
72 template<
typename AllData_,
typename Used_>
73 void permute_raw(AllData_& data, Used_* work)
const {
78 const auto num_points = my_permutation.size();
79 std::fill_n(work, num_points, 0);
82 for (
decltype(internal::I(num_points)) i = 0; i < num_points; ++i) {
88 std::size_t current = i, replacement = my_permutation[i];
89 while (replacement != i) {
90 if constexpr(std::is_pointer<AllData_>::value) {
91 std::swap(data[current], data[replacement]);
94 std::swap(d[current], d[replacement]);
97 current = replacement;
98 work[replacement] = 1;
99 replacement = my_permutation[replacement];
113 template<
typename Data_,
typename Used_>
114 void permute(Data_* data, Used_* work)
const {
115 permute_raw(data, work);
126 template<
typename Data_,
typename Used_>
127 void permute(std::initializer_list<Data_> data, Used_* work)
const {
128 permute_raw(data, work);
139 template<
typename DataPo
inters_,
typename Used_>
140 void permute(DataPointers_ data, Used_* work)
const {
141 permute_raw(data, work);
152 template<
typename Data_,
typename Used_>
153 void permute(Data_* data, std::vector<Used_>& work)
const {
154 const auto num_points = my_permutation.size();
155 sanisizer::resize(work, num_points);
167 template<
typename Data_,
typename Used_>
168 void permute(std::initializer_list<Data_> data, std::vector<Used_>& work)
const {
169 const auto num_points = my_permutation.size();
170 sanisizer::resize(work, num_points);
182 template<
typename DataPo
inters_,
typename Used_>
183 void permute(DataPointers_ data, std::vector<Used_>& work)
const {
184 const auto num_points = my_permutation.size();
185 sanisizer::resize(work, num_points);
190 template<
typename AllData_,
typename Used_>
191 void unpermute_raw(AllData_& data, Used_* work)
const {
196 const auto num_points = my_permutation.size();
197 std::fill_n(work, num_points, 0);
199 for (
decltype(internal::I(num_points)) i = 0; i < num_points; ++i) {
205 auto replacement = my_permutation[i];
206 while (replacement != i) {
207 if constexpr(std::is_pointer<AllData_>::value) {
208 std::swap(data[i], data[replacement]);
210 for (
auto d : data) {
211 std::swap(d[i], d[replacement]);
214 work[replacement] = 1;
215 replacement = my_permutation[replacement];
228 template<
typename Data_,
typename Used_>
230 unpermute_raw(data, work);
240 template<
typename Data_,
typename Used_>
241 void unpermute(std::initializer_list<Data_*> data, Used_* work)
const {
242 unpermute_raw(data, work);
252 template<
typename DataPo
inters_,
typename Used_>
254 unpermute_raw(data, work);
264 template<
typename Data_,
typename Used_>
265 void unpermute(Data_* data, std::vector<Used_>& work)
const {
266 const auto num_points = my_permutation.size();
267 sanisizer::resize(work, num_points);
278 template<
typename Data_,
typename Used_>
279 void unpermute(std::initializer_list<Data_*> data, std::vector<Used_>& work)
const {
280 const auto num_points = my_permutation.size();
281 sanisizer::resize(work, num_points);
292 template<
typename DataPo
inters_,
typename Used_>
293 void unpermute(DataPointers_ data, std::vector<Used_>& work)
const {
294 const auto num_points = my_permutation.size();
295 sanisizer::resize(work, num_points);
Utility class for sorting on a covariate.
Definition SortBy.hpp:32
void unpermute(Data_ *data, std::vector< Used_ > &work) const
Definition SortBy.hpp:265
void unpermute(Data_ *data, Used_ *work) const
Definition SortBy.hpp:229
void unpermute(std::initializer_list< Data_ * > data, std::vector< Used_ > &work) const
Definition SortBy.hpp:279
void unpermute(DataPointers_ data, Used_ *work) const
Definition SortBy.hpp:253
void permute(std::initializer_list< Data_ > data, std::vector< Used_ > &work) const
Definition SortBy.hpp:168
void permute(std::initializer_list< Data_ > data, Used_ *work) const
Definition SortBy.hpp:127
void unpermute(std::initializer_list< Data_ * > data, Used_ *work) const
Definition SortBy.hpp:241
void permute(Data_ *data, std::vector< Used_ > &work) const
Definition SortBy.hpp:153
void permute(DataPointers_ data, std::vector< Used_ > &work) const
Definition SortBy.hpp:183
void set(const std::size_t num_points, const Sortable_ *x)
Definition SortBy.hpp:60
void permute(DataPointers_ data, Used_ *work) const
Definition SortBy.hpp:140
void permute(Data_ *data, Used_ *work) const
Definition SortBy.hpp:114
void unpermute(DataPointers_ data, std::vector< Used_ > &work) const
Definition SortBy.hpp:293
SortBy(const std::size_t num_points, const Sortable_ *x)
Definition SortBy.hpp:44
Namespace for LOWESS functions.
Definition compute.hpp:18