From d546165c766137ca05843e69b6bb1b41378d4425 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 6 Jan 2026 11:16:05 +0100 Subject: [PATCH 1/3] Support orthnull for Diagonal --- src/interface/orthnull.jl | 4 ++++ test/linearmap.jl | 2 +- test/orthnull.jl | 6 +++--- test/testsuite/TestSuite.jl | 2 ++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/interface/orthnull.jl b/src/interface/orthnull.jl index afd1c2f2..fde974b9 100644 --- a/src/interface/orthnull.jl +++ b/src/interface/orthnull.jl @@ -443,7 +443,9 @@ left_orth_alg(alg::LeftOrthAlgorithm) = alg left_orth_alg(alg::QRAlgorithms) = LeftOrthViaQR(alg) left_orth_alg(alg::PolarAlgorithms) = LeftOrthViaPolar(alg) left_orth_alg(alg::SVDAlgorithms) = LeftOrthViaSVD(alg) +left_orth_alg(alg::DiagonalAlgorithm) = LeftOrthViaQR(alg) left_orth_alg(alg::TruncatedAlgorithm{<:SVDAlgorithms}) = LeftOrthViaSVD(alg) +left_orth_alg(alg::TruncatedAlgorithm{DiagonalAlgorithm}) = LeftOrthViaSVD(alg) """ right_orth_alg(alg::AbstractAlgorithm) -> RightOrthAlgorithm @@ -478,7 +480,9 @@ right_orth_alg(alg::RightOrthAlgorithm) = alg right_orth_alg(alg::LQAlgorithms) = RightOrthViaLQ(alg) right_orth_alg(alg::PolarAlgorithms) = RightOrthViaPolar(alg) right_orth_alg(alg::SVDAlgorithms) = RightOrthViaSVD(alg) +right_orth_alg(alg::DiagonalAlgorithm) = RightOrthViaLQ(alg) right_orth_alg(alg::TruncatedAlgorithm{<:SVDAlgorithms}) = RightOrthViaSVD(alg) +right_orth_alg(alg::TruncatedAlgorithm{DiagonalAlgorithm}) = RightOrthViaSVD(alg) """ left_null_alg(alg::AbstractAlgorithm) -> LeftNullAlgorithm diff --git a/test/linearmap.jl b/test/linearmap.jl index 07063ac9..8b5f3fc6 100644 --- a/test/linearmap.jl +++ b/test/linearmap.jl @@ -38,7 +38,7 @@ module LinearMaps # Using AbstractAlgorithm here would be ambiguous since neither A-type nor alg-type would # be strictly more specific. for f! in (:svd_compact!, :svd_full!) - for Alg in (:SafeDivideAndConquer, :DivideAndConquer, :QRIteration, :Bisection, :Jacobi, :SVDViaPolar) + for Alg in (:SafeDivideAndConquer, :DivideAndConquer, :QRIteration, :Bisection, :Jacobi, :SVDViaPolar, :DiagonalAlgorithm) @eval MAK.$f!(A::LinearMap, USVᴴ, alg::MAK.$Alg) = LinearMap.(MAK.$f!(parent(A), parent.(USVᴴ), alg)) end diff --git a/test/orthnull.jl b/test/orthnull.jl index 995e2607..a8aedcb9 100644 --- a/test/orthnull.jl +++ b/test/orthnull.jl @@ -19,16 +19,16 @@ for T in (BLASFloats..., GenericFloats...), n in (17, m, 27) if T ∈ BLASFloats if CUDA.functional() TestSuite.test_orthnull(CuMatrix{T}, (m, n); test_nullity = false) - n == m && TestSuite.test_orthnull(Diagonal{T, CuVector{T}}, m; test_orthnull = false) + n == m && TestSuite.test_orthnull(Diagonal{T, CuVector{T}}, m) end if AMDGPU.functional() TestSuite.test_orthnull(ROCMatrix{T}, (m, n); test_nullity = false) - n == m && TestSuite.test_orthnull(Diagonal{T, ROCVector{T}}, m; test_orthnull = false) + n == m && TestSuite.test_orthnull(Diagonal{T, ROCVector{T}}, m) end end if !is_buildkite TestSuite.test_orthnull(T, (m, n)) AT = Diagonal{T, Vector{T}} - TestSuite.test_orthnull(AT, m; test_orthnull = false) + TestSuite.test_orthnull(AT, m) end end diff --git a/test/testsuite/TestSuite.jl b/test/testsuite/TestSuite.jl index c2abb925..b4fb9300 100644 --- a/test/testsuite/TestSuite.jl +++ b/test/testsuite/TestSuite.jl @@ -76,9 +76,11 @@ is_pivoted(alg::MatrixAlgebraKit.LQViaTransposedQR) = is_pivoted(alg.qr_alg) isleftcomplete(V, N) = V * V' + N * N' ≈ I isleftcomplete(V::AnyCuMatrix, N::AnyCuMatrix) = isleftcomplete(collect(V), collect(N)) isleftcomplete(V::AnyROCMatrix, N::AnyROCMatrix) = isleftcomplete(collect(V), collect(N)) +isleftcomplete(V::Diagonal{TV, <:AnyROCVector}, N::AnyROCMatrix) where {TV} = isleftcomplete(Diagonal(collect(V.diag)), collect(N)) isrightcomplete(Vᴴ, Nᴴ) = Vᴴ' * Vᴴ + Nᴴ' * Nᴴ ≈ I isrightcomplete(V::AnyCuMatrix, N::AnyCuMatrix) = isrightcomplete(collect(V), collect(N)) isrightcomplete(V::AnyROCMatrix, N::AnyROCMatrix) = isrightcomplete(collect(V), collect(N)) +isrightcomplete(V::Diagonal{TV, <:AnyROCVector}, N::AnyROCMatrix) where {TV} = isrightcomplete(Diagonal(collect(V.diag)), collect(N)) instantiate_unitary(T, A, sz) = qr_compact(randn!(similar(A, eltype(T), sz, sz)))[1] # AMDGPU can't generate ComplexF32 random numbers From abefa426813b1d61c9f6a5f7a489600084f6e034 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Fri, 20 Mar 2026 19:53:49 +0100 Subject: [PATCH 2/3] Update src/interface/orthnull.jl Co-authored-by: Lukas Devos --- src/interface/orthnull.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/orthnull.jl b/src/interface/orthnull.jl index fde974b9..8ad02bc3 100644 --- a/src/interface/orthnull.jl +++ b/src/interface/orthnull.jl @@ -445,7 +445,7 @@ left_orth_alg(alg::PolarAlgorithms) = LeftOrthViaPolar(alg) left_orth_alg(alg::SVDAlgorithms) = LeftOrthViaSVD(alg) left_orth_alg(alg::DiagonalAlgorithm) = LeftOrthViaQR(alg) left_orth_alg(alg::TruncatedAlgorithm{<:SVDAlgorithms}) = LeftOrthViaSVD(alg) -left_orth_alg(alg::TruncatedAlgorithm{DiagonalAlgorithm}) = LeftOrthViaSVD(alg) +left_orth_alg(alg::TruncatedAlgorithm{<:DiagonalAlgorithm}) = LeftOrthViaSVD(alg) """ right_orth_alg(alg::AbstractAlgorithm) -> RightOrthAlgorithm From ae8805fbde42cb8e8b6b61206388c4654384a12b Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Fri, 20 Mar 2026 19:53:56 +0100 Subject: [PATCH 3/3] Update src/interface/orthnull.jl Co-authored-by: Lukas Devos --- src/interface/orthnull.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/orthnull.jl b/src/interface/orthnull.jl index 8ad02bc3..0d996b4e 100644 --- a/src/interface/orthnull.jl +++ b/src/interface/orthnull.jl @@ -482,7 +482,7 @@ right_orth_alg(alg::PolarAlgorithms) = RightOrthViaPolar(alg) right_orth_alg(alg::SVDAlgorithms) = RightOrthViaSVD(alg) right_orth_alg(alg::DiagonalAlgorithm) = RightOrthViaLQ(alg) right_orth_alg(alg::TruncatedAlgorithm{<:SVDAlgorithms}) = RightOrthViaSVD(alg) -right_orth_alg(alg::TruncatedAlgorithm{DiagonalAlgorithm}) = RightOrthViaSVD(alg) +right_orth_alg(alg::TruncatedAlgorithm{<:DiagonalAlgorithm}) = RightOrthViaSVD(alg) """ left_null_alg(alg::AbstractAlgorithm) -> LeftNullAlgorithm