mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-16 17:22:55 +00:00
Refactor MinAndMax to be a shared binary operator.
This commit is contained in:
parent
18375b5424
commit
8d60ed57ad
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user