Hi,
I want to know how to output the first integer solution and its objective value found within B&B process in Mosek.
Hi,
I want to know how to output the first integer solution and its objective value found within B&B process in Mosek.
Welcome!
This should work with a solver-specific callback (which is called each time an integer solution is found). According to the readme in the Mosek.jl this functionality is wrapped. Unfortunately, I did not find an example how to do that with JuMP.
Yes, apparently you can call putcallbackfunc(t::MSKtask, f::Function)
The Mosek MOI wrapper in MosekTools.jl
does not have any special support for it so you’ll have to use JuMP.unsafe_backend
:
optimizer = unsafe_backend(model) # Gives you a `MosekTools.Optimizer`
task = unsafe_backend(model).task # Gives you a `Mosek.MSKtask`
function my_callback(where::Callbackcode, dinf::Vector{Float64}, iinf::Vector{Int32}, liinf::Vector{Int64})
# ...
end
putcallbackfunc(task, my_callback)
By careful that the mapping between the JuMP variables and the indices in the Mosek task may be a bit nontrivial. JuMP.optimizer_index
gives you the MOI.VariableIndex
associated to the MosekTools.Optimizer
. So given a JuMP variable x
, do
index = JuMP.optimizer_index(x) # Gives a `MOI.VariableIndex` corresponding to the index in `optimizer`
col = MosekTools.mosek_index(optimizer, index) # Gives a `MosekTools.ColumnIndex`
col.value # Gives a `Int32` corresponding to the column in `task`
Let us know how it goes, we could add MOI attributes in MosekTools to make this easier