From cb128666b764921384548263e22595abf412b5a2 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 13 Nov 2025 06:03:51 -0500 Subject: [PATCH 1/5] Fix and test opnorm for sparse --- src/host/sparse.jl | 2 +- test/testsuite/sparse.jl | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/host/sparse.jl b/src/host/sparse.jl index 1bee2ce58..3fae31877 100644 --- a/src/host/sparse.jl +++ b/src/host/sparse.jl @@ -75,7 +75,7 @@ function LinearAlgebra.opnorm(A::AbstractGPUSparseMatrixCSR, p::Real=2) end end -LinearAlgebra.opnorm(A::AbstractGPUSparseMatrixCSC, p::Real=2) = opnorm(_csr_type(A)(A), p) +LinearAlgebra.opnorm(A::AbstractGPUSparseMatrixCSC, p::Real=2) = opnorm(csr_type(A)(A), p) function LinearAlgebra.norm(A::AbstractGPUSparseMatrix{T}, p::Real=2) where T if p == Inf diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index e1fcf5c62..75292d804 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -10,6 +10,7 @@ matrix_construction(sparse_AT, eltypes) broadcasting_matrix(sparse_AT, eltypes) mapreduce_matrix(sparse_AT, eltypes) + linalg(sparse_AT, eltypes) end end end @@ -336,3 +337,24 @@ function mapreduce_matrix(AT, eltypes) end end end + +function linalg(AT, eltypes) + dense_AT = GPUArrays.dense_array_type(AT) + for ET in eltypes + @testset "SparseMatrix($ET)" begin + m = 10 + A = sprand(ET, m, m, 0.2) + B = sprand(ET, m, m, 0.3) + ZA = spzeros(ET, m, m) + C = I(div(m, 2)) + dA = AT(A) + dB = AT(B) + dZA = AT(ZA) + @testset "opnorm and norm" begin + @test opnorm(A, Inf) ≈ opnorm(dA, Inf) + @test opnorm(A, 1) ≈ opnorm(dA, 1) + @test_throws ArgumentError opnorm(dA, 2) + end + end + end +end From 66f4a85d3ac48321356cc0e2bb3469bd26dbee82 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 13 Nov 2025 06:29:55 -0500 Subject: [PATCH 2/5] Use sprandn --- test/testsuite/sparse.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index 75292d804..4b771b007 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -341,10 +341,10 @@ end function linalg(AT, eltypes) dense_AT = GPUArrays.dense_array_type(AT) for ET in eltypes - @testset "SparseMatrix($ET)" begin + @testset "Sparse matrix($ET) linear algebra" begin m = 10 - A = sprand(ET, m, m, 0.2) - B = sprand(ET, m, m, 0.3) + A = sprandn(ET, m, m, 0.2) + B = sprandn(ET, m, m, 0.3) ZA = spzeros(ET, m, m) C = I(div(m, 2)) dA = AT(A) From a885b14ab96bc27b8b053b6bb2ecd4fd59939d0b Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 13 Nov 2025 06:48:42 -0500 Subject: [PATCH 3/5] Don't use linalg tests with complex int --- test/testsuite/sparse.jl | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index 4b771b007..84bba9c26 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -341,19 +341,22 @@ end function linalg(AT, eltypes) dense_AT = GPUArrays.dense_array_type(AT) for ET in eltypes - @testset "Sparse matrix($ET) linear algebra" begin - m = 10 - A = sprandn(ET, m, m, 0.2) - B = sprandn(ET, m, m, 0.3) - ZA = spzeros(ET, m, m) - C = I(div(m, 2)) - dA = AT(A) - dB = AT(B) - dZA = AT(ZA) - @testset "opnorm and norm" begin - @test opnorm(A, Inf) ≈ opnorm(dA, Inf) - @test opnorm(A, 1) ≈ opnorm(dA, 1) - @test_throws ArgumentError opnorm(dA, 2) + # sprandn doesn't work nicely with these... + if !isa(ET, Union{Complex{Int16}, Complex{Int32}, Complex{Int64}}) + @testset "Sparse matrix($ET) linear algebra" begin + m = 10 + A = sprandn(ET, m, m, 0.2) + B = sprandn(ET, m, m, 0.3) + ZA = spzeros(ET, m, m) + C = I(div(m, 2)) + dA = AT(A) + dB = AT(B) + dZA = AT(ZA) + @testset "opnorm and norm" begin + @test opnorm(A, Inf) ≈ opnorm(dA, Inf) + @test opnorm(A, 1) ≈ opnorm(dA, 1) + @test_throws ArgumentError opnorm(dA, 2) + end end end end From e4c4ce756c4b2066465f456a77efed49e4b29417 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 13 Nov 2025 07:06:38 -0500 Subject: [PATCH 4/5] Fix subtype check --- test/testsuite/sparse.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index 84bba9c26..cd72aa84b 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -342,7 +342,7 @@ function linalg(AT, eltypes) dense_AT = GPUArrays.dense_array_type(AT) for ET in eltypes # sprandn doesn't work nicely with these... - if !isa(ET, Union{Complex{Int16}, Complex{Int32}, Complex{Int64}}) + if !(ET <: Union{Complex{Int16}, Complex{Int32}, Complex{Int64}}) @testset "Sparse matrix($ET) linear algebra" begin m = 10 A = sprandn(ET, m, m, 0.2) From 2f8e31244a57bf6561a76fb0f14a934177bfaf3d Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Thu, 13 Nov 2025 07:27:28 -0500 Subject: [PATCH 5/5] Just don't do Ints for linalg tests --- test/testsuite/sparse.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index cd72aa84b..08c5ab12c 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -342,7 +342,7 @@ function linalg(AT, eltypes) dense_AT = GPUArrays.dense_array_type(AT) for ET in eltypes # sprandn doesn't work nicely with these... - if !(ET <: Union{Complex{Int16}, Complex{Int32}, Complex{Int64}}) + if !(ET <: Union{Int16, Int32, Int64, Complex{Int16}, Complex{Int32}, Complex{Int64}}) @testset "Sparse matrix($ET) linear algebra" begin m = 10 A = sprandn(ET, m, m, 0.2)