diff options
author | Tobias Christiansen <tobyase@serenityos.org> | 2021-08-23 23:13:54 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-31 16:38:22 +0200 |
commit | dcf06a4f40170288117251daa05d5e427a15a8c4 (patch) | |
tree | e9115472790bde97cf37c4b19117a9471695ba2a | |
parent | 60d43d6969bf9868497502580996923aea7fc90d (diff) | |
download | serenity-dcf06a4f40170288117251daa05d5e427a15a8c4.zip |
AK: Add Statistics helper
This patch adds a helper to AK which allows for basic statistical
analysis of values.
The median algorithm is very naive and slow, but it works.
-rw-r--r-- | AK/Statistics.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/AK/Statistics.h b/AK/Statistics.h new file mode 100644 index 0000000000..f8063caa87 --- /dev/null +++ b/AK/Statistics.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <AK/Math.h> +#include <AK/QuickSort.h> +#include <AK/StdLibExtraDetails.h> +#include <AK/Vector.h> + +namespace AK { + +template<typename T = float> +requires(IsArithmetic<T>) class Statistics { +public: + Statistics() = default; + ~Statistics() = default; + + void add(T const& value) + { + // FIXME: Check for an overflow + m_sum += value; + m_values.append(value); + } + + T const sum() const { return m_sum; } + float average() const { return (float)sum() / size(); } + + // FIXME: Implement a better algorithm + T const median() + { + quick_sort(m_values); + return m_values.at(size() / 2); + } + + float standard_deviation() const { return sqrt(variance()); } + float variance() const + { + float summation = 0; + float avg = average(); + for (T number : values()) { + float difference = (float)number - avg; + summation += (difference * difference); + } + summation = summation / size(); + return summation; + } + + Vector<T> const& values() const { return m_values; } + size_t size() const { return m_values.size(); } + +private: + Vector<T> m_values; + T m_sum {}; +}; + +} |