#1035 Adjusted the statistics calculators a bit.

This commit is contained in:
Jacob Støren 2016-12-20 11:39:10 +01:00
parent 8f145da725
commit 3c55a86650
4 changed files with 109 additions and 21 deletions

View File

@ -21,33 +21,26 @@
#include "RigStatisticsCalculator.h" #include "RigStatisticsCalculator.h"
#include "cvfBase.h"
#include "cvfObject.h"
#include "cvfCollection.h"
class RigHistogramCalculator; class RigHistogramCalculator;
class RigCaseCellResultsData; class RigCaseCellResultsData;
//================================================================================================== //==================================================================================================
/// ///
//================================================================================================== //==================================================================================================
class RigEclipseNativeStatCalc : public RigStatisticsCalculator class RigEclipseNativeStatCalc : public RigStatisticsCalculator
{ {
public: public:
RigEclipseNativeStatCalc(RigCaseCellResultsData* cellResultsData, size_t scalarResultIndex); RigEclipseNativeStatCalc(RigCaseCellResultsData* cellResultsData, size_t scalarResultIndex);
virtual void minMaxCellScalarValues(size_t timeStepIndex, double& min, double& max); virtual void minMaxCellScalarValues(size_t timeStepIndex, double& min, double& max);
virtual void posNegClosestToZero(size_t timeStepIndex, double& pos, double& neg); virtual void posNegClosestToZero(size_t timeStepIndex, double& pos, double& neg);
virtual void valueSumAndSampleCount(size_t timeStepIndex, double& valueSum, size_t& sampleCount);
virtual void valueSumAndSampleCount(size_t timeStepIndex, double& valueSum, size_t& sampleCount); virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator);
virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator);
virtual void uniqueValues(size_t timeStepIndex, std::set<int>& values); virtual void uniqueValues(size_t timeStepIndex, std::set<int>& values);
virtual size_t timeStepCount(); virtual size_t timeStepCount();
private: private:
RigCaseCellResultsData* m_resultsData; RigCaseCellResultsData* m_resultsData;
size_t m_scalarResultIndex; size_t m_scalarResultIndex;
}; };

View File

