Skip to content

Commit cacffcb

Browse files
axel-grcSimonRit
authored andcommitted
ENH: Use RebindImageType to replace manual itk::Image vs itk::CudaImage selection
1 parent c189101 commit cacffcb

14 files changed

+62
-154
lines changed

.github/workflows/build-test-cxx-cuda.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on: [push,pull_request]
44

55
env:
66
itk-git-tag: "v5.4.4"
7-
itk-module-deps: "CudaCommon@8baef219d19d8f320898c3c649539bbb5ba3f509"
7+
itk-module-deps: "CudaCommon@main"
88

99
concurrency:
1010
group: '${{ github.workflow }}@${{ github.head_ref || github.run_id }}'

include/rtkADMMTotalVariationConeBeamReconstructionFilter.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,8 @@ class ITK_TEMPLATE_EXPORT ADMMTotalVariationConeBeamReconstructionFilter
158158
using BackProjectionFilterPointer = typename BackProjectionFilterType::Pointer;
159159
using ConjugateGradientFilterType = rtk::ConjugateGradientImageFilter<TOutputImage>;
160160
using VectorPixelType = itk::CovariantVector<typename TOutputImage::ValueType, TOutputImage::ImageDimension>;
161-
using CPUImageType = itk::Image<typename TOutputImage::PixelType, TOutputImage::ImageDimension>;
162-
#ifdef RTK_USE_CUDA
163-
using GradientImageType = typename std::conditional_t<std::is_same_v<TOutputImage, CPUImageType>,
164-
itk::Image<VectorPixelType, TOutputImage::ImageDimension>,
165-
itk::CudaImage<VectorPixelType, TOutputImage::ImageDimension>>;
166-
#else
167-
using GradientImageType = itk::Image<VectorPixelType, TOutputImage::ImageDimension>;
168-
#endif
161+
using GradientImageType =
162+
typename TOutputImage::template RebindImageType<VectorPixelType, TOutputImage::ImageDimension>;
169163
using ImageGradientFilterType = ForwardDifferenceGradientImageFilter<TOutputImage,
170164
typename TOutputImage::ValueType,
171165
typename TOutputImage::ValueType,

include/rtkADMMTotalVariationConjugateGradientOperator.h

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@
3131
#include "rtkMultiplyByVectorImageFilter.h"
3232
#include "rtkThreeDCircularProjectionGeometry.h"
3333

