@@ -286,15 +286,15 @@ end
286
286
end
287
287
end
288
288
end
289
- @testset " nev = 3, block size = 2 " begin
289
+ @testset " nev = 3, block size = $block_size " for block_size in ( 1 , 2 )
290
290
n = 10
291
291
@testset " Simple eigenvalue problem" begin
292
292
@testset " Matrix{$T }" for T in (Float32, Float64, Complex64, Complex128)
293
293
@testset " largest = $largest " for largest in (true , false )
294
294
A = rand (T, n, n)
295
295
A = A' * A + I
296
296
tol = eps (real (T))^ 0.4
297
- X0 = rand (T, n, 2 )
297
+ X0 = rand (T, n, block_size )
298
298
r = lobpcg (A, largest, X0, 3 , tol= tol, maxiter= Inf , log= true )
299
299
λ, X = r. λ, r. X
300
300
@test max_err (A* X - X* diagm (λ)) ≤ tol
@@ -311,13 +311,53 @@ end
311
311
B = B' * B + I
312
312
tol = eps (real (T))^ 0.4
313
313
314
- X0 = rand (T, n, 2 )
314
+ X0 = rand (T, n, block_size )
315
315
r = lobpcg (A, B, largest, X0, 3 , tol= tol, maxiter= Inf , log= true )
316
316
λ, X = r. λ, r. X
317
317
@test max_err (A* X - B* X* diagm (λ)) ≤ tol
318
318
@test all (isapprox .(Ac_mul_B (X, B* X), eye (3 ), atol= 2 * n* tol))
319
319
end
320
320
end
321
321
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
322
362
end
323
363
end
0 commit comments