From 61e07b7ac336c3318f17643a2a26dccd507732a4 Mon Sep 17 00:00:00 2001 From: SausageMan99 Date: Wed, 7 Oct 2026 18:15:53 +0200 Subject: [PATCH] fix(linalg): Validate eps values in QuadprogProjector constructor __init__ assigned the private attributes directly, so negative norm_eps and reg_eps were accepted at construction while the setters rejected them. The constructor now goes through the validating setters. Fixes #810 Co-Authored-By: Claude Opus 5.5 --- src/torchjd/_linalg/_dual_cone.py | 4 ++-- tests/unit/linalg/test_dual_cone.py | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/torchjd/_linalg/_dual_cone.py b/src/torchjd/_linalg/_dual_cone.py index 7dd324829..ff4bc692c 100644 --- a/src/torchjd/_linalg/_dual_cone.py +++ b/src/torchjd/_linalg/_dual_cone.py @@ -78,8 +78,8 @@ def __init__( reg_eps: float = 0.0001, ) -> None: super().__init__() - self._norm_eps = norm_eps - self._reg_eps = reg_eps + self.norm_eps = norm_eps + self.reg_eps = reg_eps @property def norm_eps(self) -> float: diff --git a/tests/unit/linalg/test_dual_cone.py b/tests/unit/linalg/test_dual_cone.py index 045b1a643..aed115bb8 100644 --- a/tests/unit/linalg/test_dual_cone.py +++ b/tests/unit/linalg/test_dual_cone.py @@ -136,6 +136,16 @@ def test_reg_eps_setter_rejects_negative() -> None: projector.reg_eps = -1e-9 +def test_init_rejects_negative_norm_eps() -> None: + with raises(ValueError, match="norm_eps"): + QuadprogProjector(norm_eps=-1e-9) + + +def test_init_rejects_negative_reg_eps() -> None: + with raises(ValueError, match="reg_eps"): + QuadprogProjector(reg_eps=-1e-9) + + def test_qp_solver_based_failure() -> None: """ Tests that `QPSolverBased._project_weight_vector` raises an error when the input G has too large