34-
#ifdef RTK_USE_CUDA
35-
# include <itkCudaImage.h>
36-
#endif
37-
3834
namespace rtk
3935
{
4036

@@ -131,14 +127,8 @@ class ITK_TEMPLATE_EXPORT ADMMTotalVariationConjugateGradientOperator : public C
131127
using SubtractFilterType = itk::SubtractImageFilter<TOutputImage>;
132128

133129
using VectorPixelType = itk::CovariantVector<typename TOutputImage::ValueType, TOutputImage::ImageDimension>;
134-
using CPUImageType = itk::Image<typename TOutputImage::PixelType, TOutputImage::ImageDimension>;
135-
#ifdef RTK_USE_CUDA
136-
using GradientImageType = typename std::conditional_t<std::is_same_v<TOutputImage, CPUImageType>,
137-
itk::Image<VectorPixelType, TOutputImage::ImageDimension>,
138-
itk::CudaImage<VectorPixelType, TOutputImage::ImageDimension>>;
139-
#else
140-
using GradientImageType = itk::Image<VectorPixelType, TOutputImage::ImageDimension>;
141-
#endif
130+
using GradientImageType =
131+
typename TOutputImage::template RebindImageType<VectorPixelType, TOutputImage::ImageDimension>;
142132

143133
using GradientFilterType = ForwardDifferenceGradientImageFilter<TOutputImage,
144134
typename TOutputImage::ValueType,

include/rtkFourDROOSTERConeBeamReconstructionFilter.h

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -219,42 +219,33 @@ class ITK_TEMPLATE_EXPORT FourDROOSTERConeBeamReconstructionFilter
219219
itk::CovariantVector<typename VolumeSeriesType::ValueType, VolumeSeriesType::ImageDimension - 1>;
220220
using CovariantVectorForTemporalGradient = itk::CovariantVector<typename VolumeSeriesType::ValueType, 1>;
221221
using DVFVectorType = CovariantVectorForSpatialGradient;
222-
223-
/** SFINAE type alias, depending on whether a CUDA image is used. */
224222
using CPUVolumeSeriesType =
225223
typename itk::Image<typename VolumeSeriesType::PixelType, VolumeSeriesType::ImageDimension>;
226-
#ifdef RTK_USE_CUDA
224+
227225
using SpatialGradientImageType =
228-
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
229-
itk::Image<CovariantVectorForSpatialGradient, VolumeSeriesType::ImageDimension>,
230-
itk::CudaImage<CovariantVectorForSpatialGradient, VolumeSeriesType::ImageDimension>>;
226+
typename VolumeSeriesType::template RebindImageType<CovariantVectorForSpatialGradient,
227+
VolumeSeriesType::ImageDimension>;
231228
using TemporalGradientImageType =
232-
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
233-
itk::Image<CovariantVectorForTemporalGradient, VolumeSeriesType::ImageDimension>,
234-
itk::CudaImage<CovariantVectorForTemporalGradient, VolumeSeriesType::ImageDimension>>;
229+
typename VolumeSeriesType::template RebindImageType<CovariantVectorForTemporalGradient,
230+
VolumeSeriesType::ImageDimension>;
231+
235232
using DVFSequenceImageType =
236-
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
237-
itk::Image<DVFVectorType, VolumeSeriesType::ImageDimension>,
238-
itk::CudaImage<DVFVectorType, VolumeSeriesType::ImageDimension>>;
239-
using DVFImageType = typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
240-
itk::Image<DVFVectorType, VolumeSeriesType::ImageDimension - 1>,
241-
itk::CudaImage<DVFVectorType, VolumeSeriesType::ImageDimension - 1>>;
242-
using AverageOutOfROIFilterType =
243-
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
244-
AverageOutOfROIImageFilter<VolumeSeriesType, VolumeType>,
245-
CudaAverageOutOfROIImageFilter>;
233+
typename VolumeSeriesType::template RebindImageType<DVFVectorType, VolumeSeriesType::ImageDimension>;
234+
using DVFImageType =
235+
typename VolumeSeriesType::template RebindImageType<DVFVectorType, VolumeSeriesType::ImageDimension - 1>;
236+
237+
#ifdef RTK_USE_CUDA
238+
using AverageOutOfROIFilterType = std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
239+
AverageOutOfROIImageFilter<VolumeSeriesType, VolumeType>,
240+
CudaAverageOutOfROIImageFilter>;
246241
using TemporalTVDenoisingFilterType =
247-
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
248-
TotalVariationDenoisingBPDQImageFilter<VolumeSeriesType, TemporalGradientImageType>,
249-
CudaLastDimensionTVDenoisingImageFilter>;
242+
std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
243+
TotalVariationDenoisingBPDQImageFilter<VolumeSeriesType, TemporalGradientImageType>,
244+
CudaLastDimensionTVDenoisingImageFilter>;
250245
#else
251-
using SpatialGradientImageType = itk::Image<CovariantVectorForSpatialGradient, VolumeSeriesType::ImageDimension>;
252-
using TemporalGradientImageType = itk::Image<CovariantVectorForTemporalGradient, VolumeSeriesType::ImageDimension>;
253-
using DVFSequenceImageType = itk::Image<DVFVectorType, VolumeSeriesType::ImageDimension>;
254-
using DVFImageType = itk::Image<DVFVectorType, VolumeSeriesType::ImageDimension - 1>;
255-
using AverageOutOfROIFilterType = AverageOutOfROIImageFilter<VolumeSeriesType, VolumeType>;
246+
using AverageOutOfROIFilterType = rtk::AverageOutOfROIImageFilter<VolumeSeriesType, VolumeType>;
256247
using TemporalTVDenoisingFilterType =
257-
TotalVariationDenoisingBPDQImageFilter<VolumeSeriesType, TemporalGradientImageType>;
248+
rtk::TotalVariationDenoisingBPDQImageFilter<VolumeSeriesType, TemporalGradientImageType>;
258249
#endif
259250

260251
/** Method for creation through the object factory. */

include/rtkLaplacianImageFilter.h

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@
2323
#include "rtkBackwardDifferenceDivergenceImageFilter.h"
2424
#include "itkMultiplyImageFilter.h"
2525

26-
#ifdef RTK_USE_CUDA
27-
# include <itkCudaImage.h>
28-
#endif
29-
3026
namespace rtk
3127
{
3228

@@ -53,16 +49,9 @@ class ITK_TEMPLATE_EXPORT LaplacianImageFilter : public itk::ImageToImageFilter<
5349
using Superclass = itk::ImageToImageFilter<TOutputImage, TOutputImage>;
5450
using Pointer = itk::SmartPointer<Self>;
5551
using OutputImagePointer = typename TOutputImage::Pointer;
56-
using CPUImageType = itk::Image<typename TOutputImage::PixelType, TOutputImage::ImageDimension>;
5752
using VectorPixelType = itk::CovariantVector<typename TOutputImage::ValueType, TOutputImage::ImageDimension>;
58-
59-
#ifdef RTK_USE_CUDA
60-
using GradientImageType = typename std::conditional_t<std::is_same_v<TOutputImage, CPUImageType>,
61-
itk::Image<VectorPixelType, TOutputImage::ImageDimension>,
62-
itk::CudaImage<VectorPixelType, TOutputImage::ImageDimension>>;
63-
#else
64-
using GradientImageType = itk::Image<VectorPixelType, TOutputImage::ImageDimension>;
65-
#endif
53+
using GradientImageType =
54+
typename TOutputImage::template RebindImageType<VectorPixelType, TOutputImage::ImageDimension>;
6655
using GradientFilterType = rtk::ForwardDifferenceGradientImageFilter<TOutputImage,
6756
typename TOutputImage::ValueType,
6857
typename TOutputImage::ValueType,

include/rtkMechlemOneStepSpectralReconstructionFilter.h

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -179,19 +179,11 @@ class ITK_TEMPLATE_EXPORT MechlemOneStepSpectralReconstructionFilter
179179

180180
/** SFINAE type alias, depending on whether a CUDA image is used. */
181181
using CPUOutputImageType = typename itk::Image<typename TOutputImage::PixelType, TOutputImage::ImageDimension>;
182-
#ifdef RTK_USE_CUDA
183-
using HessiansImageType = typename std::conditional_t<
184-
std::is_same_v<TOutputImage, CPUOutputImageType>,
185-
itk::Image<itk::Vector<dataType, nMaterials * nMaterials>, TOutputImage::ImageDimension>,
186-
itk::CudaImage<itk::Vector<dataType, nMaterials * nMaterials>, TOutputImage::ImageDimension>>;
187-
using SingleComponentImageType = typename std::conditional_t<std::is_same_v<TOutputImage, CPUOutputImageType>,
188-
itk::Image<dataType, TOutputImage::ImageDimension>,
189-
itk::CudaImage<dataType, TOutputImage::ImageDimension>>;
190-
#else
191182
using HessiansImageType =
192-
typename itk::Image<itk::Vector<dataType, nMaterials * nMaterials>, TOutputImage::ImageDimension>;
193-
using SingleComponentImageType = typename itk::Image<dataType, TOutputImage::ImageDimension>;
194-
#endif
183+
typename TOutputImage::template RebindImageType<itk::Vector<dataType, nMaterials * nMaterials>,
184+
TOutputImage::ImageDimension>;
185+
using SingleComponentImageType =
186+
typename TOutputImage::template RebindImageType<dataType, TOutputImage::ImageDimension>;
195187

196188
#if !defined(ITK_WRAPPING_PARSER)
197189
# ifdef RTK_USE_CUDA

include/rtkMotionCompensatedFourDConjugateGradientConeBeamReconstructionFilter.h

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,22 +87,10 @@ class ITK_TEMPLATE_EXPORT MotionCompensatedFourDConjugateGradientConeBeamReconst
8787

8888
using ForwardProjectionType = typename Superclass::ForwardProjectionType;
8989
using BackProjectionType = typename Superclass::BackProjectionType;
90-
91-
/** SFINAE type alias, depending on whether a CUDA image is used. */
92-
using CPUVolumeSeriesType =
93-
typename itk::Image<typename VolumeSeriesType::PixelType, VolumeSeriesType::ImageDimension>;
94-
#ifdef RTK_USE_CUDA
9590
using DVFSequenceImageType =
96-
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
97-
itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension>,
98-
itk::CudaImage<VectorForDVF, VolumeSeriesType::ImageDimension>>;
99-
using DVFImageType = typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
100-
itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension - 1>,
101-
itk::CudaImage<VectorForDVF, VolumeSeriesType::ImageDimension - 1>>;
102-
#else
103-
using DVFSequenceImageType = itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension>;
104-
using DVFImageType = itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension - 1>;
105-
#endif
91+
typename VolumeSeriesType::template RebindImageType<VectorForDVF, VolumeSeriesType::ImageDimension>;
92+
using DVFImageType =
93+
typename VolumeSeriesType::template RebindImageType<VectorForDVF, VolumeSeriesType::ImageDimension - 1>;
10694

10795
/** Typedefs of each subfilter of this composite filter */
10896

include/rtkMotionCompensatedFourDROOSTERConeBeamReconstructionFilter.h

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,16 @@ class ITK_TEMPLATE_EXPORT MotionCompensatedFourDROOSTERConeBeamReconstructionFil
154154

155155
using ForwardProjectionType = typename Superclass::ForwardProjectionType;
156156
using BackProjectionType = typename Superclass::BackProjectionType;
157-
158-
#ifdef RTK_USE_CUDA
159-
using SpatialGradientImageType = itk::CudaImage<CovariantVectorForSpatialGradient, VolumeSeriesType::ImageDimension>;
157+
using SpatialGradientImageType =
158+
typename VolumeSeriesType::template RebindImageType<CovariantVectorForSpatialGradient,
159+
VolumeSeriesType::ImageDimension>;
160160
using TemporalGradientImageType =
161-
itk::CudaImage<CovariantVectorForTemporalGradient, VolumeSeriesType::ImageDimension>;
162-
using DVFSequenceImageType = itk::CudaImage<DVFVectorType, VolumeSeriesType::ImageDimension>;
163-
using DVFImageType = itk::CudaImage<DVFVectorType, VolumeSeriesType::ImageDimension - 1>;
164-
#else
165-
using SpatialGradientImageType = itk::Image<CovariantVectorForSpatialGradient, VolumeSeriesType::ImageDimension>;
166-
using TemporalGradientImageType = itk::Image<CovariantVectorForTemporalGradient, VolumeSeriesType::ImageDimension>;
167-
using DVFSequenceImageType = itk::Image<DVFVectorType, VolumeSeriesType::ImageDimension>;
168-
using DVFImageType = itk::Image<DVFVectorType, VolumeSeriesType::ImageDimension - 1>;
169-
#endif
161+
typename VolumeSeriesType::template RebindImageType<CovariantVectorForTemporalGradient,
162+
VolumeSeriesType::ImageDimension>;
163+
using DVFSequenceImageType =
164+
typename VolumeSeriesType::template RebindImageType<DVFVectorType, VolumeSeriesType::ImageDimension>;
165+
using DVFImageType =
166+
typename VolumeSeriesType::template RebindImageType<DVFVectorType, VolumeSeriesType::ImageDimension - 1>;
170167

171168
/** Method for creation through the object factory. */
172169
itkNewMacro(Self);

include/rtkMotionCompensatedFourDReconstructionConjugateGradientOperator.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,11 @@ class ITK_TEMPLATE_EXPORT MotionCompensatedFourDReconstructionConjugateGradientO
115115
/** SFINAE type alias, depending on whether a CUDA image is used. */
116116
using CPUVolumeSeriesType =
117117
typename itk::Image<typename VolumeSeriesType::PixelType, VolumeSeriesType::ImageDimension>;
118-
#ifdef RTK_USE_CUDA
119118
using DVFSequenceImageType =
120-
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
121-
itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension>,
122-
itk::CudaImage<VectorForDVF, VolumeSeriesType::ImageDimension>>;
123-
using DVFImageType = typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
124-
itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension - 1>,
125-
itk::CudaImage<VectorForDVF, VolumeSeriesType::ImageDimension - 1>>;
119+
typename VolumeSeriesType::template RebindImageType<VectorForDVF, VolumeSeriesType::ImageDimension>;
120+
using DVFImageType =
121+
typename VolumeSeriesType::template RebindImageType<VectorForDVF, VolumeSeriesType::ImageDimension - 1>;
122+
#ifdef RTK_USE_CUDA
126123
using WarpForwardProjectionImageFilterType =
127124
typename std::conditional_t<std::is_same_v<VolumeSeriesType, CPUVolumeSeriesType>,
128125
JosephForwardProjectionImageFilter<ProjectionStackType, ProjectionStackType>,
@@ -132,8 +129,6 @@ class ITK_TEMPLATE_EXPORT MotionCompensatedFourDReconstructionConjugateGradientO
132129
BackProjectionImageFilter<VolumeType, VolumeType>,
133130
CudaWarpBackProjectionImageFilter>;
134131
#else
135-
using DVFSequenceImageType = itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension>;
136-
using DVFImageType = itk::Image<VectorForDVF, VolumeSeriesType::ImageDimension - 1>;
137132
using WarpForwardProjectionImageFilterType =
138133
JosephForwardProjectionImageFilter<ProjectionStackType, ProjectionStackType>;
139134
using WarpBackProjectionImageFilterType = BackProjectionImageFilter<VolumeType, VolumeType>;

include/rtkReconstructionConjugateGradientOperator.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,9 @@ class ITK_TEMPLATE_EXPORT ReconstructionConjugateGradientOperator : public Conju
124124
using Self = ReconstructionConjugateGradientOperator;
125125
using Superclass = ConjugateGradientOperator<TOutputImage>;
126126
using Pointer = itk::SmartPointer<Self>;
127-
#ifdef RTK_USE_CUDA
128-
using GradientImageType =
129-
itk::CudaImage<itk::CovariantVector<typename TOutputImage::PixelType, TOutputImage::ImageDimension>,
130-
TOutputImage::ImageDimension>;
131-
#else
127+
using VectorPixelType = itk::CovariantVector<typename TOutputImage::ValueType, TOutputImage::ImageDimension>;
132128
using GradientImageType =
133-
itk::Image<itk::CovariantVector<typename TOutputImage::PixelType, TOutputImage::ImageDimension>,
134-
TOutputImage::ImageDimension>;
135-
#endif
129+
typename TOutputImage::template RebindImageType<VectorPixelType, TOutputImage::ImageDimension>;
136130

137131
/** Method for creation through the object factory. */
138132
itkNewMacro(Self);

0 commit comments

Comments
 (0)