Skip to content

Commit 6051a03

Browse files
committed
Add issymmetrictype and ishermitiantype
1 parent 98723df commit 6051a03

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

src/symmetric.jl

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -461,9 +461,34 @@ issymmetric(A::Hermitian{<:Real}) = true
461461
issymmetric(A::Hermitian{<:Complex}) = isreal(A)
462462
issymmetric(A::Symmetric) = true
463463

464-
# check if the symmetry is known from the type
465-
_issymmetric(::Union{SymSymTri, Hermitian{<:Real}}) = true
466-
_issymmetric(::Any) = false
464+
"""
465+
issymmetrictype(T::Type)
466+
467+
Return whether every instance `x` of the type `T` satisfies `issymmetric(x) == tue`,
468+
that is, the fact that the instance is symmetric is known from its type.
469+
470+
!!! note
471+
An instance `x::T` may still be symmetric when `issymmetrictype(T)` return `false`.
472+
"""
473+
issymmetrictype(::Type) = false
474+
issymmetrictype(::Type{<:Union{Symmetric,Hermitian{<:Real}}}) = true
475+
issymmetrictype(::Type{<:Real}) = true
476+
issymmetrictype(::Type{<:AbstractFloat}) = false
477+
issymmetrictype(::Type{Complex{T}}) where {T} = issymmetrictype(T)
478+
479+
"""
480+
ishermitiantype(T::Type)
481+
482+
Return whether every instance `x` of the type `T` satisfies `ishermitian(x) == tue`,
483+
that is, the fact that the instance is hermitian is known from its type.
484+
485+
!!! note
486+
An instance `x::T` may still be hermitian when `ishermitiantype(T)` return `false`.
487+
"""
488+
ishermitiantype(::Type) = false
489+
ishermitiantype(::Type{<:Union{Symmetric{<:Real},Hermitian}}) = true
490+
ishermitiantype(::Type{<:Real}) = true
491+
ishermitiantype(::Type{<:AbstractFloat}) = false
467492

468493
adjoint(A::Hermitian) = A
469494
transpose(A::Symmetric) = A

src/tridiag.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ function (::Type{SymTri})(A::AbstractMatrix) where {SymTri <: SymTridiagonal}
111111
checksquare(A)
112112
du = diag(A, 1)
113113
d = diag(A)
114-
if !(_issymmetric(A) || _checksymmetric(d, du, diag(A, -1)))
114+
if !(issymmetrictype(typeof(A)) || _checksymmetric(d, du, diag(A, -1)))
115115
throw(ArgumentError("matrix is not symmetric; cannot convert to SymTridiagonal"))
116116
end
117117
return SymTri(d, du)

test/symmetric.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,4 +1343,26 @@ end
13431343
@test_throws msg LinearAlgebra.fillband!(Symmetric(A), 2, 0, 1)
13441344
end
13451345

1346+
@testset "issymmetrictype/ishermitiantype" begin
1347+
fsym(x) = Val(LinearAlgebra.issymmetrictype(typeof(x)))
1348+
@test @inferred(fsym(Symmetric(ones(2,2)))) == Val(true)
1349+
@test @inferred(fsym(Symmetric(ones(ComplexF64,2,2)))) == Val(true)
1350+
@test @inferred(fsym(Hermitian(ones(2,2)))) == Val(true)
1351+
@test @inferred(fsym(Hermitian(ones(ComplexF64,2,2)))) == Val(false)
1352+
@test @inferred(fsym(1)) == Val(true)
1353+
@test @inferred(fsym(1.0)) == Val(false)
1354+
@test @inferred(fsym(complex(1))) == Val(true)
1355+
@test @inferred(fsym(complex(1.0))) == Val(false)
1356+
1357+
fherm(x) = Val(LinearAlgebra.ishermitiantype(typeof(x)))
1358+
@test @inferred(fherm(Symmetric(ones(2,2)))) == Val(true)
1359+
@test @inferred(fherm(Symmetric(ones(ComplexF64,2,2)))) == Val(false)
1360+
@test @inferred(fherm(Hermitian(ones(2,2)))) == Val(true)
1361+
@test @inferred(fherm(Hermitian(ones(ComplexF64,2,2)))) == Val(true)
1362+
@test @inferred(fherm(1)) == Val(true)
1363+
@test @inferred(fherm(1.0)) == Val(false)
1364+
@test @inferred(fherm(complex(1))) == Val(false)
1365+
@test @inferred(fherm(complex(1.0))) == Val(false)
1366+
end
1367+
13461368
end # module TestSymmetric

0 commit comments

Comments
 (0)