Source code for tomobar.regularisersCuPy
"""Adding CuPy-enabled regularisers from the CCPi-regularisation toolkit and
instantiate a proximal operator for iterative methods.
"""
import cupy as cp
try:
from ccpi.filters.regularisersCuPy import ROF_TV as ROF_TV_cupy
from ccpi.filters.regularisersCuPy import PD_TV as PD_TV_cupy
except ImportError:
print(
"____! CCPi-regularisation package (CuPy part needed only) is missing, please install !____"
)
[docs]
def prox_regul(self, X: cp.ndarray, _regularisation_: dict) -> cp.ndarray:
"""Enabling proximal operators step in iterative reconstruction.
Args:
X (cp.ndarray): 2D or 3D CuPy array.
_regularisation_ (dict): Regularisation dictionary with parameters, see :mod:`tomobar.supp.dicts`.
Returns:
cp.ndarray: Filtered 2D or 3D CuPy array.
"""
info_vec = (_regularisation_["iterations"], 0)
# The proximal operator of the chosen regulariser
if "ROF_TV" in _regularisation_["method"]:
# Rudin - Osher - Fatemi Total variation method
X_prox = ROF_TV_cupy(
X,
_regularisation_["regul_param"],
_regularisation_["iterations"],
_regularisation_["time_marching_step"],
self.Atools.device_index,
)
if "PD_TV" in _regularisation_["method"]:
# Primal-Dual (PD) Total variation method by Chambolle-Pock
X_prox = PD_TV_cupy(
X,
_regularisation_["regul_param"],
_regularisation_["iterations"],
_regularisation_["methodTV"],
self.nonneg_regul,
_regularisation_["PD_LipschitzConstant"],
self.Atools.device_index,
)
return X_prox