I want to reproduce the Juniper README example (with Binary variable and nonlinear non-convex objective).
It has been done with JuMP.jl, with Optimization.jl (here). But I cannot reproduce it using ModelingToolKit.jl
It would be great if the following just worked
using Juniper, Ipopt
using Optimization
using OptimizationMOI
using LinearAlgebra
using ModelingToolkit
@variables u[1:5]::Bool
@parameters begin
v[1:5]::Int = [10, 20, 12, 23, 42]
w[1:5]::Int = [12, 45, 12, 22, 21]
end
cons = [
sum(w[i] * u[i]^2 for i in 1:5) ≲ 45
]
obj = dot(v, u)
@named optsys = OptimizationSystem(obj, u, vcat(v,w), constraints = cons)
optsys = complete(optsys)
optprob = OptimizationProblem(optsys,
zeros(Bool, 5); # initialization
sense = Optimization.MaxSense,
# int = fill(true, 5) # Do I need that?
)
nl_solver = OptimizationMOI.MOI.OptimizerWithAttributes(Ipopt.Optimizer,
"print_level" => 0)
minlp_solver = OptimizationMOI.MOI.OptimizerWithAttributes(Juniper.Optimizer,
"nl_solver" => nl_solver)
sol = solve(optprob, minlp_solver)
I get
ERROR: MethodError: no method matching OptimizationMOI.MOIOptimizationNLPEvaluator(::OptimizationFunction{…}, ::OptimizationBase.ReInitCache{…}, ::Vector{…}, ::Vector{…}, ::BitVector, ::Vector{…}, ::Vector{…}, ::ObjSense, ::Matrix{…}, ::Matrix{…}, ::Vector{…}, ::Nothing, ::Int64, ::Expr, ::Vector{…})
The type `OptimizationMOI.MOIOptimizationNLPEvaluator` exists, but no method is defined for this combination of argument types when trying to construct it.
Closest candidates are:
OptimizationMOI.MOIOptimizationNLPEvaluator(::F, ::RC, ::LB, ::UB, ::I, ::Vector{T}, ::Vector{T}, ::S, ::JT, ::HT, ::Vector{CHT}, ::CB, ::Int64, ::Union{Nothing, Expr}, ::Union{Nothing, Vector{Expr}}) where {T, F<:OptimizationFunction, RC, LB, UB, I, JT<:Union{Matrix{T}, SparseArrays.SparseMatrixCSC{T}}, HT<:Union{Matrix{T}, SparseArrays.SparseMatrixCSC{T}}, CHT<:Union{Matrix{T}, SparseArrays.SparseMatrixCSC{T}}, S, CB}
@ OptimizationMOI C:\Users\metivier\.julia\packages\OptimizationMOI\aLp6X\src\nlp.jl:6
Stacktrace:
[1] OptimizationMOI.MOIOptimizationNLPCache(prob::OptimizationProblem{…}, opt::MathOptInterface.OptimizerWithAttributes; mtkize::Bool, callback::Nothing, kwargs::@Kwargs{…})
@ OptimizationMOI C:\Users\metivier\.julia\packages\OptimizationMOI\aLp6X\src\nlp.jl:196
[2] MOIOptimizationNLPCache
@ C:\Users\metivier\.julia\packages\OptimizationMOI\aLp6X\src\nlp.jl:108 [inlined]
[3] __init(prob::OptimizationProblem{…}, opt::MathOptInterface.OptimizerWithAttributes; maxiters::Nothing, maxtime::Nothing, abstol::Nothing, reltol::Nothing, mtkize::Bool, kwargs::@Kwargs{})
@ OptimizationMOI C:\Users\metivier\.julia\packages\OptimizationMOI\aLp6X\src\OptimizationMOI.jl:302
[4] __init
@ C:\Users\metivier\.julia\packages\OptimizationMOI\aLp6X\src\OptimizationMOI.jl:293 [inlined]
[5] #init#728
@ C:\Users\metivier\.julia\packages\SciMLBase\Pma4a\src\solve.jl:173 [inlined]
[6] init
@ C:\Users\metivier\.julia\packages\SciMLBase\Pma4a\src\solve.jl:171 [inlined]
[7] solve(::OptimizationProblem{…}, ::MathOptInterface.OptimizerWithAttributes; kwargs::@Kwargs{})
@ SciMLBase C:\Users\metivier\.julia\packages\SciMLBase\Pma4a\src\solve.jl:95
[8] solve(::OptimizationProblem{…}, ::MathOptInterface.OptimizerWithAttributes)
@ SciMLBase C:\Users\metivier\.julia\packages\SciMLBase\Pma4a\src\solve.jl:92
[9] top-level scope
@ c:\Users\metivier\Dropbox\PC (2)\Documents\Simulations\SWG\article_swg_25_02_03_revision_ascmo\test_optimization.jl:61
Some type information was truncated. Use `show(err)` to see complete types.
which I cannot understand.
I guess dealing with Boolean variable is not that simple? I did not find such examples in MTK.jl.
Indeed removing all mention of Bool (in the variable and initialization) + adding grad = true, hess = true, cons_j = true, cons_h = true
in the OptimizationProblem
works.