Skip to content

Commit d2db55a

Browse files
authored
Merge pull request #18760 from JuliaLang/ksh/linalgtestset
Switch more of the linalg tests to use testsets
2 parents 6c27e24 + 59400a2 commit d2db55a

File tree

10 files changed

+951
-908
lines changed

10 files changed

+951
-908
lines changed

test/linalg/arnoldi.jl

Lines changed: 155 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -2,75 +2,77 @@
22

33
using Base.Test
44

5-
debug = false
6-
7-
debug && println("eigs")
8-
let
9-
srand(1234)
10-
local n,a,asym,b,bsym,d,v
11-
n = 10
12-
areal = sprandn(n,n,0.4)
13-
breal = sprandn(n,n,0.4)
14-
acmplx = complex(sprandn(n,n,0.4), sprandn(n,n,0.4))
15-
bcmplx = complex(sprandn(n,n,0.4), sprandn(n,n,0.4))
16-
17-
testtol = 1e-6
18-
19-
for elty in (Float64, Complex128)
20-
if elty == Complex64 || elty == Complex128
21-
a = acmplx
22-
b = bcmplx
23-
else
24-
a = areal
25-
b = breal
26-
end
27-
a = convert(SparseMatrixCSC{elty}, a)
28-
asym = a' + a # symmetric indefinite
29-
apd = a'*a # symmetric positive-definite
30-
31-
b = convert(SparseMatrixCSC{elty}, b)
32-
bsym = b' + b
33-
bpd = b'*b
34-
35-
(d,v) = eigs(a, nev=3)
36-
@test a*v[:,2] d[2]*v[:,2]
37-
@test norm(v) > testtol # eigenvectors cannot be null vectors
38-
# (d,v) = eigs(a, b, nev=3, tol=1e-8) # not handled yet
39-
# @test_approx_eq_eps a*v[:,2] d[2]*b*v[:,2] testtol
40-
# @test norm(v) > testtol # eigenvectors cannot be null vectors
41-
42-
(d,v) = eigs(asym, nev=3)
43-
@test asym*v[:,1] d[1]*v[:,1]
44-
@test eigs(asym; nev=1, sigma=d[3])[1][1] d[3]
45-
@test norm(v) > testtol # eigenvectors cannot be null vectors
46-
47-
(d,v) = eigs(apd, nev=3)
48-
@test apd*v[:,3] d[3]*v[:,3]
49-
@test eigs(apd; nev=1, sigma=d[3])[1][1] d[3]
50-
51-
(d,v) = eigs(apd, bpd, nev=3, tol=1e-8)
52-
@test_approx_eq_eps apd*v[:,2] d[2]*bpd*v[:,2] testtol
53-
@test norm(v) > testtol # eigenvectors cannot be null vectors
54-
55-
# test (shift-and-)invert mode
56-
(d,v) = eigs(apd, nev=3, sigma=0)
57-
@test apd*v[:,3] d[3]*v[:,3]
58-
@test norm(v) > testtol # eigenvectors cannot be null vectors
59-
60-
(d,v) = eigs(apd, bpd, nev=3, sigma=0, tol=1e-8)
61-
@test_approx_eq_eps apd*v[:,1] d[1]*bpd*v[:,1] testtol
62-
@test norm(v) > testtol # eigenvectors cannot be null vectors
63-
64-
@test_throws ArgumentError eigs(rand(elty,2,2))
65-
@test_throws ArgumentError eigs(a, nev=-1)
66-
@test_throws ArgumentError eigs(a, which=:Z)
67-
@test_throws ArgumentError eigs(a, which=:BE)
68-
@test_throws DimensionMismatch eigs(a, v0=zeros(elty,n+2))
69-
@test_throws ArgumentError eigs(a, v0=zeros(Int,n))
70-
if elty == Float64
71-
@test_throws ArgumentError eigs(a+a.',which=:SI)
72-
@test_throws ArgumentError eigs(a+a.',which=:LI)
73-
@test_throws ArgumentError eigs(a,sigma=rand(Complex64))
5+
@testset "eigs" begin
6+
let
7+
srand(1234)
8+
local n,a,asym,b,bsym,d,v
9+
n = 10
10+
areal = sprandn(n,n,0.4)
11+
breal = sprandn(n,n,0.4)
12+
acmplx = complex(sprandn(n,n,0.4), sprandn(n,n,0.4))
13+
bcmplx = complex(sprandn(n,n,0.4), sprandn(n,n,0.4))
14+
15+
testtol = 1e-6
16+
17+
@testset for elty in (Float64, Complex128)
18+
if elty == Complex64 || elty == Complex128
19+
a = acmplx
20+
b = bcmplx
21+
else
22+
a = areal
23+
b = breal
24+
end
25+
a = convert(SparseMatrixCSC{elty}, a)
26+
asym = a' + a # symmetric indefinite
27+
apd = a'*a # symmetric positive-definite
28+
29+
b = convert(SparseMatrixCSC{elty}, b)
30+
bsym = b' + b
31+
bpd = b'*b
32+
33+
(d,v) = eigs(a, nev=3)
34+
@test a*v[:,2] d[2]*v[:,2]
35+
@test norm(v) > testtol # eigenvectors cannot be null vectors
36+
# (d,v) = eigs(a, b, nev=3, tol=1e-8) # not handled yet
37+
# @test_approx_eq_eps a*v[:,2] d[2]*b*v[:,2] testtol
38+
# @test norm(v) > testtol # eigenvectors cannot be null vectors
39+
40+
(d,v) = eigs(asym, nev=3)
41+
@test asym*v[:,1] d[1]*v[:,1]
42+
@test eigs(asym; nev=1, sigma=d[3])[1][1] d[3]
43+
@test norm(v) > testtol # eigenvectors cannot be null vectors
44+
45+
(d,v) = eigs(apd, nev=3)
46+
@test apd*v[:,3] d[3]*v[:,3]
47+
@test eigs(apd; nev=1, sigma=d[3])[1][1] d[3]
48+
49+
(d,v) = eigs(apd, bpd, nev=3, tol=1e-8)
50+
@test_approx_eq_eps apd*v[:,2] d[2]*bpd*v[:,2] testtol
51+
@test norm(v) > testtol # eigenvectors cannot be null vectors
52+
53+
@testset "(shift-and-)invert mode" begin
54+
(d,v) = eigs(apd, nev=3, sigma=0)
55+
@test apd*v[:,3] d[3]*v[:,3]
56+
@test norm(v) > testtol # eigenvectors cannot be null vectors
57+
58+
(d,v) = eigs(apd, bpd, nev=3, sigma=0, tol=1e-8)
59+
@test_approx_eq_eps apd*v[:,1] d[1]*bpd*v[:,1] testtol
60+
@test norm(v) > testtol # eigenvectors cannot be null vectors
61+
end
62+
63+
@testset "ArgumentErrors" begin
64+
@test_throws ArgumentError eigs(rand(elty,2,2))
65+
@test_throws ArgumentError eigs(a, nev=-1)
66+
@test_throws ArgumentError eigs(a, which=:Z)
67+
@test_throws ArgumentError eigs(a, which=:BE)
68+
@test_throws DimensionMismatch eigs(a, v0=zeros(elty,n+2))
69+
@test_throws ArgumentError eigs(a, v0=zeros(Int,n))
70+
if elty == Float64
71+
@test_throws ArgumentError eigs(a+a.',which=:SI)
72+
@test_throws ArgumentError eigs(a+a.',which=:LI)
73+
@test_throws ArgumentError eigs(a,sigma=rand(Complex64))
74+
end
75+
end
7476
end
7577
end
7678
end
@@ -150,87 +152,94 @@ let
150152
@test eigs(speye(50), nev=10)[1] ones(10) #Issue 4246
151153
end
152154

153-
debug && println("real svds")
154-
let # svds test
155-
A = sparse([1, 1, 2, 3, 4], [2, 1, 1, 3, 1], [2.0, -1.0, 6.1, 7.0, 1.5])
156-
S1 = svds(A, nsv = 2)
157-
S2 = svd(full(A))
158-
159-
## singular values match:
160-
@test S1[1][:S] S2[2][1:2]
161-
162-
## 1st left singular vector
163-
s1_left = sign(S1[1][:U][3,1]) * S1[1][:U][:,1]
164-
s2_left = sign(S2[1][3,1]) * S2[1][:,1]
165-
@test s1_left s2_left
166-
167-
## 1st right singular vector
168-
s1_right = sign(S1[1][:Vt][3,1]) * S1[1][:Vt][:,1]
169-
s2_right = sign(S2[3][3,1]) * S2[3][:,1]
170-
@test s1_right s2_right
171-
172-
#10329
173-
debug && println("Issue 10329")
174-
B = sparse(diagm([1.0, 2.0, 34.0, 5.0, 6.0]))
175-
S3 = svds(B, ritzvec=false, nsv=2)
176-
@test S3[1][:S] [34.0, 6.0]
177-
S4 = svds(B, nsv=2)
178-
@test S4[1][:S] [34.0, 6.0]
179-
180-
## test passing guess for Krylov vectors
181-
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)))
182-
@test S1[1][:S] S2[2][1:2]
183-
S1 = svds(A, nsv = 2, v0=rand(eltype(A),size(A,2)))
184-
@test S1[1][:S] S2[2][1:2]
185-
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)), v0=rand(eltype(A),size(A,2)))
186-
@test S1[1][:S] S2[2][1:2]
187-
188-
@test_throws ArgumentError svds(A,nsv=0)
189-
@test_throws ArgumentError svds(A,nsv=20)
190-
@test_throws DimensionMismatch svds(A,nsv=2,u0=rand(size(A,1)+1))
191-
@test_throws DimensionMismatch svds(A,nsv=2,v0=rand(size(A,2)+1))
155+
@testset "real svds" begin
156+
let # svds test
157+
A = sparse([1, 1, 2, 3, 4], [2, 1, 1, 3, 1], [2.0, -1.0, 6.1, 7.0, 1.5])
158+
S1 = svds(A, nsv = 2)
159+
S2 = svd(full(A))
160+
161+
## singular values match:
162+
@test S1[1][:S] S2[2][1:2]
163+
@testset "singular vectors" begin
164+
## 1st left singular vector
165+
s1_left = sign(S1[1][:U][3,1]) * S1[1][:U][:,1]
166+
s2_left = sign(S2[1][3,1]) * S2[1][:,1]
167+
@test s1_left s2_left
168+
169+
## 1st right singular vector
170+
s1_right = sign(S1[1][:Vt][3,1]) * S1[1][:Vt][:,1]
171+
s2_right = sign(S2[3][3,1]) * S2[3][:,1]
172+
@test s1_right s2_right
173+
end
174+
# Issue number 10329
175+
# Ensure singular values from svds are in
176+
# the correct order
177+
@testset "singular values ordered correctly" begin
178+
B = sparse(diagm([1.0, 2.0, 34.0, 5.0, 6.0]))
179+
S3 = svds(B, ritzvec=false, nsv=2)
180+
@test S3[1][:S] [34.0, 6.0]
181+
S4 = svds(B, nsv=2)
182+
@test S4[1][:S] [34.0, 6.0]
183+
end
184+
@testset "passing guess for Krylov vectors" begin
185+
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)))
186+
@test S1[1][:S] S2[2][1:2]
187+
S1 = svds(A, nsv = 2, v0=rand(eltype(A),size(A,2)))
188+
@test S1[1][:S] S2[2][1:2]
189+
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)), v0=rand(eltype(A),size(A,2)))
190+
@test S1[1][:S] S2[2][1:2]
191+
end
192+
193+
@test_throws ArgumentError svds(A,nsv=0)
194+
@test_throws ArgumentError svds(A,nsv=20)
195+
@test_throws DimensionMismatch svds(A,nsv=2,u0=rand(size(A,1)+1))
196+
@test_throws DimensionMismatch svds(A,nsv=2,v0=rand(size(A,2)+1))
197+
end
192198
end
193199