@ -262,7 +262,17 @@ const std::vector<int>& RigStatisticsDataCache::uniqueCellScalarValues()
{ {
computeUniqueValuesIfNeeded(); computeUniqueValuesIfNeeded();
return m_uniqueValues; return m_statsAllTimesteps.m_uniqueValues;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::vector<int>& RigStatisticsDataCache::uniqueCellScalarValues(size_t timeStepIndex)
{
computeUniqueValuesIfNeeded(timeStepIndex);
return m_statsPrTs[timeStepIndex].m_uniqueValues;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -334,15 +344,31 @@ void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded(size_t timeStepI
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::computeUniqueValuesIfNeeded() void RigStatisticsDataCache::computeUniqueValuesIfNeeded()
{ {
if (m_uniqueValues.size() == 0) if (m_statsAllTimesteps.m_uniqueValues.size() == 0)
{ {
std::set<int> setValues; std::set<int> setValues;
m_statisticsCalculator->uniqueValues(0, setValues); m_statisticsCalculator->uniqueValues(0, setValues); // This is a Hack ! Only using first timestep. Ok for Static eclipse results but beware !
for (auto val : setValues) for (auto val : setValues)
{ {
m_uniqueValues.push_back(val); m_statsAllTimesteps.m_uniqueValues.push_back(val);
} }
} }
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::computeUniqueValuesIfNeeded(size_t timeStepIndex)
{
if ( m_statsPrTs[timeStepIndex].m_uniqueValues.size() == 0 )
{
std::set<int> setValues;
m_statisticsCalculator->uniqueValues(timeStepIndex, setValues);
for ( auto val : setValues )
{
m_statsPrTs[timeStepIndex].m_uniqueValues.push_back(val);
}
}
}

View File

@ -56,12 +56,14 @@ public:
const std::vector<size_t>& cellScalarValuesHistogram(size_t timeStepIndex); const std::vector<size_t>& cellScalarValuesHistogram(size_t timeStepIndex);
const std::vector<int>& uniqueCellScalarValues(); const std::vector<int>& uniqueCellScalarValues();
const std::vector<int>& uniqueCellScalarValues(size_t timeStepIndex);
private: private:
void computeHistogramStatisticsIfNeeded(); void computeHistogramStatisticsIfNeeded();
void computeHistogramStatisticsIfNeeded(size_t timeStepIndex); void computeHistogramStatisticsIfNeeded(size_t timeStepIndex);
void computeUniqueValuesIfNeeded(); void computeUniqueValuesIfNeeded();
void computeUniqueValuesIfNeeded(size_t timeStepIndex);
private: private:
struct StatisticsValues struct StatisticsValues
@ -100,11 +102,12 @@ private:
bool m_isValueSumCalculated; bool m_isValueSumCalculated;
std::vector<size_t> m_histogram; std::vector<size_t> m_histogram;
std::vector<int> m_uniqueValues;
}; };
StatisticsValues m_statsAllTimesteps; StatisticsValues m_statsAllTimesteps;
std::vector<StatisticsValues> m_statsPrTs; std::vector<StatisticsValues> m_statsPrTs;
std::vector<int> m_uniqueValues;
cvf::ref<RigStatisticsCalculator> m_statisticsCalculator; cvf::ref<RigStatisticsCalculator> m_statisticsCalculator;
}; };

View File

@ -62,7 +62,24 @@ private:
class MinMaxAccumulator class MinMaxAccumulator
{ {
public: public:
MinMaxAccumulator(double initMin, double initMax): max(initMax), min(initMin) {} MinMaxAccumulator(double initMin = -HUGE_VAL, double initMax = HUGE_VAL): max(initMax), min(initMin) {}
void addData(const std::vector<double>& values)
{
for ( double val : values )
{
addValue(val);
}
}
void addData(const std::vector<float>& values)
{
for ( float val : values )
{
addValue(val);
}
}
void addValue(double value) void addValue(double value)
{ {
if (value == HUGE_VAL) // TODO if (value == HUGE_VAL) // TODO
@ -89,7 +106,24 @@ public:
class PosNegAccumulator class PosNegAccumulator
{ {
public: public:
PosNegAccumulator(double initPos, double initNeg): pos(initPos), neg(initNeg) {} PosNegAccumulator(double initPos = HUGE_VAL, double initNeg = -HUGE_VAL): pos(initPos), neg(initNeg) {}
void addData(const std::vector<double>& values)
{
for (double val : values)
{
addValue(val);
}
}
void addData(const std::vector<float>& values)
{
for ( float val : values )
{
addValue(val);
}
}
void addValue(double value) void addValue(double value)
{ {
if (value == HUGE_VAL) if (value == HUGE_VAL)
@ -116,7 +150,23 @@ public:
class SumCountAccumulator class SumCountAccumulator
{ {
public: public:
SumCountAccumulator(double initSum, size_t initCount): valueSum(initSum), sampleCount(initCount) {} SumCountAccumulator(double initSum = 0.0, size_t initCount = 0): valueSum(initSum), sampleCount(initCount) {}
void addData(const std::vector<double>& values)
{
for ( double val : values )
{
addValue(val);
}
}
void addData(const std::vector<float>& values)
{
for ( float val : values )
{
addValue(val);
}
}
void addValue(double value) void addValue(double value)
{ {
@ -140,6 +190,22 @@ public:
UniqueValueAccumulator() UniqueValueAccumulator()
{} {}
void addData(const std::vector<double>& values)
{
for ( double val : values )
{
addValue(val);
}
}
void addData(const std::vector<float>& values)
{
for ( float val : values )
{
addValue(val);
}
}
void addValue(double value) void addValue(double value)
{ {
uniqueValues.insert(static_cast<int>(value)); uniqueValues.insert(static_cast<int>(value));