jump-dev / HiGHS.jl

A Julia interface to the HiGHS solver
https://highs.dev
MIT License
108 stars 15 forks source link

Support the HiGHS callback in MOI #228

Closed odow closed 2 weeks ago

odow commented 3 weeks ago

Required for https://github.com/jump-dev/open-energy-modeling-benchmarks/issues/17

odow commented 3 weeks ago
using HiGHS
import MathOptInterface as MOI
model = HiGHS.Optimizer()
x = MOI.add_variables(model, 2)
MOI.add_constraint.(model, x, MOI.GreaterThan(0.0))
ci = MOI.add_constraint(model, x[1] + 2.0 * x[2], MOI.LessThan(3.0))

function run_user_callback(
    callback_type::Cint,
    message::Ptr{Cchar},
    p_data_out::Ptr{HiGHS.HighsCallbackDataOut},
    p_data_in::Ptr{HiGHS.HighsCallbackDataIn},
    user_callback_data::Ptr{Cvoid},
)
    data_out = unsafe_load(p_data_out)::HiGHS.HighsCallbackDataOut
    # @show data_out
    if p_data_in != C_NULL
        data_in = unsafe_load(p_data_in)::HiGHS.HighsCallbackDataIn
    end
    print(unsafe_string(message))
    return
end

callback_cfn = @cfunction(
    run_user_callback,
    Cvoid,
    (
        Cint, 
        Ptr{Cchar}, 
        Ptr{HiGHS.HighsCallbackDataOut}, 
        Ptr{HiGHS.HighsCallbackDataIn}, 
        Ptr{Cvoid},
    ),
)
HiGHS.Highs_setCallback(model, callback_cfn, C_NULL)
HiGHS.Highs_startCallback(model, HiGHS.kHighsCallbackLogging)
MOI.optimize!(model)