Shahin,
I am unable to parse your second paragraph. Perhaps you can clarify.
Control comes in the UserCutCallback,
Meaning CPLEX calls the UCC at a particular node?
!isAfterCutLoop() becomes True
You call isAfterCutLoop() inside the UCC and it returns false?
and returns
Who returns, the UCC? Does it add a cut first?
and never comes back.
Meaning the UCC is not called again at that node, or that it is never called again at any node?
Therefore I cannot separate any cut and my final solution is infeasible.
How could adding user cuts prevent an "infeasible" solution for being chosen? By fiat, user cuts cannot alter the integer hull of the problem; they can only remove part of the "fat" around the integer hull (the non-integer points that are in the LP hull but not the integer hull). If you are trying to block solutions that are feasible in the model you originally handed to CPLEX, you should be using lazy constraints, not user cuts. This, however, would seem to have nothing much to do with whether you are setting a non-default optimality tolerance.
Paul
#CPLEXOptimizers#DecisionOptimization