121 auto& xbuffer = workspace.xbuffer;
123 auto& ybuffer = workspace.ybuffer;
126 auto quad = [](Float_ x) -> Float_ {
127 return x * x * x * x;
132 for (
size_t i = 0; i < n; ++i) {
134 xbuffer[counter] = mean[i];
136 ybuffer[counter] = std::pow(variance[i], 0.25);
138 ybuffer[counter] = variance[i];
145 throw std::runtime_error(
"not enough observations above the minimum mean");
148 auto& sorter = workspace.sorter;
149 sorter.set(counter, xbuffer.data());
150 auto& work = workspace.sort_workspace;
151 sorter.permute(std::array<Float_*, 2>{ xbuffer.data(), ybuffer.data() }, work);
168 Float_ left_x = xbuffer[0];
169 Float_ left_fitted = (options.
transform ? quad(fitted[0]) : fitted[0]);
171 sorter.unpermute(fitted, work);
178 for (
size_t i = n; i > 0; --i) {
182 fitted[j] = (options.
transform ? quad(fitted[counter]) : fitted[counter]);
184 fitted[j] = mean[j] / left_x * left_fitted;
188 for (
size_t i = 0; i < n; ++i) {
189 residuals[i] = variance[i] - fitted[i];
void compute(size_t num_points, const Data_ *x, const PrecomputedWindows< Data_ > &windows, const Data_ *y, Data_ *fitted, Data_ *robust_weights, const Options< Data_ > &opt)
void fit_variance_trend(size_t n, const Float_ *mean, const Float_ *variance, Float_ *fitted, Float_ *residuals, FitVarianceTrendWorkspace< Float_ > &workspace, const FitVarianceTrendOptions &options)
Definition fit_variance_trend.hpp:120