Merge branch 'tbb_SortByKey_ZipArray_fix' into 'master'

TBB sort by key zip array fix

The original codes do not accept when the zip handle array contains two different storage types

See merge request !25
This commit is contained in:
Robert Maynard 2015-06-12 15:43:09 -04:00
commit 50ffcec3bb
2 changed files with 172 additions and 8 deletions

@ -670,16 +670,19 @@ public:
// the value summed currently, the second being 0 or 1, with 1 being used
// when this is a value of a key we need to write ( END or START_AND_END)
{
typedef vtkm::cont::ArrayHandle<U,VIn> ValueHandleType;
typedef vtkm::cont::ArrayHandle<U,VIn> ValueInHandleType;
typedef vtkm::cont::ArrayHandle<U,VOut> ValueOutHandleType;
typedef vtkm::cont::ArrayHandle< vtkm::UInt8> StencilHandleType;
typedef vtkm::cont::ArrayHandleZip<ValueHandleType,
StencilHandleType> ZipHandleType;
typedef vtkm::cont::ArrayHandleZip<ValueInHandleType,
StencilHandleType> ZipInHandleType;
typedef vtkm::cont::ArrayHandleZip<ValueOutHandleType,
StencilHandleType> ZipOutHandleType;
vtkm::cont::ArrayHandle< vtkm::UInt8 > stencil;
vtkm::cont::ArrayHandle< U > reducedValues;
StencilHandleType stencil;
ValueOutHandleType reducedValues;
ZipHandleType scanInput( values, keystate);
ZipHandleType scanOutput( reducedValues, stencil);
ZipInHandleType scanInput( values, keystate);
ZipOutHandleType scanOutput( reducedValues, stencil);
DerivedAlgorithm::ScanInclusive(scanInput, scanOutput, ReduceByKeyAdd() );
//at this point we are done with keystate, so free the memory

@ -23,7 +23,11 @@
#include <vtkm/TypeTraits.h>
#include <vtkm/cont/ArrayHandle.h>
#include <vtkm/cont/ArrayHandleZip.h>
#include <vtkm/cont/ArrayHandleConstant.h>
#include <vtkm/cont/ArrayHandleZip.h>
#include <vtkm/cont/ArrayPortalToIterators.h>
#include <vtkm/cont/ArrayHandleConstant.h>
#include <vtkm/cont/ArrayHandleZip.h>
#include <vtkm/cont/ErrorControlOutOfMemory.h>
#include <vtkm/cont/ErrorExecution.h>
#include <vtkm/cont/StorageBasic.h>
@ -1108,7 +1112,7 @@ private:
}
//next test with values in vec3d (Added by Jimmy to be reviewed)
//next test with values in vec3d
{
const vtkm::Id inputLength = 3;
const vtkm::Id expectedLength = 1;
@ -1147,6 +1151,163 @@ private:
VTKM_TEST_ASSERT( expectedValues[i] == v, "Incorrect reduced vale");
}
}
//next test with values in zip
{
const vtkm::Id inputLength = 3;
const vtkm::Id expectedLength = 1;
typedef vtkm::Float32 ValueType;
vtkm::Id inputKeys[inputLength] = {0, 0, 0}; // input keys
ValueType inputValues1[inputLength] = {13.1f, -2.1f, -1.0f}; // input values array1
ValueType inputValues2[inputLength] = {13.3f, -2.3f, -1.0f}; // input values array2
vtkm::Id expectedKeys[expectedLength] = { 0};
ValueType expectedValues1[expectedLength] = {10.f}; // output values 1
ValueType expectedValues2[expectedLength] = {10.f}; // output values 2
IdArrayHandle keys = MakeArrayHandle(inputKeys, inputLength);
typedef vtkm::cont::ArrayHandle<ValueType, StorageTag> ValueArrayType;
ValueArrayType values1 = MakeArrayHandle(inputValues1, inputLength);
ValueArrayType values2 = MakeArrayHandle(inputValues2, inputLength);
vtkm::cont::ArrayHandleZip<ValueArrayType, ValueArrayType> valuesZip;
valuesZip = make_ArrayHandleZip(values1, values2); // values in zip
IdArrayHandle keysOut;
ValueArrayType valuesOut1;
ValueArrayType valuesOut2;
vtkm::cont::ArrayHandleZip<ValueArrayType, ValueArrayType> valuesOutZip(valuesOut1, valuesOut2);
Algorithm::ReduceByKey( keys,
valuesZip,
keysOut,
valuesOutZip,
vtkm::internal::Add() );
VTKM_TEST_ASSERT(keysOut.GetNumberOfValues() == expectedLength,
"Got wrong number of output keys");
VTKM_TEST_ASSERT(valuesOutZip.GetNumberOfValues() == expectedLength,
"Got wrong number of output values");
for(vtkm::Id i=0; i < expectedLength; ++i)
{
const vtkm::Id k = keysOut.GetPortalConstControl().Get(i);
const vtkm::Pair<ValueType, ValueType> v = valuesOutZip.GetPortalConstControl().Get(i);
VTKM_TEST_ASSERT( expectedKeys[i] == k, "Incorrect reduced key");
VTKM_TEST_ASSERT( expectedValues1[i] == v.first, "Incorrect reduced vale");
VTKM_TEST_ASSERT( expectedValues2[i] == v.second, "Incorrect reduced vale");
}
}
//next test with values in heterogeneous zip
{
const vtkm::Id inputLength = 3;
const vtkm::Id expectedLength = 1;
typedef vtkm::Float32 ValueType;
vtkm::Id inputKeys[inputLength] = {0, 0, 0}; // input keys
ValueType inputValues1[inputLength] = {13.1f, -2.1f, -1.0f}; // input values array1
vtkm::Id expectedKeys[expectedLength] = { 0};
ValueType expectedValues1[expectedLength] = {10.f}; // output values 1
ValueType expectedValues2[expectedLength] = {3.f}; // output values 2
IdArrayHandle keys = MakeArrayHandle(inputKeys, inputLength);
typedef vtkm::cont::ArrayHandle<ValueType, StorageTag> ValueArrayType;
ValueArrayType values1 = MakeArrayHandle(inputValues1, inputLength);
typedef vtkm::cont::ArrayHandleConstant<ValueType> ConstValueArrayType;
ConstValueArrayType constOneArray(1.f, inputLength);
vtkm::cont::ArrayHandleZip<ValueArrayType, ConstValueArrayType> valuesZip;
valuesZip = make_ArrayHandleZip(values1, constOneArray); // values in zip
IdArrayHandle keysOut;
ValueArrayType valuesOut1;
ValueArrayType valuesOut2;
vtkm::cont::ArrayHandleZip<ValueArrayType, ValueArrayType> valuesOutZip(valuesOut1, valuesOut2);
Algorithm::ReduceByKey( keys,
valuesZip,
keysOut,
valuesOutZip,
vtkm::internal::Add() );
VTKM_TEST_ASSERT(keysOut.GetNumberOfValues() == expectedLength,
"Got wrong number of output keys");
VTKM_TEST_ASSERT(valuesOutZip.GetNumberOfValues() == expectedLength,
"Got wrong number of output values");
for(vtkm::Id i=0; i < expectedLength; ++i)
{
const vtkm::Id k = keysOut.GetPortalConstControl().Get(i);
const vtkm::Pair<ValueType, ValueType> v = valuesOutZip.GetPortalConstControl().Get(i);
VTKM_TEST_ASSERT( expectedKeys[i] == k, "Incorrect reduced key");
VTKM_TEST_ASSERT( expectedValues1[i] == v.first, "Incorrect reduced value1");
VTKM_TEST_ASSERT( expectedValues2[i] == v.second, "Incorrect reduced value2");
}
}
//next test with values in heterogeneous zip with diff. keys
{
const vtkm::Id inputLength = 30;
const vtkm::Id expectedLength = 10;
typedef vtkm::Float32 ValueType;
vtkm::Id inputKeys[inputLength] = {0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,
5,5,5,6,6,6,7,7,7,8,8,8,9,9,9}; // input keys
ValueType inputValues1[inputLength] = {13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f,
13.1f, -2.1f, -1.0f}; // input values array1
vtkm::Id expectedKeys[expectedLength] = {0,1,2,3,4,5,6,7,8,9};
ValueType expectedValues1[expectedLength] = {10.f,10.f,10.f,10.f,10.f,10.f,10.f,10.f,10.f,10.f}; // output values 1
ValueType expectedValues2[expectedLength] = {3.f,3.f,3.f,3.f,3.f,3.f,3.f,3.f,3.f,3.f}; // output values 2
IdArrayHandle keys = MakeArrayHandle(inputKeys, inputLength);
typedef vtkm::cont::ArrayHandle<ValueType, StorageTag> ValueArrayType;
ValueArrayType values1 = MakeArrayHandle(inputValues1, inputLength);
typedef vtkm::cont::ArrayHandleConstant<ValueType> ConstValueArrayType;
ConstValueArrayType constOneArray(1.f, inputLength);
vtkm::cont::ArrayHandleZip<ValueArrayType, ConstValueArrayType> valuesZip;
valuesZip = make_ArrayHandleZip(values1, constOneArray); // values in zip
IdArrayHandle keysOut;
ValueArrayType valuesOut1;
ValueArrayType valuesOut2;
vtkm::cont::ArrayHandleZip<ValueArrayType, ValueArrayType> valuesOutZip(valuesOut1, valuesOut2);
Algorithm::ReduceByKey( keys,
valuesZip,
keysOut,
valuesOutZip,
vtkm::internal::Add() );
VTKM_TEST_ASSERT(keysOut.GetNumberOfValues() == expectedLength,
"Got wrong number of output keys");
VTKM_TEST_ASSERT(valuesOutZip.GetNumberOfValues() == expectedLength,
"Got wrong number of output values");
for(vtkm::Id i=0; i < expectedLength; ++i)
{
const vtkm::Id k = keysOut.GetPortalConstControl().Get(i);
const vtkm::Pair<ValueType, ValueType> v = valuesOutZip.GetPortalConstControl().Get(i);
std::cout << "key=" << k << "," << "expectedValues1[i] = " << expectedValues1[i] << "," << "computed value1 = " << v.first << std::endl;
VTKM_TEST_ASSERT( expectedKeys[i] == k, "Incorrect reduced key");
VTKM_TEST_ASSERT( expectedValues1[i] == v.first, "Incorrect reduced value1");
VTKM_TEST_ASSERT( expectedValues2[i] == v.second, "Incorrect reduced value2");
VTKM_TEST_ASSERT( expectedValues1[i] == v.first, "Incorrect reduced vale");
VTKM_TEST_ASSERT( expectedValues2[i] == v.second, "Incorrect reduced vale");
}
}
}
static VTKM_CONT_EXPORT void TestScanInclusive()