finish multi-level implementation, need to test

This commit is contained in:
Samuel Li 2017-02-25 11:55:00 -07:00
parent 4d22303c6b
commit 80590fdf29
3 changed files with 72 additions and 70 deletions

@ -162,7 +162,7 @@ public:
vtkm::Id nLevels, // n levels of DWT
vtkm::Id inX, vtkm::Id inY, vtkm::Id inZ,
OutArrayType &coeffOut,
std::vector<vtkm::Id> &L,
//std::vector<vtkm::Id> &L,
DeviceTag )
{
vtkm::Id sigInLen = sigIn.GetNumberOfValues();
@ -179,7 +179,7 @@ public:
return 0;
}
this->ComputeL3( inX, inY, inZ, nLevels, L );
//this->ComputeL3( inX, inY, inZ, nLevels, L );
vtkm::Id currentLenX = inX;
vtkm::Id currentLenY = inY;
@ -192,39 +192,37 @@ public:
// First level transform writes to the output array
vtkm::Float64 computationTime = WaveletDWT::DWT3D(
sigIn,
currentLenX, currentLenY, currentLenZ,
0, 0, 0,
currentLenX, currentLenY, currentLenZ,
inX, inY, inZ,
0, 0, 0,
currentLenX, currentLenY, currentLenZ,
coeffOut,
L3d,
DeviceTag() );
VTKM_ASSERT( coeffOut.GetNumberOfValues() == currentLenX * currentLenY * currentLenZ );
currentLenX = WaveletBase::GetApproxLength( currentLenX );
currentLenY = WaveletBase::GetApproxLength( currentLenY );
currentLenZ = WaveletBase::GetApproxLength( currentLenZ );
// Successor transforms writes to a temporary array
/* for( vtkm::Id i = nLevels-1; i > 0; i-- )
for( vtkm::Id i = nLevels-1; i > 0; i-- )
{
OutBasicArray tempOutput;
computationTime +=
WaveletDWT::DWT2D ( coeffOut,
inX, inY,
0, 0,
currentLenX, currentLenY,
tempOutput, L2d, DeviceTag() );
// copy results to coeffOut
WaveletBase::DeviceRectangleCopyTo( tempOutput, currentLenX, currentLenY,
coeffOut, inX, inY, 0, 0, DeviceTag() );
// update currentLen
currentLenX = WaveletBase::GetApproxLength( currentLenX );
currentLenY = WaveletBase::GetApproxLength( currentLenY );
} */
currentLenZ = WaveletBase::GetApproxLength( currentLenZ );
OutBasicArray tempOutput;
computationTime += WaveletDWT::DWT3D(
coeffOut,
inX, inY, inZ,
0, 0, 0,
currentLenX, currentLenY, currentLenZ,
tempOutput,
DeviceTag() );
// copy results to coeffOut
WaveletBase::DeviceCubeCopyTo( tempOutput,
currentLenX, currentLenY, currentLenZ,
coeffOut,
inX, inY, inZ,
0, 0, 0,
DeviceTag() );
}
return computationTime;
}
@ -239,12 +237,10 @@ public:
vtkm::Id nLevels, // n levels of DWT
vtkm::Id inX, vtkm::Id inY, vtkm::Id inZ,
OutArrayType &arrOut,
std::vector<vtkm::Id> &L,
DeviceTag )
{
vtkm::Id arrInLen = arrIn.GetNumberOfValues();
VTKM_ASSERT( inX * inY * inZ == arrInLen );
VTKM_ASSERT( vtkm::Id(L.size()) == 21 * nLevels + 6 );
if( nLevels < 0 || nLevels > WaveletBase::GetWaveletMaxLevel( inX ) ||
nLevels > WaveletBase::GetWaveletMaxLevel( inY ) ||
nLevels > WaveletBase::GetWaveletMaxLevel( inZ ) )
@ -264,52 +260,58 @@ public:
else
vtkm::cont::DeviceAdapterAlgorithm< DeviceTag >::Copy( arrIn, outBuffer );
std::vector<vtkm::Id> L;
this->ComputeL3( inX, inY, inZ, nLevels, L );
std::vector<vtkm::Id> L3d(27, 0);
for( size_t i = 0; i < 27; i++ )
L3d[i] = L[i];
WaveletDWT::IDWT3D( outBuffer,
inX, inY, inZ,
0, 0, 0,
L3d,
arrOut,
DeviceTag() );
// All transforms but the last operate on temporary arrays
/*for( size_t i = 1; i < static_cast<size_t>(nLevels); i++ )
// All transforms but the last level operate on temporary arrays
for( size_t i = 0; i < 24; i++ )
L3d[i] = L[i];
for( size_t i = 1; i < static_cast<size_t>(nLevels); i++ )
{
L2d[8] = L2d[0] + L2d[4]; // This is always true for Biorthogonal wavelets
L2d[9] = L2d[1] + L2d[3]; // (same above)
L3d[24] = L3d[0] + L3d[12]; // Total X dim; this is always true for Biorthogonal wavelets
L3d[25] = L3d[1] + L3d[7]; // Total Y dim
L3d[26] = L3d[2] + L3d[5]; // Total Z dim
OutBasicArray tempOutput;
// IDWT
computationTime +=
WaveletDWT::IDWT2D ( outBuffer, inX, inY, 0, 0, L2d, tempOutput, DeviceTag() );
//computationTime +=
WaveletDWT::IDWT3D( outBuffer,
inX, inY, inZ,
0, 0, 0,
L3d,
tempOutput,
DeviceTag() );
// copy back reconstructed block
WaveletBase::DeviceRectangleCopyTo( tempOutput, L2d[8], L2d[9],
outBuffer, inX, inY, 0, 0, DeviceTag() );
WaveletBase::DeviceCubeCopyTo( tempOutput,
L3d[24], L3d[25], L3d[26],
outBuffer,
inX, inY, inZ,
0, 0, 0,
DeviceTag() );
// update L2d array
L2d[0] = L2d[8];
L2d[1] = L2d[9];
L2d[2] = L[6*i+2];
L2d[3] = L[6*i+3];
L2d[4] = L[6*i+4];
L2d[5] = L[6*i+5];
L2d[6] = L[6*i+6];
L2d[7] = L[6*i+7];
// update L3d array
L3d[0] = L3d[24];
L3d[1] = L3d[25];
L3d[2] = L3d[26];
for( size_t j = 3; j < 24; j++ )
L3d[j] = L[ 21 * i + j ];
}
// The last transform outputs to the final output
L2d[8] = L2d[0] + L2d[4];
L2d[9] = L2d[1] + L2d[3];
computationTime +=
WaveletDWT::IDWT2D ( outBuffer, inX, inY, 0, 0, L2d, arrOut, DeviceTag() );
*/
L3d[24] = L3d[0] + L3d[12];
L3d[25] = L3d[1] + L3d[7];
L3d[26] = L3d[2] + L3d[5];
//computationTime +=
WaveletDWT::IDWT3D( outBuffer,
inX, inY, inZ,
0, 0, 0,
L3d,
arrOut,
DeviceTag() );
return 0.0;
}

