# Differentiating optimization problem solutions in Julia

**URL:** <https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988>\
**Category:** Optimization (Mathematical)\
**Tags:** optimization, zygote, autodiff\
**Created:** [February 8, 2022, 1:51am UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988 "2022-02-08T01:51:55Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![mtfishman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mtfishman/32/30755_2.png) [@mtfishman](https://discourse.julialang.org/u/mtfishman)\
**Post date:** [February 8, 2022, 1:51am UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/1 "2022-02-08T01:51:56Z")

</div>

Hello,

I was recently made aware of the paper “Efficient and Modular Implicit Differentiation”:

> **[Efficient and Modular Implicit Differentiation](https://arxiv.org/abs/2105.15183)**
>
> Automatic differentiation (autodiff) has revolutionized machine learning. It allows to express complex computations by composing elementary ones in creative ways and removes the burden of computing their derivatives by hand. More recently,...

which is implemented in Jax here:

> **[GitHub - google/jaxopt: Hardware accelerated, batchable and differentiable...](https://github.com/google/jaxopt)**
>
> Hardware accelerated, batchable and differentiable optimizers in JAX. - GitHub - google/jaxopt: Hardware accelerated, batchable and differentiable optimizers in JAX.

It is about automatically generating differentiation rules for optimization problem solutions given a function defining the optimality conditions.

I wanted to bring this up to see if it is on anyone’s radar, it sounds like it would be a nice general feature to add to the Julia autodiff ecosystem. We would have many use cases in our application area of tensor networks and quantum computing.

I have a feeling that this functionality may be available in some form in the extensive Julia optimization and differential equation ecosystem, but I’m not so familiar with that part of Julia so if it is available it would be nice to hear about it!

-Matt

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [February 8, 2022, 3:49am UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/2 "2022-02-08T03:49:17Z")

</div>

[https://github.com/jump-dev/DiffOpt.jl](https://github.com/jump-dev/DiffOpt.jl)

That’s an attempt. Though it is slated to exist for GalacticOptim.jl: there’s specifically a spot for parameters in its definition specifically for supporting differentiation, but we haven’t done it yet.

---

<div class="post-metadata">

**Author:** ![mohamed82008](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mohamed82008/32/18171_2.png) [@mohamed82008](https://discourse.julialang.org/u/mohamed82008)\
**Post date:** [February 8, 2022, 7:51am UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/3 "2022-02-08T07:51:00Z")

</div>

> [@mtfishman](#):
>
> I have a feeling that this functionality may be available in some form in the extensive Julia optimization and differential equation ecosystem, but I’m not so familiar with that part of Julia so if it is available it would be nice to hear about it!

Here you go. [GitHub - JuliaNonconvex/NonconvexUtils.jl: Some convenient hacks when using Nonconvex.jl.](https://github.com/JuliaNonconvex/NonconvexUtils.jl#hack-5-implicitfunction)

---

<div class="post-metadata">

**Author:** ![mtfishman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mtfishman/32/30755_2.png) [@mtfishman](https://discourse.julialang.org/u/mtfishman)\
**Post date:** [February 13, 2022, 10:03pm UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/4 "2022-02-13T22:03:17Z")

</div>

Thanks for the pointers, I knew someone must have worked on this kind of thing.

I think `ImplicitFunction` from ` NonconvexUtils.jl` is what we are looking for, when I get some free time I’ll test it out and see if it works for our use cases.

`DiffOpt.jl` may be relevant too, but it looks pretty specific to `JuMP` (though I’m not familiar with the `JuMP` syntax so I can’t really tell at first glance).

---

<div class="post-metadata">

**Author:** ![gdalle](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdalle/32/27854_2.png) [@gdalle](https://discourse.julialang.org/u/gdalle)\
**Post date:** [February 24, 2024, 8:27am UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/5 "2024-02-24T08:27:05Z")

</div>

Just stumbled upon this thread, and wanted to update the answers in case someone else lands here.

- for implicit differentiation, check out ImplicitDifferentiation.jl
- if your problem is convex and JuMP-compatible, check out DiffOpt.jl
- in general, check out Optimization.jl

---

<div class="post-metadata">

**Author:** ![baggepinnen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baggepinnen/32/693_2.png) [@baggepinnen](https://discourse.julialang.org/u/baggepinnen)\
**Post date:** [February 24, 2024, 9:56am UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/6 "2024-02-24T09:56:21Z")

</div>

In what sense does Optimization.jl currently support this?

---

<div class="post-metadata">

**Author:** ![gdalle](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdalle/32/27854_2.png) [@gdalle](https://discourse.julialang.org/u/gdalle)\
**Post date:** [February 24, 2024, 3:49pm UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/7 "2024-02-24T15:49:13Z")

</div>

In the sense that you can probably differentiate _through_ a significant number of solvers. However, if your solver is not differentiable (or if that is too slow), then you need implicit differentiation, and I don’t think Optimization.jl supports that

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [February 24, 2024, 4:44pm UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/8 "2024-02-24T16:44:31Z")

</div>

It doesn’t have the rule yet, but we should have it by JuliaCon at the latest (@Vaibhavdixit02)

---

<div class="post-metadata">

**Author:** ![gdalle](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gdalle/32/27854_2.png) [@gdalle](https://discourse.julialang.org/u/gdalle)\
**Post date:** [February 24, 2024, 4:56pm UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/9 "2024-02-24T16:56:40Z")

</div>

I’m curious how you pull that off in the general constrained case, with KKT?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [February 25, 2024, 2:10pm UTC](https://discourse.julialang.org/t/differentiating-optimization-problem-solutions-in-julia/75988/10 "2024-02-25T14:10:32Z")

</div>

Yup, it’s similar to what you’d do with ImplicitDifferentiation.jl but instead you’d just bake the rules into the package and make it reuse caches and structures already generated for the optimization in order to save memory.
