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
21 Require (start != forward<ITERATOR_OF_T2> (end));
24 for (ITERATOR_OF_T i = start; i != forward<ITERATOR_OF_T2> (end); ++i) {
30 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
31 inline auto Mean (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end) ->
typename iterator_traits<ITERATOR_OF_T>::value_type
33 Require (start != forward<ITERATOR_OF_T2> (end));
34 return Mean<typename iterator_traits<ITERATOR_OF_T>::value_type> (start, forward<ITERATOR_OF_T2> (end));
36 template <ranges::range CONTAINER_OF_T>
37 inline auto Mean (
const CONTAINER_OF_T& container) ->
typename CONTAINER_OF_T::value_type
39 Require (not container.empty ());
40 return Mean<typename CONTAINER_OF_T::value_type> (ranges::begin (container), ranges::end (container));
48 template <
typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2, Common::IInOrderComparer<RESULT_TYPE> INORDER_COMPARE_FUNCTION>
49 RESULT_TYPE
Median (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end, INORDER_COMPARE_FUNCTION&& compare)
52 Require (start != forward<ITERATOR_OF_T2> (end));
54 size_t size = tmp.
size ();
55 nth_element (tmp.begin (), tmp.begin () + size / 2, tmp.end (), forward<INORDER_COMPARE_FUNCTION> (compare));
56 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
57 RESULT_TYPE result{tmp[size / 2]};
58 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wmaybe-uninitialized\"");
59 if ((size % 2) == 0) {
63 nth_element (tmp.begin (), tmp.begin () + size / 2 - 1, tmp.end (), forward<INORDER_COMPARE_FUNCTION> (compare));
64 result += tmp[size / 2 - 1];
69 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>
70 inline auto Median (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end, INORDER_COMPARE_FUNCTION&& compare) ->
71 typename iterator_traits<ITERATOR_OF_T>::value_type
73 return Median<typename iterator_traits<ITERATOR_OF_T>::value_type> (start, forward<ITERATOR_OF_T2> (end),
74 forward<INORDER_COMPARE_FUNCTION> (compare));
76 template <ranges::range CONTAINER_OF_T, Common::IInOrderComparer<
typename CONTAINER_OF_T::value_type> INORDER_COMPARE_FUNCTION>
77 inline auto Median (
const CONTAINER_OF_T& container, INORDER_COMPARE_FUNCTION&& compare) ->
typename CONTAINER_OF_T::value_type
79 Require (not container.empty ());
80 return Median<typename CONTAINER_OF_T::value_type> (ranges::begin (container), ranges::end (container),
81 forward<INORDER_COMPARE_FUNCTION> (compare));
89 template <
typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
92 Require (start != forward<ITERATOR_OF_T2> (end));
93 RESULT_TYPE mean = Mean<RESULT_TYPE> (start, forward<ITERATOR_OF_T2> (end));
96 for (
auto i = start; i != end; ++i) {
98 accum += (*i - mean) * (*i - mean);
101 return sqrt (accum / (n - 1));
103 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
104 inline auto StandardDeviation (
const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end) ->
105 typename iterator_traits<remove_cvref_t<ITERATOR_OF_T>>::value_type
107 Require (start != forward<ITERATOR_OF_T2> (end));
108 return StandardDeviation<typename iterator_traits<ITERATOR_OF_T>::value_type> (start, forward<ITERATOR_OF_T2> (end));
110 template <ranges::range CONTAINER_OF_T>
111 inline auto StandardDeviation (
const CONTAINER_OF_T& container) ->
typename CONTAINER_OF_T::value_type
113 Require (not container.empty ());
114 return StandardDeviation<typename CONTAINER_OF_T::value_type> (ranges::begin (container), ranges::end (container));
122 template <
typename T, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
128 results.fMin = *min_element (start, forward<ITERATOR_OF_T2> (end));
129 results.fMax = *max_element (start, forward<ITERATOR_OF_T2> (end));
131 results.fMean =
Mean (start, forward<ITERATOR_OF_T2> (end));
132 results.fMedian =
Median (start, forward<ITERATOR_OF_T2> (end));
134 results.fStandardDeviation =
StandardDeviation (start, forward<ITERATOR_OF_T2> (end));
139 template <ranges::range CONTAINER_OF_T>
140 inline auto ComputeCommonStatistics (
const CONTAINER_OF_T& container) -> CommonStatistics<typename CONTAINER_OF_T::value_type>
142 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 floatpoint type 'T'. Not sure why not provided by std c++