Skip to content

Commit b6ad8f9

Browse files
authored
Change default symmetriceigen algorithm back to RobustRepresentations (#1363)
See #1313 A brief summary: RobustRepresentations (`LAPACK.syevr!`) was the only algorithm implemented until Julia v1.11. Then, JuliaLang/julia#49355 implemented interface to other algorithms, and changed the default to DivideAndConquer (`LAPACK.syevd!`) based on its better numerical accuracy and performance. But, it turned out that in some LAPACK implementation, the DivideAndConquer fails more frequently than RobustRepresentations (#1313). Based on the discussion in #1313 , this PR reverts the default algorithm to RobustRepresentations. Once the problem with the RobustRepresentations in the problematic LAPACK implementation has been sorted out, the default could be changed to DivideAndConquer.
1 parent fd7e413 commit b6ad8f9

File tree

1 file changed

+10
-6
lines changed

1 file changed

+10
-6
lines changed

src/symmetriceigen.jl

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ eigencopy_oftype(A::Symmetric{<:Complex}, S) = copyto!(similar(parent(A), S), A)
1010
default_eigen_alg(A)
1111
1212
Return the default algorithm used to solve the eigensystem `A v = λ v` for a symmetric matrix `A`.
13-
Defaults to `LinearAlegbra.DivideAndConquer()`, which corresponds to the LAPACK function `LAPACK.syevd!`.
13+
Defaults to `LinearAlegbra.RobustRepresentations()`, which corresponds to the LAPACK function `LAPACK.syevr!`.
1414
"""
15-
default_eigen_alg(@nospecialize(A)) = DivideAndConquer()
15+
default_eigen_alg(@nospecialize(A)) = RobustRepresentations()
1616

1717
# Eigensolvers for symmetric and Hermitian matrices
1818
function eigen!(A::RealHermSymComplexHerm{<:BlasReal,<:StridedMatrix}; alg::Algorithm = default_eigen_alg(A), sortby::Union{Function,Nothing}=nothing)
@@ -37,9 +37,9 @@ matrix `F.vectors`. (The `k`th eigenvector can be obtained from the slice `F.vec
3737
Iterating the decomposition produces the components `F.values` and `F.vectors`.
3838
3939
`alg` specifies which algorithm and LAPACK method to use for eigenvalue decomposition:
40-
- `alg = DivideAndConquer()` (default): Calls `LAPACK.syevd!`.
40+
- `alg = DivideAndConquer()`: Calls `LAPACK.syevd!`.
4141
- `alg = QRIteration()`: Calls `LAPACK.syev!`.
42-
- `alg = RobustRepresentations()`: Multiple relatively robust representations method, Calls `LAPACK.syevr!`.
42+
- `alg = RobustRepresentations()` (default): Multiple relatively robust representations method, Calls `LAPACK.syevr!`.
4343
4444
See James W. Demmel et al, SIAM J. Sci. Comput. 30, 3, 1508 (2008) for
4545
a comparison of the accuracy and performance of different algorithms.
@@ -140,14 +140,18 @@ end
140140
Return the eigenvalues of `A`.
141141
142142
`alg` specifies which algorithm and LAPACK method to use for eigenvalue decomposition:
143-
- `alg = DivideAndConquer()` (default): Calls `LAPACK.syevd!`.
143+
- `alg = DivideAndConquer()`: Calls `LAPACK.syevd!`.
144144
- `alg = QRIteration()`: Calls `LAPACK.syev!`.
145-
- `alg = RobustRepresentations()`: Multiple relatively robust representations method, Calls `LAPACK.syevr!`.
145+
- `alg = RobustRepresentations()` (default): Multiple relatively robust representations method, Calls `LAPACK.syevr!`.
146146
147147
See James W. Demmel et al, SIAM J. Sci. Comput. 30, 3, 1508 (2008) for
148148
a comparison of the accuracy and performance of different methods.
149149
150150
The default `alg` used may change in the future.
151+
152+
!!! compat "Julia 1.12"
153+
The `alg` keyword argument requires Julia 1.12 or later.
154+
151155
"""
152156
function eigvals(A::RealHermSymComplexHerm; alg::Algorithm = default_eigen_alg(A), sortby::Union{Function,Nothing}=nothing)
153157
S = eigtype(eltype(A))

0 commit comments

Comments
 (0)