# Building a symbolic Hessian function with ModelingToolkit.jl

**URL:** https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746
**Category:** General Usage
**Tags:** question, modelingtoolkit
**Created:** [January 17, 2022, 9:46am UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746 "2022-01-17T09:46:00Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![adeyemiadeoye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adeyemiadeoye/32/32475_2.png) [@adeyemiadeoye](https://discourse.julialang.org/u/adeyemiadeoye)
#### Post date: [January 17, 2022, 9:46am UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/1 "2022-01-17T09:46:00Z")

</div>

I seek to build a Hessian function for the Lagrangian using [ModelingToolkit.jl](https://mtk.sciml.ai/stable/). This Hessian function is supposed to take two (non-symbolic) functions as arguments. My question is, how would you “correctly” write (if possible) the following using the same idea as found in [this post](https://discourse.julialang.org/t/evaluating-the-hessian-of-the-lagrangian-efficiently/54659/2), or any available workaround? I couldn’t figure it out from the different docs.

```julia
ℒ = func1 + sum(λ .* func2)
ℋ = ModelingToolkit.hessian(ℒ, [vec1; λ])

```

```julia
hess,_ = ModelingToolkit.build_function(ℋ, [func1;func2;λ]; expression=Val{false})
hess(obj(inp1,inp2,inp3), constr(inp4, inp5, inp6), lbda)

```

where `obj` outputs the objective value, and `constr` outputs the constraints vector; λ is the Lagrange multiplier.

Thank you.

---

<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: [January 17, 2022, 12:28pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/2 "2022-01-17T12:28:43Z")

</div>

I don’t quite get the question. Looks like that would work fine, other than the `build_function` call needs to match the signature of what you want to be passing in, so

```julia
hess,_ = ModelingToolkit.build_function(ℋ, [func1;func2], λ; expression=Val{false})

```

---

<div class="post-metadata">

### Author: ![adeyemiadeoye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adeyemiadeoye/32/32475_2.png) [@adeyemiadeoye](https://discourse.julialang.org/u/adeyemiadeoye)
#### Post date: [January 17, 2022, 2:14pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/3 "2022-01-17T14:14:30Z")

</div>

Thanks a lot. It truly works fine, I was passing the functions wrongly.

---

<div class="post-metadata">

### Author: ![adeyemiadeoye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adeyemiadeoye/32/32475_2.png) [@adeyemiadeoye](https://discourse.julialang.org/u/adeyemiadeoye)
#### Post date: [January 17, 2022, 6:42pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/4 "2022-01-17T18:42:39Z")

</div>

Hi @ChrisRackauckas , thanks again. How would one show the output as a matrix with numeric values?  
Thanks.

---

<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: [January 17, 2022, 7:21pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/5 "2022-01-17T19:21:10Z")

</div>

once you create the function you just call it with the inputs. Are you actually using ModelingToolkit here or just Symbolics?

---

<div class="post-metadata">

### Author: ![adeyemiadeoye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adeyemiadeoye/32/32475_2.png) [@adeyemiadeoye](https://discourse.julialang.org/u/adeyemiadeoye)
#### Post date: [January 17, 2022, 10:35pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/6 "2022-01-17T22:35:29Z")

</div>

Yes, I’m using ModelingToolkit, and there are the symbolic `Differential()` terms in the output.

---

<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: [January 17, 2022, 10:41pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/7 "2022-01-17T22:41:24Z")

</div>

Wait so is this coming from an `OptimizationSystem`? What kind of system type?

---

<div class="post-metadata">

### Author: ![adeyemiadeoye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adeyemiadeoye/32/32475_2.png) [@adeyemiadeoye](https://discourse.julialang.org/u/adeyemiadeoye)
#### Post date: [January 17, 2022, 10:58pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/8 "2022-01-17T22:58:41Z")

</div>

(EDIT) Oops… Yes! Constrained [OptimizationSystem](https://mtk.sciml.ai/stable/systems/OptimizationSystem/).  
The goal is to find an effective way to compute the Lagrangian Hessian (preferably symbolically store it as this is a large system).

A very similar description of the problem would be [this post](https://discourse.julialang.org/t/evaluating-the-hessian-of-the-lagrangian-efficiently/54659). I think the original poster settled with their approach (which works but may not be very efficient). For a system with a large number of parameters, I would prefer to store this Hessian symbolically in a function and provide the Lagrange multiplier (and other parameters) each time we call the function. This is what I attempt doing with `ModelingToolkit.jl`.

---

<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: [January 21, 2022, 9:36pm UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/9 "2022-01-21T21:36:11Z")

</div>

Okay yeah, when you do `OptimizationProblem` you can just pass the `hes=true` and it should generate it.

---

<div class="post-metadata">

### Author: ![adeyemiadeoye](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/adeyemiadeoye/32/32475_2.png) [@adeyemiadeoye](https://discourse.julialang.org/u/adeyemiadeoye)
#### Post date: [January 27, 2022, 9:15am UTC](https://discourse.julialang.org/t/building-a-symbolic-hessian-function-with-modelingtoolkit-jl/74746/10 "2022-01-27T09:15:11Z")

</div>

Thank you very much for your help Chris. I opted for a different tool. I saved this answer for later!
