# Ignore part of the gradient calculation inside differential equation model

**URL:** https://discourse.julialang.org/t/ignore-part-of-the-gradient-calculation-inside-differential-equation-model/90011
**Category:** Numerics
**Tags:** diffeq, zygote, autodiff, differentialequation
**Created:** [November 9, 2022, 11:22pm UTC](https://discourse.julialang.org/t/ignore-part-of-the-gradient-calculation-inside-differential-equation-model/90011 "2022-11-09T23:22:13Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![facusapienza](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/facusapienza/32/24317_2.png) [@facusapienza](https://discourse.julialang.org/u/facusapienza)
#### Post date: [November 9, 2022, 11:22pm UTC](https://discourse.julialang.org/t/ignore-part-of-the-gradient-calculation-inside-differential-equation-model/90011/1 "2022-11-09T23:22:13Z")

</div>

I am trying to differentiate the solution of a differential equation using `DifferentialEquation` with respect to some parameters but ignoring parts of the calculation of the gradient for being redundant or computationally expensive to compute. However, I cannot manage to ignore parts of the forward model when computing the gradient using `Zygote`. I am including next a MWE.

We can compute the gradient of the solution of a simple ODE with respect of the vector parameter `p` as follows

```julia
using DifferentialEquations
using Zygote, SciMLSensitivity
using Plots 
using DiffEqFlux
using ChainRulesCore
using Zygote: @ignore

p = [0.1, 0.2]

function dynamics(du, u, p, t)
    du[1] = - p[1] * u[1] + p[2]
end

dp = Zygote.gradient(p -> solve(ODEProblem(dynamics,
                                           [10.0],
                                           (0.0,10.0),
                                           tstops=[4.0], 
                                           p), Tsit5()).u[end][1], p)

```

which results in the final calculation of `dp=([-42.072752200991175, 6.321205292676615],)`. Now, I would like to consider a case in which the dependency of the solution with one of the parameters, let say `p[2]` is ignored. Zygote allows ignoring certain computations of the gradient by using the macro `@ignore`, for example in the following example:

```julia
using Zygote: @ignore

function foo(x)
    y = @ignore x
    return y*x
end

```

where the computed gradient gives the formula `f'(x) = x` instead of `f'(x) = 2x`. However, running the previous example with the `ignore` macro inside `dynamics()` leads to the same numerical value of the gradient

```julia
function dynamics2(du, u, p, t)
    offset = @ignore p[2]
    du[1] = - p[1] * u[1] + offset
end

dp2 = Zygote.gradient(p -> solve(ODEProblem(dynamics2,
                                           [10.0],
                                           (0.0,10.0), 
                                           p), Tsit5()).u[end][1], p)

```

where `dp2 = ([-42.072752200991175, 6.321205292676615],)`.

Does anyone knows if `@ignore` is supported for differential equations? There is a chance I am also missing something about the behavior of `@ignore`, but my understanding is that this command should ignore the dependency of certain parts of the code at the moment of applying AD.

Thank you!
