Skip to content

Commit 15ca958

Browse files
authored
Merge pull request #1 from mohamed82008/v0.7fixes
[WIP] Tolerance increase and systematic tolerance setting
2 parents e9bf96d + 5458ca8 commit 15ca958

File tree

2 files changed

+37
-26
lines changed

2 files changed

+37
-26
lines changed

src/lobpcg.jl

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,22 @@ function (iterator::LOBPCGIterator{Generalized})(residualTolerance, log) where {
746746
end
747747
end
748748

749+
function default_tolerance(::Type{T}, tol=nothing) where T
750+
if T <: Complex
751+
if tol isa Nothing
752+
return eps(real(T))^(real(T)(3)/10)
753+
else
754+
real(tol)
755+
end
756+
else
757+
if tol isa Nothing
758+
return eps(T)^(T(3)/10)
759+
else
760+
return real(tol)
761+
end
762+
end
763+
end
764+
749765
"""
750766
The Locally Optimal Block Preconditioned Conjugate Gradient Method (LOBPCG)
751767
@@ -872,7 +888,7 @@ function lobpcg!(iterator::LOBPCGIterator; log=false, tol=nothing, maxiter=200,
872888
end
873889
n = size(X, 1)
874890
sizeX = size(X, 2)
875-
residualTolerance = (tol isa Nothing) ? (eps(real(T)))^(real(T)(4)/10) : real(tol)
891+
residualTolerance = default_tolerance(T, tol)
876892
iterator.iteration[] = 1
877893
while iterator.iteration[] <= maxiter
878894
state = iterator(residualTolerance, log)

test/lobpcg.jl

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function max_err(R)
2727
end
2828

2929
@testset "Locally Optimal Block Preconditioned Conjugate Gradient" begin
30-
srand(1234323)
30+
srand(1234321)
3131
@testset "Single eigenvalue" begin
3232
n = 10
3333
@testset "Small full system" begin
@@ -37,8 +37,7 @@ end
3737
A = rand(T, n, n)
3838
A = A' * A + I
3939
b = rand(T, n, 1)
40-
tol = eps(real(T))
41-
40+
tol = IterativeSolvers.default_tolerance(T)
4241
r = lobpcg(A, largest, b; tol=tol, maxiter=Inf, log=false)
4342
λ, X = r.λ, r.X
4443
@test norm(A*X - X*λ) tol
@@ -57,8 +56,7 @@ end
5756
B = rand(T, n, n)
5857
B = B' * B + I
5958
b = rand(T, n, 1)
60-
tol = eps(real(T))
61-
59+
tol = IterativeSolvers.default_tolerance(T)
6260
r = lobpcg(A, B, largest, b; tol=tol, maxiter=Inf, log=true)
6361
λ, X = r.λ, r.X
6462
@test max_err(A*X - B*X*λ) tol
@@ -74,8 +72,7 @@ end
7472
A = laplace_matrix(Float64, 20, 2)
7573
rhs = randn(size(A, 2), 1)
7674
rmul!(rhs, inv(norm(rhs)))
77-
tol = 1e-5
78-
75+
tol = IterativeSolvers.default_tolerance(Float64)
7976
@testset "Matrix" begin
8077
@testset "largest = $largest" for largest in (true, false)
8178
r = lobpcg(A, largest, rhs; tol=tol, maxiter=Inf)
@@ -91,8 +88,7 @@ end
9188
A = rand(T, n, n)
9289
A = A' * A + I
9390
b = zeros(T, n, 1)
94-
tol = eps(real(T))
95-
91+
tol = IterativeSolvers.default_tolerance(T)
9692
r = lobpcg(A, largest, b; tol=tol, maxiter=Inf, log=false)
9793
λ, X = r.λ, r.X
9894
@test norm(A*X - X*λ) tol
@@ -107,7 +103,7 @@ end
107103
B = rand(T, n, n)
108104
B = B' * B + I
109105
b = zeros(T, n, 1)
110-
tol = eps(real(T))
106+
tol = IterativeSolvers.default_tolerance(T)
111107

112108
r = lobpcg(A, B, largest, b; tol=tol, maxiter=Inf, log=true)
113109
λ, X = r.λ, r.X
@@ -122,7 +118,7 @@ end
122118
@testset "largest = $largest" for largest in (true, false)
123119
A = rand(T, n, n)
124120
A = A' * A + I
125-
tol = eps(real(T))
121+
tol = IterativeSolvers.default_tolerance(T)
126122

127123
r = lobpcg(A, largest, 1; tol=tol, maxiter=Inf, log=false)
128124
λ, X = r.λ, r.X
@@ -137,7 +133,7 @@ end
137133
A = A' * A + I
138134
B = rand(T, n, n)
139135
B = B' * B + I
140-
tol = eps(real(T))
136+
tol = IterativeSolvers.default_tolerance(T)
141137

142138
r = lobpcg(A, B, largest, 1; tol=tol, maxiter=Inf, log=true)
143139
λ, X = r.λ, r.X
@@ -152,7 +148,7 @@ end
152148
@testset "largest = $largest" for largest in (true, false)
153149
A = rand(T, n, n)
154150
A = A' * A + I
155-
tol = eps(real(T))
151+
tol = IterativeSolvers.default_tolerance(T)
156152
b = rand(T, n, 1)
157153
itr = LOBPCGIterator(A, largest, b)
158154

@@ -170,7 +166,7 @@ end
170166
B = rand(T, n, n)
171167
B = B' * B + I
172168
b = rand(T, n, 1)
173-
tol = eps(real(T))
169+
tol = IterativeSolvers.default_tolerance(T)
174170
itr = LOBPCGIterator(A, B, largest, b)
175171

176172
r = lobpcg!(itr; tol=tol, maxiter=Inf, log=true)
@@ -186,7 +182,7 @@ end
186182
@testset "largest = $largest" for largest in (true, false)
187183
A = rand(T, n, n)
188184
A = A' * A + I
189-
tol = eps(real(T))
185+
tol = IterativeSolvers.default_tolerance(T)
190186
P = JacobiPrec(diag(A))
191187
r = lobpcg(A, largest, 1; P=P, tol=tol, maxiter=Inf, log=false)
192188
λ, X = r.λ, r.X
@@ -202,7 +198,7 @@ end
202198
P = JacobiPrec(diag(A))
203199
B = rand(T, n, n)
204200
B = B' * B + I
205-
tol = eps(real(T))
201+
tol = IterativeSolvers.default_tolerance(T)
206202

207203
r = lobpcg(A, B, largest, 1; P=P, tol=tol, maxiter=Inf, log=true)
208204
λ, X = r.λ, r.X
@@ -217,7 +213,7 @@ end
217213
@testset "largest = $largest" for largest in (true, false)
218214
A = rand(T, n, n)
219215
A = A' * A + I
220-
tol = eps(real(T))
216+
tol = IterativeSolvers.default_tolerance(T)
221217
r = lobpcg(A, largest, 1; tol=tol, maxiter=Inf, log=false)
222218
λ1, X1 = r.λ, r.X
223219
r = lobpcg(A, largest, 1; C=copy(r.X), tol=tol, maxiter=Inf, log=false)
@@ -234,7 +230,7 @@ end
234230
A = A' * A + I
235231
B = rand(T, n, n)
236232
B = B' * B + I
237-
tol = eps(real(T))^0.4
233+
tol = IterativeSolvers.default_tolerance(T)
238234
r = lobpcg(A, B, largest, 1; tol=tol, maxiter=Inf, log=false)
239235
λ1, X1 = r.λ, r.X
240236
r = lobpcg(A, B, largest, 1; C=copy(r.X), tol=tol, maxiter=Inf, log=false)
@@ -255,7 +251,7 @@ end
255251
A = rand(T, n, n)
256252
A = A' * A + I
257253
b = rand(T, n, 2)
258-
tol = eps(real(T))
254+
tol = IterativeSolvers.default_tolerance(T)
259255

260256
r = lobpcg(A, largest, b; tol=tol, maxiter=Inf, log=false)
261257
λ, X = r.λ, r.X
@@ -275,7 +271,7 @@ end
275271
B = rand(T, n, n)
276272
B = B' * B + I
277273
b = rand(T, n, 2)
278-
tol = eps(real(T))^(real(T)(4/10))
274+
tol = IterativeSolvers.default_tolerance(T)
279275
r = lobpcg(A, B, largest, b; tol=tol, maxiter=Inf, log=true)
280276
λ, X = r.λ, r.X
281277
@test max_err(A*X - B*X*Matrix(Diagonal(λ))) tol
@@ -295,7 +291,7 @@ end
295291
@testset "largest = $largest" for largest in (true, false)
296292
A = rand(T, n, n)
297293
A = A' * A + I
298-
tol = eps(real(T))^0.4
294+
tol = IterativeSolvers.default_tolerance(T)
299295
X0 = rand(T, n, block_size)
300296
r = lobpcg(A, largest, X0, 3, tol=tol, maxiter=Inf, log=true)
301297
λ, X = r.λ, r.X
@@ -311,8 +307,7 @@ end
311307
A = A' * A + I
312308
B = rand(T, n, n)
313309
B = B' * B + I
314-
tol = eps(real(T))^0.4
315-
310+
tol = IterativeSolvers.default_tolerance(T)
316311
X0 = rand(T, n, block_size)
317312
r = lobpcg(A, B, largest, X0, 3, tol=tol, maxiter=Inf, log=true)
318313
λ, X = r.λ, r.X
@@ -327,7 +322,7 @@ end
327322
@testset "largest = $largest" for largest in (true, false)
328323
A = rand(T, n, n)
329324
A = A' * A + I
330-
tol = eps(real(T))
325+
tol = IterativeSolvers.default_tolerance(T)
331326
r = lobpcg(A, largest, 1; tol=tol, maxiter=Inf, log=false)
332327
λ1, X1 = r.λ, r.X
333328

@@ -347,7 +342,7 @@ end
347342
A = A' * A + 2I
348343
B = rand(T, n, n)
349344
B = B' * B + 2I
350-
tol = eps(real(T))^0.4
345+
tol = IterativeSolvers.default_tolerance(T)
351346
r = lobpcg(A, B, largest, 1; tol=tol, maxiter=Inf, log=false)
352347
λ1, X1 = r.λ, r.X
353348

0 commit comments

Comments
 (0)