Skip to content

Commit 73ff52d

Browse files
jaemolihmjishnub
authored andcommitted
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. (cherry picked from commit b6ad8f9)
1 parent 7194038 commit 73ff52d

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)