# User cuts and Lazy Constraints JuMP Gurobi

**URL:** <https://discourse.julialang.org/t/user-cuts-and-lazy-constraints-jump-gurobi/53328>\
**Category:** Optimization (Mathematical)\
**Tags:** jump\
**Created:** [January 14, 2021, 11:10am UTC](https://discourse.julialang.org/t/user-cuts-and-lazy-constraints-jump-gurobi/53328 "2021-01-14T11:10:37Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![baprata](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baprata/32/204269_2.png) [@baprata](https://discourse.julialang.org/u/baprata)\
**Post date:** [January 14, 2021, 11:10am UTC](https://discourse.julialang.org/t/user-cuts-and-lazy-constraints-jump-gurobi/53328/1 "2021-01-14T11:10:37Z")

</div>

I am trying to insert user cuts and lazy constraints in a mixed-integer linear programming model. I am putting the functions in separate files from the main model. An illustrative example:

function valid\_inequality(cb\_data)  
con = @constraint([i in 1:m,j in 1:n, k in 1:n], sum(X[i,j,k,l] for l in 1:s)\<=1)  
MOI.submit(model, MOI.UserCutCallback(), con)  
end

in the main file:  
MOI.set(model, MOI.UserCutCallback(), valid\_inequality)

And Julia is returning:  
UndefVarError: i not defined

The examples of user cuts and lazy constraints in the JuMP documentation does not present decision variables with several indices.

Thanks in advance,  
Bruno

---

<div class="post-metadata">

**Author:** ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)\
**Post date:** [January 14, 2021, 12:49pm UTC](https://discourse.julialang.org/t/user-cuts-and-lazy-constraints-jump-gurobi/53328/2 "2021-01-14T12:49:29Z")

</div>

Please, enclosure your code in triple backticks to make it easier to read:

```  
code  
```

becomes

```julia
code

```

Second, I do not think you should call [`@constraint`](https://jump.dev/JuMP.jl/dev/reference/constraints/#JuMP.@constraint) without passing a model as first argument. If you read the documentation for [`@constraint`](https://jump.dev/JuMP.jl/dev/reference/constraints/#JuMP.@constraint) you will see that to build a constraint without immediately associating it to a model you should use [`@build_constraint`](https://jump.dev/JuMP.jl/dev/reference/callbacks/#JuMP.@build_constraint), that is inside a page called [`Callbacks API`](https://jump.dev/JuMP.jl/dev/reference/callbacks/).

---

<div class="post-metadata">

**Author:** ![baprata](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baprata/32/204269_2.png) [@baprata](https://discourse.julialang.org/u/baprata)\
**Post date:** [January 15, 2021, 8:57am UTC](https://discourse.julialang.org/t/user-cuts-and-lazy-constraints-jump-gurobi/53328/3 "2021-01-15T08:57:06Z")

</div>

Dear Henrique. Thank you for your feedback. Regarding the source code, my mistake. I am sending the code again:

```julia
function valid_inequality(cb_data)
con = @I constraint([i in 1:m,j in 1:n, k in 1:n], sum(X[i,j,k,l] for l in 1:s)<=1)
MOI.submit(model, MOI.UserCutCallback(), con)
end

```

in the main file:

```julia
MOI.set(model, MOI.UserCutCallback(), valid_inequality)

```

And Julia is returning:

```julia
UndefVarError: i not defined

```

I replace @constraint with @build\_constraint, following your suggestion.

I am trying to solve the problem.

Where can I find an example about user-cuts and lazy constraints with decision variables with multiple dimensions? In the documentation, the decision variable presents a single dimension:  
[https://jump.dev/JuMP.jl/dev/callbacks/#callbacks\_manual](https://jump.dev/JuMP.jl/dev/callbacks/#callbacks_manual)

Thanks in advance,  
Bruno

---

<div class="post-metadata">

**Author:** ![Henrique\_Becker](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/henrique_becker/32/15443_2.png) [@Henrique\_Becker](https://discourse.julialang.org/u/Henrique_Becker)\
**Post date:** [January 15, 2021, 1:11pm UTC](https://discourse.julialang.org/t/user-cuts-and-lazy-constraints-jump-gurobi/53328/4 "2021-01-15T13:11:27Z")

</div>

> [@baprata](#):
>
> `[i in 1:m,j in 1:n, k in 1:n], sum(X[i,j,k,l] for l in 1:s)<=1`

I think the `@build_constraint` macro (that is the right one to call here) does not support this syntax, it only builds one constraint per call. Probably they forgot or never considered in the first place, does not seem intentional.

You would need to do something like this:

```julia
cuts_to_add = Any[] # maybe tighten the typing someday
for i in 1:m,j in 1:n, k in 1:n
    cut = @build_constraint(sum(X[i,j,k,l] for l in 1:s)<=1)
    push!(cuts_to_add, cut)
end
MOI.submit.((model,), (MOI.UserCutCallback(),), cuts_to_add)

```

Maybe it is not the best performant code but it should work.

---

<div class="post-metadata">

**Author:** ![baprata](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baprata/32/204269_2.png) [@baprata](https://discourse.julialang.org/u/baprata)\
**Post date:** [January 16, 2021, 8:43am UTC](https://discourse.julialang.org/t/user-cuts-and-lazy-constraints-jump-gurobi/53328/5 "2021-01-16T08:43:10Z")

</div>

Dear Henrique,

Thank you very much for your attention. I have inserted this code, and it works fine. Thanks.

```julia
    function cuts_to_add(cb_data)
        for i in 1:m, j in 1:n, k in 1:n
            cut = @build_constraint(sum(X[i,j,k,l] for l in 1:s)<=1)
            MOI.submit(model, MOI.UserCut(cb_data), cut)
        end
    end

    MOI.set(model, MOI.UserCutCallback(), cuts_to_add)

```
