Merge topic 'save-partition-statistics'

8ae76c27f Save statistics of each partition

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !3109
This commit is contained in:
Kenneth Moreland 2023-08-15 14:12:54 +00:00 committed by Kitware Robot
commit 3581248233
2 changed files with 41 additions and 5 deletions

@ -195,17 +195,16 @@ VTKM_CONT vtkm::cont::PartitionedDataSet Statistics::DoExecutePartitions(
// containing the local statistics. It will iterate through each partition in the input and call the // containing the local statistics. It will iterate through each partition in the input and call the
// DoExecute function. This is the same behavior as if we did not implement `DoExecutePartitions`. // DoExecute function. This is the same behavior as if we did not implement `DoExecutePartitions`.
// It has the added benefit of optimizations for concurrently executing small blocks. // It has the added benefit of optimizations for concurrently executing small blocks.
vtkm::cont::PartitionedDataSet localOutput = this->FilterField::DoExecutePartitions(input); vtkm::cont::PartitionedDataSet output = this->FilterField::DoExecutePartitions(input);
vtkm::Id numPartitions = input.GetNumberOfPartitions(); vtkm::Id numPartitions = input.GetNumberOfPartitions();
DistributedStatistics helper(numPartitions); DistributedStatistics helper(numPartitions);
for (vtkm::Id i = 0; i < numPartitions; ++i) for (vtkm::Id i = 0; i < numPartitions; ++i)
{ {
const vtkm::cont::DataSet& localDS = localOutput.GetPartition(i); const vtkm::cont::DataSet& localDS = output.GetPartition(i);
StatValueType localStatisticsValues = GetStatValueFromDataSet(localDS); StatValueType localStatisticsValues = GetStatValueFromDataSet(localDS);
helper.SetLocalStatistics(i, localStatisticsValues); helper.SetLocalStatistics(i, localStatisticsValues);
} }
StatValueType result = helper.ReduceStatisticsDiy(); StatValueType result = helper.ReduceStatisticsDiy();
vtkm::cont::PartitionedDataSet output;
SaveIntoDataSet<vtkm::cont::PartitionedDataSet>( SaveIntoDataSet<vtkm::cont::PartitionedDataSet>(
result, output, vtkm::cont::Field::Association::Global); result, output, vtkm::cont::Field::Association::Global);
return output; return output;

@ -16,8 +16,9 @@
namespace namespace
{ {
template <typename DataSetType> template <typename DataSetType>
vtkm::FloatDefault getStatsFromDataSet(const DataSetType& dataset, const std::string statName) vtkm::FloatDefault getStatsFromDataSet(const DataSetType& dataset, const std::string& statName)
{ {
vtkm::cont::ArrayHandle<vtkm::FloatDefault> array; vtkm::cont::ArrayHandle<vtkm::FloatDefault> array;
dataset.GetField(statName).GetData().AsArrayHandle(array); dataset.GetField(statName).GetData().AsArrayHandle(array);
@ -28,6 +29,7 @@ vtkm::FloatDefault getStatsFromDataSet(const DataSetType& dataset, const std::st
void TestStatisticsPartial() void TestStatisticsPartial()
{ {
std::cout << "Test statistics for single vtkm::cont::DataSet" << std::endl;
vtkm::cont::DataSet dataSet; vtkm::cont::DataSet dataSet;
constexpr vtkm::FloatDefault N = 1000; constexpr vtkm::FloatDefault N = 1000;
auto scalarArrayCounting = auto scalarArrayCounting =
@ -79,6 +81,8 @@ void TestStatisticsPartial()
void TestStatisticsPartition() void TestStatisticsPartition()
{ {
std::cout << "Test statistics for vtkm::cont::PartitionedDataSet" << std::endl;
std::vector<vtkm::cont::DataSet> dataSetList; std::vector<vtkm::cont::DataSet> dataSetList;
constexpr vtkm::FloatDefault N = 1000; constexpr vtkm::FloatDefault N = 1000;
@ -109,6 +113,8 @@ void TestStatisticsPartition()
statisticsFilter.SetActiveField("scalarField", AsscoType::Points); statisticsFilter.SetActiveField("scalarField", AsscoType::Points);
vtkm::cont::PartitionedDataSet outputPDS = statisticsFilter.Execute(pds); vtkm::cont::PartitionedDataSet outputPDS = statisticsFilter.Execute(pds);
std::cout << " Check aggregate statistics" << std::endl;
vtkm::FloatDefault NValueFromFilter = getStatsFromDataSet(outputPDS, "N"); vtkm::FloatDefault NValueFromFilter = getStatsFromDataSet(outputPDS, "N");
VTKM_TEST_ASSERT(test_equal(NValueFromFilter, N)); VTKM_TEST_ASSERT(test_equal(NValueFromFilter, N));
@ -142,15 +148,46 @@ void TestStatisticsPartition()
vtkm::FloatDefault PopulationVariance = getStatsFromDataSet(outputPDS, "PopulationVariance"); vtkm::FloatDefault PopulationVariance = getStatsFromDataSet(outputPDS, "PopulationVariance");
VTKM_TEST_ASSERT(test_equal(PopulationVariance, 83333.3)); VTKM_TEST_ASSERT(test_equal(PopulationVariance, 83333.3));
vtkm::Id numOutPartitions = outputPDS.GetNumberOfPartitions();
VTKM_TEST_ASSERT(pds.GetNumberOfPartitions() == numOutPartitions);
for (vtkm::Id partitionId = 0; partitionId < numOutPartitions; ++partitionId)
{
std::cout << " Check partition " << partitionId << std::endl;
// Assume stats for a single `DataSet` is working.
vtkm::cont::DataSet inPartition = pds.GetPartition(partitionId);
vtkm::cont::DataSet inStats = statisticsFilter.Execute(inPartition);
vtkm::cont::DataSet outStats = outputPDS.GetPartition(partitionId);
auto checkStats = [&](const std::string& statName) {
vtkm::FloatDefault inStat = getStatsFromDataSet(inStats, statName);
vtkm::FloatDefault outStat = getStatsFromDataSet(outStats, statName);
VTKM_TEST_ASSERT(test_equal(inStat, outStat));
};
checkStats("N");
checkStats("Min");
checkStats("Max");
checkStats("Sum");
checkStats("Mean");
checkStats("SampleVariance");
checkStats("SampleStddev");
checkStats("Skewness");
checkStats("Kurtosis");
checkStats("PopulationStddev");
checkStats("PopulationVariance");
}
} }
void TestStatistics() void TestStatistics()
{ {
TestStatisticsPartial(); TestStatisticsPartial();
TestStatisticsPartition(); TestStatisticsPartition();
} // TestFieldStatistics
} }
} // anonymous namespace
int UnitTestStatisticsFilter(int argc, char* argv[]) int UnitTestStatisticsFilter(int argc, char* argv[])
{ {
return vtkm::cont::testing::Testing::Run(TestStatistics, argc, argv); return vtkm::cont::testing::Testing::Run(TestStatistics, argc, argv);