# Julia JuMP optimization help

**URL:** <https://discourse.julialang.org/t/julia-jump-optimization-help/43259>\
**Category:** Optimization (Mathematical)\
**Created:** [July 17, 2020, 8:38pm UTC](https://discourse.julialang.org/t/julia-jump-optimization-help/43259 "2020-07-17T20:38:23Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![jovansam](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jovansam/32/15023_2.png) [@jovansam](https://discourse.julialang.org/u/jovansam)\
**Post date:** [July 17, 2020, 8:38pm UTC](https://discourse.julialang.org/t/julia-jump-optimization-help/43259/1 "2020-07-17T20:38:23Z")

</div>

With complements in Julia/JuMP/PATH/KNITRO. How do you get to use non-linear functions. See in the code below.

```julia

using PATH, JuMP, KNITRO

function geological_constraints_MCP()

    Α = 50.0
    Β = 0.1
    δ = 0.05
    γ = 0.1
    ψ₁ = 0.0
    ψ₂ = 2.0
    λ₁ = 5.0
    λ₂ = 4.0
    R₀ = 0.0
    S₀ = 10.0
    T = 40

    gxt = Model(PATH.Optimizer)

    @variable(gxt, q[1:4]>=0)

    # working linear function
    #@constraint(gxt, -(Α .- Β*q - ψ₁.*q) ⟂ q)

    # I would like one of the two below to work    
    @NLconstraint(gxt, -(Α .- Β*q - ψ₁.*q.^(ψ₂-1)) ⟂ q)
    #@NLconstraint(gxt, -(Α .- Β*q - (ψ₁.*q).*q) ⟂ q)

    print(gxt)
    optimize!(gxt)
    value.(q)
end

geological_constraints_MCP()

```

---

<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:** [July 18, 2020, 3:19am UTC](https://discourse.julialang.org/t/julia-jump-optimization-help/43259/2 "2020-07-18T03:19:45Z")

</div>

JuMP’s NLP support is limited to `<=`, `>=`, and `==` constraints. It’s a sore point that needs fixing, but that is for the future.

For now, you can only use linear complementary constraints with PATH. Not sure about KNITRO, but I think the same applies. Although you could add a slack variable and use that instead.

---

<div class="post-metadata">

**Author:** ![jovansam](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jovansam/32/15023_2.png) [@jovansam](https://discourse.julialang.org/u/jovansam)\
**Post date:** [July 18, 2020, 3:28am UTC](https://discourse.julialang.org/t/julia-jump-optimization-help/43259/3 "2020-07-18T03:28:28Z")

</div>

Thanks once again @odow. This is very helpful.

---

<div class="post-metadata">

**Author:** ![jovansam](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jovansam/32/15023_2.png) [@jovansam](https://discourse.julialang.org/u/jovansam)\
**Post date:** [August 7, 2020, 10:04am UTC](https://discourse.julialang.org/t/julia-jump-optimization-help/43259/4 "2020-08-07T10:04:09Z")

</div>

To partly answer my own question. See this [discussion](https://github.com/GAMS-dev/gams.jl/issues/2).

Using “complementarity.jl” works with nonlinear expressions. Here is the working piece of code:

```nohighlight
using PATH, JuMP, Complementarity

function geological_constraints_MCP()

    Α = 50.0
    Β = 0.1
    δ = 0.05
    γ = 0.1
    ψ₁ = 0.0
    ψ₂ = 2.0
    λ₁ = 5.0
    λ₂ = 4.0
    R₀ = 0.0
    S₀ = 10.0
    T = 4
    t = 1:T

    gxt =MCPModel()
    @variable(gxt, q[i in t]>=0)
    @mapping(gxt, FOC[i in t], -(Α - Β*q[i] - ψ₁*q[i]^(ψ₂-1)))
    @complementarity(gxt,FOC,q)

    print(gxt)
    status = solveMCP(gxt)
    #value.(q)
    @show result_value.(q)
end

geological_constraints_MCP()

```
