Skip to content

Commit 6dfa690

Browse files
authored
Remove many */mul! methods for AdjOrTrans of sym/herm/diag/triangular (#41188)
1 parent 25efa99 commit 6dfa690

File tree

6 files changed

+76
-263
lines changed

6 files changed

+76
-263
lines changed

stdlib/LinearAlgebra/src/bidiag.jl

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -390,18 +390,15 @@ const BiTri = Union{Bidiagonal,Tridiagonal}
390390
@inline mul!(C::AbstractMatrix, A::AbstractTriangular, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
391391
@inline mul!(C::AbstractMatrix, A::AbstractMatrix, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
392392
@inline mul!(C::AbstractMatrix, A::Diagonal, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
393-
@inline mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
394-
@inline mul!(C::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
395-
@inline mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:AbstractTriangular}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
396-
@inline mul!(C::AbstractMatrix, A::Transpose{<:Any,<:AbstractTriangular}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
397393
@inline mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:AbstractVecOrMat}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
398394
@inline mul!(C::AbstractMatrix, A::Transpose{<:Any,<:AbstractVecOrMat}, B::BiTriSym, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
399-
@inline mul!(C::AbstractVector, A::BiTriSym, B::AbstractVector, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
400-
@inline mul!(C::AbstractMatrix, A::BiTriSym, B::AbstractVecOrMat, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
401-
@inline mul!(C::AbstractVecOrMat, A::BiTriSym, B::AbstractVecOrMat, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
402-
@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
395+
@inline mul!(C::AbstractVector, A::BiTriSym, B::AbstractVector, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
396+
@inline mul!(C::AbstractMatrix, A::BiTriSym, B::AbstractVecOrMat, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
397+
@inline mul!(C::AbstractMatrix, A::BiTriSym, B::Diagonal, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
398+
@inline mul!(C::AbstractMatrix, A::BiTriSym, B::Transpose{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
403399
@inline mul!(C::AbstractMatrix, A::BiTriSym, B::Adjoint{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = A_mul_B_td!(C, A, B, MulAddMul(alpha, beta))
404400
@inline mul!(C::AbstractVector, A::BiTriSym, B::Transpose{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = throw(MethodError(mul!, (C, A, B)), MulAddMul(alpha, beta))
401+
@inline mul!(C::AbstractVector, A::BiTriSym, B::Adjoint{<:Any,<:AbstractVecOrMat}, alpha::Number, beta::Number) = throw(MethodError(mul!, (C, A, B)), MulAddMul(alpha, beta))
405402

406403
function check_A_mul_B!_sizes(C, A, B)
407404
require_one_based_indexing(C)

stdlib/LinearAlgebra/src/diagonal.jl

Lines changed: 29 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -275,29 +275,20 @@ function lmul!(D::Diagonal, B::UnitUpperTriangular)
275275
UpperTriangular(B.data)
276276
end
277277

278-
*(D::Adjoint{<:Any,<:Diagonal}, B::Diagonal) = Diagonal(adjoint.(D.parent.diag) .* B.diag)
279-
*(A::Adjoint{<:Any,<:AbstractTriangular}, D::Diagonal) =
280-
rmul!(copyto!(similar(A, promote_op(*, eltype(A), eltype(D.diag))), A), D)
281278
function *(adjA::Adjoint{<:Any,<:AbstractMatrix}, D::Diagonal)
282279
A = adjA.parent
283280
Ac = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1)))
284281
adjoint!(Ac, A)
285282
rmul!(Ac, D)
286283
end
287284

288-
*(D::Transpose{<:Any,<:Diagonal}, B::Diagonal) = Diagonal(transpose.(D.parent.diag) .* B.diag)
289-
*(A::Transpose{<:Any,<:AbstractTriangular}, D::Diagonal) =
290-
rmul!(copyto!(similar(A, promote_op(*, eltype(A), eltype(D.diag))), A), D)
291285
function *(transA::Transpose{<:Any,<:AbstractMatrix}, D::Diagonal)
292286
A = transA.parent
293287
At = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1)))
294288
transpose!(At, A)
295289
rmul!(At, D)
296290
end
297291

298-
*(D::Diagonal, B::Adjoint{<:Any,<:Diagonal}) = Diagonal(D.diag .* adjoint.(B.parent.diag))
299-
*(D::Diagonal, B::Adjoint{<:Any,<:AbstractTriangular}) =
300-
lmul!(D, copyto!(similar(B, promote_op(*, eltype(B), eltype(D.diag))), B))
301292
*(D::Diagonal, adjQ::Adjoint{<:Any,<:Union{QRCompactWYQ,QRPackedQ}}) = (Q = adjQ.parent; rmul!(Array(D), adjoint(Q)))
302293
function *(D::Diagonal, adjA::Adjoint{<:Any,<:AbstractMatrix})
303294
A = adjA.parent
@@ -306,157 +297,63 @@ function *(D::Diagonal, adjA::Adjoint{<:Any,<:AbstractMatrix})
306297
lmul!(D, Ac)
307298
end
308299

309-
*(D::Diagonal, B::Transpose{<:Any,<:Diagonal}) = Diagonal(D.diag .* transpose.(B.parent.diag))
310-
*(D::Diagonal, B::Transpose{<:Any,<:AbstractTriangular}) =
311-
lmul!(D, copyto!(similar(B, promote_op(*, eltype(B), eltype(D.diag))), B))
312300
function *(D::Diagonal, transA::Transpose{<:Any,<:AbstractMatrix})
313301
A = transA.parent
314302
At = similar(A, promote_op(*, eltype(A), eltype(D.diag)), (size(A, 2), size(A, 1)))
315303
transpose!(At, A)
316304
lmul!(D, At)
317305
end
318306

319-
*(D::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:Diagonal}) =
320-
Diagonal(adjoint.(D.parent.diag) .* adjoint.(B.parent.diag))
321-
*(D::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:Diagonal}) =
322-
Diagonal(transpose.(D.parent.diag) .* transpose.(B.parent.diag))
323-
324307
rmul!(A::Diagonal, B::Diagonal) = Diagonal(A.diag .*= B.diag)
325308
lmul!(A::Diagonal, B::Diagonal) = Diagonal(B.diag .= A.diag .* B.diag)
326309

327-
function lmul!(adjA::Adjoint{<:Any,<:Diagonal}, B::AbstractMatrix)
328-
A = adjA.parent
329-
return lmul!(adjoint(A), B)
330-
end
331-
function lmul!(transA::Transpose{<:Any,<:Diagonal}, B::AbstractMatrix)
332-
A = transA.parent
333-
return lmul!(transpose(A), B)
334-
end
335-
336-
function rmul!(A::AbstractMatrix, adjB::Adjoint{<:Any,<:Diagonal})
337-
B = adjB.parent
338-
return rmul!(A, adjoint(B))
339-
end
340-
function rmul!(A::AbstractMatrix, transB::Transpose{<:Any,<:Diagonal})
341-
B = transB.parent
342-
return rmul!(A, transpose(B))
343-
end
344-
345310
# Get ambiguous method if try to unify AbstractVector/AbstractMatrix here using AbstractVecOrMat
346-
@inline mul!(out::AbstractVector, A::Diagonal, in::AbstractVector,
347-
alpha::Number, beta::Number) =
311+
@inline mul!(out::AbstractVector, A::Diagonal, in::AbstractVector, alpha::Number, beta::Number) =
348312
out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta
349-
@inline mul!(out::AbstractVector, A::Adjoint{<:Any,<:Diagonal}, in::AbstractVector,
350-
alpha::Number, beta::Number) =
351-
out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
352-
@inline mul!(out::AbstractVector, A::Transpose{<:Any,<:Diagonal}, in::AbstractVector,
353-
alpha::Number, beta::Number) =
354-
out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
355-
356-
@inline mul!(out::AbstractMatrix, A::Diagonal, in::StridedMatrix,
357-
alpha::Number, beta::Number) =
313+
@inline mul!(out::AbstractMatrix, A::Diagonal, in::AbstractMatrix, alpha::Number, beta::Number) =
358314
out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta
359-
@inline mul!(out::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, in::StridedMatrix,
360-
alpha::Number, beta::Number) =
361-
out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
362-
@inline mul!(out::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, in::StridedMatrix,
363-
alpha::Number, beta::Number) =
364-
out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
365-
366-
@inline mul!(out::AbstractMatrix, A::Diagonal, in::Adjoint{<:Any,<:StridedMatrix},
315+
@inline mul!(out::AbstractMatrix, A::Diagonal, in::Adjoint{<:Any,<:AbstractVecOrMat},
367316
alpha::Number, beta::Number) =
368317
out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta
369-
@inline mul!(out::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, in::Adjoint{<:Any,<:StridedMatrix},
370-
alpha::Number, beta::Number) =
371-
out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
372-
@inline mul!(out::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, in::Adjoint{<:Any,<:StridedMatrix},
373-
alpha::Number, beta::Number) =
374-
out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
375-
376-
@inline mul!(out::AbstractMatrix, A::Diagonal, in::Transpose{<:Any,<:StridedMatrix},
318+
@inline mul!(out::AbstractMatrix, A::Diagonal, in::Transpose{<:Any,<:AbstractVecOrMat},
377319
alpha::Number, beta::Number) =
378320
out .= (A.diag .* in) .*ₛ alpha .+ out .*ₛ beta
379-
@inline mul!(out::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, in::Transpose{<:Any,<:StridedMatrix},
380-
alpha::Number, beta::Number) =
381-
out .= (adjoint.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
382-
@inline mul!(out::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, in::Transpose{<:Any,<:StridedMatrix},
383-
alpha::Number, beta::Number) =
384-
out .= (transpose.(A.parent.diag) .* in) .*ₛ alpha .+ out .*ₛ beta
385321

386-
@inline mul!(out::AbstractMatrix, in::StridedMatrix, A::Diagonal,
387-
alpha::Number, beta::Number) =
322+
@inline mul!(out::AbstractMatrix, in::AbstractMatrix, A::Diagonal, alpha::Number, beta::Number) =
388323
out .= (in .* permutedims(A.diag)) .*ₛ alpha .+ out .*ₛ beta
389-
@inline mul!(out::AbstractMatrix, in::StridedMatrix, A::Adjoint{<:Any,<:Diagonal},
390-
alpha::Number, beta::Number) =
391-
out .= (in .* adjoint(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta
392-
@inline mul!(out::AbstractMatrix, in::StridedMatrix, A::Transpose{<:Any,<:Diagonal},
393-
alpha::Number, beta::Number) =
394-
out .= (in .* transpose(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta
395-
396-
@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:StridedMatrix}, A::Diagonal,
324+
@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:AbstractVecOrMat}, A::Diagonal,
397325
alpha::Number, beta::Number) =
398326
out .= (in .* permutedims(A.diag)) .*ₛ alpha .+ out .*ₛ beta
399-
@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:StridedMatrix}, A::Adjoint{<:Any,<:Diagonal},
400-
alpha::Number, beta::Number) =
401-
out .= (in .* adjoint(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta
402-
@inline mul!(out::AbstractMatrix, in::Adjoint{<:Any,<:StridedMatrix}, A::Transpose{<:Any,<:Diagonal},
403-
alpha::Number, beta::Number) =
404-
out .= (in .* transpose(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta
405-
406-
@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:StridedMatrix}, A::Diagonal,
327+
@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:AbstractVecOrMat}, A::Diagonal,
407328
alpha::Number, beta::Number) =
408329
out .= (in .* permutedims(A.diag)) .*ₛ alpha .+ out .*ₛ beta
409-
@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:StridedMatrix}, A::Adjoint{<:Any,<:Diagonal},
410-
alpha::Number, beta::Number) =
411-
out .= (in .* adjoint(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta
412-
@inline mul!(out::AbstractMatrix, in::Transpose{<:Any,<:StridedMatrix}, A::Transpose{<:Any,<:Diagonal},
413-
alpha::Number, beta::Number) =
414-
out .= (in .* transpose(A.parent.diag)) .*ₛ alpha .+ out .*ₛ beta
415-
416-
# ambiguities with Symmetric/Hermitian
417-
# RealHermSymComplex[Sym]/[Herm] only include Number; invariant to [c]transpose
418-
*(A::Diagonal, transB::Transpose{<:Any,<:RealHermSymComplexSym}) = A * transB.parent
419-
*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, B::Diagonal) = transA.parent * B
420-
*(A::Diagonal, adjB::Adjoint{<:Any,<:RealHermSymComplexHerm}) = A * adjB.parent
421-
*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Diagonal) = adjA.parent * B
422-
*(transA::Transpose{<:Any,<:RealHermSymComplexSym}, transD::Transpose{<:Any,<:Diagonal}) = transA.parent * transD
423-
*(transD::Transpose{<:Any,<:Diagonal}, transA::Transpose{<:Any,<:RealHermSymComplexSym}) = transD * transA.parent
424-
*(adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}, adjD::Adjoint{<:Any,<:Diagonal}) = adjA.parent * adjD
425-
*(adjD::Adjoint{<:Any,<:Diagonal}, adjA::Adjoint{<:Any,<:RealHermSymComplexHerm}) = adjD * adjA.parent
426-
mul!(C::AbstractMatrix, A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSymComplexSym}) = C .= adjoint.(A.parent.diag) .* B
427-
mul!(C::AbstractMatrix, A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSymComplexHerm}) = C .= transpose.(A.parent.diag) .* B
428-
429-
@inline mul!(C::AbstractMatrix,
430-
A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSym},
431-
alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta)
432-
@inline mul!(C::AbstractMatrix,
433-
A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSymComplexHerm},
434-
alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta)
435-
@inline mul!(C::AbstractMatrix,
436-
A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSym},
437-
alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta)
438-
@inline mul!(C::AbstractMatrix,
439-
A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSymComplexSym},
440-
alpha::Number, beta::Number) = mul!(C, A, B.parent, alpha, beta)
441-
442-
@inline mul!(C::AbstractMatrix,
443-
A::Adjoint{<:Any,<:Diagonal}, B::Adjoint{<:Any,<:RealHermSymComplexSym},
444-
alpha::Number, beta::Number) =
445-
C .= (adjoint.(A.parent.diag) .* B) .*ₛ alpha .+ C .*ₛ beta
446-
@inline mul!(C::AbstractMatrix,
447-
A::Transpose{<:Any,<:Diagonal}, B::Transpose{<:Any,<:RealHermSymComplexHerm},
448-
alpha::Number, beta::Number) =
449-
C .= (transpose.(A.parent.diag) .* B) .*ₛ alpha .+ C .*ₛ beta
330+
331+
function mul!(C::AbstractMatrix, Da::Diagonal, Db::Diagonal, alpha::Number, beta::Number)
332+
mA = size(Da, 1)
333+
mB = size(Db, 1)
334+
mA == mB || throw(DimensionMismatch("A has dimensions ($mA,$mA) but B has dimensions ($mB,$mB)"))
335+
mC, nC = size(C)
336+
mC == nC == mA || throw(DimensionMismatch("output matrix has size: ($mC,$nC), but should have size ($mA,$mA)"))
337+
require_one_based_indexing(C)
338+
da = Da.diag
339+
db = Db.diag
340+
_rmul_or_fill!(C, beta)
341+
if iszero(beta)
342+
@inbounds @simd for i in 1:mA
343+
C[i,i] = Ref(da[i] * db[i]) .*ₛ alpha
344+
end
345+
else
346+
@inbounds @simd for i in 1:mA
347+
C[i,i] += Ref(da[i] * db[i]) .*ₛ alpha
348+
end
349+
end
350+
return C
351+
end
450352

451353
(/)(Da::Diagonal, Db::Diagonal) = Diagonal(Da.diag ./ Db.diag)
452354

453355
ldiv!(x::AbstractArray, A::Diagonal, b::AbstractArray) = (x .= A.diag .\ b)
454356

455-
ldiv!(adjD::Adjoint{<:Any,<:Diagonal}, B::AbstractVecOrMat) =
456-
(D = adjD.parent; ldiv!(conj(D), B))
457-
ldiv!(transD::Transpose{<:Any,<:Diagonal}, B::AbstractVecOrMat) =
458-
(D = transD.parent; ldiv!(D, B))
459-
460357
function ldiv!(D::Diagonal, A::Union{LowerTriangular,UpperTriangular})
461358
broadcast!(\, parent(A), D.diag, parent(A))
462359
A
@@ -486,11 +383,6 @@ function rdiv!(A::Union{LowerTriangular,UpperTriangular}, D::Diagonal)
486383
A
487384
end
488385

489-
rdiv!(A::AbstractMatrix, adjD::Adjoint{<:Any,<:Diagonal}) =
490-
(D = adjD.parent; rdiv!(A, conj(D)))
491-
rdiv!(A::AbstractMatrix, transD::Transpose{<:Any,<:Diagonal}) =
492-
(D = transD.parent; rdiv!(A, D))
493-
494386
(/)(A::Union{StridedMatrix, AbstractTriangular}, D::Diagonal) =
495387
rdiv!((typeof(oneunit(eltype(D))/oneunit(eltype(A)))).(A), D)
496388

stdlib/LinearAlgebra/src/givens.jl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -403,11 +403,6 @@ end
403403
*(A::Adjoint{<:Any,<:AbstractMatrix}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B
404404
*(A::Transpose{<:Any,<:AbstractVector}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B
405405
*(A::Transpose{<:Any,<:AbstractMatrix}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B
406-
# disambiguation methods: *(Adj/Trans of AbsTri or RealHermSymComplex{Herm|Sym}, Adj of AbstractRotation)
407-
*(A::Adjoint{<:Any,<:AbstractTriangular}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B
408-
*(A::Transpose{<:Any,<:AbstractTriangular}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B
409-
*(A::Adjoint{<:Any,<:RealHermSymComplexHerm}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B
410-
*(A::Transpose{<:Any,<:RealHermSymComplexSym}, B::Adjoint{<:Any,<:AbstractRotation}) = copy(A) * B
411406
# disambiguation methods: *(Diag/AbsTri, Adj of AbstractRotation)
412407
*(A::Diagonal, B::Adjoint{<:Any,<:AbstractRotation}) = A * copy(B)
413408
*(A::AbstractTriangular, B::Adjoint{<:Any,<:AbstractRotation}) = A * copy(B)

0 commit comments

Comments
 (0)