Skip to content

Commit 947e631

Browse files
author
mohamed82008
committed
Maximize test coverage and fix bugs
1 parent 312ba60 commit 947e631

File tree

2 files changed

+48
-8
lines changed

2 files changed

+48
-8
lines changed

src/lobpcg.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,11 @@ LOBPCGIterator(A, largest::Bool, X, P=nothing, C=nothing) = LOBPCGIterator(A, no
445445
to a subspace; must overload `A_mul_B!`;
446446
"""
447447
function LOBPCGIterator(A, B, largest::Bool, X, P=nothing, C=nothing)
448-
constr! = Constraint(C, B, X, BWrapper())
449448
precond! = RPreconditioner(P, X)
450-
return LOBPCGIterator(A, B, largest, X, constr!, precond!)
449+
constr! = Constraint(C, B, X)
450+
return LOBPCGIterator(A, B, largest, X, precond!, constr!)
451451
end
452-
function LOBPCGIterator(A, B, largest::Bool, X, constr!::Constraint, precond!::RPreconditioner)
452+
function LOBPCGIterator(A, B, largest::Bool, X, precond!::RPreconditioner, constr!::Constraint)
453453
T = eltype(X)
454454
nev = size(X, 2)
455455
if B isa Void
@@ -515,7 +515,7 @@ function LOBPCGIterator(A, B, largest::Bool, X, nev::Int, P=nothing, C=nothing)
515515
end
516516
constr! = Constraint(Y, BY, X, NotBWrapper())
517517
precond! = RPreconditioner(P, X)
518-
return LOBPCGIterator(A, B, largest, X, constr!, precond!)
518+
return LOBPCGIterator(A, B, largest, X, precond!, constr!)
519519
end
520520

521521
function ortho_AB_mul_X!(blocks::Blocks, ortho!, A, B, bs=-1)
@@ -929,7 +929,7 @@ function lobpcg(A, B, largest::Bool, X0, nev::Int;
929929

930930
sizeX = min(nev, sizeX)
931931
X = X0[:, 1:sizeX]
932-
iterator = LOBPCGIterator(A, B, largest, X, nev, C, P)
932+
iterator = LOBPCGIterator(A, B, largest, X, nev, P, C)
933933

934934
r = EmptyLOBPCGResults(X, nev, tol, maxiter)
935935
rnext = lobpcg!(iterator, log=log, tol=tol, maxiter=maxiter, not_zeros=not_zeros)

test/lobpcg.jl

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,15 +286,15 @@ end
286286
end
287287
end
288288
end
289-
@testset "nev = 3, block size = 2" begin
289+
@testset "nev = 3, block size = $block_size" for block_size in (1, 2)
290290
n = 10
291291
@testset "Simple eigenvalue problem" begin
292292
@testset "Matrix{$T}" for T in (Float32, Float64, Complex64, Complex128)
293293
@testset "largest = $largest" for largest in (true, false)
294294
A = rand(T, n, n)
295295
A = A' * A + I
296296
tol = eps(real(T))^0.4
297-
X0 = rand(T, n, 2)
297+
X0 = rand(T, n, block_size)
298298
r = lobpcg(A, largest, X0, 3, tol=tol, maxiter=Inf, log=true)
299299
λ, X = r.λ, r.X
300300
@test max_err(A*X - X*diagm(λ)) tol
@@ -311,13 +311,53 @@ end
311311
B = B' * B + I
312312
tol = eps(real(T))^0.4
313313

314-
X0 = rand(T, n, 2)
314+
X0 = rand(T, n, block_size)
315315
r = lobpcg(A, B, largest, X0, 3, tol=tol, maxiter=Inf, log=true)
316316
λ, X = r.λ, r.X
317317
@test max_err(A*X - B*X*diagm(λ)) tol
318318
@test all(isapprox.(Ac_mul_B(X, B*X), eye(3), atol=2*n*tol))
319319
end
320320
end
321321
end
322+
@testset "Constraint" begin
323+
@testset "Simple eigenvalue problem" begin
324+
@testset "Matrix{$T}" for T in (Float32, Float64, Complex64, Complex128)
325+
@testset "largest = $largest" for largest in (true, false)
326+
A = rand(T, n, n)
327+
A = A' * A + I
328+
tol = eps(real(T))
329+
r = lobpcg(A, largest, 1; tol=tol, maxiter=Inf, log=false)
330+
λ1, X1 = r.λ, r.X
331+
332+
X0 = rand(T, n, block_size)
333+
r = lobpcg(A, largest, X0, 3, C=copy(r.X), tol=tol, maxiter=Inf, log=true)
334+
λ2, X2 = r.λ, r.X
335+
@test max_err(A*X2 - X2*diagm(λ2)) tol
336+
@test all(isapprox.(Ac_mul_B(X2, X2), eye(3), atol=2*n*tol))
337+
@test all(isapprox.(real(Ac_mul_B(X1, X2)), 0, atol=2*n*tol))
338+
end
339+
end
340+
end
341+
@testset "Generalized eigenvalue problem" begin
342+
@testset "Matrix{$T}" for T in (Float32, Float64, Complex64, Complex128)
343+
@testset "largest = $largest" for largest in (true, false)
344+
A = rand(T, n, n)
345+
A = A' * A + 2I
346+
B = rand(T, n, n)
347+
B = B' * B + 2I
348+
tol = eps(real(T))^0.4
349+
r = lobpcg(A, B, largest, 1; tol=tol, maxiter=Inf, log=false)
350+
λ1, X1 = r.λ, r.X
351+
352+
X0 = rand(T, n, block_size)
353+
r = lobpcg(A, B, largest, X0, 2, C=copy(r.X), tol=tol, maxiter=Inf, log=true)
354+
λ2, X2 = r.λ, r.X
355+
@test max_err(A*X2 - B*X2*diagm(λ2)) tol
356+
@test all(isapprox.(Ac_mul_B(X2, B*X2), eye(2), atol=2*n*tol))
357+
@test all(isapprox.(real(Ac_mul_B(X1, B*X2)), 0, atol=2*n*tol))
358+
end
359+
end
360+
end
361+
end
322362
end
323363
end

0 commit comments

Comments
 (0)