Skip to content

Commit 2b7bd49

Browse files
authored
Remove some pirated methods for the symmetric eigenvalue problem. (#142)
* Remove some pirated methods for the symmetric eigenvalue problem. They don't seem to be needed anymore and avoid an ambiguity introduced by Julia 1.11. Also, sort the eigenvalues of the symmetric problem when nothing is passed. * Also test on earliest supported version but test on pre instead of nightly
1 parent d766949 commit 2b7bd49

File tree

3 files changed

+38
-25
lines changed

3 files changed

+38
-25
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ jobs:
2727
fail-fast: false
2828
matrix:
2929
version:
30+
- 'min'
3031
- 'lts'
31-
- 'nightly'
3232
- '1'
33+
- 'pre'
3334
os:
3435
- ubuntu-latest
3536
# - macos-latest

src/eigenSelfAdjoint.jl

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,10 @@ function eigvalsPWK!(S::SymTridiagonal{T}; tol = eps(T), sortby::Union{Function,
216216
end
217217
end
218218
end
219-
LinearAlgebra.sorteig!(d, sortby)
219+
220+
# LinearAlgebra.eigvals will pass sortby=nothing but LAPACK always sort the symmetric
221+
# eigenvalue problem so we'll will do the same here
222+
LinearAlgebra.sorteig!(d, sortby === nothing ? LinearAlgebra.eigsortby : sortby)
220223
end
221224

222225
function eigQL!(
@@ -639,29 +642,31 @@ else
639642
LinearAlgebra.copy_oftype
640643
end
641644

642-
function LinearAlgebra.eigvals(A::Hermitian{<:Real})
643-
T = typeof(sqrt(zero(eltype(A))))
644-
return eigvals!(_eigencopy_oftype(A, T))
645-
end
646-
function LinearAlgebra.eigvals(A::Hermitian{<:Complex})
647-
T = typeof(sqrt(zero(eltype(A))))
648-
return eigvals!(_eigencopy_oftype(A, T))
649-
end
650-
function LinearAlgebra.eigvals(A::Hermitian)
651-
T = typeof(sqrt(zero(eltype(A))))
652-
return eigvals!(_eigencopy_oftype(A, T))
653-
end
654-
function LinearAlgebra.eigen(A::Hermitian{<:Real})
655-
T = typeof(sqrt(zero(eltype(A))))
656-
return eigen!(_eigencopy_oftype(A, T))
657-
end
658-
function LinearAlgebra.eigen(A::Hermitian{<:Complex})
659-
T = typeof(sqrt(zero(eltype(A))))
660-
return eigen!(_eigencopy_oftype(A, T))
661-
end
662-
function LinearAlgebra.eigen(A::Hermitian)
663-
T = typeof(sqrt(zero(eltype(A))))
664-
return eigen!(_eigencopy_oftype(A, T))
645+
if VERSION < v"1.7"
646+
function LinearAlgebra.eigvals(A::Hermitian{<:Real})
647+
T = typeof(sqrt(zero(eltype(A))))
648+
return eigvals!(_eigencopy_oftype(A, T))
649+
end
650+
function LinearAlgebra.eigvals(A::Hermitian{<:Complex})
651+
T = typeof(sqrt(zero(eltype(A))))
652+
return eigvals!(_eigencopy_oftype(A, T))
653+
end
654+
function LinearAlgebra.eigvals(A::Hermitian)
655+
T = typeof(sqrt(zero(eltype(A))))
656+
return eigvals!(_eigencopy_oftype(A, T))
657+
end
658+
function LinearAlgebra.eigen(A::Hermitian{<:Real})
659+
T = typeof(sqrt(zero(eltype(A))))
660+
return eigen!(_eigencopy_oftype(A, T))
661+
end
662+
function LinearAlgebra.eigen(A::Hermitian{<:Complex})
663+
T = typeof(sqrt(zero(eltype(A))))
664+
return eigen!(_eigencopy_oftype(A, T))
665+
end
666+
function LinearAlgebra.eigen(A::Hermitian)
667+
T = typeof(sqrt(zero(eltype(A))))
668+
return eigen!(_eigencopy_oftype(A, T))
669+
end
665670
end
666671

667672
# Aux (should go somewhere else at some point)

test/eigenselfadjoint.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,11 @@ using Test, GenericLinearAlgebra, LinearAlgebra, Quaternions
164164
@test eigen(A).values == diag(A)
165165
end
166166
end
167+
168+
if VERSION >= v"1.11"
169+
@testset "Method ambiguity in eigen with Julia 1.11 #141" begin
170+
M = Hermitian(Tridiagonal(ones(ComplexF64, 2), ones(ComplexF64, 3), ones(ComplexF64, 2)))
171+
@test eigen(M).values Float64.(eigen(big.(M)).values)
172+
end
173+
end
167174
end

0 commit comments

Comments
 (0)