@@ -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 + 2 I
346+ B = rand (T, n, n)
347+ B = B' * B + 2 I
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
323363end
0 commit comments