Skip to content

Commit 9129696

Browse files
committed
Restrict to real/complex
1 parent dc905a4 commit 9129696

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

src/symmetric.jl

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ const RealHermSymComplexHerm{T<:Real,S} = Union{Hermitian{T,S}, Symmetric{T,S},
225225
const RealHermSymComplexSym{T<:Real,S} = Union{Hermitian{T,S}, Symmetric{T,S}, Symmetric{Complex{T},S}}
226226
const RealHermSymSymTriComplexHerm{T<:Real} = Union{RealHermSymComplexSym{T}, SymTridiagonal{T}}
227227
const SelfAdjoint = Union{SymTridiagonal{<:Real}, Symmetric{<:Real}, Hermitian}
228+
const SelfAdjointRealOrComplex = Union{SymTridiagonal{<:Real}, Symmetric{<:Real}, Hermitian{<:Union{Real,Complex}}}
228229

229230
wrappertype(::Union{Symmetric, SymTridiagonal}) = Symmetric
230231
wrappertype(::Hermitian) = Hermitian
@@ -722,20 +723,20 @@ end
722723

723724
mul(A::HermOrSym, B::HermOrSym) = A * copyto!(similar(parent(B)), B)
724725

725-
# Multiplication of Hermitian and adjoint with an Adjoint destination
726+
# Multiplication of Hermitian and Adjoint with an Adjoint destination
726727
# may conjugate the terms to delegate the multiplication to the parents of the adjoints
727-
for (AdjTransT, SymHermT) in ((:AdjointAbsMat, :SelfAdjoint), (:(TransposeAbsMat{<:Union{Real,Complex}}), :RealHermSymComplexSym))
728+
# Only defined for commutative numbers
729+
for (AdjTransT, SymHermT) in (
730+
(:(Adjoint{<:Union{Real,Complex}}), :SelfAdjointRealOrComplex),
731+
(:(Transpose{<:Union{Real,Complex}}), :RealHermSymComplexSym))
732+
728733
@eval begin
729-
function mul!(C::$AdjTransT, A::$SymHermT, B::$AdjTransT, α::Number, β::Number)
730-
_rmul_or_fill!(C, β)
731-
isone(α) || rmul!(B, α)
732-
mul!(wrapperop(C)(C), wrapperop(B)(B), A)
734+
function mul!(C::$AdjTransT, A::$SymHermT, B::$AdjTransT, α::Union{Real,Complex}, β::Union{Real,Complex})
735+
mul!(wrapperop(C)(C), wrapperop(B)(B), A, α, β)
733736
return C
734737
end
735-
function mul!(C::$AdjTransT, A::$AdjTransT, B::$SymHermT, α::Number, β::Number)
736-
_rmul_or_fill!(C, β)
737-
isone(α) || rmul!(B, α)
738-
mul!(wrapperop(C)(C), B, wrapperop(A)(A))
738+
function mul!(C::$AdjTransT, A::$AdjTransT, B::$SymHermT, α::Union{Real,Complex}, β::Union{Real,Complex})
739+
mul!(wrapperop(C)(C), B, wrapperop(A)(A), α, β)
739740
return C
740741
end
741742
end

test/symmetric.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,17 @@ end
888888
@test Bm * A Bm * Matrix(A)
889889
@test transpose(Bm) * A transpose(Bm) * Matrix(A)
890890
@test adjoint(Bm) * A adjoint(Bm) * Matrix(A)
891+
C = similar(Bm, promote_type(T, S))
892+
@test mul!(C, A, Bm) A * Bm
893+
@test mul!(adjoint(C), A, adjoint(Bm)) A * adjoint(Bm)
894+
@test mul!(transpose(C), A, transpose(Bm)) A * transpose(Bm)
895+
rand!(C)
896+
@test mul!(copy(C), A, Bm, 2, 3) A * Bm * 2 + C * 3
897+
@test mul!(copy(C), Bm, A, 2, 3) Bm * A * 2 + C * 3
898+
@test mul!(adjoint(copy(C)), A, adjoint(Bm), 2, 3) A * adjoint(Bm) * 2 + adjoint(C) * 3
899+
@test mul!(adjoint(copy(C)), adjoint(Bm), A, 2, 3) adjoint(Bm) * A * 2 + adjoint(C) * 3
900+
@test mul!(transpose(copy(C)), A, transpose(Bm), 2, 3) A * transpose(Bm) * 2 + transpose(C) * 3
901+
@test mul!(transpose(copy(C)), transpose(Bm), A, 2, 3) transpose(Bm) * A * 2 + transpose(C) * 3
891902
end
892903
let A = adjoint(Hermitian(rand(S, n,n))), Bv = Vector(rand(T, n)), Bm = Matrix(rand(T, n,n))
893904
@test A * Bv Matrix(A) * Bv
@@ -897,6 +908,17 @@ end
897908
@test Bm * A Bm * Matrix(A)
898909
@test transpose(Bm) * A transpose(Bm) * Matrix(A)
899910
@test adjoint(Bm) * A adjoint(Bm) * Matrix(A)
911+
C = similar(Bm, promote_type(T, S))
912+
@test mul!(C, A, Bm) A * Bm
913+
@test mul!(adjoint(C), A, adjoint(Bm)) A * adjoint(Bm)
914+
@test mul!(transpose(C), A, transpose(Bm)) A * transpose(Bm)
915+
rand!(C)
916+
@test mul!(copy(C), A, Bm, 2, 3) A * Bm * 2 + C * 3
917+
@test mul!(copy(C), Bm, A, 2, 3) Bm * A * 2 + C * 3
918+
@test mul!(adjoint(copy(C)), A, adjoint(Bm), 2, 3) A * adjoint(Bm) * 2 + adjoint(C) * 3
919+
@test mul!(adjoint(copy(C)), adjoint(Bm), A, 2, 3) adjoint(Bm) * A * 2 + adjoint(C) * 3
920+
@test mul!(transpose(copy(C)), A, transpose(Bm), 2, 3) A * transpose(Bm) * 2 + transpose(C) * 3
921+
@test mul!(transpose(copy(C)), transpose(Bm), A, 2, 3) transpose(Bm) * A * 2 + transpose(C) * 3
900922
end
901923
let Ahrs = transpose(Hermitian(Symmetric(rand(T, n, n)))),
902924
Acs = transpose(Symmetric(rand(S, n, n))),

0 commit comments

Comments
 (0)