194-
debug && println("complex svds")
195-
let # complex svds test
196-
A = sparse([1, 1, 2, 3, 4], [2, 1, 1, 3, 1], exp.(im*[2.0:2:10;]))
197-
S1 = svds(A, nsv = 2)
198-
S2 = svd(full(A))
199-
200-
## singular values match:
201-
@test S1[1][:S] S2[2][1:2]
202-
203-
## left singular vectors
204-
s1_left = abs.(S1[1][:U][:,1:2])
205-
s2_left = abs.(S2[1][:,1:2])
206-
@test s1_left s2_left
207-
208-
## right singular vectors
209-
s1_right = abs.(S1[1][:Vt][:,1:2])
210-
s2_right = abs.(S2[3][:,1:2])
211-
@test s1_right s2_right
212-
213-
## test passing guess for Krylov vectors
214-
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)))
215-
@test S1[1][:S] S2[2][1:2]
216-
S1 = svds(A, nsv = 2, v0=rand(eltype(A),size(A,2)))
217-
@test S1[1][:S] S2[2][1:2]
218-
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)), v0=rand(eltype(A),size(A,2)))
219-
@test S1[1][:S] S2[2][1:2]
220-
221-
@test_throws ArgumentError svds(A,nsv=0)
222-
@test_throws ArgumentError svds(A,nsv=20)
223-
@test_throws DimensionMismatch svds(A,nsv=2,u0=complex(rand(size(A,1)+1)))
224-
@test_throws DimensionMismatch svds(A,nsv=2,v0=complex(rand(size(A,2)+1)))
200+
@testset "complex svds" begin
201+
let # complex svds test
202+
A = sparse([1, 1, 2, 3, 4], [2, 1, 1, 3, 1], exp.(im*[2.0:2:10;]))
203+
S1 = svds(A, nsv = 2)
204+
S2 = svd(full(A))
205+
206+
## singular values match:
207+
@test S1[1][:S] S2[2][1:2]
208+
@testset "singular vectors" begin
209+
## left singular vectors
210+
s1_left = abs.(S1[1][:U][:,1:2])
211+
s2_left = abs.(S2[1][:,1:2])
212+
@test s1_left s2_left
213+
214+
## right singular vectors
215+
s1_right = abs.(S1[1][:Vt][:,1:2])
216+
s2_right = abs.(S2[3][:,1:2])
217+
@test s1_right s2_right
218+
end
219+
@testset "passing guess for Krylov vectors" begin
220+
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)))
221+
@test S1[1][:S] S2[2][1:2]
222+
S1 = svds(A, nsv = 2, v0=rand(eltype(A),size(A,2)))
223+
@test S1[1][:S] S2[2][1:2]
224+
S1 = svds(A, nsv = 2, u0=rand(eltype(A),size(A,1)), v0=rand(eltype(A),size(A,2)))
225+
@test S1[1][:S] S2[2][1:2]
226+
end
227+
228+
@test_throws ArgumentError svds(A,nsv=0)
229+
@test_throws ArgumentError svds(A,nsv=20)
230+
@test_throws DimensionMismatch svds(A,nsv=2,u0=complex(rand(size(A,1)+1)))
231+
@test_throws DimensionMismatch svds(A,nsv=2,v0=complex(rand(size(A,2)+1)))
232+
end
225233
end
226234

227-
# test promotion
228-
eigs(rand(1:10, 10, 10))
229-
eigs(rand(1:10, 10, 10), rand(1:10, 10, 10) |> t -> t't)
230-
svds(rand(1:10, 10, 8))
231-
@test_throws MethodError eigs(big(rand(1:10, 10, 10)))
232-
@test_throws MethodError eigs(big(rand(1:10, 10, 10)), rand(1:10, 10, 10))
233-
@test_throws MethodError svds(big(rand(1:10, 10, 8)))
235+
@testset "promotion" begin
236+
eigs(rand(1:10, 10, 10))
237+
eigs(rand(1:10, 10, 10), rand(1:10, 10, 10) |> t -> t't)
238+
svds(rand(1:10, 10, 8))
239+
@test_throws MethodError eigs(big(rand(1:10, 10, 10)))
240+
@test_throws MethodError eigs(big(rand(1:10, 10, 10)), rand(1:10, 10, 10))
241+
@test_throws MethodError svds(big(rand(1:10, 10, 8)))
242+
end
234243

235244
# Symmetric generalized with singular B
236245
let

0 commit comments

Comments
 (0)