Skip to content

Commit 712ecd0

Browse files
committed
refactor: fold the eigenvalue domain scan into a single helper call
Add a `_clamp_domain_eigenvalues!(D::Diagonal, domain_atol)` convenience method that derives the default tolerance itself, so the real-input branch of the `MatrixFunctionViaEig` kernels reduces to a one-line preamble before delegating to the `DiagonalAlgorithm` kernel.
1 parent e0e0ee1 commit 712ecd0

4 files changed

Lines changed: 11 additions & 8 deletions

File tree

src/implementations/logarithm.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ function logarithm!(A::AbstractMatrix, logA, alg::MatrixFunctionViaEig)
5858
D, V = eig_full!(A, alg.eig_alg)
5959
diag_alg = DiagonalAlgorithm(; domain_atol = alg.domain_atol)
6060
if eltype(A) <: Real
61-
atol = something(alg.domain_atol, default_domain_atol(diagview(D)))
62-
_clamp_domain_eigenvalues!(diagview(D), atol)
61+
_clamp_domain_eigenvalues!(D, alg.domain_atol)
6362
VlogD = V * logarithm!(D, D, diag_alg)
6463
logAc = rdiv!(VlogD, LinearAlgebra.lu!(V))
6564
return logA .= real.(logAc)

src/implementations/matrixfunctions.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ function _clamp_domain_eigenvalues!(λ::AbstractVector{<:Real}, atol::Real)
2222
return λ
2323
end
2424

25+
# Convenience method for the eigenvalues of a decomposition, deriving the default
26+
# tolerance from the eigenvalues themselves when `domain_atol` is `nothing`.
27+
function _clamp_domain_eigenvalues!(D::Diagonal, domain_atol::Union{Nothing, Real})
28+
λ = diagview(D)
29+
atol = something(domain_atol, default_domain_atol(λ))
30+
return _clamp_domain_eigenvalues!(λ, atol)
31+
end
32+
2533
# Complex eigenvalues of a real matrix: only eigenvalues (numerically) on the negative
2634
# real axis obstruct a real result; complex-conjugate pairs do not.
2735
function _clamp_domain_eigenvalues!::AbstractVector{<:Complex}, atol::Real)

src/implementations/power.jl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,7 @@ function power!(A::AbstractMatrix, p::Real, powA, alg::MatrixFunctionViaEig)
7171
D, V = eig_full!(A, alg.eig_alg)
7272
diag_alg = DiagonalAlgorithm(; domain_atol = alg.domain_atol)
7373
if eltype(A) <: Real
74-
if !isinteger(p)
75-
atol = something(alg.domain_atol, default_domain_atol(diagview(D)))
76-
_clamp_domain_eigenvalues!(diagview(D), atol)
77-
end
74+
isinteger(p) || _clamp_domain_eigenvalues!(D, alg.domain_atol)
7875
VpD = V * power!(D, p, D, diag_alg)
7976
powAc = rdiv!(VpD, LinearAlgebra.lu!(V))
8077
return powA .= real.(powAc)

src/implementations/squareroot.jl

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ function squareroot!(A::AbstractMatrix, sqrtA, alg::MatrixFunctionViaEig)
6060
D, V = eig_full!(A, alg.eig_alg)
6161
diag_alg = DiagonalAlgorithm(; domain_atol = alg.domain_atol)
6262
if eltype(A) <: Real
63-
atol = something(alg.domain_atol, default_domain_atol(diagview(D)))
64-
_clamp_domain_eigenvalues!(diagview(D), atol)
63+
_clamp_domain_eigenvalues!(D, alg.domain_atol)
6564
VsqrtD = V * squareroot!(D, D, diag_alg)
6665
sqrtAc = rdiv!(VsqrtD, LinearAlgebra.lu!(V))
6766
return sqrtA .= real.(sqrtAc)

0 commit comments

Comments
 (0)