11namespace Stroika::Foundation::Math {
18 template <
typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
19 auto Mean (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end) -> RESULT_TYPE
23 Require (start != end);
26 for (ITERATOR_OF_T i = start; i != end; ++i) {
32 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
33 inline auto Mean (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end) ->
typename iterator_traits<ITERATOR_OF_T>::value_type
35 Require (start != end);
36 return Mean<typename iterator_traits<ITERATOR_OF_T>::value_type> (start, forward<ITERATOR_OF_T2> (end));
38 template <ranges::range CONTAINER_OF_T>
39 inline auto Mean (
const CONTAINER_OF_T& container) ->
typename CONTAINER_OF_T::value_type
41 Require (not container.empty ());
42 return Mean<typename CONTAINER_OF_T::value_type> (ranges::begin (container), ranges::end (container));
50 template <
typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2, Common::IInOrderComparer<RESULT_TYPE> INORDER_COMPARE_FUNCTION>
51 RESULT_TYPE
Median (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end, INORDER_COMPARE_FUNCTION&& compare)
58 Require (start != end);
60 size_t size = tmp.
size ();
61 nth_element (tmp.begin (), tmp.begin () + size / 2, tmp.end (), compare);
62 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
63 RESULT_TYPE result{tmp[size / 2]};
64 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
65 if ((size % 2) == 0) {
69 nth_element (tmp.begin (), tmp.begin () + size / 2 - 1, tmp.end (), forward<INORDER_COMPARE_FUNCTION> (compare));
70 result += tmp[size / 2 - 1];
75 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2, Common::IInOrderComparer<
typename iterator_traits<ITERATOR_OF_T>::value_type> INORDER_COMPARE_FUNCTION>
76 inline auto Median (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end, INORDER_COMPARE_FUNCTION&& compare) ->
77 typename iterator_traits<ITERATOR_OF_T>::value_type
79 return Median<typename iterator_traits<ITERATOR_OF_T>::value_type> (start, forward<ITERATOR_OF_T2> (end),
80 forward<INORDER_COMPARE_FUNCTION> (compare));
82 template <ranges::range CONTAINER_OF_T, Common::IInOrderComparer<
typename CONTAINER_OF_T::value_type> INORDER_COMPARE_FUNCTION>
83 inline auto Median (
const CONTAINER_OF_T& container, INORDER_COMPARE_FUNCTION&& compare) ->
typename CONTAINER_OF_T::value_type
85 Require (not container.empty ());
86 return Median<typename CONTAINER_OF_T::value_type> (ranges::begin (container), ranges::end (container),
87 forward<INORDER_COMPARE_FUNCTION> (compare));
95 template <
typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
101 Require (start != end);
102 RESULT_TYPE mean = Mean<RESULT_TYPE> (start, remove_cvref_t<ITERATOR_OF_T2>{end});
105 for (
auto i = start; i != end; ++i) {
107 accum += (*i - mean) * (*i - mean);
110 return sqrt (accum / (n - 1));
112 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
113 inline auto StandardDeviation (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end) ->
114 typename iterator_traits<remove_cvref_t<ITERATOR_OF_T>>::value_type
116 Require (start != end);
117 return StandardDeviation<typename iterator_traits<ITERATOR_OF_T>::value_type> (start, forward<ITERATOR_OF_T2> (end));
119 template <ranges::range CONTAINER_OF_T>
120 inline auto StandardDeviation (
const CONTAINER_OF_T& container) ->
typename CONTAINER_OF_T::value_type
122 Require (not container.empty ());
123 return StandardDeviation<typename CONTAINER_OF_T::value_type> (ranges::begin (container), ranges::end (container));
131 template <
typename T, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
147 using EndType_ = remove_cvref_t<ITERATOR_OF_T2>;
149 results.fMin = *min_element (start, EndType_{end});
150 results.fMax = *max_element (start, EndType_{end});
152 results.fMean =
Mean (start, EndType_{end});
153 results.fMedian =
Median (start, EndType_{end});
160 template <ranges::range CONTAINER_OF_T>
161 inline auto ComputeCommonStatistics (
const CONTAINER_OF_T& container) -> CommonStatistics<typename CONTAINER_OF_T::value_type>
163 return ComputeCommonStatistics<typename CONTAINER_OF_T::value_type> (ranges::begin (container), ranges::end (container));
RESULT_TYPE StandardDeviation(const ITERATOR_OF_T &start, ITERATOR_OF_T2 &&end)
Alias: sd, standard-deviation, stddev.
CommonStatistics< T > ComputeCommonStatistics(const ITERATOR_OF_T &start, ITERATOR_OF_T2 &&end)
handy aggregation of several common random-variable statistics/measurements.
RESULT_TYPE Mean(const ITERATOR_OF_T &start, ITERATOR_OF_T2 &&end)
Mean (average) of a collection of numbers computed.
RESULT_TYPE Median(const ITERATOR_OF_T &start, ITERATOR_OF_T2 &&end, INORDER_COMPARE_FUNCTION &&compare={})
Median of a collection of numbers computed.
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
nonvirtual size_t size() const noexcept
concept true if integral or floating-point type 'T'. Not sure why not provided by std c++