# Nonlinear optimization using JuMP, The solver does not support nonlinear problems (i.e., NLobjective and NLconstraint)

**URL:** https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978
**Category:** Optimization (Mathematical)
**Tags:** jump, mosek, nonlinear
**Created:** [March 12, 2023, 11:55pm UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978 "2023-03-12T23:55:47Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![mosby](https://avatars.discourse-cdn.com/v4/letter/m/9d8465/32.png) [@mosby](https://discourse.julialang.org/u/mosby)
#### Post date: [March 12, 2023, 11:55pm UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/1 "2023-03-12T23:55:47Z")

</div>

I am solving a nonlinear optimization problem using Mosek, I am running the following script

model = Model(Mosek.Optimizer)  
@variable(model, y[1:n])  
@NLconstraint(model, sum((A_y-b)[i]^4 for i=1:m) \<= 1.0) # The constraint is norm(A_y-b,4) \<=1  
@objective(model, Min, 0.5\*y’_Q_y + c’\*y-1)  
optimize!(model)

Then I got

The solver does not support nonlinear problems (i.e., NLobjective and NLconstraint).

When I do the L-2 norm constraint norm(A_y-b,2)\<=1, I use  
 @constraint(model, [1; A_y-b] in SecondOrderCone()),

everything works well. But now for L-4 norm, am I doing something wrong?

---

<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: [March 13, 2023, 12:00am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/2 "2023-03-13T00:00:56Z")

</div>

Mosek does not support arbitrary nonlinear constraints. You need to formulate your problem as a conic optimization problem.

See

- [Introduction · JuMP](https://jump.dev/JuMP.jl/stable/tutorials/conic/introduction/)
- [Tips and Tricks · JuMP](https://jump.dev/JuMP.jl/stable/tutorials/conic/tips_and_tricks/)

In this particular case, the p-norm can be modeled using PowerCones: [4 The power cones — MOSEK Modeling Cookbook 3.3.0](https://docs.mosek.com/modeling-cookbook/powo.html#p-norm-cones)

```plaintext
julia> using JuMP

julia> import LinearAlgebra

julia> import SCS

julia> function pnorm_model(x0, p)
           model = Model(SCS.Optimizer)
           set_silent(model)
           @variable(model, x[i = 1:4] == x0[i])
           @variable(model, r[1:4])
           @variable(model, t)
           @constraint(model, [i=1:4], [r[i], t, x[i]] in MOI.PowerCone(1 / p))
           @constraint(model, sum(r) == t)
           @objective(model, Min, t)
           optimize!(model)
           return value(t)
       end
pnorm_model (generic function with 1 method)

julia> x0 = rand(4)
4-element Vector{Float64}:
 0.5033115464997369
 0.748802243142874
 0.0906063454411572
 0.44528993571248954

julia> pnorm_model(x0, 4)
0.8040190643234455

julia> LinearAlgebra.norm(x0, 4)
0.8040443072979447

```

---

<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: [March 13, 2023, 12:19am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/3 "2023-03-13T00:19:31Z")

</div>

I’ve opened a PR to add this example to the documentation: [[docs] add p-norm example by odow · Pull Request #3282 · jump-dev/JuMP.jl · GitHub](https://github.com/jump-dev/JuMP.jl/pull/3282)

---

<div class="post-metadata">

### Author: ![mosby](https://avatars.discourse-cdn.com/v4/letter/m/9d8465/32.png) [@mosby](https://discourse.julialang.org/u/mosby)
#### Post date: [March 13, 2023, 1:13am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/4 "2023-03-13T01:13:30Z")

</div>

Thank you so much! It works well for my problem!

---

<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: [March 13, 2023, 1:35am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/5 "2023-03-13T01:35:23Z")

</div>

For future readers, the full problem with the norm constraint is something like:

```julia
julia> using JuMP

julia> import LinearAlgebra

julia> import SCS

julia> begin
           n = 3
           A = [1 2 3; 4 5 6; 7 8 9; 10 11 12]
           b = [13, 14, 15, 16]
           p = 4
           model = Model(SCS.Optimizer)
           set_silent(model)
           @variable(model, y[1:n])
           @expression(model, f, A * y - b)
           @variable(model, r[1:length(f)])
           @variable(model, t <= 1)
           @constraint(model, [i=1:4], [r[i], t, f[i]] in MOI.PowerCone(1 / p))
           @constraint(model, sum(r) == t)
           @objective(model, Max, sum(y))
           optimize!(model)
           println("t = ", value(t))
           println("pnorm(Ay - b, $p) = ", LinearAlgebra.norm(A * value.(y) - b, p))
       end
t = 1.0002567650485095
pnorm(Ay - b, 4) = 1.0004631209883683

```

So `t` is the p-norm, give or take a little tolerance.

---

<div class="post-metadata">

### Author: ![mosby](https://avatars.discourse-cdn.com/v4/letter/m/9d8465/32.png) [@mosby](https://discourse.julialang.org/u/mosby)
#### Post date: [March 13, 2023, 5:25am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/6 "2023-03-13T05:25:23Z")

</div>

One more question, if I use Gurobi instead of Mosek, I got

Constraints of type MathOptInterface.VectorAffineFunction{Float64}-in-MathOptInterface.PowerCone{Float64} are not supported by the solver.

If you expected the solver to support your problem, you may have an error in your formulation. Otherwise, consider using a different solver.

Does MOI.PowerCone not work with Gurobi?

---

<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: [March 13, 2023, 5:36am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/7 "2023-03-13T05:36:19Z")

</div>

> [@mosby](#):
>
> Does MOI.PowerCone not work with Gurobi?

Nope. Gurobi is limited to linear or quadratic programs.

---

<div class="post-metadata">

### Author: ![mosby](https://avatars.discourse-cdn.com/v4/letter/m/9d8465/32.png) [@mosby](https://discourse.julialang.org/u/mosby)
#### Post date: [March 13, 2023, 5:49am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/8 "2023-03-13T05:49:08Z")

</div>

But with Convex.jl, Gurobi is able to solve this 4-norm constraint problem. With JuMP, it isn’t. Is there a reason why Convex.jl works?

---

<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: [March 13, 2023, 6:14am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/9 "2023-03-13T06:14:22Z")

</div>

Convex must use a different reformulation that doesn’t use the PowerCone, but I don’t know the details.

I think this is really asking for an explicit PNormCone in JuMP. Thatd let us write proper reformulations for each solver.

---

<div class="post-metadata">

### Author: ![mosby](https://avatars.discourse-cdn.com/v4/letter/m/9d8465/32.png) [@mosby](https://discourse.julialang.org/u/mosby)
#### Post date: [March 13, 2023, 6:20am UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/10 "2023-03-13T06:20:06Z")

</div>

For convex I just use the following code

y = Variable(n)  
Prob = minimize(0.5_quadform(y,Q; assume\_psd=true)+dot(c,y)-1, norm(A_y - b, 4) \<= 1)  
Convex.solve!(Prob, Gurobi.Optimizer)

I don’t know why this works.

---

<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: [March 13, 2023, 7:30pm UTC](https://discourse.julialang.org/t/nonlinear-optimization-using-jump-the-solver-does-not-support-nonlinear-problems-i-e-nlobjective-and-nlconstraint/95978/11 "2023-03-13T19:30:14Z")

</div>

> I don’t know why this works.

Because Convex includes a reformulation that JuMP has not implemented yet.

I’ve opened an issue to get this implemented: [Add NormPCone · Issue #2118 · jump-dev/MathOptInterface.jl · GitHub](https://github.com/jump-dev/MathOptInterface.jl/issues/2118)
