Files
Upsilon/apps/statistics/test/store.cpp
Gabriel Ozouf 2b59509fdd [apps/i18n] Derive preferences from country
Each country comes with an set of preferences, built at compile time by
apps/i18n.py, used to define :
  - the exam mode
  - the method for computing quartiles
  - the unit system in which to output the results with units
Functions to access those preferences are available in
via sharedGlobalPreferences.

Change-Id: I220ebaa9b9e8954dfe33cd51936f47505b98978d
2020-11-04 15:11:44 +01:00

370 lines
13 KiB
C++

#include <quiz.h>
#include <apps/i18n.h>
#include <apps/global_preferences.h>
#include <assert.h>
#include <math.h>
#include <cmath>
#include "../store.h"
#include <poincare/helpers.h>
#include <poincare/test/helper.h>
using namespace Poincare;
namespace Statistics {
void assert_value_approximately_equal_to(double d1, double d2, double precision, double reference) {
quiz_assert((std::isnan(d1) && std::isnan(d2))
|| (std::isinf(d1) && std::isinf(d2) && d1 * d2 > 0.0 /*same sign*/)
|| IsApproximatelyEqual(d1, d2, precision, reference));
}
/* SublistMethod is the method for computing quartiles used in most
* countries, which defines quartiles as the medians of the left and right
* subsets of data.
* FrequencyMethod is the method used in France and Italy, which defines the
* quartiles as the 25th and 75th percentile, in terms of cumulated
* frequencies. */
void assert_data_statictics_equal_to(
double v[],
double n[],
int numberOfData,
double trueSumOfOccurrences,
double trueMaxValue,
double trueMinValue,
double trueRange,
double trueMean,
double trueVariance,
double trueStandardDeviation,
double trueSampleStandardDeviation,
double trueFirstQuartileSublistMethod,
double trueThirdQuartileSublistMethod,
double trueQuartileRangeSublistMethod,
double trueFirstQuartileFrequencyMethod,
double trueThirdQuartileFrequencyMethod,
double trueQuartileRangeFrequencyMethod,
double trueMedian,
double trueSum,
double trueSquaredValueSum) {
Store store;
int seriesIndex = 0;
// Set the data in the store
for (int i = 0; i < numberOfData; i++) {
store.set(v[i], seriesIndex, 0, i);
store.set(n[i], seriesIndex, 1, i);
}
double precision = 1e-3;
double sumOfOccurrences = store.sumOfOccurrences(seriesIndex);
double maxValue = store.maxValue(seriesIndex);
double minValue = store.minValue(seriesIndex);
double range = store.range(seriesIndex);
double mean = store.mean(seriesIndex);
double variance = store.variance(seriesIndex);
double standardDeviation = store.standardDeviation(seriesIndex);
double sampleStandardDeviation = store.sampleStandardDeviation(seriesIndex);
double median = store.median(seriesIndex);
double sum = store.sum(seriesIndex);
double squaredValueSum = store.squaredValueSum(seriesIndex);
// Check the positive statistics
quiz_assert(range >= 0.0);
quiz_assert(variance >= 0.0);
quiz_assert(standardDeviation >= 0.0);
quiz_assert(sampleStandardDeviation >= 0.0);
quiz_assert(squaredValueSum >= 0.0);
// Compare the statistics
double reference = trueSquaredValueSum;
assert_value_approximately_equal_to(variance, trueVariance, precision, reference);
assert_value_approximately_equal_to(squaredValueSum, trueSquaredValueSum, precision, reference);
reference = std::sqrt(trueSquaredValueSum);
assert_value_approximately_equal_to(trueStandardDeviation * trueStandardDeviation, trueVariance, precision, reference);
assert_value_approximately_equal_to(sumOfOccurrences, trueSumOfOccurrences, precision, reference);
assert_value_approximately_equal_to(mean, trueMean, precision, reference);
assert_value_approximately_equal_to(standardDeviation, trueStandardDeviation, precision, reference);
assert_value_approximately_equal_to(sampleStandardDeviation, trueSampleStandardDeviation, precision, reference);
assert_value_approximately_equal_to(median, trueMedian, precision, reference);
assert_value_approximately_equal_to(sum, trueSum, precision, reference);
// Perfect match
assert_value_approximately_equal_to(maxValue, trueMaxValue, 0.0, 0.0);
assert_value_approximately_equal_to(minValue, trueMinValue, 0.0, 0.0);
assert_value_approximately_equal_to(range, trueRange, 0.0, 0.0);
// Compare the country specific statistics
I18n::Country country;
double quartileRange;
bool shouldUseFrequencyMethod;
for (int c = 0; c < I18n::NumberOfCountries; c++) {
country = static_cast<I18n::Country>(c);
GlobalPreferences::sharedGlobalPreferences()->setCountry(country);
quartileRange = store.quartileRange(seriesIndex);
quiz_assert(quartileRange >= 0.0);
shouldUseFrequencyMethod = GlobalPreferences::sharedGlobalPreferences()->methodForQuartiles() == I18n::MethodForQuartiles::CumulatedFrequency;
assert_value_approximately_equal_to(store.firstQuartile(seriesIndex), shouldUseFrequencyMethod ? trueFirstQuartileFrequencyMethod : trueFirstQuartileSublistMethod, precision, reference);
assert_value_approximately_equal_to(store.thirdQuartile(seriesIndex), shouldUseFrequencyMethod ? trueThirdQuartileFrequencyMethod : trueThirdQuartileSublistMethod, precision, reference);
assert_value_approximately_equal_to(quartileRange, shouldUseFrequencyMethod ? trueQuartileRangeFrequencyMethod : trueQuartileRangeSublistMethod, 0.0, 0.0);
}
}
QUIZ_CASE(data_statistics) {
/* 1 2 3 4
* 1 1 1 1 */
constexpr int listLength1 = 4;
double v1[listLength1] = {1.0, 2.0, 3.0, 4.0};
double n1[listLength1] = {1.0, 1.0, 1.0, 1.0};
assert_data_statictics_equal_to(
v1,
n1,
listLength1,
/* sumOfOccurrences */ 4.0,
/* maxValue */ 4.0,
/* minValue */ 1.0,
/* range */ 3.0,
/* mean */ 2.5,
/* variance */ 1.25,
/* standardDeviation */ 1.118,
/* sampleStandardDeviation */ 1.291,
/* firstQuartileSublistMethod */ 1.5,
/* thirdQuartileSublistMethod */ 3.5,
/* quartileRangeSublistMethod */ 2.0,
/* firstQuartileFrequencyMethod */ 1.0,
/* thirdQuartileFrequencyMethod */ 3.0,
/* quartileRangeFrequencyMethod */ 2.0,
/* median */ 2.5,
/* sum */ 10.0,
/* squaredValueSum */ 30.0);
/* 1 2 3 4 5 6 7 8 9 10 11
* 1 1 1 1 1 1 1 1 1 1 1 */
constexpr int listLength2 = 11;
double v2[listLength2] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0};
double n2[listLength2] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
assert_data_statictics_equal_to(
v2,
n2,
listLength2,
/* sumOfOccurrences */ 11.0,
/* maxValue */ 11.0,
/* minValue */ 1.0,
/* range */ 10.0,
/* mean */ 6.0,
/* variance */ 10.0,
/* standardDeviation */ 3.1623,
/* sampleStandardDeviation */ 3.3166,
/* firstQuartileSublistMethod */ 3.0,
/* thirdQuartileSublistMethod */ 9.0,
/* quartileRangeSublistMethod */ 6.0,
/* firstQuartileFrequencyMethod */ 3.0,
/* thirdQuartileFrequencyMethod */ 9.0,
/* quartileRangeFrequencyMethod */ 6.0,
/* median */ 6.0,
/* sum */ 66.0,
/* squaredValueSum */ 506.0);
/* 1 2 3 4 5 6 7 8 9 10 11 12
* 1 1 1 1 1 1 1 1 1 1 1 1 */
constexpr int listLength3 = 12;
double v3[listLength3] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0};
double n3[listLength3] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
assert_data_statictics_equal_to(
v3,
n3,
listLength3,
/* sumOfOccurrences */ 12.0,
/* maxValue */ 12.0,
/* minValue */ 1.0,
/* range */ 11.0,
/* mean */ 6.5,
/* variance */ 11.917,
/* standardDeviation */ 3.4521,
/* sampleStandardDeviation */ 3.6056,
/* firstQuartileSublistMethod */ 3.5,
/* thirdQuartileSublistMethod */ 9.5,
/* quartileRangeSublistMethod */ 6.0,
/* firstQuartileFrequencyMethod */ 3.0,
/* thirdQuartileFrequencyMethod */ 9.0,
/* quartileRangeFrequencyMethod */ 6.0,
/* median */ 6.5,
/* sum */ 78.0,
/* squaredValueSum */ 650.0);
/* 1 2 3 5 10
* 0.2 0.05 0.3 0.0001 0.4499 */
constexpr int listLength4 = 5;
double v4[listLength4] = {1.0, 2.0, 3.0, 5.0, 10.0};
double n4[listLength4] = {0.2, 0.05, 0.3, 0.0001, 0.4499};
assert_data_statictics_equal_to(
v4,
n4,
listLength4,
/* sumOfOccurrences */ 1.0,
/* maxValue */ 10.0,
/* minValue */ 1.0,
/* range */ 9.0,
/* mean */ 5.6995,
/* variance */ 15.6082,
/* standardDeviation */ 3.9507,
/* sampleStandardDeviation */ INFINITY,
/* firstQuartileSublistMethod */ 2.0,
/* thirdQuartileSublistMethod */ 10.0,
/* quartileRangeSublistMethod */ 8.0,
/* firstQuartileFrequencyMethod */ 2.0,
/* thirdQuartileFrequencyMethod */ 10.0,
/* quartileRangeFrequencyMethod */ 8.0,
/* median */ 3.0,
/* sum */ 5.6995,
/* squaredValueSum */ 48.0925);
/* 1 -2 3 5 10
* 0.4 0.00005 0.9 0.4 0.5 */
constexpr int listLength5 = 5;
double v5[listLength5] = {1.0, -2.0, 3.0, 5.0, 10.0};
double n5[listLength5] = {0.4, 0.00005, 0.9, 0.4, 0.5};
assert_data_statictics_equal_to(
v5,
n5,
listLength5,
/* sumOfOccurrences */ 2.2,
/* maxValue */ 10.0,
/* minValue */ -2.0,
/* range */ 12.0,
/* mean */ 4.5908,
/* variance */ 10.06,
/* standardDeviation */ 3.1719,
/* sampleStandardDeviation */ 4.2947,
/* firstQuartileSublistMethod */ 3.0,
/* thirdQuartileSublistMethod */ 5.0,
/* quartileRangeSublistMethod */ 2.0,
/* firstQuartileFrequencyMethod */ 3.0,
/* thirdQuartileFrequencyMethod */ 5.0,
/* quartileRangeFrequencyMethod */ 2.0,
/* median */ 3.0,
/* sum */ 10.1,
/* squaredValueSum */ 68.500);
/* -7 -10 12 5 -2
* 4 5 3 1 9 */
constexpr int listLength6 = 6;
double v6[listLength6] = {-7.0, -10.0, 1.0, 2.0, 5.0, -2.0};
double n6[listLength6] = {4.0, 5.0, 3.0, 0.5, 1.0, 9.0};
assert_data_statictics_equal_to(
v6,
n6,
listLength6,
/* sumOfOccurrences */ 22.5,
/* maxValue */ 5.0,
/* minValue */ -10.0,
/* range */ 15.0,
/* mean */ -3.8667,
/* variance */ 18.9155,
/* standardDeviation */ 4.3492,
/* sampleStandardDeviation */ 4.4492,
/* firstQuartileSublistMethod */ -7.0,
/* thirdQuartileSublistMethod */ -2.0,
/* quartileRangeSublistMethod */ 5.0,
/* firstQuartileFrequencyMethod */ -7.0,
/* thirdQuartileFrequencyMethod */ -2.0,
/* quartileRangeFrequencyMethod */ 5.0,
/* median */ -2.0,
/* sum */ -87.0,
/* squaredValueSum */ 762.0);
/* 1 1 1 10 3 -1 3
* 1 1 1 0 0 0 1 */
constexpr int listLength7 = 7;
double v7[listLength7] = {1.0, 1.0, 1.0, 10.0, 3.0, -1.0, 3.0};
double n7[listLength7] = {1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 1.0};
assert_data_statictics_equal_to(
v7,
n7,
listLength7,
/* sumOfOccurrences */ 4.0,
/* maxValue */ 3.0,
/* minValue */ 1.0,
/* range */ 2.0,
/* mean */ 1.5,
/* variance */ 0.75,
/* standardDeviation */ 0.866,
/* sampleStandardDeviation */ 1.0,
/* firstQuartileSublistMethod */ 1.0,
/* thirdQuartileSublistMethod */ 2.0,
/* quartileRangeSublistMethod */ 1.0,
/* firstQuartileFrequencyMethod */ 1.0,
/* thirdQuartileFrequencyMethod */ 1.0,
/* quartileRangeFrequencyMethod */ 0.0,
/* median */ 1.0,
/* sum */ 6.0,
/* squaredValueSum */ 12.0);
/* 1 2 3 4
* 0 1 0 1 */
constexpr int listLength8 = 4;
double v8[listLength8] = {1.0, 2.0, 3.0, 4.0};
double n8[listLength8] = {0.0, 1.0, 0.0, 1.0};
assert_data_statictics_equal_to(
v8,
n8,
listLength8,
/* sumOfOccurrences */ 2.0,
/* maxValue */ 4.0,
/* minValue */ 2.0,
/* range */ 2.0,
/* mean */ 3.0,
/* variance */ 1.0,
/* standardDeviation */ 1.0,
/* sampleStandardDeviation */ 1.414,
/* firstQuartileSublistMethod */ 2.0,
/* thirdQuartileSublistMethod */ 4.0,
/* quartileRangeSublistMethod */ 2.0,
/* firstQuartileFrequencyMethod */ 2.0,
/* thirdQuartileFrequencyMethod */ 4.0,
/* quartileRangeFrequencyMethod */ 2.0,
/* median */ 3.0,
/* sum */ 6.0,
/* squaredValueSum */ 20.0);
/* -996.85840734641
* 9 */
constexpr int listLength9 = 1;
double v9[listLength9] = {-996.85840734641};
double n9[listLength9] = {9};
assert_data_statictics_equal_to(
v9,
n9,
listLength9,
/* sumOfOccurrences */ 9.0,
/* maxValue */ -996.85840734641,
/* minValue */ -996.85840734641,
/* range */ 0.0,
/* mean */ -996.85840734641,
/* variance */ 0.0,
/* standardDeviation */ 0.0,
/* sampleStandardDeviation */ 0.0,
/* firstQuartileSublistMethod */ -996.85840734641,
/* thirdQuartileSublistMethod */ -996.85840734641,
/* quartileRangeSublistMethod */ 0.0,
/* firstQuartileFrequencyMethod */ -996.85840734641,
/* thirdQuartileFrequencyMethod */ -996.85840734641,
/* quartileRangeFrequencyMethod */ 0.0,
/* median */ -996.85840734641,
/* sum */ -8971.72566611769,
/* squaredValueSum */ 8943540.158675);
}
}