Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-27 07:24:14

0001 // This file is part of the ACTS project.
0002 //
0003 // Copyright (C) 2016 CERN for the benefit of the ACTS project
0004 //
0005 // This Source Code Form is subject to the terms of the Mozilla Public
0006 // License, v. 2.0. If a copy of the MPL was not distributed with this
0007 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
0008 
0009 #pragma once
0010 
0011 // TODO: Remove this when gcc fixes their false positives.
0012 #if defined(__GNUC__) && !defined(__clang__)
0013 #pragma GCC diagnostic warning "-Wfree-nonheap-object"
0014 #endif
0015 
0016 // Project include(s)
0017 #include "detray/utils/ranges.hpp"
0018 
0019 // System include(s).
0020 #include <algorithm>
0021 #include <numeric>
0022 #include <type_traits>
0023 
0024 namespace detray::statistics {
0025 
0026 /// @returns the sample mean over a range of numbers
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 /// @returns RMS as the variance over a range of numbers with a true mean value
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 /// @returns the sample variance over a range of numbers with a mean value
0057 /// calculated from the range of numbers
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   // Variance is zero for single element
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   // Divide with n-1 to avoid a bias
0077   value_t variance = sq_sum * (1.0f / static_cast<value_t>(r.size() - 1u));
0078 
0079   return variance;
0080 }
0081 
0082 }  // namespace detray::statistics