Assertion `new_infeasibility < 0' failed in HEkkPrimal.cpp:2813: void HEkkPrimal::shiftBound()
Running SCIP with HiGHS in debug mode on https://miplib.zib.de/instance_details_traininstance2.html runs into the above assert.
The attached log traininstance2.txt shows that SCIP initially calls the dual simplex, HiGHS reaches the objective limit, and then switches the primal.
In rebuild() -> correctPrimal() the assert fails because the bound is huge and adding the small perturbation of 1e-6 gets lost. Maybe the perturbation added should be scaled up by the size of the bound, if you want to break degeneracy in this case.
Thanks, I'll take a look in due course
One suggestion, not sure what you think: use a combination of relative and absolute perturbation:
- for bounds with abs. value smaller than X keep as now
- for larger bounds multiply the perturbation with (abs. value of the bound / X) X could be something like 1e4 then, the perturbation would be at least 1e-10 times the bound and would not disappear when added.
I implemented this suggestion in pull request #1175 ; it resolves the problem in this issue.
What do you think?
I'll look at it, but will have to be sure that it doesn't lead to other problems or impair general performance
Of course.