From 3dbaf48b89ba435def9b250299a0207f363222b7 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 13:55:32 +0100 Subject: [PATCH 1/9] Comment out unused LAPACK wrappers for coverage --- src/yalapack.jl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/yalapack.jl b/src/yalapack.jl index 576fe3c5..5b406197 100644 --- a/src/yalapack.jl +++ b/src/yalapack.jl @@ -99,7 +99,7 @@ for (geqr, gelq, geqrf, gelqf, geqlf, gerqf, geqrt, gelqt, latsqr, laswlq, geqp3 #! format: on @eval begin # Flexible QR / LQ - function geqr!(A::AbstractMatrix{$elty}) + #=function geqr!(A::AbstractMatrix{$elty}) require_one_based_indexing(A) chkstride1(A) m, n = size(A) @@ -162,7 +162,7 @@ for (geqr, gelq, geqrf, gelqf, geqlf, gerqf, geqrt, gelqt, latsqr, laswlq, geqp3 end end return A, t - end + end=# # Classic QR / LQ / QL / RQ function geqrf!( @@ -231,7 +231,7 @@ for (geqr, gelq, geqrf, gelqf, geqlf, gerqf, geqrt, gelqt, latsqr, laswlq, geqp3 end return A, tau end - function geqlf!( + #=function geqlf!( A::AbstractMatrix{$elty}, tau::AbstractVector{$elty} = similar(A, $elty, min(size(A)...)) ) @@ -296,7 +296,7 @@ for (geqr, gelq, geqrf, gelqf, geqlf, gerqf, geqrt, gelqt, latsqr, laswlq, geqp3 end end return A, tau - end + end=# # QR and LQ with block reflectors #! format: off @@ -441,7 +441,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr #! format: on @eval begin # multiply with Q factor of flexible QR / LQ - function gemqr!( + #=function gemqr!( side::AbstractChar, trans::AbstractChar, A::AbstractMatrix{$elty}, T::AbstractVector{$elty}, C::AbstractVecOrMat{$elty} ) @@ -682,7 +682,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr end end return A - end + end=# # multiply with Q factor of classic QR / LQ / QL / RQ function unmqr!( @@ -781,7 +781,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr end return C end - function unmql!( + #=function unmql!( side::AbstractChar, trans::AbstractChar, A::AbstractMatrix{$elty}, tau::AbstractVector{$elty}, C::AbstractVecOrMat{$elty} @@ -876,7 +876,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr end end return C - end + end=# # Multiply with blocked Q factor from QR / LQ function gemqrt!( @@ -1423,7 +1423,7 @@ for (gees, geesx, geev, geevx, ggev, elty, celty, relty) in (:zgees_, :zgeesx_, :zgeev_, :zgeevx_, :zggev_, :ComplexF64, :ComplexF64, :Float64), ) @eval begin - function gees!( + #=function gees!( A::AbstractMatrix{$elty}, V::AbstractMatrix{$elty} = similar(A), vals::AbstractVector{$celty} = similar(A, $celty, size(A, 1)) @@ -1501,7 +1501,7 @@ for (gees, geesx, geev, geevx, ggev, elty, celty, relty) in _reorder_realeigendecomposition!(vals, valsR, valsI, work, V, 'N') end return A, V, vals - end + end=# function geesx!( A::AbstractMatrix{$elty}, V::AbstractMatrix{$elty} = similar(A), @@ -2303,7 +2303,7 @@ for (gesvd, gesdd, gesvdx, gejsv, gesvj, elty, relty) in end return (S, U, Vᴴ) end - function gesvj!( + #=function gesvj!( A::AbstractMatrix{$elty}, S::AbstractVector{$relty} = similar(A, $relty, min(size(A)...)), U::AbstractMatrix{$elty} = similar( @@ -2426,7 +2426,7 @@ for (gesvd, gesdd, gesvdx, gejsv, gesvj, elty, relty) in copyto!(U, A) end return (S, U, Vᴴ) - end + end=# end end From d8445006a5aed4356ca5b59528adb74eada89a66 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 14:16:53 +0100 Subject: [PATCH 2/9] Restore gesvj and test it --- src/yalapack.jl | 4 ++-- test/svd.jl | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/yalapack.jl b/src/yalapack.jl index 5b406197..d45103b7 100644 --- a/src/yalapack.jl +++ b/src/yalapack.jl @@ -2303,7 +2303,7 @@ for (gesvd, gesdd, gesvdx, gejsv, gesvj, elty, relty) in end return (S, U, Vᴴ) end - #=function gesvj!( + function gesvj!( A::AbstractMatrix{$elty}, S::AbstractVector{$relty} = similar(A, $relty, min(size(A)...)), U::AbstractMatrix{$elty} = similar( @@ -2426,7 +2426,7 @@ for (gesvd, gesdd, gesvdx, gejsv, gesvj, elty, relty) in copyto!(U, A) end return (S, U, Vᴴ) - end=# + end end end diff --git a/test/svd.jl b/test/svd.jl index 800f191b..3c5c0145 100644 --- a/test/svd.jl +++ b/test/svd.jl @@ -55,6 +55,7 @@ for T in (BLASFloats..., GenericFloats...), m in (0, 54), n in (0, 37, m, 63) ) TestSuite.test_svd(T, (m, n)) TestSuite.test_svd_algs(T, (m, n), LAPACK_SVD_ALGS) + m ≥ n && TestSuite.test_svd_algs(T, (m, n), (LAPACK_Jacobi(),)) elseif T ∈ GenericFloats TestSuite.test_svd(T, (m, n)) TestSuite.test_svd_algs(T, (m, n), (GLA_QRIteration(),)) From 2e8052b06c57677d19d48aa8ff7035a787bf0cf6 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 14:46:25 +0100 Subject: [PATCH 3/9] No Jacobi for svd_full --- test/testsuite/decompositions/svd.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/testsuite/decompositions/svd.jl b/test/testsuite/decompositions/svd.jl index a6aa4fb9..1450203b 100644 --- a/test/testsuite/decompositions/svd.jl +++ b/test/testsuite/decompositions/svd.jl @@ -123,6 +123,7 @@ function test_svd_full_algs( ) summary_str = testargs_summary(T, sz) return @testset "svd_full! algorithm $alg $summary_str" for alg in algs + isa(alg, LAPACK_Jacobi) && continue A = instantiate_matrix(T, sz) Ac = deepcopy(A) m, n = size(A) From d32bcdd9d5e02cc45e16d9175eef156d634c8aac Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 15:27:28 +0100 Subject: [PATCH 4/9] Test algorithms for Schur too --- src/yalapack.jl | 4 +- test/schur.jl | 4 ++ test/testsuite/decompositions/schur.jl | 55 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/yalapack.jl b/src/yalapack.jl index d45103b7..b3e5d1d9 100644 --- a/src/yalapack.jl +++ b/src/yalapack.jl @@ -1423,7 +1423,7 @@ for (gees, geesx, geev, geevx, ggev, elty, celty, relty) in (:zgees_, :zgeesx_, :zgeev_, :zgeevx_, :zggev_, :ComplexF64, :ComplexF64, :Float64), ) @eval begin - #=function gees!( + function gees!( A::AbstractMatrix{$elty}, V::AbstractMatrix{$elty} = similar(A), vals::AbstractVector{$celty} = similar(A, $celty, size(A, 1)) @@ -1501,7 +1501,7 @@ for (gees, geesx, geev, geevx, ggev, elty, celty, relty) in _reorder_realeigendecomposition!(vals, valsR, valsI, work, V, 'N') end return A, V, vals - end=# + end function geesx!( A::AbstractMatrix{$elty}, V::AbstractMatrix{$elty} = similar(A), diff --git a/test/schur.jl b/test/schur.jl index d306e3d8..6bb5a1ae 100644 --- a/test/schur.jl +++ b/test/schur.jl @@ -27,6 +27,10 @@ for T in (BLASFloats..., GenericFloats...) end if !is_buildkite TestSuite.test_schur(T, (m, m)) + if T ∈ BLASFloats + LAPACK_SCHUR_ALGS = (LAPACK_Simple(), LAPACK_Expert()) + TestSuite.test_schur_algs(T, (m, m), LAPACK_SCHUR_ALGS) + end #AT = Diagonal{T, Vector{T}} #TestSuite.test_schur(AT, m) # not supported yet end diff --git a/test/testsuite/decompositions/schur.jl b/test/testsuite/decompositions/schur.jl index 572b9501..76b5c140 100644 --- a/test/testsuite/decompositions/schur.jl +++ b/test/testsuite/decompositions/schur.jl @@ -9,6 +9,14 @@ function test_schur(T::Type, sz; kwargs...) end end +function test_schur_algs(T::Type, sz, algs; kwargs...) + summary_str = testargs_summary(T, sz) + return @testset "schur algorithms $summary_str" begin + test_schur_full_algs(T, sz, algs; kwargs...) + test_schur_vals_algs(T, sz, algs; kwargs...) + end +end + function test_schur_full( T::Type, sz; atol::Real = 0, rtol::Real = precision(T), @@ -34,6 +42,31 @@ function test_schur_full( end end +function test_schur_full_algs( + T::Type, sz, algs; + atol::Real = 0, rtol::Real = precision(T), + kwargs... + ) + summary_str = testargs_summary(T, sz) + return @testset "schur_full! algorithm $alg $summary_str" for alg in algs + A = instantiate_matrix(T, sz) + Ac = deepcopy(A) + Tc = isa(A, Diagonal) ? eltype(T) : complex(eltype(T)) + + TA, Z, vals = @testinferred schur_full(A; alg) + @test eltype(TA) == eltype(Z) == eltype(T) + @test eltype(vals) == Tc + @test isisometric(Z) + @test A * Z ≈ Z * TA + + TA2, Z2, vals2 = @testinferred schur_full!(Ac, (TA, Z, vals); alg) + @test TA2 === TA + @test Z2 === Z + @test vals2 === vals + @test A * Z ≈ Z * TA + end +end + function test_schur_vals( T::Type, sz; atol::Real = 0, rtol::Real = precision(T), @@ -55,3 +88,25 @@ function test_schur_vals( @test valsc ≈ eig_vals(A) end end + +function test_schur_vals_algs( + T::Type, sz, algs; + atol::Real = 0, rtol::Real = precision(T), + kwargs... + ) + summary_str = testargs_summary(T, sz) + return @testset "schur_vals! algorithm $alg $summary_str" for alg in algs + A = instantiate_matrix(T, sz) + Ac = deepcopy(A) + Tc = isa(A, Diagonal) ? eltype(T) : complex(eltype(T)) + + valsc = @testinferred schur_vals(A; alg) + @test eltype(valsc) == Tc + @test valsc ≈ eig_vals(A) + + valsc = similar(A, Tc, size(A, 1)) + valsc = @testinferred schur_vals!(Ac, valsc; alg) + @test eltype(valsc) == Tc + @test valsc ≈ eig_vals(A) + end +end From 0a86022586c1f835500685b4fd49ba11c0f8af80 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 15:55:15 +0100 Subject: [PATCH 5/9] Restore ungql --- src/yalapack.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yalapack.jl b/src/yalapack.jl index b3e5d1d9..09f95e3c 100644 --- a/src/yalapack.jl +++ b/src/yalapack.jl @@ -580,7 +580,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr end end return A - end + end=# function unglq!(A::AbstractMatrix{$elty}, tau::AbstractVector{$elty}) require_one_based_indexing(A, tau) chkstride1(A, tau) @@ -615,7 +615,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr end return A end - function ungql!(A::AbstractMatrix{$elty}, tau::AbstractVector{$elty}) + #=function ungql!(A::AbstractMatrix{$elty}, tau::AbstractVector{$elty}) require_one_based_indexing(A, tau) chkstride1(A, tau) m, n = size(A) From ed71fbaff87e6c52dac3848a18eb312c66cb609b Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 16:21:12 +0100 Subject: [PATCH 6/9] And ungqr --- src/yalapack.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/yalapack.jl b/src/yalapack.jl index 09f95e3c..25be9d80 100644 --- a/src/yalapack.jl +++ b/src/yalapack.jl @@ -544,7 +544,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr end end return C - end + end=# # Build Q factor of classic QR / LQ / QL / RQ in the space of `A` function ungqr!(A::AbstractMatrix{$elty}, tau::AbstractVector{$elty}) @@ -580,7 +580,7 @@ for (gemqr, gemlq, ungqr, unglq, ungql, ungrq, unmqr, unmlq, unmql, unmrq, gemqr end end return A - end=# + end function unglq!(A::AbstractMatrix{$elty}, tau::AbstractVector{$elty}) require_one_based_indexing(A, tau) chkstride1(A, tau) From c19bef3fae62070a4f2c743a81cc1a05da413e97 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 17:13:19 +0100 Subject: [PATCH 7/9] Kwargs for SVD --- test/svd.jl | 2 +- test/testsuite/decompositions/svd.jl | 33 +++++++++++++++------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/test/svd.jl b/test/svd.jl index 3c5c0145..738ae8ba 100644 --- a/test/svd.jl +++ b/test/svd.jl @@ -55,7 +55,7 @@ for T in (BLASFloats..., GenericFloats...), m in (0, 54), n in (0, 37, m, 63) ) TestSuite.test_svd(T, (m, n)) TestSuite.test_svd_algs(T, (m, n), LAPACK_SVD_ALGS) - m ≥ n && TestSuite.test_svd_algs(T, (m, n), (LAPACK_Jacobi(),)) + m ≥ n && TestSuite.test_svd_algs(T, (m, n), (LAPACK_Jacobi(),); test_full = false, test_vals = false) elseif T ∈ GenericFloats TestSuite.test_svd(T, (m, n)) TestSuite.test_svd_algs(T, (m, n), (GLA_QRIteration(),)) diff --git a/test/testsuite/decompositions/svd.jl b/test/testsuite/decompositions/svd.jl index 1450203b..951de26d 100644 --- a/test/testsuite/decompositions/svd.jl +++ b/test/testsuite/decompositions/svd.jl @@ -2,28 +2,28 @@ using TestExtras using GenericLinearAlgebra using LinearAlgebra: opnorm -function test_svd(T::Type, sz; kwargs...) +function test_svd(T::Type, sz; test_compact::Bool = true, test_full::Bool = true, test_trunc::Bool = true, kwargs...) summary_str = testargs_summary(T, sz) return @testset "svd $summary_str" begin - test_svd_compact(T, sz; kwargs...) - test_svd_full(T, sz; kwargs...) - test_svd_trunc(T, sz; kwargs...) + test_compact && test_svd_compact(T, sz; kwargs...) + test_full && test_svd_full(T, sz; kwargs...) + test_trunc && test_svd_trunc(T, sz; kwargs...) end end -function test_svd_algs(T::Type, sz, algs; kwargs...) +function test_svd_algs(T::Type, sz, algs; test_compact::Bool = true, test_full::Bool = true, test_trunc::Bool = true, kwargs...) summary_str = testargs_summary(T, sz) return @testset "svd algorithms $summary_str" begin - test_svd_compact_algs(T, sz, algs; kwargs...) - test_svd_full_algs(T, sz, algs; kwargs...) - test_svd_trunc_algs(T, sz, algs; kwargs...) + test_compact && test_svd_compact_algs(T, sz, algs; kwargs...) + test_full && test_svd_full_algs(T, sz, algs; kwargs...) + test_trunc && test_svd_trunc_algs(T, sz, algs; kwargs...) end end function test_svd_compact( T::Type, sz; atol::Real = 0, rtol::Real = precision(eltype(T)), - kwargs... + test_vals::Bool = true, kwargs... ) summary_str = testargs_summary(T, sz) return @testset "svd_compact! $summary_str" begin @@ -47,15 +47,17 @@ function test_svd_compact( @test isisometric(V2ᴴ; side = :right) @test isposdef(S2) - Sd = @testinferred svd_vals(A) - @test S ≈ Diagonal(Sd) + if test_vals + Sd = @testinferred svd_vals(A) + @test S ≈ Diagonal(Sd) + end end end function test_svd_compact_algs( T::Type, sz, algs; atol::Real = 0, rtol::Real = precision(eltype(T)), - kwargs... + test_vals::Bool = true, kwargs... ) summary_str = testargs_summary(T, sz) return @testset "svd_compact! algorithm $alg $summary_str" for alg in algs @@ -78,8 +80,10 @@ function test_svd_compact_algs( @test isisometric(V2ᴴ; side = :right) @test isposdef(S2) - Sd = @testinferred svd_vals(A; alg) - @test S ≈ Diagonal(Sd) + if test_vals + Sd = @testinferred svd_vals(A; alg) + @test S ≈ Diagonal(Sd) + end end end @@ -123,7 +127,6 @@ function test_svd_full_algs( ) summary_str = testargs_summary(T, sz) return @testset "svd_full! algorithm $alg $summary_str" for alg in algs - isa(alg, LAPACK_Jacobi) && continue A = instantiate_matrix(T, sz) Ac = deepcopy(A) m, n = size(A) From 3fd2b11b252e4d51db201c6c66e429c9b2200aea Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 17:13:34 +0100 Subject: [PATCH 8/9] Formatter --- test/testsuite/decompositions/svd.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsuite/decompositions/svd.jl b/test/testsuite/decompositions/svd.jl index 951de26d..4b89d497 100644 --- a/test/testsuite/decompositions/svd.jl +++ b/test/testsuite/decompositions/svd.jl @@ -2,7 +2,7 @@ using TestExtras using GenericLinearAlgebra using LinearAlgebra: opnorm -function test_svd(T::Type, sz; test_compact::Bool = true, test_full::Bool = true, test_trunc::Bool = true, kwargs...) +function test_svd(T::Type, sz; test_compact::Bool = true, test_full::Bool = true, test_trunc::Bool = true, kwargs...) summary_str = testargs_summary(T, sz) return @testset "svd $summary_str" begin test_compact && test_svd_compact(T, sz; kwargs...) From 45325c801cd6a6de4beae7ce6ab54e8f0a63df9f Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Mar 2026 18:59:36 +0100 Subject: [PATCH 9/9] Don't run Jacobi on 1.10 --- test/svd.jl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/svd.jl b/test/svd.jl index 738ae8ba..41ad8c09 100644 --- a/test/svd.jl +++ b/test/svd.jl @@ -55,7 +55,9 @@ for T in (BLASFloats..., GenericFloats...), m in (0, 54), n in (0, 37, m, 63) ) TestSuite.test_svd(T, (m, n)) TestSuite.test_svd_algs(T, (m, n), LAPACK_SVD_ALGS) - m ≥ n && TestSuite.test_svd_algs(T, (m, n), (LAPACK_Jacobi(),); test_full = false, test_vals = false) + @static if VERSION > v"1.11-" # Jacobi broken on 1.10 + m ≥ n && TestSuite.test_svd_algs(T, (m, n), (LAPACK_Jacobi(),); test_full = false, test_vals = false) + end elseif T ∈ GenericFloats TestSuite.test_svd(T, (m, n)) TestSuite.test_svd_algs(T, (m, n), (GLA_QRIteration(),))