124 auto& xbuffer = workspace.xbuffer;
125 xbuffer.resize(sanisizer::cast<
decltype(xbuffer.size())>(n));
126 auto& ybuffer = workspace.ybuffer;
127 ybuffer.resize(sanisizer::cast<
decltype(ybuffer.size())>(n));
129 auto quad = [](Float_ x) -> Float_ {
130 return x * x * x * x;
133 std::size_t counter = 0;
135 for (
decltype(n) i = 0; i < n; ++i) {
137 xbuffer[counter] = mean[i];
139 ybuffer[counter] = std::pow(variance[i], 0.25);
141 ybuffer[counter] = variance[i];
148 throw std::runtime_error(
"not enough observations above the minimum mean");
151 auto& sorter = workspace.sorter;
152 sorter.set(counter, xbuffer.data());
153 auto& work = workspace.sort_workspace;
154 sorter.permute(std::array<Float_*, 2>{ xbuffer.data(), ybuffer.data() }, work);
171 Float_ left_x = xbuffer[0];
172 Float_ left_fitted = (options.
transform ? quad(fitted[0]) : fitted[0]);
174 sorter.unpermute(fitted, work);
181 for (
auto i = n; i > 0; --i) {
185 fitted[j] = (options.
transform ? quad(fitted[counter]) : fitted[counter]);
187 fitted[j] = mean[j] / left_x * left_fitted;
191 for (
decltype(n) i = 0; i < n; ++i) {
192 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(std::size_t n, const Float_ *mean, const Float_ *variance, Float_ *fitted, Float_ *residuals, FitVarianceTrendWorkspace< Float_ > &workspace, const FitVarianceTrendOptions &options)
Definition fit_variance_trend.hpp:123