Refactor MinAndMax to be a shared binary operator.

This commit is contained in:
Robert Maynard 2016-11-23 15:18:58 -05:00
parent 18375b5424
commit 8d60ed57ad
5 changed files with 45 additions and 137 deletions

@ -21,6 +21,8 @@
#define vtk_m_BinaryOperators_h
#include <vtkm/internal/ExportMacros.h>
#include <vtkm/Math.h>
#include <vtkm/Pair.h>
namespace vtkm {
@ -90,6 +92,40 @@ struct Minimum
}
};
/// Binary Predicate that takes two arguments argument \c x, and \c y and
/// returns a vtkm::Pair<T,T> that represents the minimum and maximum values
/// Note: Requires Type \p T implement the vtkm::Min and vtkm::Max functions.
template <typename T>
struct MinAndMax
{
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b), vtkm::Max(a, b));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(
const vtkm::Pair<T, T>& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(
vtkm::Min(a.first, b.first), vtkm::Max(a.second, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b.first), vtkm::Max(a, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const vtkm::Pair<T, T>& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a.first, b), vtkm::Max(a.second, b));
}
};
/// Binary Predicate that takes two arguments argument \c x, and \c y and
/// returns the bitwise operation <tt>x&y</tt>
/// Note: Requires Type \p T implement the & operator.

@ -24,6 +24,7 @@
#include <vtkm/Range.h>
#include <vtkm/Types.h>
#include <vtkm/VecTraits.h>
#include <vtkm/BinaryOperators.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/ArrayHandleTransform.h>
@ -38,36 +39,6 @@ namespace cont {
namespace internal {
template <typename T>
struct MinMaxValue
{
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b), vtkm::Max(a, b));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(
const vtkm::Pair<T, T>& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(
vtkm::Min(a.first, b.first), vtkm::Max(a.second, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b.first), vtkm::Max(a, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const vtkm::Pair<T, T>& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a.first, b), vtkm::Max(a.second, b));
}
};
template<typename DeviceAdapterTag>
class ComputeRange
{
@ -90,7 +61,7 @@ public:
input.GetPortalConstControl().Get(0));
vtkm::Pair<ValueType, ValueType> result =
Algorithm::Reduce(input, initial, MinMaxValue<ValueType>());
Algorithm::Reduce(input, initial, vtkm::MinAndMax<ValueType>());
this->Range->Allocate(NumberOfComponents);
for (vtkm::IdComponent i = 0; i < NumberOfComponents; ++i)

@ -22,6 +22,8 @@
#include <vtkm/TypeTraits.h>
#include <vtkm/BinaryPredicates.h>
#include <vtkm/BinaryOperators.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/ArrayHandleConstant.h>
#include <vtkm/cont/ArrayHandleIndex.h>
@ -58,48 +60,6 @@ namespace vtkm {
namespace cont {
namespace testing {
namespace comparison {
struct MaxValue
{
template<typename T>
VTKM_EXEC_CONT T operator()(const T& a,const T& b) const
{
return (a > b) ? a : b;
}
};
template <typename T>
struct MinMaxValue
{
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b), vtkm::Max(a, b));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(
const vtkm::Pair<T, T>& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(
vtkm::Min(a.first, b.first), vtkm::Max(a.second, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b.first), vtkm::Max(a, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const vtkm::Pair<T, T>& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a.first, b), vtkm::Max(a.second, b));
}
};
}
#define ERROR_MESSAGE "Got an error."
#define ARRAY_SIZE 1000
#define OFFSET 1000
@ -1130,7 +1090,7 @@ private:
IdArrayHandle input = vtkm::cont::make_ArrayHandle(testData, ARRAY_SIZE);
vtkm::Pair<vtkm::Id,vtkm::Id> range = Algorithm::Reduce(input,
vtkm::Pair<vtkm::Id,vtkm::Id>(0,0),
comparison::MinMaxValue<vtkm::Id>());
vtkm::MinAndMax<vtkm::Id>());
VTKM_TEST_ASSERT(maxValue == range.second,
"Got bad value from Reduce with comparison object");
@ -1466,7 +1426,7 @@ private:
IdArrayHandle result;
vtkm::Id sum = Algorithm::ScanInclusive(array,
result,
comparison::MaxValue());
vtkm::Maximum());
VTKM_TEST_ASSERT(sum == OFFSET + (ARRAY_SIZE-1),
"Got bad sum from Inclusive Scan with comparison object");
@ -1480,7 +1440,7 @@ private:
//now try it inline
sum = Algorithm::ScanInclusive(array,
array,
comparison::MaxValue());
vtkm::Maximum());
VTKM_TEST_ASSERT(sum == OFFSET + (ARRAY_SIZE-1),
"Got bad sum from Inclusive Scan with comparison object");

@ -65,35 +65,6 @@ namespace worklet {
class FieldHistogram
{
public:
template <typename T>
struct MinMaxValue
{
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b), vtkm::Max(a, b));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(
const vtkm::Pair<T, T>& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(
vtkm::Min(a.first, b.first), vtkm::Max(a.second, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b.first), vtkm::Max(a, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const vtkm::Pair<T, T>& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a.first, b), vtkm::Max(a.second, b));
}
};
// For each value set the bin it should be in
template<typename FieldType>
@ -181,7 +152,7 @@ public:
fieldArray.GetPortalConstControl().Get(0));
vtkm::Pair<FieldType,FieldType> result =
DeviceAlgorithms::Reduce(fieldArray, initValue, MinMaxValue<FieldType>());
DeviceAlgorithms::Reduce(fieldArray, initValue, vtkm::MinAndMax<FieldType>());
const FieldType& fieldMinValue = result.first;
const FieldType& fieldMaxValue = result.second;

@ -67,36 +67,6 @@ public:
FieldType centralMoment[4];
};
struct MinMaxValue
{
using T = FieldType;
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b), vtkm::Max(a, b));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(
const vtkm::Pair<T, T>& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(
vtkm::Min(a.first, b.first), vtkm::Max(a.second, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const T& a, const vtkm::Pair<T, T>& b) const
{
return vtkm::make_Pair(vtkm::Min(a, b.first), vtkm::Max(a, b.second));
}
VTKM_EXEC_CONT
vtkm::Pair<T, T> operator()(const vtkm::Pair<T, T>& a, const T& b) const
{
return vtkm::make_Pair(vtkm::Min(a.first, b), vtkm::Max(a.second, b));
}
};
class CalculatePowers : public vtkm::worklet::WorkletMapField
{
public:
@ -170,7 +140,7 @@ public:
const vtkm::Pair<FieldType,FieldType> initValue(tempPortal.Get(0),
tempPortal.Get(0));
vtkm::Pair<FieldType,FieldType> result =
DeviceAlgorithms::Reduce(fieldArray, initValue, MinMaxValue());
DeviceAlgorithms::Reduce(fieldArray, initValue, vtkm::MinAndMax<FieldType>());
statinfo.minimum = result.first;
statinfo.maximum = result.second;