# @NLexpression with JuMP 0.21

**URL:** <https://discourse.julialang.org/t/nlexpression-with-jump-0-21/34859>\
**Category:** Optimization (Mathematical)\
**Tags:** jump\
**Created:** [February 19, 2020, 4:20pm UTC](https://discourse.julialang.org/t/nlexpression-with-jump-0-21/34859 "2020-02-19T16:20:19Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![amontoison](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/amontoison/32/218741_2.png) [@amontoison](https://discourse.julialang.org/u/amontoison)\
**Post date:** [February 19, 2020, 4:20pm UTC](https://discourse.julialang.org/t/nlexpression-with-jump-0-21/34859/1 "2020-02-19T16:20:20Z")

</div>

I tried to use an old JuMP model that was working with JuMP 0.18. But the behaviour of @NLexpression changed with JuMP 0.19 /0.20 / 0.21.

Is it a bug or I need to modify how the expression is written?

Thank you in advance for your reply!

```julia
n = m = 10
if m < n
  @warn(": number of function must be ≥ number of variables. Adjusting to m = n")
  m = n
end

nls = Model()
x0 = collect(1:n)/(n+1)
@variable(nls, x[i=1:n], start = x0[i])

function Tsim(x, n)
  if n == 0
    return 1
  elseif n == 1
    return x
  else
    return 2*x*Tsim(x,n-1) - Tsim(x,n-2)
  end
end

Ts = Vector{Function}(undef, n)
Tnames = Vector{Symbol}(undef, n)
for i = 1:n
  Ts[i] = x -> Tsim(2*x-1, i)
  Tnames[i] = gensym()
  JuMP.register(nls, Tnames[i], 1, Ts[i], autodiff=true)
end

I = [i%2 == 0 ? -1/(i^2-1) : 0 for i = 1:n]
@NLexpression(nls, F[i=1:n], sum($(Tnames[i])(x[j]) for j = 1:n)/n - I[i])

```

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [February 19, 2020, 6:22pm UTC](https://discourse.julialang.org/t/nlexpression-with-jump-0-21/34859/2 "2020-02-19T18:22:36Z")

</div>

See the documentation for how to use the raw expression format:  
[https://www.juliaopt.org/JuMP.jl/stable/nlp/#Raw-expression-input-1](https://www.juliaopt.org/JuMP.jl/stable/nlp/#Raw-expression-input-1)

Note that when building the expression, you need to splice in the actual variables, e.g., `:($(x[j]))`.

---

<div class="post-metadata">

**Author:** ![amontoison](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/amontoison/32/218741_2.png) [@amontoison](https://discourse.julialang.org/u/amontoison)\
**Post date:** [February 19, 2020, 7:01pm UTC](https://discourse.julialang.org/t/nlexpression-with-jump-0-21/34859/3 "2020-02-19T19:01:14Z")

</div>

@odow It seems that we can only use the raw expression format with `set_NL_objective` and `add_NL_constraint`?

Example :

```julia
@NLexpression(nls, F1, :($(x[1]) * $(x[2])))
ERROR: Unexpected object x[1] * x[2] (of type Expr in nonlinear expression.
```

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [February 19, 2020, 9:30pm UTC](https://discourse.julialang.org/t/nlexpression-with-jump-0-21/34859/4 "2020-02-19T21:30:18Z")

</div>

> It seems that we can only use the raw expression format with `set_NL_objective` and `add_NL_constraint` ?

Yes. You need to use the functional form.

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [February 20, 2020, 4:01pm UTC](https://discourse.julialang.org/t/nlexpression-with-jump-0-21/34859/5 "2020-02-20T16:01:58Z")

</div>

See also [Procedural Nonlinear Constaint Generation - String to NLconstraint - #4 by odow](https://discourse.julialang.org/t/procedural-nonlinear-constaint-generation-string-to-nlconstraint/34799/4)
