Avoid repeatedly recalculation of statistics of HUGE_VAL-only results

This commit is contained in:
Jacob Støren 2015-06-24 10:39:55 +02:00
parent 7d075999af
commit 2b881f2cb8
2 changed files with 27 additions and 23 deletions

View File

@ -41,11 +41,14 @@ void RigStatisticsDataCache::clearAllStatistics()
{ {
m_minValue = HUGE_VAL; m_minValue = HUGE_VAL;
m_maxValue = -HUGE_VAL; m_maxValue = -HUGE_VAL;
m_isMaxMinCalculated = false;
m_posClosestToZero = HUGE_VAL; m_posClosestToZero = HUGE_VAL;
m_negClosestToZero = -HUGE_VAL; m_negClosestToZero = -HUGE_VAL;
m_isClosestToZeroCalculated = false;
m_p10 = HUGE_VAL; m_p10 = HUGE_VAL;
m_p90 = HUGE_VAL; m_p90 = HUGE_VAL;
m_meanValue = HUGE_VAL; m_meanValue = HUGE_VAL;
m_isMeanCalculated = false;
m_histogram.clear(); m_histogram.clear();
m_maxMinValuesPrTs.clear(); m_maxMinValuesPrTs.clear();
@ -57,7 +60,7 @@ void RigStatisticsDataCache::clearAllStatistics()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::minMaxCellScalarValues(double& min, double& max) void RigStatisticsDataCache::minMaxCellScalarValues(double& min, double& max)
{ {
if (m_minValue == HUGE_VAL) if (!m_isMaxMinCalculated)
{ {
min = HUGE_VAL; min = HUGE_VAL;
max = -HUGE_VAL; max = -HUGE_VAL;
@ -73,6 +76,7 @@ void RigStatisticsDataCache::minMaxCellScalarValues(double& min, double& max)
m_minValue = min; m_minValue = min;
m_maxValue = max; m_maxValue = max;
m_isMaxMinCalculated = true;
} }
min = m_minValue; min = m_minValue;
@ -87,18 +91,15 @@ void RigStatisticsDataCache::minMaxCellScalarValues(size_t timeStepIndex, double
if (timeStepIndex >= m_maxMinValuesPrTs.size()) if (timeStepIndex >= m_maxMinValuesPrTs.size())
{ {
m_maxMinValuesPrTs.resize(timeStepIndex + 1, std::make_pair(HUGE_VAL, -HUGE_VAL)); m_maxMinValuesPrTs.resize(timeStepIndex + 1, std::make_pair(HUGE_VAL, -HUGE_VAL));
}
if (m_maxMinValuesPrTs[timeStepIndex].first == HUGE_VAL) double tsMin = HUGE_VAL;
{ double tsMax = -HUGE_VAL;
min = HUGE_VAL;
max = -HUGE_VAL;
m_statisticsCalculator->minMaxCellScalarValues(timeStepIndex, min, max); m_statisticsCalculator->minMaxCellScalarValues(timeStepIndex, tsMin, tsMax);
m_maxMinValuesPrTs[timeStepIndex].first = min; m_maxMinValuesPrTs[timeStepIndex].first = tsMin;
m_maxMinValuesPrTs[timeStepIndex].second = max; m_maxMinValuesPrTs[timeStepIndex].second = tsMax;
} }
min = m_maxMinValuesPrTs[timeStepIndex].first; min = m_maxMinValuesPrTs[timeStepIndex].first;
max = m_maxMinValuesPrTs[timeStepIndex].second; max = m_maxMinValuesPrTs[timeStepIndex].second;
@ -109,7 +110,7 @@ void RigStatisticsDataCache::minMaxCellScalarValues(size_t timeStepIndex, double
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::posNegClosestToZero(double& pos, double& neg) void RigStatisticsDataCache::posNegClosestToZero(double& pos, double& neg)
{ {
if (m_posClosestToZero == HUGE_VAL) if (!m_isClosestToZeroCalculated)
{ {
pos = HUGE_VAL; pos = HUGE_VAL;
neg = -HUGE_VAL; neg = -HUGE_VAL;
@ -125,6 +126,7 @@ void RigStatisticsDataCache::posNegClosestToZero(double& pos, double& neg)
m_posClosestToZero = pos; m_posClosestToZero = pos;
m_negClosestToZero = neg; m_negClosestToZero = neg;
m_isClosestToZeroCalculated = true;
} }
pos = m_posClosestToZero; pos = m_posClosestToZero;
@ -134,26 +136,23 @@ void RigStatisticsDataCache::posNegClosestToZero(double& pos, double& neg)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::posNegClosestToZero(size_t timeStepIndex, double& pos, double& neg) void RigStatisticsDataCache::posNegClosestToZero(size_t timeStepIndex, double& posNearZero, double& negNearZero)
{ {
if (timeStepIndex >= m_posNegClosestToZeroPrTs.size()) if (timeStepIndex >= m_posNegClosestToZeroPrTs.size())
{ {
m_posNegClosestToZeroPrTs.resize(timeStepIndex + 1, std::make_pair(HUGE_VAL, -HUGE_VAL)); m_posNegClosestToZeroPrTs.resize(timeStepIndex + 1, std::make_pair(HUGE_VAL, -HUGE_VAL));
}
if (m_posNegClosestToZeroPrTs[timeStepIndex].first == HUGE_VAL) double pos = HUGE_VAL;
{ double neg = -HUGE_VAL;
pos = HUGE_VAL;
neg = -HUGE_VAL;
m_statisticsCalculator->posNegClosestToZero(timeStepIndex, pos, neg); m_statisticsCalculator->posNegClosestToZero(timeStepIndex, pos, neg);
m_posNegClosestToZeroPrTs[timeStepIndex].first = pos; m_posNegClosestToZeroPrTs[timeStepIndex].first = pos;
m_posNegClosestToZeroPrTs[timeStepIndex].second = neg; m_posNegClosestToZeroPrTs[timeStepIndex].second = neg;
} }
pos = m_posNegClosestToZeroPrTs[timeStepIndex].first; posNearZero = m_posNegClosestToZeroPrTs[timeStepIndex].first;
neg = m_posNegClosestToZeroPrTs[timeStepIndex].second; negNearZero = m_posNegClosestToZeroPrTs[timeStepIndex].second;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -196,9 +195,10 @@ void RigStatisticsDataCache::p10p90CellScalarValues(double& p10, double& p90)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::meanCellScalarValues(double& meanValue) void RigStatisticsDataCache::meanCellScalarValues(double& meanValue)
{ {
if (m_meanValue == HUGE_VAL) if (!m_isMeanCalculated)
{ {
m_statisticsCalculator->meanCellScalarValue(m_meanValue); m_statisticsCalculator->meanCellScalarValue(m_meanValue);
m_isMeanCalculated = true;
} }
meanValue = m_meanValue; meanValue = m_meanValue;

View File

@ -49,12 +49,16 @@ public:
private: private:
double m_minValue; double m_minValue;
double m_maxValue; double m_maxValue;
bool m_isMaxMinCalculated;
double m_posClosestToZero; double m_posClosestToZero;
double m_negClosestToZero; double m_negClosestToZero;
bool m_isClosestToZeroCalculated;
double m_p10; double m_p10;
double m_p90; double m_p90;
double m_meanValue; double m_meanValue;
bool m_isMeanCalculated;
std::vector<size_t> m_histogram; std::vector<size_t> m_histogram;