Segmentation fault when adding lazy constaints to CBC
Describe the bug
I create a small MIP model, using CBC. I also create a ConstrsGenerator and add it via model.lazy_constrs_generator.
When I call model.optimize(), Python crashes with a segmentation faul.
To Reproduce See script and output in gist.
Desktop (please complete the following information):
- Operating System, version: Linux t440p 4.19.0-14-amd64 #1 SMP Debian 4.19.171-2 (2021-01-30) x86_64 GNU/Linux
- Python version: CPython 3.7.3
- Python-MIP version (we recommend you to test with the latest version): 1.13.0
Additional context
I believe that the generate_constrs method of the ConstrsGenerator is not even called. Also, when adding it via model.cuts_generator, there is no crash (but it's also never called?).
Maybe this has to do with the limited preprocessing in CBC that the documentation hints at?
I found that the script to reproduce the problem can be simplified to:
import mip
class CutGen(mip.ConstrsGenerator):
pass
model = mip.Model(solver_name="CBC")
x = model.add_var("x", var_type=mip.BINARY)
model.lazy_constrs_generator = CutGen()
status = model.optimize()
For what it's worth, I also checked all released versions of python-mip from 1.8 to 1.13, to see whether the crash is related to an updated version of the CBC library.
If you just add an "obsolete" constraint, it works.
model += x <= 1
Seems to be an issue related to adding a lazy constraint generator if the model itself has no constraints. No issue with this for gurobi, only for CBC.