From 70b043a329f13738e55907d33c6eaa386e13a51c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Wed, 14 Feb 2024 21:51:05 +0100 Subject: [PATCH] Fix promotion of outer product (#263) * Fix promotion of outer product * Update matmul.jl --------- Co-authored-by: Oscar Dowson --- src/implementations/LinearAlgebra.jl | 4 ++-- test/matmul.jl | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/implementations/LinearAlgebra.jl b/src/implementations/LinearAlgebra.jl index d577e6c..00ff2b6 100644 --- a/src/implementations/LinearAlgebra.jl +++ b/src/implementations/LinearAlgebra.jl @@ -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( diff --git a/test/matmul.jl b/test/matmul.jl index 7392066..339b87e 100644 --- a/test/matmul.jl +++ b/test/matmul.jl @@ -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