@@ -15,34 +15,33 @@ include(joinpath("..", "utilities.jl"))
1515 k = min(m, n)
1616 algs = (CUSOLVER_QRIteration(), CUSOLVER_SVDPolar(), CUSOLVER_Jacobi())
1717 @testset " algorithm $alg " for alg in algs
18- As = m == n ? (CuArray(randn(rng, T, m, n)), Diagonal(CuArray(randn(rng, T, m)))) : (CuArray(randn(rng, T, m, n)),)
19- for A in As
20- minmn = min(m, n)
21- U, S, Vᴴ = svd_compact(A; alg)
22- @test U isa CuMatrix{T} && size(U) == (m, minmn)
23- @test S isa Diagonal{real(T), <: CuVector } && size(S) == (minmn, minmn)
24- @test Vᴴ isa CuMatrix{T} && size(Vᴴ) == (minmn, n)
25- @test U * S * Vᴴ ≈ A
26- @test isapproxone(U' * U)
27- @test isapproxone(Vᴴ * Vᴴ' )
28- @test isposdef(S)
18+ minmn = min(m, n)
19+ A = CuArray(randn(rng, T, m, n))
2920
30- Ac = similar(A)
31- U2, S2, V2ᴴ = @constinferred svd_compact!(copy!(Ac, A), (U, S, Vᴴ), alg)
32- @test U2 === U
33- @test S2 === S
34- @test V2ᴴ === Vᴴ
35- @test U * S * Vᴴ ≈ A
36- @test isapproxone(U' * U)
37- @test isapproxone(Vᴴ * Vᴴ' )
38- @test isposdef(S)
21+ U, S, Vᴴ = svd_compact(A; alg)
22+ @test U isa CuMatrix{T} && size(U) == (m, minmn)
23+ @test S isa Diagonal{real(T), <: CuVector } && size(S) == (minmn, minmn)
24+ @test Vᴴ isa CuMatrix{T} && size(Vᴴ) == (minmn, n)
25+ @test U * S * Vᴴ ≈ A
26+ @test isapproxone(U' * U)
27+ @test isapproxone(Vᴴ * Vᴴ' )
28+ @test isposdef(S)
3929
40- Sd = svd_vals(A, alg)
41- @test CuArray(diagview(S)) ≈ Sd
42- # CuArray is necessary because norm of CuArray view with non-unit step is broken
43- if alg isa CUSOLVER_QRIteration
44- @test_warn " invalid keyword arguments for GPU_QRIteration" svd_compact!(copy!(Ac, A), (U, S, Vᴴ), CUSOLVER_QRIteration(; bad = " bad" ))
45- end
30+ Ac = similar(A)
31+ U2, S2, V2ᴴ = @constinferred svd_compact!(copy!(Ac, A), (U, S, Vᴴ), alg)
32+ @test U2 === U
33+ @test S2 === S
34+ @test V2ᴴ === Vᴴ
35+ @test U * S * Vᴴ ≈ A
36+ @test isapproxone(U' * U)
37+ @test isapproxone(Vᴴ * Vᴴ' )
38+ @test isposdef(S)
39+
40+ Sd = svd_vals(A, alg)
41+ @test CuArray(diagview(S)) ≈ Sd
42+ # CuArray is necessary because norm of CuArray view with non-unit step is broken
43+ if alg isa CUSOLVER_QRIteration
44+ @test_warn " invalid keyword arguments for GPU_QRIteration" svd_compact!(copy!(Ac, A), (U, S, Vᴴ), CUSOLVER_QRIteration(; bad = " bad" ))
4645 end
4746 end
4847 end
5453 @testset " size ($m , $n )" for n in (37 , m, 63 )
5554 algs = (CUSOLVER_QRIteration(), CUSOLVER_SVDPolar(), CUSOLVER_Jacobi())
5655 @testset " algorithm $alg " for alg in algs
57- As = m == n ? (CuArray(randn(rng, T, m, n)), Diagonal(CuArray(randn(rng, T, m)))) : (CuArray(randn(rng, T, m, n)),)
58- for A in As
59- minmn = min(m, n)
60- U, S, Vᴴ = svd_full(A; alg)
61- @test U isa CuMatrix{T} && size(U) == (m, m)
62- @test S isa CuMatrix{real(T)} && size(S) == (m, n)
63- @test Vᴴ isa CuMatrix{T} && size(Vᴴ) == (n, n)
64- @test U * S * Vᴴ ≈ A
65- @test isapproxone(U' * U)
66- @test isapproxone(U * U' )
67- @test isapproxone(Vᴴ * Vᴴ' )
68- @test isapproxone(Vᴴ' * Vᴴ)
69- @test all(isposdef, diagview(S))
56+ A = CuArray(randn(rng, T, m, n))
57+ U, S, Vᴴ = svd_full(A; alg)
58+ @test U isa CuMatrix{T} && size(U) == (m, m)
59+ @test S isa CuMatrix{real(T)} && size(S) == (m, n)
60+ @test Vᴴ isa CuMatrix{T} && size(Vᴴ) == (n, n)
61+ @test U * S * Vᴴ ≈ A
62+ @test isapproxone(U' * U)
63+ @test isapproxone(U * U' )
64+ @test isapproxone(Vᴴ * Vᴴ' )
65+ @test isapproxone(Vᴴ' * Vᴴ)
66+ @test all(isposdef, diagview(S))
7067
71- Ac = similar(A)
72- U2, S2, V2ᴴ = @constinferred svd_full!(copy!(Ac, A), (U, S, Vᴴ), alg)
73- @test U2 === U
74- @test S2 === S
75- @test V2ᴴ === Vᴴ
76- @test U * S * Vᴴ ≈ A
77- @test isapproxone(U' * U)
78- @test isapproxone(U * U' )
79- @test isapproxone(Vᴴ * Vᴴ' )
80- @test isapproxone(Vᴴ' * Vᴴ)
81- @test all(isposdef, diagview(S))
68+ Ac = similar(A)
69+ U2, S2, V2ᴴ = @constinferred svd_full!(copy!(Ac, A), (U, S, Vᴴ), alg)
70+ @test U2 === U
71+ @test S2 === S
72+ @test V2ᴴ === Vᴴ
73+ @test U * S * Vᴴ ≈ A
74+ @test isapproxone(U' * U)
75+ @test isapproxone(U * U' )
76+ @test isapproxone(Vᴴ * Vᴴ' )
77+ @test isapproxone(Vᴴ' * Vᴴ)
78+ @test all(isposdef, diagview(S))
8279
83- Sc = similar(A, real(T), minmn)
84- Sc2 = svd_vals!(copy!(Ac, A), Sc, alg)
85- @test Sc === Sc2
86- @test CuArray(diagview(S)) ≈ Sc
87- # CuArray is necessary because norm of CuArray view with non-unit step is broken
88- if alg isa CUSOLVER_QRIteration
89- @test_warn " invalid keyword arguments for GPU_QRIteration" svd_full!(copy!(Ac, A), (U, S, Vᴴ), CUSOLVER_QRIteration(; bad = " bad" ))
90- if ! isa(A, Diagonal)
91- @test_warn " invalid keyword arguments for GPU_QRIteration" svd_vals!(copy!(Ac, A), Sc, CUSOLVER_QRIteration(; bad = " bad" ))
92- end
93- end
80+ minmn = min(m, n)
81+ Sc = similar(A, real(T), minmn)
82+ Sc2 = svd_vals!(copy!(Ac, A), Sc, alg)
83+ @test Sc === Sc2
84+ @test CuArray(diagview(S)) ≈ Sc
85+ # CuArray is necessary because norm of CuArray view with non-unit step is broken
86+ if alg isa CUSOLVER_QRIteration
87+ @test_warn " invalid keyword arguments for GPU_QRIteration" svd_full!(copy!(Ac, A), (U, S, Vᴴ), CUSOLVER_QRIteration(; bad = " bad" ))
88+ @test_warn " invalid keyword arguments for GPU_QRIteration" svd_vals!(copy!(Ac, A), Sc, CUSOLVER_QRIteration(; bad = " bad" ))
9489 end
9590 end
9691 end
9792 @testset " size (0, 0)" begin
9893 algs = (CUSOLVER_QRIteration(), CUSOLVER_SVDPolar(), CUSOLVER_Jacobi())
9994 @testset " algorithm $alg " for alg in algs
100- for A in (CuArray(randn(rng, T, 0 , 0 )), Diagonal(CuArray(randn(rng, T, 0 ))))
101- U, S, Vᴴ = svd_full(A; alg)
102- @test U isa CuMatrix{T} && size(U) == (0 , 0 )
103- @test S isa CuMatrix{real(T)} && size(S) == (0 , 0 )
104- @test Vᴴ isa CuMatrix{T} && size(Vᴴ) == (0 , 0 )
105- @test U * S * Vᴴ ≈ A
106- @test isapproxone(U' * U)
107- @test isapproxone(U * U' )
108- @test isapproxone(Vᴴ * Vᴴ' )
109- @test isapproxone(Vᴴ' * Vᴴ)
110- @test all(isposdef, diagview(S))
111- end
95+ A = CuArray(randn(rng, T, 0 , 0 ))
96+ U, S, Vᴴ = svd_full(A; alg)
97+ @test U isa CuMatrix{T} && size(U) == (0 , 0 )
98+ @test S isa CuMatrix{real(T)} && size(S) == (0 , 0 )
99+ @test Vᴴ isa CuMatrix{T} && size(Vᴴ) == (0 , 0 )
100+ @test U * S * Vᴴ ≈ A
101+ @test isapproxone(U' * U)
102+ @test isapproxone(U * U' )
103+ @test isapproxone(Vᴴ * Vᴴ' )
104+ @test isapproxone(Vᴴ' * Vᴴ)
105+ @test all(isposdef, diagview(S))
112106 end
113107 end
114108end
@@ -121,28 +115,26 @@ end
121115 p = min(m, n) - k - 1
122116 algs = (CUSOLVER_QRIteration(), CUSOLVER_SVDPolar(), CUSOLVER_Jacobi(), CUSOLVER_Randomized(; k = k, p = p, niters = 100 ))
123117 @testset " algorithm $alg " for alg in algs
124- hAs = m == n ? (randn(rng, T, m, n), Diagonal(randn(rng, T, m))) : (randn(rng, T, m, n),)
125- for hA in hAs
126- S₀ = svd_vals(hA)
127- A = CuArray(hA)
128- minmn = min(m, n)
129- r = k
118+ hA = randn(rng, T, m, n)
119+ S₀ = svd_vals(hA)
120+ A = CuArray(hA)
121+ minmn = min(m, n)
122+ r = k
130123
131- U1, S1, V1ᴴ, ϵ1 = @constinferred svd_trunc(A; alg, trunc = truncrank(r))
132- @test length(S1. diag) == r
133- @test opnorm(A - U1 * S1 * V1ᴴ) ≈ S₀[r + 1 ]
134- @test norm(A - U1 * S1 * V1ᴴ) ≈ ϵ1
124+ U1, S1, V1ᴴ, ϵ1 = @constinferred svd_trunc(A; alg, trunc = truncrank(r))
125+ @test length(S1. diag) == r
126+ @test opnorm(A - U1 * S1 * V1ᴴ) ≈ S₀[r + 1 ]
127+ @test norm(A - U1 * S1 * V1ᴴ) ≈ ϵ1
135128
136- if ! (alg isa CUSOLVER_Randomized)
137- s = 1 + sqrt(eps(real(T)))
138- trunc2 = trunctol(; atol = s * S₀[r + 1 ])
129+ if ! (alg isa CUSOLVER_Randomized)
130+ s = 1 + sqrt(eps(real(T)))
131+ trunc2 = trunctol(; atol = s * S₀[r + 1 ])
139132
140- U2, S2, V2ᴴ, ϵ2 = @constinferred svd_trunc(A; alg, trunc = trunctol(; atol = s * S₀[r + 1 ]))
141- @test length(S2. diag) == r
142- @test U1 ≈ U2
143- @test parent(S1) ≈ parent(S2)
144- @test V1ᴴ ≈ V2ᴴ
145- end
133+ U2, S2, V2ᴴ, ϵ2 = @constinferred svd_trunc(A; alg, trunc = trunctol(; atol = s * S₀[r + 1 ]))
134+ @test length(S2. diag) == r
135+ @test U1 ≈ U2
136+ @test parent(S1) ≈ parent(S2)
137+ @test V1ᴴ ≈ V2ᴴ
146138 end
147139 end
148140 end
0 commit comments