1- from typing import TYPE_CHECKING , Any , Callable , Optional , Union
1+ from typing import TYPE_CHECKING , Any , Optional , Union
2+ from collections .abc import Callable
23
34import numpy as np
45from pylops .utils .typing import NDArray
@@ -19,13 +20,14 @@ def _check_tau(func: Callable[..., NDArray]) -> Callable[..., NDArray]:
1920
2021 def wrapper (* args : Any , ** kwargs : Any ) -> Any :
2122 if np .any (args [2 ] <= 0 ):
22- raise ValueError ("tau must be positive" )
23+ msg = "tau must be positive"
24+ raise ValueError (msg )
2325 return func (* args , ** kwargs )
2426
2527 return wrapper
2628
2729
28- class ProxOperator ( object ) :
30+ class ProxOperator :
2931 r"""Common interface for proximal operators of a function.
3032
3133 This class defines the overarching structure of any proximal operator. It
@@ -87,10 +89,11 @@ def __call__(self, x: NDArray) -> bool | float | int:
8789 Subclasses should implement this. Returns the
8890 value of the function.
8991 """
90- raise NotImplementedError (
92+ msg = (
9193 "This ProxOperator's __call__ method "
9294 "must be implemented by subclasses to return a float."
9395 )
96+ raise NotImplementedError (msg )
9497
9598 @_check_tau
9699 def _prox_moreau (self , x : NDArray , tau : float , ** kwargs : Any ) -> NDArray :
@@ -207,7 +210,8 @@ def affine_addition(self, v: NDArray) -> "ProxOperator":
207210 if isinstance (v , (np .ndarray , cp_dtype )):
208211 return _SumOperator (self , v )
209212 else :
210- raise NotImplementedError ("v must be a numpy.ndarray or cupy.ndarray" )
213+ msg = "v must be a numpy.ndarray or cupy.ndarray"
214+ raise NotImplementedError (msg )
211215
212216 def postcomposition (self , sigma : float ) -> "ProxOperator" :
213217 r"""Postcomposition
@@ -235,7 +239,8 @@ def postcomposition(self, sigma: float) -> "ProxOperator":
235239 if isinstance (sigma , float ):
236240 return _PostcompositionOperator (self , sigma )
237241 else :
238- raise NotImplementedError ("sigma must be of type float" )
242+ msg = "sigma must be of type float"
243+ raise NotImplementedError (msg )
239244
240245 def precomposition (self , a : float , b : float | NDArray ) -> "ProxOperator" :
241246 r"""Precomposition
@@ -264,11 +269,8 @@ def precomposition(self, a: float, b: float | NDArray) -> "ProxOperator":
264269 if isinstance (a , float ) and isinstance (b , (float , np .ndarray , cp_dtype )): # type: ignore[redundant-expr]
265270 return _PrecompositionOperator (self , a , b )
266271 else :
267- raise NotImplementedError (
268- "a must be of type float and b "
269- "must be of type float or "
270- "numpy.ndarray"
271- )
272+ msg = "a must be of type float and b must be of type float or numpy.ndarray"
273+ raise NotImplementedError (msg )
272274
273275 def chain (self , g : "ProxOperator" ) -> "ProxOperator" :
274276 r"""Chain
@@ -336,7 +338,8 @@ def __init__(self, f: ProxOperator, v: NDArray) -> None:
336338 # if not isinstance(f, ProxOperator):
337339 # raise ValueError('First input must be a ProxOperator')
338340 if not isinstance (v , (np .ndarray , cp_dtype )):
339- raise ValueError ("Second input must be a numpy.ndarray or cupy.ndarray" )
341+ msg = "Second input must be a numpy.ndarray or cupy.ndarray"
342+ raise ValueError (msg )
340343 self .f , self .v = f , v
341344 super ().__init__ (None , f .hasgrad )
342345
@@ -375,7 +378,8 @@ def __init__(self, f: ProxOperator, sigma: float) -> None:
375378 # if not isinstance(f, ProxOperator):
376379 # raise ValueError('First input must be a ProxOperator')
377380 if not isinstance (sigma , float ):
378- raise ValueError ("Second input must be a float" )
381+ msg = "Second input must be a float"
382+ raise ValueError (msg )
379383 self .f , self .sigma = f , sigma
380384 super ().__init__ (None , f .hasgrad )
381385
@@ -395,11 +399,11 @@ def __init__(self, f: ProxOperator, a: float, b: float | NDArray) -> None:
395399 # if not isinstance(f, ProxOperator):
396400 # raise ValueError('First input must be a ProxOperator')
397401 if not isinstance (a , float ):
398- raise ValueError ("Second input must be a float" )
402+ msg = "Second input must be a float"
403+ raise ValueError (msg )
399404 if not isinstance (b , (float , np .ndarray , cp_dtype )):
400- raise ValueError (
401- "Third input must be a float, numpy.ndarray, or cupy.ndarray"
402- )
405+ msg = "Third input must be a float, numpy.ndarray, or cupy.ndarray"
406+ raise ValueError (msg )
403407 self .f , self .a , self .b = f , a , b
404408 super ().__init__ (None , f .hasgrad )
405409
0 commit comments