# JuMP/CPLEX: how to set heuristic solution using SparseAxisArrays in callback

**URL:** <https://discourse.julialang.org/t/jump-cplex-how-to-set-heuristic-solution-using-sparseaxisarrays-in-callback/56938>\
**Category:** Optimization (Mathematical)\
**Created:** [March 11, 2021, 10:07am UTC](https://discourse.julialang.org/t/jump-cplex-how-to-set-heuristic-solution-using-sparseaxisarrays-in-callback/56938 "2021-03-11T10:07:35Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![mike\_k](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mike_k/32/211864_2.png) [@mike\_k](https://discourse.julialang.org/u/mike_k)\
**Post date:** [March 11, 2021, 10:07am UTC](https://discourse.julialang.org/t/jump-cplex-how-to-set-heuristic-solution-using-sparseaxisarrays-in-callback/56938/1 "2021-03-11T10:07:35Z")

</div>

Dear folks,  
unfortunately I fail to submit a heuristic solution using SparseAxisArrays in a callback. Here is an MWE:

```julia
using JuMP, CPLEX

model = JuMP.direct_model( CPLEX.Optimizer() )
set_optimizer_attribute( model, "CPXPARAM_Threads", 1 )
@variable( model, x[i=1:2, j=i:2], Bin )
@variable( model, y[i=1:2, j=i:2], Bin )
@objective( model, Max, sum(x) + sum(y) )
@constraint( model, sum(x) + sum(y) <= 5 )

function mycallback( cb_data::CPLEX.CallbackContext, context_id::Clong )
    if context_id == CPX_CALLBACKCONTEXT_CANDIDATE
        ispoint_p = Ref{Cint}()
        ret = CPXcallbackcandidateispoint(cb_data, ispoint_p)
        if ret != 0 || ispoint_p[] == 0
            return # No candidate point available or error
        end

        #get values
        CPLEX.load_callback_variable_primal(cb_data, context_id)
        xvals = callback_value.( Ref(cb_data), model[:x] ) #NOTE: type of xvals, yvals is JuMP.Containers.SparseAxisArray{Float64,2,Tuple{Int64,Int64}}
        yvals = callback_value.( Ref(cb_data), model[:y] )

        #set values
        xvals[1,1] = 0.0
        xvals[1,2] = xvals[2,2] = 1.0
        yvals[1,1] = yvals[1,2] = yvals[2,2] = 1.0

        #submit
        vars = [model[:x], model[:y]]
        vals = [xvals, yvals]
        status = MOI.submit( model, MOI.HeuristicSolution(cb_data), vars, vals )
        println("status: $status")
    end

    return
end
MOI.set(model, CPLEX.CallbackFunction(), mycallback)
optimize!( model )

```

where line `status = MOI.submit( model, MOI.HeuristicSolution(cb_data), vars, vals )` yields

```julia
LoadError: MethodError: no method matching submit(::Model, ::MathOptInterface.HeuristicSolution{CPLEX.CallbackContext}, ::Array{JuMP.Containers.SparseAxisArray{VariableRef,2,Tuple{Int64,Int64}},1}, ::Array{JuMP.Containers.SparseAxisArray{Float64,2,Tuple{Int64,Int64}},1})
Closest candidates are:
  submit(::MathOptInterface.Utilities.MockOptimizer, ::MathOptInterface.AbstractSubmittable, ::Any...) at /home/user/.julia/packages/MathOptInterface/ZJFKw/src/Utilities/mockoptimizer.jl:529
  submit(::MathOptInterface.Utilities.CachingOptimizer, ::MathOptInterface.AbstractSubmittable, ::Any...) at /home/user/.julia/packages/MathOptInterface/ZJFKw/src/Utilities/cachingoptimizer.jl:764
  submit(::MathOptInterface.Bridges.AbstractBridgeOptimizer, ::MathOptInterface.AbstractSubmittable, ::Any...) at /home/user/.julia/packages/MathOptInterface/ZJFKw/src/Bridges/bridge_optimizer.jl:1272

```

Do you have any suggestions what went wrong? Many thanks in advance.

---

<div class="post-metadata">

**Author:** ![odow](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/odow/32/28685_2.png) [@odow](https://discourse.julialang.org/u/odow)\
**Post date:** [March 11, 2021, 7:51pm UTC](https://discourse.julialang.org/t/jump-cplex-how-to-set-heuristic-solution-using-sparseaxisarrays-in-callback/56938/2 "2021-03-11T19:51:44Z")

</div>

Docs: [https://jump.dev/JuMP.jl/stable/callbacks/#Heuristic-solutions](https://jump.dev/JuMP.jl/stable/callbacks/#Heuristic-solutions)

You need to submit a vector of variables, and a vector of values.

Use something like:

```nohighlight
julia> vars = vcat(
           [model[:x][i, j] for i = 1:2 for j = i:2],
           [model[:y][i, j] for i = 1:2 for j = i:2]
       )
6-element Array{VariableRef,1}:
 x[1,1]
 x[1,2]
 x[2,2]
 y[1,1]
 y[1,2]
 y[2,2]

```

---

<div class="post-metadata">

**Author:** ![mike\_k](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mike_k/32/211864_2.png) [@mike\_k](https://discourse.julialang.org/u/mike_k)\
**Post date:** [March 12, 2021, 9:04am UTC](https://discourse.julialang.org/t/jump-cplex-how-to-set-heuristic-solution-using-sparseaxisarrays-in-callback/56938/3 "2021-03-12T09:04:43Z")

</div>

Great it works, thank you!!
