Modelling arbitrary non-linear expression (returned by a function) in JuMP

I ended up doing a very hackish implementation using Symbolics

using JuMP
using Ipopt
import Symbolics

@Symbolics.variables x[1:2]
x = Symbolics.scalarize(x)

function g(x)
    [
        x[1]^4 + x[2]^5,
        exp(x[1])
    ]
end

function o(x)
    exp(x[1]) + exp(x[2])
end

C = g(x)
O = o(x)

m = Model(Ipopt.Optimizer)

# replace variable
@variable(m, x[1:2])

for i in eachindex(C)
    eval("@NLconstraint(m, $(repr(C[i])) <= 0")
end

eval("@NLobjective(m, Min, $(repr(O)))")
optimize!(m)
println(value.(x))

1 Like