From dcf06a4f40170288117251daa05d5e427a15a8c4 Mon Sep 17 00:00:00 2001 From: Tobias Christiansen Date: Mon, 23 Aug 2021 23:13:54 +0200 Subject: 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. --- AK/Statistics.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 AK/Statistics.h 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 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include + +namespace AK { + +template +requires(IsArithmetic) 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 const& values() const { return m_values; } + size_t size() const { return m_values.size(); } + +private: + Vector m_values; + T m_sum {}; +}; + +} -- cgit v1.2.3