|
384 | 384 | function update_mask!(iterator, residualTolerance)
|
385 | 385 | sizeX = size(iterator.XBlocks.block, 2)
|
386 | 386 | # Update active vectors mask
|
387 |
| - iterator.activeMask .*= view(iterator.residuals, 1:sizeX) .> residualTolerance |
| 387 | + iterator.activeMask .= view(iterator.residuals, 1:sizeX) .> residualTolerance |
388 | 388 | iterator.currentBlockSize[] = sum(iterator.activeMask)
|
389 | 389 | return
|
390 | 390 | end
|
|
585 | 585 | function dense_solver(A, B, X, largest)
|
586 | 586 | warn("The problem size is small compared to the block size. Using dense eigensolver instead of LOBPCG.")
|
587 | 587 | # Define the closed range of indices of eigenvalues to return.
|
588 |
| - n, sizeX = size(X) |
| 588 | + n = size(X, 1) |
| 589 | + sizeX = size(X, 2) |
589 | 590 | eigvals = largest ? (n - sizeX + 1, n) : (1, sizeX)
|
590 | 591 | A_dense = A*eye(n)
|
591 | 592 | if B isa Void
|
@@ -650,7 +651,8 @@ function lobpcg(A, B, largest, X0;
|
650 | 651 | T = eltype(X)
|
651 | 652 | M = P
|
652 | 653 | Y = C
|
653 |
| - n, sizeX = size(X) |
| 654 | + n = size(X, 1) |
| 655 | + sizeX = size(X, 2) |
654 | 656 | if Y isa Void
|
655 | 657 | n < 5 * sizeX && return dense_solver(A, B, X, largest)
|
656 | 658 | else
|
@@ -709,7 +711,8 @@ function lobpcg!(λ::AbstractVector, X, A, B, largest=true; log=false,
|
709 | 711 | T = eltype(X)
|
710 | 712 | M = P
|
711 | 713 | Y = C
|
712 |
| - n, sizeX = size(X) |
| 714 | + n = size(X, 1) |
| 715 | + sizeX = size(X, 2) |
713 | 716 | if Y isa Void
|
714 | 717 | if n < 5 * sizeX
|
715 | 718 | lambda, vectors = dense_solver(A, B, X, largest)
|
@@ -777,12 +780,12 @@ function lobpcg!(iterator::LOBPCGIterator; log=false, tol=nothing, maxiter=200)
|
777 | 780 | end
|
778 | 781 | n = size(iterator.XBlocks.block, 1)
|
779 | 782 | sizeX = size(iterator.XBlocks.block, 2)
|
780 |
| - residualTolerance = (tol isa Void) ? sqrt(eps(T)) : tol |
781 |
| - maxiter = min(n, maxiter) |
782 |
| - for iteration in 1:maxiter |
783 |
| - iterator.iteration[] = iteration |
| 783 | + residualTolerance = (tol isa Void) ? sqrt(eps(real(T))) : tol |
| 784 | + iterator.iteration[] = 1 |
| 785 | + while iterator.iteration[] <= maxiter |
784 | 786 | iterator(residualTolerance, log)
|
785 | 787 | iterator.currentBlockSize[] == 0 && break
|
| 788 | + iterator.iteration[] += 1 |
786 | 789 | end
|
787 | 790 | iterator.λ .= view(iterator.int_λ, 1:sizeX)
|
788 | 791 | if log
|
|
0 commit comments