python-mip icon indicating copy to clipboard operation
python-mip copied to clipboard

Segmentation fault when adding lazy constaints to CBC

Open rschwarz opened this issue 4 years ago • 2 comments

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?

rschwarz avatar Feb 16 '21 17:02 rschwarz

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.

rschwarz avatar Feb 17 '21 15:02 rschwarz

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.

sebheger avatar Jan 26 '22 23:01 sebheger