diff --git a/stdlib/LinearAlgebra/src/bidiag.jl b/stdlib/LinearAlgebra/src/bidiag.jl index ff6598451509f..cdce78021563f 100644 --- a/stdlib/LinearAlgebra/src/bidiag.jl +++ b/stdlib/LinearAlgebra/src/bidiag.jl @@ -390,18 +390,15 @@ const BiTri = Union{Bidiagonal,Tridiagonal} @inline mul!(C::AbstractMatrix, A::AbstractTriangular, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) @inline mul!(C::AbstractMatrix, A::AbstractMatrix, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) @inline mul!(C::AbstractMatrix, A::Diagonal, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:AbstractTriangular}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractMatrix, A::Transpose{<:Any,<:AbstractTriangular}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) @inline mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:AbstractVecOrMat}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) @inline mul!(C::AbstractMatrix, A::Transpose{<:Any,<:AbstractVecOrMat}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractVector, A::BiTriSym, B::AbstractVector, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractMatrix, A::BiTriSym, B::AbstractVecOrMat, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractVecOrMat, A::BiTriSym, B::AbstractVecOrMat, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) -@inline mul!(C::AbstractMatrix, A::BiTriSym, B::Transpose{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) # around bidiag line 330 +@inline mul!(C::AbstractVector, A::BiTriSym, B::AbstractVector, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) +@inline mul!(C::AbstractMatrix, A::BiTriSym, B::AbstractVecOrMat, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) +@inline mul!(C::AbstractMatrix, A::BiTriSym, B::Diagonal, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) +@inline mul!(C::AbstractMatrix, A::BiTriSym, B::Transpose{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) @inline mul!(C::AbstractMatrix, A::BiTriSym, B::Adjoint{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta)) @inline mul!(C::AbstractVector, A::BiTriSym, B::Transpose{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = throw(MethodError(mul!, (C, A, B)), MulAddMul(alpha, beta)) +@inline mul!(C::AbstractVector, A::BiTriSym, B::Adjoint{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = throw(MethodError(mul!, (C, A, B)), MulAddMul(alpha, beta)) function check_A_mul_B!_sizes(C, A, B) require_one_based_indexing(C) diff --git a/stdlib/LinearAlgebra/src/diagonal.jl b/stdlib/LinearAlgebra/src/diagonal.jl index ae0743fdc6681..52b8e07658418 100644 --- a/stdlib/LinearAlgebra/src/diagonal.jl +++ b/stdlib/LinearAlgebra/src/diagonal.jl @@ -275,9 +275,6 @@ function lmul!(D::Diagonal, B::UnitUpperTriangular) UpperTriangular(B.data) end -*(D::Adjoint{<:Any,<:Diagonal}, B::Diagonal) = Diagonal(adjoint.(D.parent.diag) .* B.diag) -*(A::Adjoint{<:Any,<:AbstractTriangular}, D::Diagonal) = - rmul!(copyto!(similar(A, promote_op(*, eltype(A), eltype(D.diag))), A), D) function *(adjA::Adjoint{<:Any,<:AbstractMatrix}, D::Diagonal) A = adjA.parent Ac = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1))) @@ -285,9 +282,6 @@ function *(adjA::Adjoint{<:Any,<:AbstractMatrix}, D::Diagonal) rmul!(Ac, D) end -*(D::Transpose{<:Any,<:Diagonal}, B::Diagonal) = Diagonal(transpose.(D.parent.diag) .* B.diag) -*(A::Transpose{<:Any,<:AbstractTriangular}, D::Diagonal) = - rmul!(copyto!(similar(A, promote_op(*, eltype(A), eltype(D.diag))), A), D) function *(transA::Transpose{<:Any,<:AbstractMatrix}, D::Diagonal) A = transA.parent At = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1))) @@ -295,9 +289,6 @@ function *(transA::Transpose{<:Any,<:AbstractMatrix}, D::Diagonal) rmul!(At, D) end -*(D::Diagonal, B::Adjoint{<:Any,<:Diagonal}) = Diagonal(D.diag .* adjoint.(B.parent.diag)) -*(D::Diagonal, B::Adjoint{<:Any,<:AbstractTriangular}) = - lmul!(D, copyto!(similar(B, promote_op(*, eltype(B), eltype(D.diag))), B)) *(D::Diagonal, adjQ::Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}}) = (Q = adjQ.parent; rmul!(Array(D), adjoint(Q))) function *(D::Diagonal, adjA::Adjoint{<:Any,<:AbstractMatrix}) A = adjA.parent @@ -306,9 +297,6 @@ function *(D::Diagonal, adjA::Adjoint{<:Any,<:AbstractMatrix}) lmul!(D, Ac) end -*(D::Diagonal, B::Transpose{<:Any,<:Diagonal}) = Diagonal(D.diag .* transpose.(B.parent.diag)) -*(D::Diagonal, B::Transpose{<:Any,<:AbstractTriangular}) = - lmul!(D, copyto!(similar(B, promote_op(*, eltype(B), eltype(D.diag))), B)) function *(D::Diagonal, transA::Transpose{<:Any,<:AbstractMatrix}) A = transA.parent At = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1))) @@ -316,147 +304,56 @@ function *(D::Diagonal, transA::Transpose{<:Any,<:AbstractMatrix}) lmul!(D, At) end -*(D::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Diagonal}) = - Diagonal(adjoint.(D.parent.diag) .* adjoint.(B.parent.diag)) -*(D::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:Diagonal}) = - Diagonal(transpose.(D.parent.diag) .* transpose.(B.parent.diag)) - rmul!(A::Diagonal, B::Diagonal) = Diagonal(A.diag .*= B.diag) lmul!(A::Diagonal, B::Diagonal) = Diagonal(B.diag .= A.diag .* B.diag) -function lmul!(adjA::Adjoint{<:Any,<:Diagonal}, B::AbstractMatrix) - A = adjA.parent - return lmul!(adjoint(A), B) -end -function lmul!(transA::Transpose{<:Any,<:Diagonal}, B::AbstractMatrix) - A = transA.parent - return lmul!(transpose(A), B) -end - -function rmul!(A::AbstractMatrix, adjB::Adjoint{<:Any,<:Diagonal}) - B = adjB.parent - return rmul!(A, adjoint(B)) -end -function rmul!(A::AbstractMatrix, transB::Transpose{<:Any,<:Diagonal}) - B = transB.parent - return rmul!(A, transpose(B)) -end - # Get ambiguous method if try to unify AbstractVector/AbstractMatrix here using AbstractVecOrMat -@inline mul!(out::AbstractVector, A::Diagonal, in::AbstractVector, - alpha::Number, beta::Number) = +@inline mul!(out::AbstractVector, A::Diagonal, in::AbstractVector, alpha::Number, beta::Number) = out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractVector, A::Adjoint{<:Any,<:Diagonal}, in::AbstractVector, - alpha::Number, beta::Number) = - out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractVector, A::Transpose{<:Any,<:Diagonal}, in::AbstractVector, - alpha::Number, beta::Number) = - out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta - -@inline mul!(out::AbstractMatrix, A::Diagonal, in::StridedMatrix, - alpha::Number, beta::Number) = +@inline mul!(out::AbstractMatrix, A::Diagonal, in::AbstractMatrix, alpha::Number, beta::Number) = out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, in::StridedMatrix, - alpha::Number, beta::Number) = - out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, in::StridedMatrix, - alpha::Number, beta::Number) = - out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta - -@inline mul!(out::AbstractMatrix, A::Diagonal, in::Adjoint{<:Any,<:StridedMatrix}, +@inline mul!(out::AbstractMatrix, A::Diagonal, in::Adjoint{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, in::Adjoint{<:Any,<:StridedMatrix}, - alpha::Number, beta::Number) = - out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, in::Adjoint{<:Any,<:StridedMatrix}, - alpha::Number, beta::Number) = - out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta - -@inline mul!(out::AbstractMatrix, A::Diagonal, in::Transpose{<:Any,<:StridedMatrix}, +@inline mul!(out::AbstractMatrix, A::Diagonal, in::Transpose{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, in::Transpose{<:Any,<:StridedMatrix}, - alpha::Number, beta::Number) = - out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, in::Transpose{<:Any,<:StridedMatrix}, - alpha::Number, beta::Number) = - out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, in::StridedMatrix, A::Diagonal, - alpha::Number, beta::Number) = +@inline mul!(out::AbstractMatrix, in::AbstractMatrix, A::Diagonal, alpha::Number, beta::Number) = out .= (in .* permutedims(A.diag)) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, in::StridedMatrix, A::Adjoint{<:Any,<:Diagonal}, - alpha::Number, beta::Number) = - out .= (in .* adjoint(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, in::StridedMatrix, A::Transpose{<:Any,<:Diagonal}, - alpha::Number, beta::Number) = - out .= (in .* transpose(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta - -@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:StridedMatrix}, A::Diagonal, +@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:AbstractVecOrMat}, A::Diagonal, alpha::Number, beta::Number) = out .= (in .* permutedims(A.diag)) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:StridedMatrix}, A::Adjoint{<:Any,<:Diagonal}, - alpha::Number, beta::Number) = - out .= (in .* adjoint(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:StridedMatrix}, A::Transpose{<:Any,<:Diagonal}, - alpha::Number, beta::Number) = - out .= (in .* transpose(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta - -@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:StridedMatrix}, A::Diagonal, +@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:AbstractVecOrMat}, A::Diagonal, alpha::Number, beta::Number) = out .= (in .* permutedims(A.diag)) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:StridedMatrix}, A::Adjoint{<:Any,<:Diagonal}, - alpha::Number, beta::Number) = - out .= (in .* adjoint(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta -@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:StridedMatrix}, A::Transpose{<:Any,<:Diagonal}, - alpha::Number, beta::Number) = - out .= (in .* transpose(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta - -# ambiguities with Symmetric/Hermitian -# RealHermSymComplex[Sym]/[Herm] only include Number; invariant to [c]transpose -*(A::Diagonal, transB::Transpose{<:Any,<:RealHermSymComplexSym}) = A * transB.parent -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, B::Diagonal) = transA.parent * B -*(A::Diagonal, adjB::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * adjB.parent -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Diagonal) = adjA.parent * B -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, transD::Transpose{<:Any,<:Diagonal}) = transA.parent * transD -*(transD::Transpose{<:Any,<:Diagonal}, transA::Transpose{<:Any,<:RealHermSymComplexSym}) = transD * transA.parent -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, adjD::Adjoint{<:Any,<:Diagonal}) = adjA.parent * adjD -*(adjD::Adjoint{<:Any,<:Diagonal}, adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}) = adjD * adjA.parent -mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSymComplexSym}) = C .= adjoint.(A.parent.diag) .* B -mul!(C::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSymComplexHerm}) = C .= transpose.(A.parent.diag) .* B - -@inline mul!(C::AbstractMatrix, - A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSym}, - alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta) -@inline mul!(C::AbstractMatrix, - A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}, - alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta) -@inline mul!(C::AbstractMatrix, - A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSym}, - alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta) -@inline mul!(C::AbstractMatrix, - A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSymComplexSym}, - alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta) - -@inline mul!(C::AbstractMatrix, - A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSymComplexSym}, - alpha::Number, beta::Number) = - C .= (adjoint.(A.parent.diag) .* B) .*ₛ alpha .+ C .*ₛ beta -@inline mul!(C::AbstractMatrix, - A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSymComplexHerm}, - alpha::Number, beta::Number) = - C .= (transpose.(A.parent.diag) .* B) .*ₛ alpha .+ C .*ₛ beta + +function mul!(C::AbstractMatrix, Da::Diagonal, Db::Diagonal, alpha::Number, beta::Number) + mA = size(Da, 1) + mB = size(Db, 1) + mA == mB || throw(DimensionMismatch("A has dimensions ($mA,$mA) but B has dimensions ($mB,$mB)")) + mC, nC = size(C) + mC == nC == mA || throw(DimensionMismatch("output matrix has size: ($mC,$nC), but should have size ($mA,$mA)")) + require_one_based_indexing(C) + da = Da.diag + db = Db.diag + _rmul_or_fill!(C, beta) + if iszero(beta) + @inbounds @simd for i in 1:mA + C[i,i] = Ref(da[i] * db[i]) .*ₛ alpha + end + else + @inbounds @simd for i in 1:mA + C[i,i] += Ref(da[i] * db[i]) .*ₛ alpha + end + end + return C +end (/)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag ./ Db.diag) ldiv!(x::AbstractArray, A::Diagonal, b::AbstractArray) = (x .= A.diag .\ b) -ldiv!(adjD::Adjoint{<:Any,<:Diagonal}, B::AbstractVecOrMat) = - (D = adjD.parent; ldiv!(conj(D), B)) -ldiv!(transD::Transpose{<:Any,<:Diagonal}, B::AbstractVecOrMat) = - (D = transD.parent; ldiv!(D, B)) - function ldiv!(D::Diagonal, A::Union{LowerTriangular,UpperTriangular}) broadcast!(\, parent(A), D.diag, parent(A)) A @@ -486,11 +383,6 @@ function rdiv!(A::Union{LowerTriangular,UpperTriangular}, D::Diagonal) A end -rdiv!(A::AbstractMatrix, adjD::Adjoint{<:Any,<:Diagonal}) = - (D = adjD.parent; rdiv!(A, conj(D))) -rdiv!(A::AbstractMatrix, transD::Transpose{<:Any,<:Diagonal}) = - (D = transD.parent; rdiv!(A, D)) - (/)(A::Union{StridedMatrix, AbstractTriangular}, D::Diagonal) = rdiv!((typeof(oneunit(eltype(D))/oneunit(eltype(A)))).(A), D) diff --git a/stdlib/LinearAlgebra/src/givens.jl b/stdlib/LinearAlgebra/src/givens.jl index d892720a7a1f3..b8a34712dc9ae 100644 --- a/stdlib/LinearAlgebra/src/givens.jl +++ b/stdlib/LinearAlgebra/src/givens.jl @@ -403,11 +403,6 @@ end *(A::Adjoint{<:Any,<:AbstractMatrix}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B *(A::Transpose{<:Any,<:AbstractVector}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B *(A::Transpose{<:Any,<:AbstractMatrix}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B -# disambiguation methods: *(Adj/Trans of AbsTri or RealHermSymComplex{Herm|Sym}, Adj of AbstractRotation) -*(A::Adjoint{<:Any,<:AbstractTriangular}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B -*(A::Transpose{<:Any,<:AbstractTriangular}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B # disambiguation methods: *(Diag/AbsTri, Adj of AbstractRotation) *(A::Diagonal, B::Adjoint{<:Any,<:AbstractRotation}) = A * copy(B) *(A::AbstractTriangular, B::Adjoint{<:Any,<:AbstractRotation}) = A * copy(B) diff --git a/stdlib/LinearAlgebra/src/symmetric.jl b/stdlib/LinearAlgebra/src/symmetric.jl index 112add2739599..b0cd88254b876 100644 --- a/stdlib/LinearAlgebra/src/symmetric.jl +++ b/stdlib/LinearAlgebra/src/symmetric.jl @@ -600,36 +600,6 @@ function dot(x::AbstractVector, A::RealHermSymComplexHerm, y::AbstractVector) return r end -# Fallbacks to avoid generic_matvecmul!/generic_matmatmul! -## Symmetric{<:Number} and Hermitian{<:Real} are invariant to transpose; peel off the t -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, B::AbstractVector) = transA.parent * B -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, B::AbstractMatrix) = transA.parent * B -*(A::AbstractMatrix, transB::Transpose{<:Any,<:RealHermSymComplexSym}) = A * transB.parent -## Hermitian{<:Number} and Symmetric{<:Real} are invariant to adjoint; peel off the c -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::AbstractVector) = adjA.parent * B -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::AbstractMatrix) = adjA.parent * B -*(A::AbstractMatrix, adjB::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * adjB.parent - -# ambiguities with transposed AbstractMatrix methods in linalg/matmul.jl -*(transA::Transpose{<:Any,<:RealHermSym}, transB::Transpose{<:Any,<:RealHermSym}) = transA * transB.parent -*(transA::Transpose{<:Any,<:RealHermSym}, transB::Transpose{<:Any,<:RealHermSymComplexSym}) = transA * transB.parent -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, transB::Transpose{<:Any,<:RealHermSymComplexSym}) = transA.parent * transB.parent -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, transB::Transpose{<:Any,<:RealHermSym}) = transA.parent * transB -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, transB::Transpose{<:Any,<:RealHermSymComplexHerm}) = transA.parent * transB -*(transA::Transpose{<:Any,<:RealHermSymComplexHerm}, transB::Transpose{<:Any,<:RealHermSymComplexSym}) = transA * transB.parent -*(adjA::Adjoint{<:Any,<:RealHermSym}, adjB::Adjoint{<:Any,<:RealHermSym}) = adjA * adjB.parent -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, adjB::Adjoint{<:Any,<:RealHermSymComplexHerm}) = adjA.parent * adjB.parent -*(adjA::Adjoint{<:Any,<:RealHermSym}, adjB::Adjoint{<:Any,<:RealHermSymComplexHerm}) = adjA * adjB.parent -*(adjA::Adjoint{<:Any,<:RealHermSymComplexSym}, adjB::Adjoint{<:Any,<:RealHermSymComplexHerm}) = adjA * adjB.parent -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, adjB::Adjoint{<:Any,<:RealHermSym}) = adjA.parent * adjB -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, adjB::Adjoint{<:Any,<:RealHermSymComplexSym}) = adjA.parent * adjB - -# ambiguities with AbstractTriangular -*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, B::AbstractTriangular) = transA.parent * B -*(A::AbstractTriangular, transB::Transpose{<:Any,<:RealHermSymComplexSym}) = A * transB.parent -*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::AbstractTriangular) = adjA.parent * B -*(A::AbstractTriangular, adjB::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * adjB.parent - # Scaling with Number *(A::Symmetric, x::Number) = Symmetric(A.data*x, sym_uplo(A.uplo)) *(x::Number, A::Symmetric) = Symmetric(x*A.data, sym_uplo(A.uplo)) @@ -884,35 +854,3 @@ for func in (:log, :sqrt) end end end - -# disambiguation methods: *(Adj of RealHermSymComplexHerm, Trans of RealHermSymComplexSym) and symmetric partner -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Transpose{<:Any,<:RealHermSymComplexSym}) = A.parent * B.parent -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A.parent * B.parent -# disambiguation methods: *(Adj/Trans of AbsVec/AbsMat, Adj/Trans of RealHermSymComplex{Herm|Sym}) -*(A::Adjoint{<:Any,<:AbstractVector}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * B.parent -*(A::Adjoint{<:Any,<:AbstractMatrix}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * B.parent -*(A::Adjoint{<:Any,<:AbstractVector}, B::Transpose{<:Any,<:RealHermSymComplexSym}) = A * B.parent -*(A::Adjoint{<:Any,<:AbstractMatrix}, B::Transpose{<:Any,<:RealHermSymComplexSym}) = A * B.parent -*(A::Transpose{<:Any,<:AbstractVector}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * B.parent -*(A::Transpose{<:Any,<:AbstractMatrix}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * B.parent -*(A::Transpose{<:Any,<:AbstractVector}, B::Transpose{<:Any,<:RealHermSymComplexSym}) = A * B.parent -*(A::Transpose{<:Any,<:AbstractMatrix}, B::Transpose{<:Any,<:RealHermSymComplexSym}) = A * B.parent -# disambiguation methods: *(Adj/Trans of RealHermSymComplex{Herm|Sym}, Adj/Trans of AbsVec/AbsMat) -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Adjoint{<:Any,<:AbstractVector}) = A.parent * B -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Adjoint{<:Any,<:AbstractMatrix}) = A.parent * B -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Transpose{<:Any,<:AbstractVector}) = A.parent * B -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Transpose{<:Any,<:AbstractMatrix}) = A.parent * B -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Adjoint{<:Any,<:AbstractVector}) = A.parent * B -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Adjoint{<:Any,<:AbstractMatrix}) = A.parent * B -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Transpose{<:Any,<:AbstractVector}) = A.parent * B -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Transpose{<:Any,<:AbstractMatrix}) = A.parent * B - -# disambiguation methods: *(Adj/Trans of AbsTri or RealHermSymComplex{Herm|Sym}, Adj/Trans of other) -*(A::Adjoint{<:Any,<:AbstractTriangular}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * B.parent -*(A::Adjoint{<:Any,<:AbstractTriangular}, B::Transpose{<:Any,<:RealHermSymComplexSym}) = A * B.parent -*(A::Transpose{<:Any,<:AbstractTriangular}, B::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * B.parent -*(A::Transpose{<:Any,<:AbstractTriangular}, B::Transpose{<:Any,<:RealHermSymComplexSym}) = A * B.parent -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Adjoint{<:Any,<:AbstractTriangular}) = A.parent * B -*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Transpose{<:Any,<:AbstractTriangular}) = A.parent * B -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Adjoint{<:Any,<:AbstractTriangular}) = A.parent * B -*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Transpose{<:Any,<:AbstractTriangular}) = A.parent * B diff --git a/stdlib/LinearAlgebra/test/diagonal.jl b/stdlib/LinearAlgebra/test/diagonal.jl index d84141ed330c7..14d555f7de92b 100644 --- a/stdlib/LinearAlgebra/test/diagonal.jl +++ b/stdlib/LinearAlgebra/test/diagonal.jl @@ -229,14 +229,14 @@ Random.seed!(1) @test Array(op(Dr, Aherm)) ≈ Array(Hermitian(op(Array(Dr), Array(Aherm)))) end end - @test Array(D*Transpose(Asym)) ≈ Array(D) * Array(transpose(Asym)) - @test Array(D*Adjoint(Asym)) ≈ Array(D) * Array(adjoint(Asym)) - @test Array(D*Transpose(Aherm)) ≈ Array(D) * Array(transpose(Aherm)) - @test Array(D*Adjoint(Aherm)) ≈ Array(D) * Array(adjoint(Aherm)) - @test Array(Transpose(Asym)*Transpose(D)) ≈ Array(transpose(Asym)) * Array(transpose(D)) - @test Array(Transpose(D)*Transpose(Asym)) ≈ Array(transpose(D)) * Array(transpose(Asym)) - @test Array(Adjoint(Aherm)*Adjoint(D)) ≈ Array(adjoint(Aherm)) * Array(adjoint(D)) - @test Array(Adjoint(D)*Adjoint(Aherm)) ≈ Array(adjoint(D)) * Array(adjoint(Aherm)) + @test Array(D*transpose(Asym)) ≈ Array(D) * Array(transpose(Asym)) + @test Array(D*adjoint(Asym)) ≈ Array(D) * Array(adjoint(Asym)) + @test Array(D*transpose(Aherm)) ≈ Array(D) * Array(transpose(Aherm)) + @test Array(D*adjoint(Aherm)) ≈ Array(D) * Array(adjoint(Aherm)) + @test Array(transpose(Asym)*transpose(D)) ≈ Array(transpose(Asym)) * Array(transpose(D)) + @test Array(transpose(D)*transpose(Asym)) ≈ Array(transpose(D)) * Array(transpose(Asym)) + @test Array(adjoint(Aherm)*adjoint(D)) ≈ Array(adjoint(Aherm)) * Array(adjoint(D)) + @test Array(adjoint(D)*adjoint(Aherm)) ≈ Array(adjoint(D)) * Array(adjoint(Aherm)) # Performance specialisations for A*_mul_B! vvv = similar(vv) @@ -246,7 +246,7 @@ Random.seed!(1) UUU = similar(UU) for transformA in (identity, adjoint, transpose) - for transformD in (identity, Adjoint, Transpose, adjoint, transpose) + for transformD in (identity, adjoint, transpose) @test mul!(UUU, transformA(UU), transformD(D)) ≈ transformA(UU) * Matrix(transformD(D)) @test mul!(UUU, transformD(D), transformA(UU)) ≈ Matrix(transformD(D)) * transformA(UU) end @@ -661,15 +661,13 @@ end fullBB = copyto!(Matrix{Matrix{T}}(undef, 2, 2), BB) for (transform1, transform2) in ((identity, identity), (identity, adjoint ), (adjoint, identity ), (adjoint, adjoint ), - (identity, transpose), (transpose, identity ), (transpose, transpose), - (identity, Adjoint ), (Adjoint, identity ), (Adjoint, Adjoint ), - (identity, Transpose), (Transpose, identity ), (Transpose, Transpose)) + (identity, transpose), (transpose, identity ), (transpose, transpose)) @test *(transform1(D), transform2(B))::typeof(D) ≈ *(transform1(Matrix(D)), transform2(Matrix(B))) atol=2 * eps() @test *(transform1(DD), transform2(BB))::typeof(DD) == *(transform1(fullDD), transform2(fullBB)) end M = randn(T, 5, 5) MM = [randn(T, 2, 2) for _ in 1:2, _ in 1:2] - for transform in (identity, adjoint, transpose, Adjoint, Transpose) + for transform in (identity, adjoint, transpose) @test lmul!(transform(D), copy(M)) ≈ *(transform(Matrix(D)), M) @test rmul!(copy(M), transform(D)) ≈ *(M, transform(Matrix(D))) @test lmul!(transform(DD), copy(MM)) ≈ *(transform(fullDD), MM) @@ -683,7 +681,7 @@ end @test Diagonal(transpose([1, 2, 3])) == Diagonal([1 2 3]) end -@testset "Multiplication with Adjoint and Transpose vectors (#26863)" begin +@testset "Multiplication with adjoint and transpose vectors (#26863)" begin x = collect(1:2) xt = transpose(x) A = reshape([[1 2; 3 4], zeros(Int,2,2), zeros(Int, 2, 2), [5 6; 7 8]], 2, 2) @@ -803,9 +801,10 @@ end @testset "eltype relaxation(#41015)" begin A = rand(3,3) - for trans in (identity, Adjoint, Transpose) + for trans in (identity, adjoint, transpose) @test ldiv!(trans(I(3)), A) == A @test rdiv!(A, trans(I(3))) == A end end + end # module TestDiagonal diff --git a/stdlib/LinearAlgebra/test/symmetric.jl b/stdlib/LinearAlgebra/test/symmetric.jl index 93b91294cfecb..bdd003b57913e 100644 --- a/stdlib/LinearAlgebra/test/symmetric.jl +++ b/stdlib/LinearAlgebra/test/symmetric.jl @@ -691,45 +691,37 @@ end @testset "Multiplications symmetric/hermitian for $T and $S" for T in (Float16, Float32, Float64, BigFloat), S in (ComplexF16, ComplexF32, ComplexF64) - let A = Transpose(Symmetric(rand(S, 3, 3))), Bv = Vector(rand(T, 3)), Bm = Matrix(rand(T, 3,3)) - @test A * Bv ≈ parent(A) * Bv - @test A * Bm ≈ parent(A) * Bm - @test Bm * A ≈ Bm * parent(A) + let A = transpose(Symmetric(rand(S, 3, 3))), Bv = Vector(rand(T, 3)), Bm = Matrix(rand(T, 3,3)) + @test A * Bv ≈ Matrix(A) * Bv + @test A * Bm ≈ Matrix(A) * Bm + @test Bm * A ≈ Bm * Matrix(A) end - let A = Adjoint(Hermitian(rand(S, 3,3))), Bv = Vector(rand(T, 3)), Bm = Matrix(rand(T, 3,3)) - @test A * Bv ≈ parent(A) * Bv - @test A * Bm ≈ parent(A) * Bm - @test Bm * A ≈ Bm * parent(A) + let A = adjoint(Hermitian(rand(S, 3,3))), Bv = Vector(rand(T, 3)), Bm = Matrix(rand(T, 3,3)) + @test A * Bv ≈ Matrix(A) * Bv + @test A * Bm ≈ Matrix(A) * Bm + @test Bm * A ≈ Bm * Matrix(A) end -end - -@testset "Dsiambiguation multiplication with transposed AbstractMatrix methods in linalg/matmul.jl for $T and $S" for T in - (Float16, Float32, Float64, BigFloat), S in (ComplexF16, ComplexF32, ComplexF64) - let Ahrs = Transpose(Hermitian(Symmetric(rand(T, 3, 3)))), - Acs = Transpose(Symmetric(rand(S, 3, 3))), - Ahcs = Transpose(Hermitian(Symmetric(rand(S, 3, 3)))) - - @test Ahrs * Ahrs ≈ Ahrs * parent(Ahrs) - @test Ahrs * Acs ≈ Ahrs * parent(Acs) - @test Acs * Acs ≈ parent(Acs) * parent(Acs) - @test Acs * Ahrs ≈ parent(Acs) * Ahrs - @test Ahrs * Ahcs ≈ parent(Ahrs) * Ahcs - @test Ahcs * Ahrs ≈ Ahcs * parent(Ahrs) + let Ahrs = transpose(Hermitian(Symmetric(rand(T, 3, 3)))), + Acs = transpose(Symmetric(rand(S, 3, 3))), + Ahcs = transpose(Hermitian(Symmetric(rand(S, 3, 3)))) + + @test Ahrs * Ahrs ≈ Ahrs * Matrix(Ahrs) + @test Ahrs * Acs ≈ Ahrs * Matrix(Acs) + @test Acs * Acs ≈ Matrix(Acs) * Matrix(Acs) + @test Acs * Ahrs ≈ Matrix(Acs) * Ahrs + @test Ahrs * Ahcs ≈ Matrix(Ahrs) * Ahcs + @test Ahcs * Ahrs ≈ Ahcs * Matrix(Ahrs) end -end - -@testset "Dsiambiguation multiplication with adjointed AbstractMatrix methods in linalg/matmul.jl for $T and $S" for T in - (Float16, Float32, Float64, BigFloat), S in (ComplexF16, ComplexF32, ComplexF64) - let Ahrs = Adjoint(Hermitian(Symmetric(rand(T, 3, 3)))), - Acs = Adjoint(Symmetric(rand(S, 3, 3))), - Ahcs = Adjoint(Hermitian(Symmetric(rand(S, 3, 3)))) - - @test Ahrs * Ahrs ≈ Ahrs * parent(Ahrs) - @test Ahcs * Ahcs ≈ parent(Ahcs) * parent(Ahcs) - @test Ahrs * Ahcs ≈ Ahrs * parent(Ahcs) - @test Acs * Ahcs ≈ Acs * parent(Ahcs) - @test Ahcs * Ahrs ≈ parent(Ahcs) * Ahrs - @test Ahcs * Acs ≈ parent(Ahcs) * Acs + let Ahrs = adjoint(Hermitian(Symmetric(rand(T, 3, 3)))), + Acs = adjoint(Symmetric(rand(S, 3, 3))), + Ahcs = adjoint(Hermitian(Symmetric(rand(S, 3, 3)))) + + @test Ahrs * Ahrs ≈ Ahrs * Matrix(Ahrs) + @test Ahcs * Ahcs ≈ Matrix(Ahcs) * Matrix(Ahcs) + @test Ahrs * Ahcs ≈ Ahrs * Matrix(Ahcs) + @test Acs * Ahcs ≈ Acs * Matrix(Ahcs) + @test Ahcs * Ahrs ≈ Matrix(Ahcs) * Ahrs + @test Ahcs * Acs ≈ Matrix(Ahcs) * Acs end end