Skip to content

Commit 125a55a

Browse files
committed
relax truncation error tolerances
1 parent 22495c3 commit 125a55a

3 files changed

Lines changed: 22 additions & 14 deletions

File tree

test/eig.jl

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,26 @@ end
4242
D₀ = sort!(eig_vals(A); by = abs, rev = true)
4343
rmin = findfirst(i -> abs(D₀[end - i]) != abs(D₀[end - i - 1]), 1:(m - 2))
4444
r = length(D₀) - rmin
45+
atol = sqrt(eps(real(T)))
4546

4647
D1, V1, ϵ1 = @constinferred eig_trunc(A; alg, trunc = truncrank(r))
4748
@test length(D1.diag) == r
4849
@test A * V1 V1 * D1
49-
@test ϵ1 norm(view(D₀, (r + 1):m))
50+
@test ϵ1 norm(view(D₀, (r + 1):m)) atol = atol
5051

5152
s = 1 + sqrt(eps(real(T)))
5253
trunc = trunctol(; atol = s * abs(D₀[r + 1]))
5354
D2, V2, ϵ2 = @constinferred eig_trunc(A; alg, trunc)
5455
@test length(diagview(D2)) == r
5556
@test A * V2 V2 * D2
56-
@test ϵ2 norm(view(D₀, (r + 1):m))
57+
@test ϵ2 norm(view(D₀, (r + 1):m)) atol = atol
5758

5859
s = 1 - sqrt(eps(real(T)))
5960
trunc = truncerror(; atol = s * norm(@view(D₀[r:end]), 1), p = 1)
6061
D3, V3, ϵ3 = @constinferred eig_trunc(A; alg, trunc)
6162
@test length(diagview(D3)) == r
6263
@test A * V3 V3 * D3
63-
@test ϵ3 norm(view(D₀, (r + 1):m))
64+
@test ϵ3 norm(view(D₀, (r + 1):m)) atol = atol
6465

6566
# trunctol keeps order, truncrank might not
6667
# test for same subspace
@@ -74,26 +75,28 @@ end
7475
@testset "eig_trunc! specify truncation algorithm T = $T" for T in BLASFloats
7576
rng = StableRNG(123)
7677
m = 4
78+
atol = sqrt(eps(real(T)))
7779
V = randn(rng, T, m, m)
7880
D = Diagonal(real(T)[0.9, 0.3, 0.1, 0.01])
7981
A = V * D * inv(V)
8082
alg = TruncatedAlgorithm(LAPACK_Simple(), truncrank(2))
8183
D2, V2, ϵ2 = @constinferred eig_trunc(A; alg)
8284
@test diagview(D2) diagview(D)[1:2] rtol = sqrt(eps(real(T)))
83-
@test ϵ2 norm(diagview(D)[3:4])
85+
@test ϵ2 norm(diagview(D)[3:4]) atol = atol
8486
@test_throws ArgumentError eig_trunc(A; alg, trunc = (; maxrank = 2))
8587

8688
alg = TruncatedAlgorithm(LAPACK_Simple(), truncerror(; atol = 0.2, p = 1))
8789
D3, V3, ϵ3 = @constinferred eig_trunc(A; alg)
8890
@test diagview(D3) diagview(D)[1:2] rtol = sqrt(eps(real(T)))
89-
@test ϵ3 norm(diagview(D)[3:4])
91+
@test ϵ3 norm(diagview(D)[3:4]) atol = atol
9092
end
9193

9294
@testset "eig for Diagonal{$T}" for T in BLASFloats
9395
rng = StableRNG(123)
9496
m = 54
9597
Ad = randn(rng, T, m)
9698
A = Diagonal(Ad)
99+
atol = sqrt(eps(real(T)))
97100

98101
D, V = @constinferred eig_full(A)
99102
@test D isa Diagonal{T} && size(D) == size(A)
@@ -108,5 +111,5 @@ end
108111
alg = TruncatedAlgorithm(DiagonalAlgorithm(), truncrank(2))
109112
D2, V2, ϵ2 = @constinferred eig_trunc(A2; alg)
110113
@test diagview(D2) diagview(A2)[1:2]
111-
@test ϵ2 norm(diagview(A2)[3:4])
114+
@test ϵ2 norm(diagview(A2)[3:4]) atol = atol
112115
end

test/eigh.jl

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,27 +49,28 @@ end
4949
D₀ = reverse(eigh_vals(A))
5050
r = m - 2
5151
s = 1 + sqrt(eps(real(T)))
52+
atol = sqrt(eps(real(T)))
5253

