133 const Float_*
const mean,
134 const Float_*
const variance,
135 Float_*
const fitted,
136 Float_*
const residuals,
140 auto& xbuffer = workspace.xbuffer;
141 sanisizer::resize(xbuffer, n);
142 auto& ybuffer = workspace.ybuffer;
143 sanisizer::resize(ybuffer, n);
145 const auto quad = [](Float_ x) -> Float_ {
146 return x * x * x * x;
149 std::size_t counter = 0;
151 for (
decltype(I(n)) i = 0; i < n; ++i) {
153 xbuffer[counter] = mean[i];
155 ybuffer[counter] = std::pow(variance[i], 0.25);
157 ybuffer[counter] = variance[i];
164 throw std::runtime_error(
"not enough observations above the minimum mean");
167 auto& sorter = workspace.sorter;
168 sorter.set(counter, xbuffer.data());
169 auto& work = workspace.sort_workspace;
170 sorter.permute(std::array<Float_*, 2>{ xbuffer.data(), ybuffer.data() }, work);
187 const Float_ left_x = xbuffer[0];
188 const Float_ left_fitted = (options.
transform ? quad(fitted[0]) : fitted[0]);
190 sorter.unpermute(fitted, work);
197 for (
auto i = n; i > 0; --i) {
201 fitted[j] = (options.
transform ? quad(fitted[counter]) : fitted[counter]);
203 fitted[j] = mean[j] / left_x * left_fitted;
207 for (
decltype(I(n)) i = 0; i < n; ++i) {
208 residuals[i] = variance[i] - fitted[i];
void compute(const std::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(const std::size_t n, const Float_ *const mean, const Float_ *const variance, Float_ *const fitted, Float_ *const residuals, FitVarianceTrendWorkspace< Float_ > &workspace, const FitVarianceTrendOptions &options)
Definition fit_variance_trend.hpp:131