From 58214b41249b01c3a11762e59267346b2c959215 Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Sun, 27 Oct 2024 21:24:58 +0100 Subject: [PATCH 1/2] 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. --- src/eigenSelfAdjoint.jl | 53 ++++++++++++++++++++++------------------ test/eigenselfadjoint.jl | 7 ++++++ 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/src/eigenSelfAdjoint.jl b/src/eigenSelfAdjoint.jl index fb683ca..cbf8742 100644 --- a/src/eigenSelfAdjoint.jl +++ b/src/eigenSelfAdjoint.jl @@ -216,7 +216,10 @@ function eigvalsPWK!(S::SymTridiagonal{T}; tol = eps(T), sortby::Union{Function, end end end - LinearAlgebra.sorteig!(d, sortby) + + # LinearAlgebra.eigvals will pass sortby=nothing but LAPACK always sort the symmetric + # eigenvalue problem so we'll will do the same here + LinearAlgebra.sorteig!(d, sortby === nothing ? LinearAlgebra.eigsortby : sortby) end function eigQL!( @@ -639,29 +642,31 @@ else LinearAlgebra.copy_oftype end -function LinearAlgebra.eigvals(A::Hermitian{<:Real}) - T = typeof(sqrt(zero(eltype(A)))) - return eigvals!(_eigencopy_oftype(A, T)) -end -function LinearAlgebra.eigvals(A::Hermitian{<:Complex}) - T = typeof(sqrt(zero(eltype(A)))) - return eigvals!(_eigencopy_oftype(A, T)) -end -function LinearAlgebra.eigvals(A::Hermitian) - T = typeof(sqrt(zero(eltype(A)))) - return eigvals!(_eigencopy_oftype(A, T)) -end -function LinearAlgebra.eigen(A::Hermitian{<:Real}) - T = typeof(sqrt(zero(eltype(A)))) - return eigen!(_eigencopy_oftype(A, T)) -end -function LinearAlgebra.eigen(A::Hermitian{<:Complex}) - T = typeof(sqrt(zero(eltype(A)))) - return eigen!(_eigencopy_oftype(A, T)) -end -function LinearAlgebra.eigen(A::Hermitian) - T = typeof(sqrt(zero(eltype(A)))) - return eigen!(_eigencopy_oftype(A, T)) +if VERSION < v"1.7" + function LinearAlgebra.eigvals(A::Hermitian{<:Real}) + T = typeof(sqrt(zero(eltype(A)))) + return eigvals!(_eigencopy_oftype(A, T)) + end + function LinearAlgebra.eigvals(A::Hermitian{<:Complex}) + T = typeof(sqrt(zero(eltype(A)))) + return eigvals!(_eigencopy_oftype(A, T)) + end + function LinearAlgebra.eigvals(A::Hermitian) + T = typeof(sqrt(zero(eltype(A)))) + return eigvals!(_eigencopy_oftype(A, T)) + end + function LinearAlgebra.eigen(A::Hermitian{<:Real}) + T = typeof(sqrt(zero(eltype(A)))) + return eigen!(_eigencopy_oftype(A, T)) + end + function LinearAlgebra.eigen(A::Hermitian{<:Complex}) + T = typeof(sqrt(zero(eltype(A)))) + return eigen!(_eigencopy_oftype(A, T)) + end + function LinearAlgebra.eigen(A::Hermitian) + T = typeof(sqrt(zero(eltype(A)))) + return eigen!(_eigencopy_oftype(A, T)) + end end # Aux (should go somewhere else at some point) diff --git a/test/eigenselfadjoint.jl b/test/eigenselfadjoint.jl index 9565647..847adc0 100644 --- a/test/eigenselfadjoint.jl +++ b/test/eigenselfadjoint.jl @@ -164,4 +164,11 @@ using Test, GenericLinearAlgebra, LinearAlgebra, Quaternions @test eigen(A).values == diag(A) end end + + if VERSION >= v"1.11" + @testset "Method ambiguity in eigen with Julia 1.11 #141" begin + M = Hermitian(Tridiagonal(ones(ComplexF64, 2), ones(ComplexF64, 3), ones(ComplexF64, 2))) + @test eigen(M).values ≈ Float64.(eigen(big.(M)).values) + end + end end From 79c8b7fe69a8fb9e11a95bb954191765b151b594 Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Sun, 27 Oct 2024 21:32:13 +0100 Subject: [PATCH 2/2] Also test on earliest supported version but test on pre instead of nightly --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e9ce5c..324a3ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,9 +27,10 @@ jobs: fail-fast: false matrix: version: + - 'min' - 'lts' - - 'nightly' - '1' + - 'pre' os: - ubuntu-latest # - macos-latest