Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Math/Statistics.h
Go to the documentation of this file.
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef _Stroika_Foundation_Math_Statistics_h_
5#define _Stroika_Foundation_Math_Statistics_h_ 1
6
7#include "Stroika/Foundation/StroikaPreComp.h"
8
9#include "Stroika/Foundation/Common/Common.h"
10
11/**
12 * \file
13 *
14 * \note Code-Status: <a href="Code-Status.md#Alpha">Alpha</a>
15 *
16 * TODO:
17 * @todo Look at http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=290
18 *
19 * @todo Math statistics utilities:
20 * Mean()
21 * Mode()
22 * Median()
23 * If random-accessible iterators, (array etc), use
24 * http://en.cppreference.com/w/cpp/algorithm/nth_element
25 * else copy to vector<> and then use nth_element?
26 * Just need something quickie
27 *
28 * Use std::nth_element from <algorithm> which is O(N):
29 * nth_element(a, a + size / 2, a + size);
30 * median = a[size/2];
31 *
32 * @todo Add 'quartile' or some other such functions.
33 *
34 * @todo Do template specializations that copy to vector<> or some such, when you cannot
35 * do random-access
36 *
37 * @todo redo templates so can specify larger accumulator type for Mean()
38 */
39
40namespace Stroika::Foundation::Math {
41
42 /**
43 * \brief Mean (average) of a collection of numbers computed
44 *
45 * \pre not empty (or start != end)
46 *
47 * \par Example Usage:
48 * \code
49 * EXPECT_EQ (Mean<double> (vector<int>{1, 3, 5}), 3);
50 * \endcode
51 *
52 * \note O(N) time complexity
53 */
54 template <typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
55 RESULT_TYPE Mean (const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end);
56 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
57 auto Mean (const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end) -> typename iterator_traits<ITERATOR_OF_T>::value_type;
58 template <ranges::range CONTAINER_OF_T>
59 auto Mean (const CONTAINER_OF_T& container) -> typename CONTAINER_OF_T::value_type;
60
61 /**
62 * \brief Median of a collection of numbers computed
63 *
64 * First template requires explicit RESULT_TYPE argument.
65 * Second and third infer it from the iterator/container arguments.
66 *
67 * \pre not empty
68 *
69 * \note O(N) time complexity
70 *
71 * \par Example Usage:
72 * \code
73 * EXPECT_EQ (Median (vector<int>{1, 3, 5}), 3);
74 * \endcode
75 *
76 * \note template arguments changed significantly in Stroika v3.0d10
77 */
78 template <typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2,
79 Common::IInOrderComparer<RESULT_TYPE> INORDER_COMPARE_FUNCTION = less<RESULT_TYPE>>
80 RESULT_TYPE Median (const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end, INORDER_COMPARE_FUNCTION&& compare = {});
81 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2,
82 Common::IInOrderComparer<typename iterator_traits<ITERATOR_OF_T>::value_type> INORDER_COMPARE_FUNCTION = less<typename iterator_traits<ITERATOR_OF_T>::value_type>>
83 auto Median (const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end, INORDER_COMPARE_FUNCTION&& compare = {}) ->
84 typename iterator_traits<ITERATOR_OF_T>::value_type;
85 template <ranges::range CONTAINER_OF_T, Common::IInOrderComparer<typename CONTAINER_OF_T::value_type> INORDER_COMPARE_FUNCTION = less<typename CONTAINER_OF_T::value_type>>
86 auto Median (const CONTAINER_OF_T& container, INORDER_COMPARE_FUNCTION&& compare = {}) -> typename CONTAINER_OF_T::value_type;
87
88 /**
89 * \pre size of container >= 1
90 *
91 * \brief Alias: sd, standard-deviation, stddev
92 *
93 * \brief sqrt (sum(mean-di))/(n-1) - 'Bessel's correction'
94 *
95 * \par Example Usage:
96 * \code
97 * EXPECT_TRUE (Math::NearlyEquals (Math::StandardDeviation (vector<double> ({5, 3, 19, 1})), 8.164966, .0001));
98 * \endcode
99 *
100 * \see https://en.wikipedia.org/wiki/Standard_deviation
101 */
102 template <typename RESULT_TYPE, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
103 RESULT_TYPE StandardDeviation (const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end);
104 template <input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
105 auto StandardDeviation (const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end) -> typename iterator_traits<ITERATOR_OF_T>::value_type;
106 template <ranges::range CONTAINER_OF_T>
107 auto StandardDeviation (const CONTAINER_OF_T& container) -> typename CONTAINER_OF_T::value_type;
108
109 /**
110 * Collect together a bunch of common statistical measures of a random variable. Don't store this as its not compact,
111 * and could easily be expanded in future releases of Stroika (quartile, mode, ...)
112 */
113 template <typename T>
115 optional<T> fMin;
116 optional<T> fMax;
117 optional<T> fMean;
118 optional<T> fMedian;
119 optional<T> fStandardDeviation;
120 };
121
122 /**
123 * \brief handy aggregation of several common random-variable statistics/measurements.
124 */
125 template <typename T, input_iterator ITERATOR_OF_T, sentinel_for<ITERATOR_OF_T> ITERATOR_OF_T2>
126 CommonStatistics<T> ComputeCommonStatistics (const ITERATOR_OF_T& start, ITERATOR_OF_T2&& end);
127 template <ranges::range CONTAINER_OF_T>
129
130}
131
132/*
133 ********************************************************************************
134 ***************************** Implementation Details ***************************
135 ********************************************************************************
136 */
137#include "Statistics.inl"
138
139#endif /*_Stroika_Foundation_Math_Statistics_h_*/
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.