From 4dfcc7e45b91bd59c977f1261ba0275cb764b2e6 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 18 Dec 2020 07:33:23 +0100 Subject: [PATCH] Calculation of p10/p90 : Add more tests and treat all computed values equally --- .../RifReaderEnsembleStatisticsRft.cpp | 2 +- .../Summary/RimEnsembleStatisticsCase.cpp | 2 +- .../RigStatisticsMath.cpp | 2 + .../UnitTests/RigStatisticsMath-Test.cpp | 73 ++++++++++++++++++- 4 files changed, 76 insertions(+), 3 deletions(-) diff --git a/ApplicationCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp b/ApplicationCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp index 0586ec8256..dfc369cb78 100644 --- a/ApplicationCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp +++ b/ApplicationCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp @@ -244,7 +244,7 @@ void RifReaderEnsembleStatisticsRft::calculateStatistics( const RifEclipseRftAdd if ( p10 != HUGE_VAL ) m_cachedValues[p10Address].push_back( p10 ); if ( p50 != HUGE_VAL ) m_cachedValues[p50Address].push_back( p50 ); if ( p90 != HUGE_VAL ) m_cachedValues[p90Address].push_back( p90 ); - m_cachedValues[meanAddress].push_back( mean ); + if ( mean != HUGE_VAL ) m_cachedValues[meanAddress].push_back( mean ); } } } diff --git a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp index 1b0c4b7423..8e04e4128a 100644 --- a/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp +++ b/ApplicationCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp @@ -196,7 +196,7 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su if ( p10 != HUGE_VAL ) m_p10Data.push_back( p10 ); if ( p50 != HUGE_VAL ) m_p50Data.push_back( p50 ); if ( p90 != HUGE_VAL ) m_p90Data.push_back( p90 ); - m_meanData.push_back( mean ); + if ( mean != HUGE_VAL ) m_meanData.push_back( mean ); } } diff --git a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp index d475832533..b056bee642 100644 --- a/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp +++ b/ApplicationCode/ResultStatisticsCache/RigStatisticsMath.cpp @@ -95,6 +95,8 @@ void RigStatisticsMath::calculateStatisticsCurves( const std::vector& va { CVF_ASSERT( p10 && p50 && p90 && mean ); + if ( values.empty() ) return; + enum PValue { P10, diff --git a/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp b/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp index 890f008780..899777b474 100644 --- a/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp +++ b/ApplicationCode/UnitTests/RigStatisticsMath-Test.cpp @@ -219,4 +219,75 @@ TEST( RigStatisticsMath, Accumulators ) EXPECT_DOUBLE_EQ( sum, acc.valueSum ); EXPECT_EQ( 4u, acc.sampleCount ); } -} \ No newline at end of file +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RigStatisticsMath, calculateStatisticsCurves ) +{ + { + std::vector values; + + double mean = HUGE_VAL; + double p10 = HUGE_VAL; + double p50 = HUGE_VAL; + double p90 = HUGE_VAL; + + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + EXPECT_TRUE( std::isinf( p10 ) ); + EXPECT_TRUE( std::isinf( p50 ) ); + EXPECT_TRUE( std::isinf( p90 ) ); + EXPECT_TRUE( std::isinf( mean ) ); + } + + { + std::vector values{ + 1.0, + 1.0, + 1.0, + }; + + double mean = HUGE_VAL; + double p10 = HUGE_VAL; + double p50 = HUGE_VAL; + double p90 = HUGE_VAL; + + // If we have few samples, P10 and P90 cannot be computed + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + EXPECT_TRUE( std::isinf( p10 ) ); + EXPECT_TRUE( std::isinf( p90 ) ); + EXPECT_DOUBLE_EQ( 1.0, p50 ); + EXPECT_DOUBLE_EQ( 1.0, mean ); + } + + { + std::vector values{ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 5.0, 10.0 }; + + double mean = HUGE_VAL; + double p10 = HUGE_VAL; + double p50 = HUGE_VAL; + double p90 = HUGE_VAL; + + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + EXPECT_DOUBLE_EQ( 1.0, p10 ); + EXPECT_DOUBLE_EQ( 1.0, p50 ); + EXPECT_FALSE( std::isinf( p90 ) ); + EXPECT_FALSE( std::isinf( mean ) ); + } + + { + std::vector values{ 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; + + double mean = HUGE_VAL; + double p10 = HUGE_VAL; + double p50 = HUGE_VAL; + double p90 = HUGE_VAL; + + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + EXPECT_DOUBLE_EQ( 1.0, p10 ); + EXPECT_DOUBLE_EQ( 1.0, p50 ); + EXPECT_DOUBLE_EQ( 1.0, p90 ); + EXPECT_DOUBLE_EQ( 1.0, mean ); + } +}