I solve a pure integer linear program (all variables are binary) by calling:
model.params.LazyConstraints = 1
model.optimize(callback)
The initial model had 441 constraints, and I had to add 944 additional distinct constraints in total when Gurobi called my callback function. I counted it myself in my callback function. I am fairly certain that at least some of those constraints were absolutely necessary to find the optimal solution and to prove its optimality (though I haven't checked this).
In the summary section of the log file I see something like:
Cutting planes:
Gomory: 4
Flow cover: 7
Zero half: 21
How should I interpret this cutting planes summary?
Did Gurobi compact my 944 lazy constraints into these 32 cutting planes?
Can I somehow make the solution process faster based on this information?
In other words, is this information actionable? Does it convey anything useful?
Using the terminology of Constraint Integer Programming (PhD thesis of Tobias Achterberg), I assume that Gurobi, among other things, did something similar to what is discussed in 3.3.8 Separation Storage, and that Gurobi generated those cutting planes with clever heuristics based on my lazy constraints ("compacted" my lazy constraints into smart cutting planes).
Is there a place in the official Gurobi website / documentation where this is explained at least on a very high level?
If not: Which sections of Tobias Achterberg's PhD thesis are the closest descriptions of what is happening here?
Many thanks in advance,
Ali