File indexing completed on 2026-05-27 07:24:14
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011
0012 #if defined(__GNUC__) && !defined(__clang__)
0013 #pragma GCC diagnostic warning "-Wfree-nonheap-object"
0014 #endif
0015
0016
0017 #include "detray/utils/ranges.hpp"
0018
0019
0020 #include <algorithm>
0021 #include <numeric>
0022 #include <type_traits>
0023
0024 namespace detray::statistics {
0025
0026
0027 template <detray::ranges::range range_t>
0028 inline auto mean(const range_t& r) noexcept(false)
0029 -> detray::ranges::range_value_t<range_t> {
0030 using value_t = detray::ranges::range_value_t<range_t>;
0031
0032 value_t sum = std::accumulate(r.begin(), r.end(), value_t{});
0033 value_t mean = sum * (1.0f / static_cast<value_t>(r.size()));
0034
0035 return mean;
0036 }
0037
0038
0039 template <detray::ranges::range range_t>
0040 inline auto rms(
0041 const range_t& r,
0042 const detray::ranges::range_value_t<range_t> mean) noexcept(false)
0043 -> detray::ranges::range_value_t<range_t> {
0044 using value_t = detray::ranges::range_value_t<range_t>;
0045
0046 std::vector<value_t> diff(r.size());
0047 std::ranges::transform(r, diff.begin(),
0048 [mean](value_t x) { return x - mean; });
0049 value_t sq_sum =
0050 std::inner_product(diff.begin(), diff.end(), diff.begin(), value_t{});
0051 value_t variance = sq_sum * (1.0f / static_cast<value_t>(r.size()));
0052
0053 return variance;
0054 }
0055
0056
0057
0058 template <detray::ranges::range range_t>
0059 inline auto variance(const range_t& r) noexcept(false)
0060 -> detray::ranges::range_value_t<range_t> {
0061 using value_t = detray::ranges::range_value_t<range_t>;
0062
0063
0064 if (r.size() == 1u) {
0065 return 0.f;
0066 }
0067
0068 value_t mean = statistics::mean(r);
0069
0070 std::vector<value_t> diff(r.size());
0071 std::ranges::transform(r, diff.begin(),
0072 [mean](value_t x) { return x - mean; });
0073 value_t sq_sum =
0074 std::inner_product(diff.begin(), diff.end(), diff.begin(), value_t{});
0075
0076
0077 value_t variance = sq_sum * (1.0f / static_cast<value_t>(r.size() - 1u));
0078
0079 return variance;
0080 }
0081
0082 }