Juniper Boolean variable example with MTK

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.

Hi @dmetivie,

See MathOptInterface.jl · Optimization.jl

You need to declare an integer variables with a lower bound of 0 and an upper bound of 1.