From eeb94f9f6a93eb5e5bd5537b6f065ac66ede1112 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 13 Jun 2026 17:21:32 +0200 Subject: [PATCH 1/3] Allow default quadratic assignment options --- src/pyrecest/_backend/_shared_numpy/linalg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyrecest/_backend/_shared_numpy/linalg.py b/src/pyrecest/_backend/_shared_numpy/linalg.py index 8b87f34fb..0a3b66089 100644 --- a/src/pyrecest/_backend/_shared_numpy/linalg.py +++ b/src/pyrecest/_backend/_shared_numpy/linalg.py @@ -70,7 +70,7 @@ def sqrtm(x): return _np.vectorize(_scipy.linalg.sqrtm, signature="(n,m)->(n,m)")(x) -def quadratic_assignment(a, b, options): +def quadratic_assignment(a, b, options=None): return list(_scipy.optimize.quadratic_assignment(a, b, options=options).col_ind) From 7e7eef5a094a77279ae486e4f82712be6ab2e849 Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 13 Jun 2026 17:21:59 +0200 Subject: [PATCH 2/3] Allow default quadratic assignment options --- src/pyrecest/_backend/pytorch/linalg.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pyrecest/_backend/pytorch/linalg.py b/src/pyrecest/_backend/pytorch/linalg.py index 5264de67d..6cefceec5 100644 --- a/src/pyrecest/_backend/pytorch/linalg.py +++ b/src/pyrecest/_backend/pytorch/linalg.py @@ -166,7 +166,7 @@ def matrix_rank(a, tol=None, hermitian=False, *, rtol=None, atol=None, **kwargs) return _torch.linalg.matrix_rank(a, atol=atol, rtol=rtol, hermitian=hermitian) -def quadratic_assignment(a, b, options): +def quadratic_assignment(a, b, options=None): return list( _scipy.optimize.quadratic_assignment( _as_numpy_no_grad(a), _as_numpy_no_grad(b), options=options From f428de0194108a539fae9ae7e2442bda3a8b4aff Mon Sep 17 00:00:00 2001 From: Florian Pfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Sat, 13 Jun 2026 17:22:12 +0200 Subject: [PATCH 3/3] Add quadratic assignment default option regression tests --- tests/test_quadratic_assignment_defaults.py | 54 +++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/test_quadratic_assignment_defaults.py diff --git a/tests/test_quadratic_assignment_defaults.py b/tests/test_quadratic_assignment_defaults.py new file mode 100644 index 000000000..03382d73f --- /dev/null +++ b/tests/test_quadratic_assignment_defaults.py @@ -0,0 +1,54 @@ +import importlib.util + +import numpy as np + +from pyrecest._backend import numpy as numpy_backend + +pytorch_backend = None +if importlib.util.find_spec("torch") is not None: + from pyrecest._backend import pytorch as pytorch_backend + + +def _problem_matrices(): + adjacency = np.array( + [ + [0.0, 2.0, 1.0], + [2.0, 0.0, 3.0], + [1.0, 3.0, 0.0], + ] + ) + permuted = adjacency[[1, 2, 0]][:, [1, 2, 0]] + return adjacency, permuted + + +def test_numpy_quadratic_assignment_accepts_default_options(): + adjacency, permuted = _problem_matrices() + + assignment = numpy_backend.linalg.quadratic_assignment(adjacency, permuted) + + assert sorted(assignment) == [0, 1, 2] + + +def test_numpy_quadratic_assignment_still_accepts_options_dict(): + adjacency, permuted = _problem_matrices() + + assignment = numpy_backend.linalg.quadratic_assignment( + adjacency, + permuted, + options={"maximize": False}, + ) + + assert sorted(assignment) == [0, 1, 2] + + +def test_pytorch_quadratic_assignment_accepts_default_options(): + if pytorch_backend is None: + return + adjacency, permuted = _problem_matrices() + + assignment = pytorch_backend.linalg.quadratic_assignment( + pytorch_backend.array(adjacency), + pytorch_backend.array(permuted), + ) + + assert sorted(assignment) == [0, 1, 2]