Skip to content

Commit 5cf41c4

Browse files
authored
Indirection in matrix multiplication to avoid ambiguities (#1210)
1 parent 0a9c164 commit 5cf41c4

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

src/diagonal.jl

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -669,22 +669,24 @@ end
669669
for Tri in (:UpperTriangular, :LowerTriangular)
670670
UTri = Symbol(:Unit, Tri)
671671
# 2 args
672-
for (fun, f) in zip((:*, :rmul!, :rdiv!, :/), (:identity, :identity, :inv, :inv))
673-
@eval $fun(A::$Tri, D::Diagonal) = $Tri($fun(A.data, D))
674-
@eval $fun(A::$UTri, D::Diagonal) = $Tri(_setdiag!($fun(A.data, D), $f, D.diag))
672+
for (fun, f) in zip((:mul, :rmul!, :rdiv!, :/), (:identity, :identity, :inv, :inv))
673+
g = fun == :mul ? :* : fun
674+
@eval $fun(A::$Tri, D::Diagonal) = $Tri($g(A.data, D))
675+
@eval $fun(A::$UTri, D::Diagonal) = $Tri(_setdiag!($g(A.data, D), $f, D.diag))
675676
end
676-
@eval *(A::$Tri{<:Any, <:StridedMaybeAdjOrTransMat}, D::Diagonal) =
677-
@invoke *(A::AbstractMatrix, D::Diagonal)
678-
@eval *(A::$UTri{<:Any, <:StridedMaybeAdjOrTransMat}, D::Diagonal) =
679-
@invoke *(A::AbstractMatrix, D::Diagonal)
680-
for (fun, f) in zip((:*, :lmul!, :ldiv!, :\), (:identity, :identity, :inv, :inv))
681-
@eval $fun(D::Diagonal, A::$Tri) = $Tri($fun(D, A.data))
682-
@eval $fun(D::Diagonal, A::$UTri) = $Tri(_setdiag!($fun(D, A.data), $f, D.diag))
677+
@eval mul(A::$Tri{<:Any, <:StridedMaybeAdjOrTransMat}, D::Diagonal) =
678+
@invoke mul(A::AbstractMatrix, D::Diagonal)
679+
@eval mul(A::$UTri{<:Any, <:StridedMaybeAdjOrTransMat}, D::Diagonal) =
680+
@invoke mul(A::AbstractMatrix, D::Diagonal)
681+
for (fun, f) in zip((:mul, :lmul!, :ldiv!, :\), (:identity, :identity, :inv, :inv))
682+
g = fun == :mul ? :* : fun
683+
@eval $fun(D::Diagonal, A::$Tri) = $Tri($g(D, A.data))
684+
@eval $fun(D::Diagonal, A::$UTri) = $Tri(_setdiag!($g(D, A.data), $f, D.diag))
683685
end
684-
@eval *(D::Diagonal, A::$Tri{<:Any, <:StridedMaybeAdjOrTransMat}) =
685-
@invoke *(D::Diagonal, A::AbstractMatrix)
686-
@eval *(D::Diagonal, A::$UTri{<:Any, <:StridedMaybeAdjOrTransMat}) =
687-
@invoke *(D::Diagonal, A::AbstractMatrix)
686+
@eval mul(D::Diagonal, A::$Tri{<:Any, <:StridedMaybeAdjOrTransMat}) =
687+
@invoke mul(D::Diagonal, A::AbstractMatrix)
688+
@eval mul(D::Diagonal, A::$UTri{<:Any, <:StridedMaybeAdjOrTransMat}) =
689+
@invoke mul(D::Diagonal, A::AbstractMatrix)
688690
# 3-arg ldiv!
689691
@eval ldiv!(C::$Tri, D::Diagonal, A::$Tri) = $Tri(ldiv!(C.data, D, A.data))
690692
@eval ldiv!(C::$Tri, D::Diagonal, A::$UTri) = $Tri(_setdiag!(ldiv!(C.data, D, A.data), inv, D.diag))

src/matmul.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ julia> [1 1; 0 1] * [1 0; 1 1]
111111
1 1
112112
```
113113
"""
114-
function (*)(A::AbstractMatrix, B::AbstractMatrix)
114+
(*)(A::AbstractMatrix, B::AbstractMatrix) = mul(A, B)
115+
# we add an extra level of indirection to avoid ambiguities in *
116+
function mul(A::AbstractMatrix, B::AbstractMatrix)
115117
TS = promote_op(matprod, eltype(A), eltype(B))
116118
mul!(matprod_dest(A, B, TS), A, B)
117119
end

0 commit comments

Comments
 (0)