# Differentiate expressions involving LinearMap

**URL:** <https://discourse.julialang.org/t/differentiate-expressions-involving-linearmap/57945>\
**Category:** General Usage\
**Tags:** zygote\
**Created:** [March 25, 2021, 4:16pm UTC](https://discourse.julialang.org/t/differentiate-expressions-involving-linearmap/57945 "2021-03-25T16:16:42Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![mpf01](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mpf01/32/8221_2.png) [@mpf01](https://discourse.julialang.org/u/mpf01)\
**Post date:** [March 25, 2021, 4:16pm UTC](https://discourse.julialang.org/t/differentiate-expressions-involving-linearmap/57945/1 "2021-03-25T16:16:43Z")

</div>

Is it possible, perhaps by defining an appropriate pullback, to differentiate expressions that involve a [`LinearMap`](https://github.com/Jutho/LinearMaps.jl) object? Here’s a small example:

```julia
using Zygote, LinearMaps

m, n = 2, 3; r = ones(m); x = ones(n)
A = LinearMap(ones(m, n))

f(x) = norm(A*x)^2/2 
g(r) = norm(A'*r)^2/2

```

Differentiating throws an error. Here’s a partial stacktrace:

```julia
julia> f'(x) # should evaluate to [6.0, 6.0, 6.0]
ERROR: Can't differentiate foreigncall expression
Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] gemv! at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/LinearAlgebra/src/blas.jl:626 [inlined]
 [3] (::typeof(∂(gemv!)))(::Array{Float64,1}) at /Users/mpf/.julia/packages/Zygote/pM10l/src/compiler/interface2.jl:0
 [4] gemv! at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/LinearAlgebra/src/matmul.jl:470 [inlined]
 [5] (::typeof(∂(gemv!)))(::Array{Float64,1}) at /Users/mpf/.julia/packages/Zygote/pM10l/src/compiler/interface2.jl:0
 [6] mul! at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/LinearAlgebra/src/matmul.jl:66 [inlined]
 [7] mul! at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/LinearAlgebra/src/matmul.jl:208 [inlined]
 [8] _unsafe_mul! at /Users/mpf/.julia/packages/LinearMaps/rw0V6/src/LinearMaps.jl:234 [inlined]

```

A similar error occurs when evaluating `g'(r)`.

---

<div class="post-metadata">

**Author:** ![Sunny](https://avatars.discourse-cdn.com/v4/letter/s/7c8e57/32.png) [@Sunny](https://discourse.julialang.org/u/Sunny)\
**Post date:** [March 25, 2021, 5:23pm UTC](https://discourse.julialang.org/t/differentiate-expressions-involving-linearmap/57945/2 "2021-03-25T17:23:46Z")

</div>

> [@mpf01](#):
>
> ```julia
> using Zygote, LinearMaps
> 
> m, n = 2, 3; r = ones(m); x = ones(n)
> A = LinearMap(ones(m, n))
> 
> f(x) = norm(A*x)^2/2 
> g(r) = norm(A'*r)^2/2
> 
> ```

Try

```julia
ForwardDiff.gradient(x->f(x), x)

```

---

<div class="post-metadata">

**Author:** ![mpf01](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mpf01/32/8221_2.png) [@mpf01](https://discourse.julialang.org/u/mpf01)\
**Post date:** [March 25, 2021, 6:56pm UTC](https://discourse.julialang.org/t/differentiate-expressions-involving-linearmap/57945/3 "2021-03-25T18:56:08Z")

</div>

Here are the forward-mode versions:

```julia
fg(x) = gradient(x) do x
            Zygote.forwarddiff(f, x)
        end[1]
gg(x) = gradient(x) do x
            Zygote.forwarddiff(g, x)
        end[1]

```

These work:

```julia
julia> fg(x)
3-element Array{Float64,1}:
 6.0
 6.0
 6.0

julia> gg(r)
2-element Array{Float64,1}:
 6.000000000000001
 6.000000000000001

```

But am I stuck using forward mode, instead of reverse mode, to differentiate through more general code that involves products with LinearMap objects?

---

<div class="post-metadata">

**Author:** ![Sunny](https://avatars.discourse-cdn.com/v4/letter/s/7c8e57/32.png) [@Sunny](https://discourse.julialang.org/u/Sunny)\
**Post date:** [March 25, 2021, 7:53pm UTC](https://discourse.julialang.org/t/differentiate-expressions-involving-linearmap/57945/4 "2021-03-25T19:53:42Z")

</div>

Provide more concrete example, please. Have you tried [ReverseDiff](https://github.com/JuliaDiff/ReverseDiff.jl) package?
