Originally posted by: TobiasAchterberg
There is a difference between the root node and nodes deeper in the tree. And for non-root nodes there is also a difference between deterministic and opportunistic parallel mode, and between different CPLEX versions.
At the root node, it basically (in CPLEX 12.5.1) like this:
1. Solve LP relaxation.
2. If not enough progress since last iteration, goto 11.
3. Call heuristic callback.
4. Call CPLEX internal heuristics.
5. Apply probing.
6. Call cut callback (wherefrom = CPX_CALLBACK_MIP_CUT_LOOP). If user signaled to terminate loop, goto 11.
7. Separate CPLEX internal cuts and the user cut pool.
8. Call pumpreduce to try to pivot to a "more integral" vertex on the optimal face of the LP polyhedron.
9. Filter cuts (also filter user cuts if indicated by the user's cut purging flag).
10. Goto 1.
11. Call the cut callback (wherefrom = CPX_CALLBACK_MIP_CUT_LAST).
12. If any cuts have been found, filter cuts and goto 1.
With CPLEX 12.5.1, the cuts at non-root nodes are separated as follows:
1. Solve LP relaxation.
2. If not enough progress since last iteration, goto 7.
3. Call cut callback (wherefrom = CPX_CALLBACK_MIP_CUT_LOOP). If user signaled to terminate loop, goto 7.
4. Only during the first cut loop iteration: If cut callback did not find any cuts, separate CPLEX internal cuts and the user cut pool. Here, it can happen that the user cut pool is not looked at if some other CPLEX internal cut separator found cuts.
5. Filter cuts.
6. Goto 1.
7. Call the cut callback (wherefrom = CPX_CALLBACK_MIP_CUT_LAST).
8. If any cuts have been found, filter cuts and goto 1.
Hope this helps...
#CPLEXOptimizers#DecisionOptimization