Skip to content

Commit

Permalink
more docs
Browse files Browse the repository at this point in the history
  • Loading branch information
haampie committed Feb 22, 2024
1 parent 847c505 commit b3d70c7
Showing 1 changed file with 15 additions and 16 deletions.
31 changes: 15 additions & 16 deletions docs/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -375,17 +375,10 @@ identical defaults: each of the mentioned packages uses a slightly different def
convergence criterion.


## Status
An overview of what we have, how it's done and what we're missing.
## Implementation details

### Implementation details

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

6 comments on commit b3d70c7

@haampie
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request created: JuliaRegistries/General/101428

Tip: Release Notes

Did you know you can add release notes too? Just add markdown formatted text underneath the comment after the text
"Release notes:" and it will be added to the registry PR, and if TagBot is installed it will also be added to the
release that TagBot creates. i.e.

@JuliaRegistrator register

Release notes:

## Breaking changes

- blah

To add them here just re-invoke and the PR will be updated.

Tagging

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v0.4.0 -m "<description of version>" b3d70c70ee0d1aff2f98d69e46e1191f768953df
git push origin v0.4.0

@haampie
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator register

Release notes:

  • BREAKING: The target structs LM, SR, LR, SI, LI are no longer exported. You have to
    import them explicitly: using ArnoldiMethod: LM. But easier it to update your code from structs
    LM() to symbols :LM.

  • ArnoldiMethod.jl now exports partialschur! and ArnoldiWorkspace, which can be used to
    pre-allocate (custom) matrices. Also it can be used to run the algorithm from an existing partial
    Schur decomposition.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request updated: JuliaRegistries/General/101428

Tagging

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v0.4.0 -m "<description of version>" b3d70c70ee0d1aff2f98d69e46e1191f768953df
git push origin v0.4.0

@haampie
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JuliaRegistrator register

Release notes:

  • BREAKING: The target structs LM, SR, LR, SI, LI are no longer exported. You have to
    import them explicitly: using ArnoldiMethod: LM. But easier is to update your code from structs
    LM() to symbols :LM (which requires at least v0.3).

  • ArnoldiMethod.jl now exports partialschur! and ArnoldiWorkspace, which can be used to
    pre-allocate (custom) matrices. Also it can be used to run the algorithm from an existing partial
    Schur decomposition.

@JuliaRegistrator
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Registration pull request updated: JuliaRegistries/General/101428

Tagging

After the above pull request is merged, it is recommended that a tag is created on this repository for the registered package version.

This will be done automatically if the Julia TagBot GitHub Action is installed, or can be done manually through the github interface, or via:

git tag -a v0.4.0 -m "<description of version>" b3d70c70ee0d1aff2f98d69e46e1191f768953df
git push origin v0.4.0

Please sign in to comment.