96 lines
2.8 KiB
C
96 lines
2.8 KiB
C
// SPDX-FileCopyrightText: 2026 Rot127 <rot127@posteo.com>
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
|
|
#include <rz_util.h>
|
|
#include <rz_vector.h>
|
|
#include "minunit.h"
|
|
|
|
static bool test_welford_arithmetic(void) {
|
|
RzMathWelfordSums wf = { 0 };
|
|
rz_math_welford_init(&wf, 0.0);
|
|
rz_math_welford_push(&wf, 0.49671415);
|
|
rz_math_welford_push(&wf, -0.1382643);
|
|
rz_math_welford_push(&wf, 0.64768854);
|
|
rz_math_welford_push(&wf, 1.52302986);
|
|
rz_math_welford_push(&wf, -0.23415337);
|
|
rz_math_welford_push(&wf, -0.23413696);
|
|
rz_math_welford_push(&wf, 1.57921282);
|
|
rz_math_welford_push(&wf, 0.76743473);
|
|
rz_math_welford_push(&wf, -0.46947439);
|
|
rz_math_welford_push(&wf, 0.54256004);
|
|
rz_math_welford_push(&wf, -0.46341769);
|
|
rz_math_welford_push(&wf, -0.46572975);
|
|
rz_math_welford_push(&wf, 0.24196227);
|
|
rz_math_welford_push(&wf, -1.91328024);
|
|
rz_math_welford_push(&wf, -1.72491783);
|
|
rz_math_welford_push(&wf, -0.56228753);
|
|
rz_math_welford_push(&wf, -1.01283112);
|
|
rz_math_welford_push(&wf, 0.31424733);
|
|
rz_math_welford_push(&wf, -0.90802408);
|
|
rz_math_welford_push(&wf, -1.4123037);
|
|
|
|
mu_assert_eq(rz_math_welford_n(&wf), 20, "n");
|
|
|
|
char val[16] = { 0 };
|
|
rz_strf(val, "%.6f", rz_math_welford_avar(&wf));
|
|
mu_assert_streq(val, "0.875572", "variance");
|
|
|
|
rz_strf(val, "%.6f", rz_math_welford_astddev(&wf));
|
|
mu_assert_streq(val, "0.935720", "std deviation");
|
|
|
|
rz_strf(val, "%.6f", rz_math_welford_amean(&wf));
|
|
mu_assert_streq(val, "-0.171299", "mean");
|
|
|
|
rz_math_welford_clear(&wf);
|
|
|
|
mu_end;
|
|
}
|
|
|
|
static bool test_welford_geometric(void) {
|
|
RzMathWelfordSums wf = { 0 };
|
|
rz_math_welford_init(&wf, 0.0);
|
|
|
|
rz_math_welford_push(&wf, 131.5502965);
|
|
rz_math_welford_push(&wf, 47.68105836);
|
|
rz_math_welford_push(&wf, 56.85572523);
|
|
rz_math_welford_push(&wf, 23.22318396);
|
|
rz_math_welford_push(&wf, 39.38442231);
|
|
rz_math_welford_push(&wf, 58.35549654);
|
|
rz_math_welford_push(&wf, 27.36880479);
|
|
rz_math_welford_push(&wf, 68.40314554);
|
|
rz_math_welford_push(&wf, 38.0772422);
|
|
rz_math_welford_push(&wf, 45.8320556);
|
|
rz_math_welford_push(&wf, 38.05285189);
|
|
rz_math_welford_push(&wf, 165.8969663);
|
|
rz_math_welford_push(&wf, 54.15778147);
|
|
rz_math_welford_push(&wf, 28.94430432);
|
|
rz_math_welford_push(&wf, 89.43632748);
|
|
rz_math_welford_push(&wf, 26.24548069);
|
|
rz_math_welford_push(&wf, 61.88749606);
|
|
rz_math_welford_push(&wf, 16.84742668);
|
|
rz_math_welford_push(&wf, 24.60841286);
|
|
rz_math_welford_push(&wf, 61.4434194);
|
|
|
|
mu_assert_eq(rz_math_welford_n(&wf), 20, "n");
|
|
|
|
char val[16] = { 0 };
|
|
rz_strf(val, "%.6f", rz_math_welford_gmean(&wf));
|
|
mu_assert_streq(val, "46.544783", "mean");
|
|
|
|
rz_strf(val, "%.6f", rz_math_welford_gstddev(&wf));
|
|
mu_assert_streq(val, "1.787509", "std deviation");
|
|
|
|
rz_math_welford_clear(&wf);
|
|
|
|
mu_end;
|
|
}
|
|
|
|
static int all_tests(void) {
|
|
|
|
mu_run_test(test_welford_arithmetic);
|
|
mu_run_test(test_welford_geometric);
|
|
|
|
return tests_passed != tests_run;
|
|
}
|
|
|
|
mu_main(all_tests)
|