19namespace sequoia::maths
21 template<std::input_iterator Iter, class T = typename std::iterator_traits<Iter>::value_type>
23 std::optional<T> mean(Iter first, Iter last)
27 if(
const auto dist{std::ranges::distance(first, last)})
29 m = std::accumulate(first, last, T{}) / dist;
35 template<std::input_iterator Iter, class T = typename std::iterator_traits<Iter>::value_type>
37 std::pair<std::optional<T>, std::optional<T>>
38 cummulative_square_diffs(Iter first, Iter last)
40 if(std::ranges::distance(first, last))
42 const auto m{mean(first, last)};
44 std::accumulate(first, last, T{}, [m](
const T& sum,
const T& datum){
45 return sum + (datum - m.value())*(datum - m.value());
56 template<std::input_iterator Iter, class T = typename std::iterator_traits<Iter>::value_type>
58 std::pair<std::optional<T>, std::optional<T>>
59 variance(Iter first, Iter last)
61 if(
const auto dist{std::ranges::distance(first, last)})
63 auto [sq, mean]{cummulative_square_diffs(first, last)};
65 return {sq.value()/dist, mean.value()};
71 template<std::input_iterator Iter, class T = typename std::iterator_traits<Iter>::value_type>
73 std::pair<std::optional<T>, std::optional<T>>
74 sample_variance(Iter first, Iter last)
76 if(
const auto dist{std::ranges::distance(first, last)}; !dist)
82 return {{}, mean(first, last)};
86 auto [sq, mean]{cummulative_square_diffs(first, last)};
88 return {sq.value()/(dist - 1), mean.value()};
92 template<std::input_iterator Iter, class T = typename std::iterator_traits<Iter>::value_type>
94 std::pair<std::optional<T>, std::optional<T>>
95 standard_deviation(Iter first, Iter last)
97 if(
const auto dist{std::ranges::distance(first, last)})
99 auto [var, mean]{variance(first, last)};
101 return {std::sqrt(var.value()), mean.value()};
111 template<std::input_iterator Iter, class T = typename std::iterator_traits<Iter>::value_type>
113 std::pair<std::optional<T>, std::optional<T>>
114 operator()(Iter first, Iter last)
const
116 if(
const auto dist{std::ranges::distance(first, last)}; !dist)
122 return {{}, mean(first, last)};
126 auto [sq, mean]{cummulative_square_diffs(first, last)};
128 return {std::sqrt(sq.value()/(dist - 1.5)), mean.value()};
134 template<std::input_iterator Iter, class Estimator = bias::gaussian_approx_estimator, class T = typename std::iterator_traits<Iter>::value_type>
136 std::pair<std::optional<T>, std::optional<T>>
137 sample_standard_deviation(Iter first, Iter last, Estimator estimator = Estimator{})
139 return estimator(first, last);
Definition: StatisticalAlgorithms.hpp:110