User Cut Callback being executed just once in every node (JuMP/CPLEX)

200 views
Skip to first unread message

Claudio Contardo

unread,
Nov 5, 2016, 6:53:02 PM11/5/16
to julia-opt
Hello,

I am experiencing the following issue when using user cut callbacks using CPLEX:

The callback is executed a single time at every node. Even if the callback succeeds at finding cuts, the solver does not call the separations again within the same node. Instead, CPLEX performs branching directly.

According to Pkg.status() I am using JuMP v0.14.0+ (master branch), CPLEX v0.1.7 (master branch).

When the solver is set to Gurobi, the callback gets called several times as expected while the separations keep finding cuts.

Is anyone capable of reproducing this issue?

Best regards,

Claudio

Joey Huchette

unread,
Nov 6, 2016, 7:19:35 PM11/6/16
to julia-opt

Hey Claudio,
I believe this is because we set the useraction_p parameter to CPX_CALLBACK_ABORT_CUT_LOOP here. I believe we chose this as the default since I noticed cycling-like behavior otherwise, but I can’t quite remember. You’re welcome to play around with other values (probably CPX_CALLBACK_DEFAULT); I’d be open to changing the default if the behavior makes sense.

-Joey


--
You received this message because you are subscribed to the Google Groups "julia-opt" group.
To unsubscribe from this group and stop receiving emails from it, send an email to julia-opt+unsubscribe@googlegroups.com.
Visit this group at https://groups.google.com/group/julia-opt.
For more options, visit https://groups.google.com/d/optout.

Claudio Contardo

unread,
Nov 7, 2016, 12:34:11 PM11/7/16
to julia-opt, huch...@mit.edu
Thank you Joey,

I followed your suggestion and for some weird reason (jus as you predicted) the user callback eventually enters into an inifinite loop in the middle of the separation process.

Best regards,

Claudio


On Sunday, November 6, 2016 at 9:19:35 PM UTC-3, Joey Huchette wrote:

Hey Claudio,
I believe this is because we set the useraction_p parameter to CPX_CALLBACK_ABORT_CUT_LOOP here. I believe we chose this as the default since I noticed cycling-like behavior otherwise, but I can’t quite remember. You’re welcome to play around with other values (probably CPX_CALLBACK_DEFAULT); I’d be open to changing the default if the behavior makes sense.

-Joey

On Sat, Nov 5, 2016 at 6:53 PM, Claudio Contardo <ccon...@gmail.com> wrote:
Hello,

I am experiencing the following issue when using user cut callbacks using CPLEX:

The callback is executed a single time at every node. Even if the callback succeeds at finding cuts, the solver does not call the separations again within the same node. Instead, CPLEX performs branching directly.

According to Pkg.status() I am using JuMP v0.14.0+ (master branch), CPLEX v0.1.7 (master branch).

When the solver is set to Gurobi, the callback gets called several times as expected while the separations keep finding cuts.

Is anyone capable of reproducing this issue?

Best regards,

Claudio

--
You received this message because you are subscribed to the Google Groups "julia-opt" group.
To unsubscribe from this group and stop receiving emails from it, send an email to julia-opt+...@googlegroups.com.

Joey Huchette

unread,
Nov 7, 2016, 1:05:05 PM11/7/16
to julia-opt
Out of curiosity, why does it not suffice to enter the callback once per node? You can separate and add multiple cuts in a single "call" to the callback function.

-Joey

To unsubscribe from this group and stop receiving emails from it, send an email to julia-opt+unsubscribe@googlegroups.com.

Claudio Contardo

unread,
Nov 7, 2016, 1:21:13 PM11/7/16
to julia-opt, huch...@mit.edu
My separation routines generate a few cuts each time. I need to reoptimize to see if I get to find more. Moreover, some of my separation routines are more time consuming than others and are thus separated last. I wanted to abort the separation call as soon as one of the first separations found anything, then reoptimize and proceed with the separation routines again (from the beginning). Currently, CPLEX either loops infinitely (using CPX_CALLBACK_DEFAULT) or I never get to execute the more time consuming (but eventually more powerful) separation routines (using CPX_CALLBACK_ABORT_CUT_LOOP).

Besides, I also tried Gurobi but I discovered another issue. Gurobi apparently has an internal parameter that decides on its own when to abort the cut callback and proceed instead to branching. Again, Gurobi sometimes decides to abort before I get the chance of running the more expensive separations.

I really need a callback that allows me to: 1) reoptimize every time I generate cuts; and 2) let me decide when to abort the cut callback (and of course 3) that does not cycle!)

Best,

Claudio

Miles Lubin

unread,
Nov 7, 2016, 2:04:01 PM11/7/16
to julia-opt, Joey Huchette

You should look into using SCIP then.


To unsubscribe from this group and stop receiving emails from it, send an email to julia-opt+unsubscribe@googlegroups.com.

c.d. mclean

unread,
Nov 7, 2016, 9:51:59 PM11/7/16
to julia-opt, huch...@mit.edu

potentially of interest, and likely obvious:




Reply all
Reply to author
Forward
0 new messages