|
42 | 42 | D₀ = sort!(eig_vals(A); by = abs, rev = true) |
43 | 43 | rmin = findfirst(i -> abs(D₀[end - i]) != abs(D₀[end - i - 1]), 1:(m - 2)) |
44 | 44 | r = length(D₀) - rmin |
| 45 | + atol = sqrt(eps(real(T))) |
45 | 46 |
|
46 | 47 | D1, V1, ϵ1 = @constinferred eig_trunc(A; alg, trunc = truncrank(r)) |
47 | 48 | @test length(D1.diag) == r |
48 | 49 | @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 |
50 | 51 |
|
51 | 52 | s = 1 + sqrt(eps(real(T))) |
52 | 53 | trunc = trunctol(; atol = s * abs(D₀[r + 1])) |
53 | 54 | D2, V2, ϵ2 = @constinferred eig_trunc(A; alg, trunc) |
54 | 55 | @test length(diagview(D2)) == r |
55 | 56 | @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 |
57 | 58 |
|
58 | 59 | s = 1 - sqrt(eps(real(T))) |
59 | 60 | trunc = truncerror(; atol = s * norm(@view(D₀[r:end]), 1), p = 1) |
60 | 61 | D3, V3, ϵ3 = @constinferred eig_trunc(A; alg, trunc) |
61 | 62 | @test length(diagview(D3)) == r |
62 | 63 | @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 |
64 | 65 |
|
65 | 66 | # trunctol keeps order, truncrank might not |
66 | 67 | # test for same subspace |
|
74 | 75 | @testset "eig_trunc! specify truncation algorithm T = $T" for T in BLASFloats |
75 | 76 | rng = StableRNG(123) |
76 | 77 | m = 4 |
| 78 | + atol = sqrt(eps(real(T))) |
77 | 79 | V = randn(rng, T, m, m) |
78 | 80 | D = Diagonal(real(T)[0.9, 0.3, 0.1, 0.01]) |
79 | 81 | A = V * D * inv(V) |
80 | 82 | alg = TruncatedAlgorithm(LAPACK_Simple(), truncrank(2)) |
81 | 83 | D2, V2, ϵ2 = @constinferred eig_trunc(A; alg) |
82 | 84 | @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 |
84 | 86 | @test_throws ArgumentError eig_trunc(A; alg, trunc = (; maxrank = 2)) |
85 | 87 |
|
86 | 88 | alg = TruncatedAlgorithm(LAPACK_Simple(), truncerror(; atol = 0.2, p = 1)) |
87 | 89 | D3, V3, ϵ3 = @constinferred eig_trunc(A; alg) |
88 | 90 | @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 |
90 | 92 | end |
91 | 93 |
|
92 | 94 | @testset "eig for Diagonal{$T}" for T in BLASFloats |
93 | 95 | rng = StableRNG(123) |
94 | 96 | m = 54 |
95 | 97 | Ad = randn(rng, T, m) |
96 | 98 | A = Diagonal(Ad) |
| 99 | + atol = sqrt(eps(real(T))) |
97 | 100 |
|
98 | 101 | D, V = @constinferred eig_full(A) |
99 | 102 | @test D isa Diagonal{T} && size(D) == size(A) |
|
108 | 111 | alg = TruncatedAlgorithm(DiagonalAlgorithm(), truncrank(2)) |
109 | 112 | D2, V2, ϵ2 = @constinferred eig_trunc(A2; alg) |
110 | 113 | @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 |
112 | 115 | end |
0 commit comments