30 auto [sx, sy, sw, sxx, syy, sxy] = state;
31 return load_state(sx, sy, sw, sxx, syy, sxy);
34 inline void operator()(T x, T y)
noexcept
36 T dx = x * sum_w - sum_x;
37 T dy = y * sum_w - sum_y;
41 T f = 1. / (sum_w * sum_w_old);
42 sum_xx += f * dx * dx;
43 sum_yy += f * dy * dy;
44 sum_xy += f * dx * dy;
52 inline void operator()(T x, T y, T w)
noexcept
54 T dx = x * sum_w - sum_x;
55 T dy = y * sum_w - sum_y;
61 T f = w / (sum_w * sum_w_old);
62 sum_xx += f * dx * dx;
63 sum_yy += f * dy * dy;
64 sum_xy += f * dx * dy;
70 requires eve::simd_value<T> && eve::simd_compatible_ptr<U, T>
71 inline void operator()(U
const* x, U
const* y)
noexcept
77 requires eve::simd_value<T> && eve::simd_compatible_ptr<U, T>
78 inline void operator()(U
const* x, U
const* y, U
const* w)
noexcept
80 (*this)(T{x}, T{y}, T{w});
84 auto stats()
const noexcept -> std::tuple<double, double, double, double, double, double>
86 if constexpr (std::is_floating_point_v<T>) {
87 return { sum_w, sum_x, sum_y, sum_xx, sum_yy, sum_xy };
89 auto [sxx, syy, sxy] = combine(sum_w, sum_x, sum_y, sum_xx, sum_yy, sum_xy);
90 return { eve::reduce(sum_w), eve::reduce(sum_x), eve::reduce(sum_y), sxx, syy, sxy };
121 double sample_variance_x;
122 double sample_variance_y;
125 double sample_covariance;
127 template <
typename T>
130 auto [sw, sx, sy, sxx, syy, sxy] = accumulator.stats();
139 variance_x = sxx / sw;
140 variance_y = syy / sw;
141 sample_variance_x = sxx / (sw - 1);
142 sample_variance_y = syy / (sw - 1);
144 if (!(sxx > 0 && syy > 0)) {
145 correlation =
static_cast<double>(sxx == syy);
147 correlation = sxy / std::sqrt(sxx * syy);
150 covariance = sxy / sw;
151 sample_covariance = sxy / (sw - 1);