Skip to content

Commit

Permalink
Fix promotion of outer product (#263)
Browse files Browse the repository at this point in the history
* Fix promotion of outer product

* Update matmul.jl

---------

Co-authored-by: Oscar Dowson <[email protected]>
  • Loading branch information
blegat and odow authored Feb 14, 2024
1 parent 2a7b7ca commit 70b043a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/implementations/LinearAlgebra.jl
Original file line number Diff line number Diff line change
Expand Up @@ -213,14 +213,14 @@ function promote_array_mul(
::Type{<:AbstractVector{S}},
::Type{<:LinearAlgebra.Adjoint{T,<:AbstractVector{T}}},
) where {S,T}
return Matrix{promote_sum_mul(S, T)}
return Matrix{promote_operation(*, S, T)}
end

function promote_array_mul(
::Type{<:AbstractVector{S}},
::Type{<:LinearAlgebra.Transpose{T,<:AbstractVector{T}}},
) where {S,T}
return Matrix{promote_sum_mul(S, T)}
return Matrix{promote_operation(*, S, T)}
end

function promote_array_mul(
Expand Down
19 changes: 19 additions & 0 deletions test/matmul.jl
Original file line number Diff line number Diff line change
Expand Up @@ -403,3 +403,22 @@ end
y = MA.@rewrite sum(A[i, :] * LinearAlgebra.transpose(x[i, :]) for i in 1:2)
@test y == BigInt[10 14; 14 20]
end

struct Monomial end
LinearAlgebra.transpose(m::Monomial) = m
LinearAlgebra.adjoint(m::Monomial) = m
MA.promote_operation(::typeof(*), ::Type{Monomial}, ::Type{Monomial}) = Monomial
Base.:*(m::Monomial, ::Monomial) = m

# `Monomial` does not implement `+`, we should check that it does not prevent
# to do outer products of vectors
@testset "Vector*Transpose{Vector}_issue_256 with Monomial" begin
m = Monomial()
a = [m, m]
for f in [LinearAlgebra.transpose, LinearAlgebra.adjoint]
b = f(a)
T = MA.promote_operation(*, typeof(a), typeof(b))
@test T == typeof(a * b)
@test T == typeof(MA.operate(*, a, b))
end
end

0 comments on commit 70b043a

Please sign in to comment.