# Concatenation causes multiplication type problems in ReverseDiff

**URL:** <https://discourse.julialang.org/t/concatenation-causes-multiplication-type-problems-in-reversediff/91917>\
**Category:** General Usage\
**Tags:** reversediff\
**Created:** [December 20, 2022, 9:38pm UTC](https://discourse.julialang.org/t/concatenation-causes-multiplication-type-problems-in-reversediff/91917 "2022-12-20T21:38:19Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![fratrik](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fratrik/32/678_2.png) [@fratrik](https://discourse.julialang.org/u/fratrik)\
**Post date:** [December 20, 2022, 9:38pm UTC](https://discourse.julialang.org/t/concatenation-causes-multiplication-type-problems-in-reversediff/91917/1 "2022-12-20T21:38:19Z")

</div>

```julia
using ReverseDiff

function f(a)
    b = [1 2]
    ([a; b]*a)*a
    [a*a*a; b*a*a]
    
    [a*a; b*a]*a # error here
    0
end

ReverseDiff.hessian(f, randn(2, 2))

```

the code fails on `[a*a; b*a]*a` with message

> ERROR: LoadError: MethodError: \*(::ReverseDiff.TrackedArray{ReverseDiff.TrackedReal{Float64, Float64, Nothing}, ReverseDiff.TrackedReal{Float64, Float64, Nothing}, 2, Matrix{ReverseDiff.TrackedReal{Float64, Float64, Nothing}}, Matrix{ReverseDiff.TrackedReal{Float64, Float64, Nothing}}}, ::ReverseDiff.TrackedArray{ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 2, Matrix{Float64}, Matrix{Float64}}}, ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 2, Matrix{Float64}, Matrix{Float64}}}, 2, Matrix{ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 2, Matrix{Float64}, Matrix{Float64}}}}, Matrix{ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{Float64, Float64, 2, Matrix{Float64}, Matrix{Float64}}}}}) is ambiguous.

Something seems to be happening with the type of `[a*a; b*a]`

> ReverseDiff.TrackedArray{ReverseDiff.TrackedReal{Float64, Float64, Nothing}, ReverseDiff.TrackedReal{Float64, Float64, Nothing}, 2, Matrix{ReverseDiff.TrackedReal{Float64, Float64, Nothing}}, Matrix{ReverseDiff.TrackedReal{Float64, Float64, Nothing}}}

Then, `[a*a; b*a]::TrackedMatrix{X, D}` for `D=ReverseDiff.TrackedReal{Float64, Float64, Nothing}` which doesn’t match up with `a::TrackedMatrix{Y, E}` for `E= ReverseDiff.TrackedArray{Float64, Float64, 2, Matrix{Float64}, Matrix{Float64}}`

so the

```julia
LinearAlgebra.:*(x::$(S1){X,D}, y::$(S2){Y,D}) where {X,Y,D} = record_mul(x, y, D)

```

won’t match. Maybe there needs to be a promotion of some sort so that `a::TrackedMatrix{Y, E}` can be treated as `TrackedMatrix{Y, D}` from above?
