From 200e6d229b2550290d60297094560a326d41a16f Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 23 Nov 2018 10:13:58 +0100 Subject: [PATCH] #3748 Statistics calculators : Improve handling of invalid numbers --- .../RigStatisticsMath.cpp | 13 ++--- .../ResultStatisticsCache/RigStatisticsMath.h | 55 +++++++++---------- .../UnitTests/RigStatisticsMath-Test.cpp | 2 +- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp index 3ad923335c..08c16ad958 100644 --- a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp +++ b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp @@ -42,7 +42,7 @@ void RigStatisticsMath::calculateBasicStatistics(const std::vector& valu for (size_t i = 0; i < values.size(); i++) { double val = values[i]; - if (val == HUGE_VAL) continue; + if (RiaStatisticsTools::isInvalidNumber(val)) continue; validValueCount++; @@ -57,7 +57,6 @@ void RigStatisticsMath::calculateBasicStatistics(const std::vector& valu { m_mean = m_sum / validValueCount; - // http://en.wikipedia.org/wiki/Standard_deviation#Rapid_calculation_methods // Running standard deviation @@ -91,7 +90,7 @@ std::vector RigStatisticsMath::calculateNearestRankPercentiles(const std for (size_t i = 0; i < inputValues.size(); ++i) { - if (inputValues[i] != HUGE_VAL) + if (RiaStatisticsTools::isValidNumber(inputValues[i])) { sortedValues.push_back(inputValues[i]); } @@ -130,7 +129,7 @@ std::vector RigStatisticsMath::calculateInterpolatedPercentiles(const st for (size_t i = 0; i < inputValues.size(); ++i) { - if (inputValues[i] != HUGE_VAL) + if (RiaStatisticsTools::isValidNumber(inputValues[i])) { sortedValues.push_back(inputValues[i]); } @@ -195,10 +194,7 @@ RigHistogramCalculator::RigHistogramCalculator(double min, double max, size_t nB //-------------------------------------------------------------------------------------------------- void RigHistogramCalculator::addValue(double value) { - if (value == HUGE_VAL || value != value) - { - return; - } + if (RiaStatisticsTools::isInvalidNumber(value)) return; size_t index = 0; @@ -262,5 +258,6 @@ double RigHistogramCalculator::calculatePercentil(double pVal) } } assert(false); + return HUGE_VAL; } diff --git a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h index e583533b9c..042c058c27 100644 --- a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h +++ b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.h @@ -17,6 +17,8 @@ ///////////////////////////////////////////////////////////////////////////////// #pragma once +#include "RiaStatisticsTools.h" + #include #include #include @@ -82,19 +84,17 @@ public: void addValue(double value) { - if (value == HUGE_VAL) // TODO + if (RiaStatisticsTools::isValidNumber(value)) { - return; - } + if (value < min) + { + min = value; + } - if (value < min) - { - min = value; - } - - if (value > max) - { - max = value; + if (value > max) + { + max = value; + } } } @@ -126,19 +126,17 @@ public: void addValue(double value) { - if (value == HUGE_VAL) + if (RiaStatisticsTools::isValidNumber(value)) { - return; - } + if (value < pos && value > 0) + { + pos = value; + } - if (value < pos && value > 0) - { - pos = value; - } - - if (value > neg && value < 0) - { - neg = value; + if (value > neg && value < 0) + { + neg = value; + } } } @@ -170,13 +168,11 @@ public: void addValue(double value) { - if (value == HUGE_VAL || value != value) + if (RiaStatisticsTools::isValidNumber(value)) { - return; + valueSum += value; + ++sampleCount; } - - valueSum += value; - ++sampleCount; } double valueSum; @@ -208,7 +204,10 @@ public: void addValue(double value) { - uniqueValues.insert(static_cast(value)); + if (RiaStatisticsTools::isValidNumber(value)) + { + uniqueValues.insert(static_cast(value)); + } } std::set uniqueValues; diff --git a/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp b/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp index 0ec1210206..bdca2ba252 100644 --- a/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp +++ b/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp @@ -225,6 +225,6 @@ TEST(RigStatisticsMath, Accumulators) EXPECT_FALSE(std::isinf(acc.valueSum)); EXPECT_DOUBLE_EQ(sum, acc.valueSum); - EXPECT_EQ(4, acc.sampleCount); + EXPECT_EQ(4u, acc.sampleCount); } } \ No newline at end of file