69 if (data.size() != m_acc_data.size())
70 throw std::runtime_error(
71 "The given data size does not fit the initialized size!");
74 std::ranges::transform(
75 data, m_acc_data.begin(),
78 auto const denominator =
static_cast<double>(m_n);
79 std::ranges::transform(m_acc_data, data, m_acc_data.begin(),
80 [denominator](
auto const &a,
double d) {
81 auto const old_mean = a.mean;
83 old_mean + (d - old_mean) / denominator;
85 a.m + (d - old_mean) * (d - new_mean);
86 return AccumulatorData<double>{new_mean, new_m};
105inline std::vector<double> Accumulator::variance()
const {
106 std::vector<double> res{};
108 res = std::vector<double>(m_acc_data.size(),
109 std::numeric_limits<double>::max());
111 auto const denominator =
static_cast<double>(m_n) - 1.;
112 std::ranges::transform(m_acc_data, std::back_inserter(res),
113 [denominator](
auto const &acc_data) {
114 return acc_data.m / denominator;
123inline std::vector<double> Accumulator::std_error()
const {
124 auto const var = variance();
125 std::vector<double> err{};
126 auto const denominator =
static_cast<double>(m_n);
127 std::ranges::transform(var, std::back_inserter(err), [denominator](
double d) {
128 return std::sqrt(d / denominator);