@ -505,10 +505,9 @@ public:
vtkm::Id sigStartX, vtkm::Id sigStartY, vtkm::Id sigStartZ,
vtkm::Id sigPretendDimX, vtkm::Id sigPretendDimY, vtkm::Id sigPretendDimZ,
ArrayOutType &coeffOut,
std::vector<vtkm::Id> &L,
DeviceTag )
{
VTKM_ASSERT( L.size() == 27 );
std::vector<vtkm::Id> L(27, 0);
// LLL
L[0] = WaveletBase::GetApproxLength( sigPretendDimX );
@ -673,7 +672,8 @@ public:
// Performs one level of IDWT on a small cube of a big cube
// The output array has the same dimensions as the small cube.
template< typename ArrayInType, typename ArrayOutType, typename DeviceTag >
vtkm::Float64 IDWT3D( const ArrayInType &coeffIn,
vtkm::Float64 IDWT3D(
const ArrayInType &coeffIn,
vtkm::Id inDimX, vtkm::Id inDimY, vtkm::Id inDimZ,
vtkm::Id inStartX, vtkm::Id inStartY, vtkm::Id inStartZ,
const std::vector<vtkm::Id> &L,

@ -539,7 +539,7 @@ public:
dimX5(x_5), dimY5(y_5), dimZ5(z_5),
startX5(start_x5), startY5(start_y5), startZ5(start_z5)
{
printf("IndexTranslator6CubesFrontBack: \n" );
/* printf("IndexTranslator6CubesFrontBack: \n" );
printf(" cube1 dims: (%lld, %lld, %lld)\n", dimX1, dimY1, dimZ1 );
printf(" cube2 dims: (%lld, %lld, %lld)\n", dimX2, dimY2, dimZ2 );
printf(" cube3 dims: (%lld, %lld, %lld)\n", dimX3, dimY3, dimZ3 );
@ -547,7 +547,7 @@ public:
printf(" cube5 dims: (%lld, %lld, %lld)\n", dimX5, dimY5, dimZ5 );
printf(" cA dims: (%lld, %lld, %lld)\n", dimXa, dimYa, dimZa );
printf(" cD dims: (%lld, %lld, %lld)\n", dimXd, dimYd, dimZd );
printf(" start idx : (%lld, %lld, %lld)\n", startX5, startY5, startZ5 );
printf(" start idx : (%lld, %lld, %lld)\n", startX5, startY5, startZ5 ); */
}
VTKM_EXEC_CONT
@ -1396,8 +1396,8 @@ public:
x_5, y_5, z_5,
startX5, startY5, startZ5 )
{
printf("InverseTransform3DFrontBack: \n");
printf(" output dims: (%lld, %lld, %lld)\n", outDimX, outDimY, outDimZ );
/* printf("InverseTransform3DFrontBack: \n");
printf(" output dims: (%lld, %lld, %lld)\n", outDimX, outDimY, outDimZ ); */
}
VTKM_EXEC_CONT