12#if defined(__GNUC__) && !defined(__clang__)
13#pragma GCC diagnostic warning "-Wfree-nonheap-object"
17#include "detray/utils/ranges.hpp"
24namespace detray::statistics {
27template <detray::ranges::range range_t>
28inline auto mean(
const range_t& r)
noexcept(
false)
29 -> detray::ranges::range_value_t<range_t> {
30 using value_t = detray::ranges::range_value_t<range_t>;
32 value_t sum = std::accumulate(r.begin(), r.end(), value_t{});
33 value_t mean = sum * (1.0f /
static_cast<value_t
>(r.size()));
39template <detray::ranges::range range_t>
42 const detray::ranges::range_value_t<range_t> mean)
noexcept(
false)
43 -> detray::ranges::range_value_t<range_t> {
44 using value_t = detray::ranges::range_value_t<range_t>;
46 std::vector<value_t> diff(r.size());
47 std::ranges::transform(r, diff.begin(),
48 [mean](value_t x) { return x - mean; });
50 std::inner_product(diff.begin(), diff.end(), diff.begin(), value_t{});
51 value_t variance = sq_sum * (1.0f /
static_cast<value_t
>(r.size()));
58template <detray::ranges::range range_t>
59inline auto variance(
const range_t& r)
noexcept(
false)
60 -> detray::ranges::range_value_t<range_t> {
61 using value_t = detray::ranges::range_value_t<range_t>;
68 value_t mean = statistics::mean(r);
70 std::vector<value_t> diff(r.size());
71 std::ranges::transform(r, diff.begin(),
72 [mean](value_t x) { return x - mean; });
74 std::inner_product(diff.begin(), diff.end(), diff.begin(), value_t{});
77 value_t variance = sq_sum * (1.0f /
static_cast<value_t
>(r.size() - 1u));