5354
D1, V1, ϵ1 = @constinferred eigh_trunc(A; alg, trunc = truncrank(r))
5455
@test length(diagview(D1)) == r
5556
@test isisometric(V1)
5657
@test A * V1 V1 * D1
5758
@test LinearAlgebra.opnorm(A - V1 * D1 * V1') D₀[r + 1]
58-
@test ϵ1 norm(view(D₀, (r + 1):m))
59+
@test ϵ1 norm(view(D₀, (r + 1):m)) atol = atol
5960

6061
trunc = trunctol(; atol = s * D₀[r + 1])
6162
D2, V2, ϵ2 = @constinferred eigh_trunc(A; alg, trunc)
6263
@test length(diagview(D2)) == r
6364
@test isisometric(V2)
6465
@test A * V2 V2 * D2
65-
@test ϵ2 norm(view(D₀, (r + 1):m))
66+
@test ϵ2 norm(view(D₀, (r + 1):m)) atol = atol
6667

6768
s = 1 - sqrt(eps(real(T)))
6869
trunc = truncerror(; atol = s * norm(@view(D₀[r:end]), 1), p = 1)
6970
D3, V3, ϵ3 = @constinferred eigh_trunc(A; alg, trunc)
7071
@test length(diagview(D3)) == r
7172
@test A * V3 V3 * D3
72-
@test ϵ3 norm(view(D₀, (r + 1):m))
73+
@test ϵ3 norm(view(D₀, (r + 1):m)) atol = atol
7374

7475
# test for same subspace
7576
@test V1 * (V1' * V2) V2
@@ -82,6 +83,7 @@ end
8283
@testset "eigh_trunc! specify truncation algorithm T = $T" for T in BLASFloats
8384
rng = StableRNG(123)
8485
m = 4
86+
atol = sqrt(eps(real(T)))
8587
V = qr_compact(randn(rng, T, m, m))[1]
8688
D = Diagonal(real(T)[0.9, 0.3, 0.1, 0.01])
8789
A = V * D * V'
@@ -90,12 +92,12 @@ end
9092
D2, V2, ϵ2 = @constinferred eigh_trunc(A; alg)
9193
@test diagview(D2) diagview(D)[1:2] rtol = sqrt(eps(real(T)))
9294
@test_throws ArgumentError eigh_trunc(A; alg, trunc = (; maxrank = 2))
93-
@test ϵ2 norm(diagview(D)[3:4])
95+
@test ϵ2 norm(diagview(D)[3:4]) atol = atol
9496

9597
alg = TruncatedAlgorithm(LAPACK_QRIteration(), truncerror(; atol = 0.2))
9698
D3, V3, ϵ3 = @constinferred eigh_trunc(A; alg)
9799
@test diagview(D3) diagview(D)[1:2] rtol = sqrt(eps(real(T)))
98-
@test ϵ3 norm(diagview(D)[3:4])
100+
@test ϵ3 norm(diagview(D)[3:4]) atol = atol
99101
end
100102

101103
@testset "eigh for Diagonal{$T}" for T in BLASFloats
@@ -104,6 +106,7 @@ end
104106
Ad = randn(rng, T, m)
105107
Ad .+= conj.(Ad)
106108
A = Diagonal(Ad)
109+
atol = sqrt(eps(real(T)))
107110

108111
D, V = @constinferred eigh_full(A)
109112
@test D isa Diagonal{real(T)} && size(D) == size(A)
@@ -118,5 +121,5 @@ end
118121
alg = TruncatedAlgorithm(DiagonalAlgorithm(), truncrank(2))
119122
D2, V2, ϵ2 = @constinferred eigh_trunc(A2; alg)
120123
@test diagview(D2) diagview(A2)[1:2]
121-
@test ϵ2 norm(diagview(A2)[3:4])
124+
@test ϵ2 norm(diagview(A2)[3:4]) atol = atol
122125
end

test/svd.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ end
9797
@testset "svd_trunc! for T = $T" for T in BLASFloats
9898
rng = StableRNG(123)
9999
m = 54
100+
atol = sqrt(eps(real(T)))
100101
if LinearAlgebra.LAPACK.version() < v"3.12.0"
101102
algs = (LAPACK_DivideAndConquer(), LAPACK_QRIteration(), LAPACK_Bisection())
102103
else
@@ -117,7 +118,7 @@ end
117118
@test length(S1.diag) == r
118119
@test LinearAlgebra.opnorm(A - U1 * S1 * V1ᴴ) S₀[r + 1]
119120
# Test truncation error
120-
@test ϵ1 norm(view(S₀, (r + 1):minmn))
121+
@test ϵ1 norm(view(S₀, (r + 1):minmn)) atol = atol
121122

122123
s = 1 + sqrt(eps(real(T)))
123124
trunc = trunctol(; atol = s * S₀[r + 1])
@@ -187,6 +188,7 @@ end
187188

188189
@testset "svd for Diagonal{$T}" for T in BLASFloats
189190
rng = StableRNG(123)
191+
atol = sqrt(eps(real(T)))
190192
for m in (54, 0)
191193
Ad = randn(T, m)
192194
A = Diagonal(Ad)
@@ -216,6 +218,6 @@ end
216218
alg = TruncatedAlgorithm(DiagonalAlgorithm(), truncrank(2))
217219
U3, S3, Vᴴ3, ϵ3 = @constinferred svd_trunc(A; alg)
218220
@test diagview(S3) S2[1:min(m, 2)]
219-
@test ϵ3 norm(S2[(min(m, 2) + 1):m])
221+
@test ϵ3 norm(S2[(min(m, 2) + 1):m]) atol = atol
220222
end
221223
end

0 commit comments

Comments
 (0)