From 92ec5cf58017e7d16095ffa730a82147096d4ff6 Mon Sep 17 00:00:00 2001 From: domfournier Date: Thu, 4 Jun 2026 11:46:10 -0400 Subject: [PATCH 1/3] Allow active_set_grad_scale to be a vector --- simpeg/optimization.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/simpeg/optimization.py b/simpeg/optimization.py index 343ff132ab..c1449ae76b 100644 --- a/simpeg/optimization.py +++ b/simpeg/optimization.py @@ -1619,9 +1619,14 @@ def active_set_grad_scale(self) -> float: @active_set_grad_scale.setter def active_set_grad_scale(self, value: float): - self._active_set_grad_scale = validate_float( - "active_set_grad_scale", value, min_val=0, inclusive_min=True - ) + try: + value = validate_float("active_set_grad_scale", value) + except TypeError: + value = validate_ndarray_with_shape( + "active_set_grad_scale", value, shape=("*",) + ) + + self._active_set_grad_scale = value @timeIt def findSearchDirection(self): From e2e5b73acb3cdef9f70e201e8ae93b2b74561b90 Mon Sep 17 00:00:00 2001 From: domfournier Date: Thu, 4 Jun 2026 14:40:24 -0400 Subject: [PATCH 2/3] Update typing --- simpeg/optimization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simpeg/optimization.py b/simpeg/optimization.py index c1449ae76b..76c9fe4505 100644 --- a/simpeg/optimization.py +++ b/simpeg/optimization.py @@ -1529,7 +1529,7 @@ def __init__( cg_rtol: float = None, cg_atol: float = None, step_active_set: bool = True, - active_set_grad_scale: float = 1e-2, + active_set_grad_scale: float | np.ndarray = 1e-2, **kwargs, ): if (val := kwargs.pop("tolCG", None)) is not None: From 5939bb95dff09ef95f8db94e8cfdcd14298e43ee Mon Sep 17 00:00:00 2001 From: domfournier Date: Thu, 4 Jun 2026 15:50:48 -0400 Subject: [PATCH 3/3] Add check for strictly positive grad --- simpeg/optimization.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/simpeg/optimization.py b/simpeg/optimization.py index 76c9fe4505..020e9a0155 100644 --- a/simpeg/optimization.py +++ b/simpeg/optimization.py @@ -1625,6 +1625,8 @@ def active_set_grad_scale(self, value: float): value = validate_ndarray_with_shape( "active_set_grad_scale", value, shape=("*",) ) + if np.any(value < 0.0): + raise ValueError("active_set_grad_scale must be >= 0.0") self._active_set_grad_scale = value