@@ -375,17 +375,10 @@ identical defaults: each of the mentioned packages uses a slightly different def
375
375
convergence criterion.
376
376
377
377
378
- ## Status
379
- An overview of what we have, how it's done and what we're missing.
378
+ ## Implementation details
380
379
381
- ### Implementation details
382
-
383
- - The method does not make assumptions about the type of the matrix; it is
384
- matrix-free.
385
- - Converged Ritz vectors are locked (or deflated).
386
- - We may do "purging" differently from ARPACK: in ArnoldiMethod.jl it is rather
387
- "unlocking", in the sense that converged but unwanted eigenvectors are retained
388
- in the search subspace instead of removed from it.
380
+ - The method is "matrix-free", in the sense that only ` mul! ` needs to be
381
+ implemented.
389
382
- Important matrices and vectors are pre-allocated and operations on the
390
383
Hessenberg matrix are in-place; Julia's garbage collector can sit back.
391
384
- Krylov basis vectors are orthogonalized with repeated classical Gram-Schmidt
@@ -394,12 +387,18 @@ An overview of what we have, how it's done and what we're missing.
394
387
- To compute the Schur decomposition of the Hessenberg matrix we use a dense
395
388
QR algorithm written natively in Julia. It is based on implicit (or Francis)
396
389
shifts and handles real arithmetic efficiently.
397
- - Locking and purging of Ritz vectors is done by reordering the Schur form,
398
- which is also implemented natively in Julia. In the real case it is done by
399
- casting tiny Sylvester equations to linear systems and solving them with
400
- complete pivoting.
390
+ - Converged Ritz vectors close enough to the target are locked, converged
391
+ Ritz vectors too far away from the target are purged (= removed from the
392
+ search subspace). This is done by re-ordering the Schur form. In the real
393
+ case it is done by casting tiny Sylvester equations to linear systems and
394
+ solving them with complete pivoting (in pure Julia).
395
+ - The Krylov-Schur restart is typically implemented by computing a Housholder
396
+ reflector for the last row of the "perturbed" Hessenberg matrix. For
397
+ stability, ArnoldiMethod.jl uses Given's rotations to zero out this row,
398
+ which is more stable, given that the row may contain number of vastly different
399
+ orders of magnitude -- they correspond to residuals, which can be tiny or large.
401
400
- Shrinking the size of the Krylov subspace and changing its basis is done by
402
401
accumulating all rotations and reflections in a unitary matrix ` Q ` , and then
403
402
simply computing the matrix-matrix product ` V := V * Q ` , where ` V ` is the
404
- original orthonormal basis. This is not in-place in ` V ` , so we allocate a bit
405
- of scratch space ahead of time.
403
+ original orthonormal basis. This is not in-place in ` V ` , so we need to
404
+ allocate a temporary for V (once, ahead of time) .
0 commit comments