From fb65555e2aadeb43012ae85173ec097bd799dda7 Mon Sep 17 00:00:00 2001 From: Bastian Wittmann Date: Wed, 31 Jul 2024 15:20:17 +0200 Subject: [PATCH 1/4] Forced Fourier class to output contiguous() tensors. --- monai/transforms/utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index d8461d927b..154fceb133 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -1649,12 +1649,12 @@ def shift_fourier(x: NdarrayOrTensor, spatial_dims: int) -> NdarrayOrTensor: k: NdarrayOrTensor if isinstance(x, torch.Tensor): if hasattr(torch.fft, "fftshift"): # `fftshift` is new in torch 1.8.0 - k = torch.fft.fftshift(torch.fft.fftn(x, dim=dims), dim=dims) + k = torch.fft.fftshift(torch.fft.fftn(x, dim=dims), dim=dims).contiguous() else: # if using old PyTorch, will convert to numpy array and return - k = np.fft.fftshift(np.fft.fftn(x.cpu().numpy(), axes=dims), axes=dims) + k = np.ascontiguousarray(np.fft.fftshift(np.fft.fftn(x.cpu().numpy(), axes=dims), axes=dims)) else: - k = np.fft.fftshift(np.fft.fftn(x, axes=dims), axes=dims) + k = np.ascontiguousarray(np.fft.fftshift(np.fft.fftn(x, axes=dims), axes=dims)) return k @staticmethod @@ -1674,12 +1674,12 @@ def inv_shift_fourier(k: NdarrayOrTensor, spatial_dims: int, n_dims: int | None out: NdarrayOrTensor if isinstance(k, torch.Tensor): if hasattr(torch.fft, "ifftshift"): # `ifftshift` is new in torch 1.8.0 - out = torch.fft.ifftn(torch.fft.ifftshift(k, dim=dims), dim=dims, norm="backward").real + out = torch.fft.ifftn(torch.fft.ifftshift(k, dim=dims), dim=dims, norm="backward").real.contiguous() else: # if using old PyTorch, will convert to numpy array and return - out = np.fft.ifftn(np.fft.ifftshift(k.cpu().numpy(), axes=dims), axes=dims).real + out = np.ascontiguousarray(np.fft.ifftn(np.fft.ifftshift(k.cpu().numpy(), axes=dims), axes=dims).real) else: - out = np.fft.ifftn(np.fft.ifftshift(k, axes=dims), axes=dims).real + out = np.ascontiguousarray(np.fft.ifftn(np.fft.ifftshift(k, axes=dims), axes=dims).real) return out From 4df5947bcd545369b5e769f584c70db3f8dd3ff8 Mon Sep 17 00:00:00 2001 From: Bastian Wittmann Date: Tue, 3 Sep 2024 11:05:13 +0200 Subject: [PATCH 2/4] Added `as_contiguous` arg following recommedations from community. --- monai/transforms/utils.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index 154fceb133..7a4ff1f011 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -1633,7 +1633,7 @@ class Fourier: """ @staticmethod - def shift_fourier(x: NdarrayOrTensor, spatial_dims: int) -> NdarrayOrTensor: + def shift_fourier(x: NdarrayOrTensor, spatial_dims: int, as_contiguous: bool = False) -> NdarrayOrTensor: """ Applies fourier transform and shifts the zero-frequency component to the center of the spectrum. Only the spatial dimensions get transformed. @@ -1641,6 +1641,7 @@ def shift_fourier(x: NdarrayOrTensor, spatial_dims: int) -> NdarrayOrTensor: Args: x: Image to transform. spatial_dims: Number of spatial dimensions. + as_contiguous: Whether to convert the cached NumPy array or PyTorch tensor to be contiguous. Returns k: K-space data. @@ -1649,16 +1650,16 @@ def shift_fourier(x: NdarrayOrTensor, spatial_dims: int) -> NdarrayOrTensor: k: NdarrayOrTensor if isinstance(x, torch.Tensor): if hasattr(torch.fft, "fftshift"): # `fftshift` is new in torch 1.8.0 - k = torch.fft.fftshift(torch.fft.fftn(x, dim=dims), dim=dims).contiguous() + k = torch.fft.fftshift(torch.fft.fftn(x, dim=dims), dim=dims) else: # if using old PyTorch, will convert to numpy array and return - k = np.ascontiguousarray(np.fft.fftshift(np.fft.fftn(x.cpu().numpy(), axes=dims), axes=dims)) + k = np.fft.fftshift(np.fft.fftn(x.cpu().numpy(), axes=dims), axes=dims) else: - k = np.ascontiguousarray(np.fft.fftshift(np.fft.fftn(x, axes=dims), axes=dims)) - return k + k = np.fft.fftshift(np.fft.fftn(x, axes=dims), axes=dims) + return ascontiguousarray(k) if as_contiguous else k @staticmethod - def inv_shift_fourier(k: NdarrayOrTensor, spatial_dims: int, n_dims: int | None = None) -> NdarrayOrTensor: + def inv_shift_fourier(k: NdarrayOrTensor, spatial_dims: int, n_dims: int | None = None, as_contiguous: bool = False) -> NdarrayOrTensor: """ Applies inverse shift and fourier transform. Only the spatial dimensions are transformed. @@ -1666,6 +1667,7 @@ def inv_shift_fourier(k: NdarrayOrTensor, spatial_dims: int, n_dims: int | None Args: k: K-space data. spatial_dims: Number of spatial dimensions. + as_contiguous: Whether to convert the cached NumPy array or PyTorch tensor to be contiguous. Returns: x: Tensor in image space. @@ -1674,13 +1676,13 @@ def inv_shift_fourier(k: NdarrayOrTensor, spatial_dims: int, n_dims: int | None out: NdarrayOrTensor if isinstance(k, torch.Tensor): if hasattr(torch.fft, "ifftshift"): # `ifftshift` is new in torch 1.8.0 - out = torch.fft.ifftn(torch.fft.ifftshift(k, dim=dims), dim=dims, norm="backward").real.contiguous() + out = torch.fft.ifftn(torch.fft.ifftshift(k, dim=dims), dim=dims, norm="backward").real else: # if using old PyTorch, will convert to numpy array and return - out = np.ascontiguousarray(np.fft.ifftn(np.fft.ifftshift(k.cpu().numpy(), axes=dims), axes=dims).real) + out = np.fft.ifftn(np.fft.ifftshift(k.cpu().numpy(), axes=dims), axes=dims).real else: - out = np.ascontiguousarray(np.fft.ifftn(np.fft.ifftshift(k, axes=dims), axes=dims).real) - return out + out = np.fft.ifftn(np.fft.ifftshift(k, axes=dims), axes=dims).real + return ascontiguousarray(out) if as_contiguous else out def get_number_image_type_conversions(transform: Compose, test_data: Any, key: Hashable | None = None) -> int: From 24c195a18c3fdd23dde10e6d7db198fc2197dfc6 Mon Sep 17 00:00:00 2001 From: Bastian Wittmann Date: Tue, 3 Sep 2024 11:56:24 +0200 Subject: [PATCH 3/4] Fixed format issue. DCO Remediation Commit for Bastian Wittmann I, Bastian Wittmann , hereby add my Signed-off-by to this commit: fb65555e2aadeb43012ae85173ec097bd799dda7 I, Bastian Wittmann , hereby add my Signed-off-by to this commit: 4df5947bcd545369b5e769f584c70db3f8dd3ff8 Signed-off-by: Bastian Wittmann . --- monai/transforms/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/monai/transforms/utils.py b/monai/transforms/utils.py index 7a4ff1f011..ee5e655575 100644 --- a/monai/transforms/utils.py +++ b/monai/transforms/utils.py @@ -1659,7 +1659,9 @@ def shift_fourier(x: NdarrayOrTensor, spatial_dims: int, as_contiguous: bool = F return ascontiguousarray(k) if as_contiguous else k @staticmethod - def inv_shift_fourier(k: NdarrayOrTensor, spatial_dims: int, n_dims: int | None = None, as_contiguous: bool = False) -> NdarrayOrTensor: + def inv_shift_fourier( + k: NdarrayOrTensor, spatial_dims: int, n_dims: int | None = None, as_contiguous: bool = False + ) -> NdarrayOrTensor: """ Applies inverse shift and fourier transform. Only the spatial dimensions are transformed. From be49408db1333a931ea0fe11c8387194eab25fee Mon Sep 17 00:00:00 2001 From: Bastian Wittmann Date: Tue, 3 Sep 2024 12:44:15 +0200 Subject: [PATCH 4/4] DCO Remediation Commit for Bastian Wittmann I, Bastian Wittmann , hereby add my Signed-off-by to this commit: 24c195a18c3fdd23dde10e6d7db198fc2197dfc6 Signed-off-by: Bastian Wittmann