151 const Float_*
const mean,
152 const Float_*
const variance,
153 Float_*
const fitted,
154 Float_*
const residual,
158 auto& xbuffer = workspace.xbuffer;
159 sanisizer::resize(xbuffer, n);
160 auto& ybuffer = workspace.ybuffer;
161 sanisizer::resize(ybuffer, n);
163 const auto quad = [](Float_ x) -> Float_ {
164 return x * x * x * x;
167 std::size_t counter = 0;
169 for (I<
decltype(n)> i = 0; i < n; ++i) {
171 xbuffer[counter] = mean[i];
173 ybuffer[counter] = std::pow(variance[i], 0.25);
175 ybuffer[counter] = variance[i];
182 throw std::runtime_error(
"not enough observations above the minimum mean");
185 auto& sorter = workspace.sorter;
186 sorter.set(counter, xbuffer.data());
187 auto& work = workspace.sort_workspace;
188 sorter.permute(std::array<Float_*, 2>{ xbuffer.data(), ybuffer.data() }, work);
205 const Float_ left_x = xbuffer[0];
206 const Float_ left_fitted = (options.
transform ? quad(fitted[0]) : fitted[0]);
208 sorter.unpermute(fitted, work);
215 for (
auto i = n; i > 0; --i) {
219 fitted[j] = (options.
transform ? quad(fitted[counter]) : fitted[counter]);
221 fitted[j] = mean[j] / left_x * left_fitted;
225 for (I<
decltype(n)> i = 0; i < n; ++i) {
226 residual[i] = variance[i] - fitted[i];
void compute(const std::size_t num_points, const Data_ *const x, const PrecomputedWindows< Data_ > &windows, const Data_ *const y, Data_ *const fitted, Data_ *robust_weights, const Options< Data_ > &opt)
void fit_variance_trend(const std::size_t n, const Float_ *const mean, const Float_ *const variance, Float_ *const fitted, Float_ *const residual, FitVarianceTrendWorkspace< Float_ > &workspace, const FitVarianceTrendOptions &options)
Definition fit_variance_trend.hpp:149