(#282) Added basic data structures to compute and cache unique integer values

This commit is contained in:
Magne Sjaastad
2016-08-05 10:26:21 +02:00
parent 24abb27674
commit 261ccd33e5
16 changed files with 166 additions and 0 deletions
@@ -45,6 +45,8 @@ public:
void addDataToHistogramCalculator(RigHistogramCalculator& histogramCalculator);
virtual void addDataToHistogramCalculator(size_t timeStepIndex, RigHistogramCalculator& histogramCalculator) = 0;
virtual void uniqueValues(size_t timeStepIndex, std::set<int>& values) = 0;
virtual size_t timeStepCount() = 0;
static void posNegClosestToZero(const std::vector<double>& values, double& pos, double& neg);
@@ -255,6 +255,26 @@ const std::vector<size_t>& RigStatisticsDataCache::cellScalarValuesHistogram(siz
return m_statsPrTs[timeStepIndex].m_histogram;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::set<int>& RigStatisticsDataCache::uniqueCellScalarValues()
{
computeUniqueValuesIfNeeded();
return m_statsAllTimesteps.m_uniqueValues;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
const std::set<int>& RigStatisticsDataCache::uniqueCellScalarValues(size_t timeStepIndex)
{
computeUniqueValuesIfNeeded(timeStepIndex);
return m_statsPrTs[timeStepIndex].m_uniqueValues;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@@ -319,3 +339,35 @@ void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded(size_t timeStepI
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::computeUniqueValuesIfNeeded(size_t timeStepIndex)
{
if (timeStepIndex >= m_statsPrTs.size())
{
m_statsPrTs.resize(timeStepIndex + 1);
}
if (m_statsPrTs[timeStepIndex].m_uniqueValues.size() == 0)
{
m_statisticsCalculator->uniqueValues(timeStepIndex, m_statsPrTs[timeStepIndex].m_uniqueValues);
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RigStatisticsDataCache::computeUniqueValuesIfNeeded()
{
if (m_statsAllTimesteps.m_uniqueValues.size() == 0)
{
for (size_t tIdx = 0; tIdx < m_statisticsCalculator->timeStepCount(); tIdx++)
{
computeUniqueValuesIfNeeded(tIdx);
m_statsAllTimesteps.m_uniqueValues.insert(m_statsPrTs[tIdx].m_uniqueValues.begin(), m_statsPrTs[tIdx].m_uniqueValues.end());
}
}
}
@@ -55,10 +55,16 @@ public:
const std::vector<size_t>& cellScalarValuesHistogram();
const std::vector<size_t>& cellScalarValuesHistogram(size_t timeStepIndex);
const std::set<int>& uniqueCellScalarValues();
const std::set<int>& uniqueCellScalarValues(size_t timeStepIndex);
private:
void computeHistogramStatisticsIfNeeded();
void computeHistogramStatisticsIfNeeded(size_t timeStepIndex);
void computeUniqueValuesIfNeeded();
void computeUniqueValuesIfNeeded(size_t timeStepIndex);
private:
struct StatisticsValues
{
@@ -96,6 +102,7 @@ private:
bool m_isValueSumCalculated;
std::vector<size_t> m_histogram;
std::set<int> m_uniqueValues;
};
StatisticsValues m_statsAllTimesteps;
@@ -18,6 +18,7 @@
#pragma once
#include <vector>
#include <set>
#include <cmath>
#include <cstddef>
@@ -131,3 +132,18 @@ public:
double valueSum;
size_t sampleCount;
};
class UniqueValueAccumulator
{
public:
UniqueValueAccumulator()
{}
void addValue(double value)
{
uniqueValues.insert(static_cast<int>(value));
}
std::set<int> uniqueValues;
};