I am trying to solve a constrained non linear optimization problem with JuMP/Ipopt and since the cost function and the constraint are functions of vector variables, I am using the splatting syntax as suggested in the JuMP documentation. Here is the minimal reproducible example of the problem:
using JuMP
using Ipopt
function Cost(args...)
x = [args[i] for i=1:8]
y = [args[i] for i=9:16]
u = [sum(x), sum(y)]
return - cos((u[1]-0.1)*u[2])^2 - u[1]*(sin(3u[1]+u[2]))
end
function Constr(args...)
x = [args[i] for i=1:8]
y = [args[i] for i=9:16]
t = atan2(sum(y), sum(x))
return (2cos(t) - cos(2t) / 2 - cos(3t) / 4 - cos(4t) / 8)^2 + (2sin(t))^2
end
m = Model(solver=IpoptSolver(print_level=1))
JuMP.register(m, :Cost, 16, Cost, autodiff=true)
JuMP.register(m, :Constr, 16, Constr, autodiff=true)
@variable(m, -2.25 <= x[1:8] <= 2.5, start=1)
@variable(m, -2.5 <= y[1:8] <= 1.75, start=1)
@NLconstraint(m, c1, sum(x[i]^2 for i in 1:8) + sum(y[i]^2 for i in 1:8) <= Constr(x...,y...))
@NLobjective(m, Min, Cost(x...,y...))
solve(m)
and the error is:
MethodError: no method matching parseNLExpr_runtime(::JuMP.Model, ::JuMP.Variable, ::JuMP.Variable, ::JuMP.Variable, ::JuMP.Variable, ::JuMP.Variable, ::JuMP.Variable, ::JuMP.Variable, ::JuMP.Variable, ::Array{ReverseDiffSparse.NodeData,1}, ::Int64, ::Array{Float64,1})
Closest candidates are:
parseNLExpr_runtime(::JuMP.Model, ::JuMP.Variable, ::Any, ::Any, ::Any) at C:\Users\arbenede\.julia\v0.6\JuMP\src\parsenlp.jl:202
parseNLExpr_runtime(::JuMP.Model, ::Number, ::Any, ::Any, ::Any) at C:\Users\arbenede\.julia\v0.6\JuMP\src\parsenlp.jl:196
parseNLExpr_runtime(::JuMP.Model, ::JuMP.NonlinearExpression, ::Any, ::Any, ::Any) at C:\Users\arbenede\.julia\v0.6\JuMP\src\parsenlp.jl:208
...
Stacktrace:
[1] macro expansion at C:\Users\arbenede\.julia\v0.6\JuMP\src\parsenlp.jl:88 [inlined]
[2] macro expansion at C:\Users\arbenede\.julia\v0.6\JuMP\src\macros.jl:1201 [inlined]
[3] anonymous at .\<missing>:?
Any ideas about what is going on?
Thank,
-Arrigo