# Converting MultivariatePolynomials output as a function to be used in JuMP

**URL:** <https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262>\
**Category:** Optimization (Mathematical)\
**Created:** [May 30, 2018, 1:43pm UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262 "2018-05-30T13:43:23Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ludo](https://avatars.discourse-cdn.com/v4/letter/l/5f9b8f/32.png) [@Ludo](https://discourse.julialang.org/u/Ludo)\
**Post date:** [May 30, 2018, 1:43pm UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/1 "2018-05-30T13:43:23Z")

</div>

The objective is to solve a large system of NL equations. Equations should be obtained via polynomial operations and passed on to JuMP as user-defined function. Below is the minuaturised code for eveluating polynomials’ variables as function’s arguments:  
`using JuMP`  
`using Ipopt`  
`using MultivariatePolynomials`  
`using DynamicPolynomials`  
`function f(k_1,c_1)`  
`c_1*k_1^2`  
`end`  
`@polyvar c_1 k_1 s`  
`d=2*k_1^2+c_1-s`  
`p5=subs(d,s=>f(k_1,c_1))`  
`function y_2(c,k)`  
` p5(c_1=>c,k_1=>k)`  
`end`  
`y_2(c,k)`  
The error message is the following when I call for the evaluated function:  
`UndefVarError: c not defined`

Please, what is wrong in the code? How differently can I convert MultivariatePolynomials output into user-defined functions usable into JuMP?

---

<div class="post-metadata">

**Author:** ![blegat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/blegat/32/217090_2.png) [@blegat](https://discourse.julialang.org/u/blegat)\
**Post date:** [May 30, 2018, 2:01pm UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/2 "2018-05-30T14:01:36Z")

</div>

The variables `c` and `k` do not have any value in your code.  
You get the same error if you do

```julia
function y_2(c, k)
    c + y
end
y_2(c, k)

```

What do you intend to do with the line `y_2(c, k)` ?

---

<div class="post-metadata">

**Author:** ![Ludo](https://avatars.discourse-cdn.com/v4/letter/l/5f9b8f/32.png) [@Ludo](https://discourse.julialang.org/u/Ludo)\
**Post date:** [May 30, 2018, 2:27pm UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/3 "2018-05-30T14:27:42Z")

</div>

y\_2(c,k) is going to be used as user-defined function in JuMP with `c` and `k` the unknowns of the non-linear system to be solved.

---

<div class="post-metadata">

**Author:** ![Ludo](https://avatars.discourse-cdn.com/v4/letter/l/5f9b8f/32.png) [@Ludo](https://discourse.julialang.org/u/Ludo)\
**Post date:** [May 30, 2018, 2:27pm UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/4 "2018-05-30T14:27:45Z")

</div>

When I register `y_2(c,k)` as a user defined function in the real model, I receive the following error:

```julia
  `AssertionError: Variable c_1 was not assigned a value`

  `Stacktrace:`
  
 `[1]_subsmap(::MultivariatePolynomials.Eval,::Array{DynamicPolynomials.PolyVar{true},1},::Tuple{Pair{DynamicPolynomials.PolyVar{true},Float64},`
  `Pair{DynamicPolynomials.PolyVar{true},Float64},Pair{DynamicPolynomials.PolyVar{true},Float64},Pair{DynamicPolynomials.PolyVar{true},Float64},Pair{DynamicPolynomials.PolyVar{true},Float64},.....`

```

Thanks for your help

---

<div class="post-metadata">

**Author:** ![blegat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/blegat/32/217090_2.png) [@blegat](https://discourse.julialang.org/u/blegat)\
**Post date:** [May 30, 2018, 3:23pm UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/5 "2018-05-30T15:23:57Z")

</div>

It is difficult to tell you what is the issue without a minimal working example but it could be cause by calling `@polyvar` twice. Indeed, in DynamicPolynomials, the equality between variables is not based on the name, each variable is different. For instance,

```julia
using JuMP
using Ipopt
using MultivariatePolynomials
using DynamicPolynomials
function f(k_1,c_1)
    c_1*k_1^2
end
@polyvar c_1 k_1 s
d=2*k_1^2+c_1-s
p5=subs(d,s=>f(k_1,c_1))
@polyvar c_1
function y_3(c,k)
    p5(c_1=>c,k_1=>k)
end
m = Model()
@variable m c
@variable m k
y_3(c, k)

```

throws the error `AssertionError: Variable c_1 was not assigned a value` because the `c_1` using in `p5(c_1=>c,k_1=>k)` is different than the `c_1` used in `d=2*k_1^2+c_1-s` and `p5=subs(d,s=>f(k_1,c_1))`.

---

<div class="post-metadata">

**Author:** ![blegat](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/blegat/32/217090_2.png) [@blegat](https://discourse.julialang.org/u/blegat)\
**Post date:** [May 31, 2018, 8:32am UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/6 "2018-05-31T08:32:23Z")

</div>

I have just added a notebook detailing how to solve polynomial optimization [here](https://github.com/JuliaOpt/SumOfSquares.jl/blob/master/examples/Polynomial_Optimization.ipynb) that might be helpful.

---

<div class="post-metadata">

**Author:** ![Ludo](https://avatars.discourse-cdn.com/v4/letter/l/5f9b8f/32.png) [@Ludo](https://discourse.julialang.org/u/Ludo)\
**Post date:** [May 31, 2018, 8:34am UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/7 "2018-05-31T08:34:57Z")

</div>

Thanks a lot! Going to have a look now.

---

<div class="post-metadata">

**Author:** ![Ludo](https://avatars.discourse-cdn.com/v4/letter/l/5f9b8f/32.png) [@Ludo](https://discourse.julialang.org/u/Ludo)\
**Post date:** [June 2, 2018, 9:09am UTC](https://discourse.julialang.org/t/converting-multivariatepolynomials-output-as-a-function-to-be-used-in-jump/11262/8 "2018-06-02T09:09:08Z")

</div>

I ran  
`Pkg.build()`  
and no error message related to the conversion of MultivariatePolynomials output to a function anymore.

Thanks for your help.
