Unexpected file name on writing the solution
When calling model.write('myfile.mps'), the resulting output file myfile.mps.mps.gz is created.
- Please remove the invalid
mps.mpssuffix, the end result should be namedmyfile.mps.gz. - It would likely be better if I were given an API option to choose if I want the result zipped or not. In my case, plaintext would be much better since I want to store this in a source control repository as a regression test, so now I have to add a step to unzip the file inside my process.
Thank you.
Running python 3.7 on mip-1.13.0 on both Windows and Linux.
Given this issue and #300, is it desirable to defer writing the model to Cbc? I think that, since the mip library knows the model definition, it could be responsible for writing (and potentially reading) well-structured .lp and .mps files.
Another issue with using Cbc for writing models to files is that its output is sometimes unreadable by other solvers. For example, if I try to write a .mps file with Cbc and read it with GLPK, I get this error:
% glpsol --mps coolmodel.mps
GLPSOL--GLPK LP/MIP Solver 5.0
Parameter(s) specified in the command line:
--mps coolmodel.mps
Reading problem data from 'coolmodel.mps'...
Problem: BLANK
coolmodel.mps:4: in fixed MPS format positions 13-14 must be blank
MPS file processing error
Writing .lp. and .mps files correctly should not be an enormous lift and would provide better interoperability.
In looking through SolverCbc.write, it should be easy to remove the repetitive .mps extension.
There are also a few bugs in the code that can be eliminated. For example, say we're a solving a model with the acronym "lumps". m.write("lu.mps.lp") will write a lu.mps.lp.mps.gz file instead of a .lp file.
I think the method should look like this. Happy to open a PR if you like.
def write(self, file_path: str):
fpstr = file_path.encode("utf-8")
flower = file_path.lower()
if flower.endswith(".mps"):
# CBC adds a ".mps.gz" extension for us.
cbclib.Cbc_writeMps(self._model, fpstr[:-4]) # remove .mps extension
elif flower.endswith(".lp"):
cbclib.Cbc_writeLp(self._model, fpstr)
elif flower.endswith(".bas"):
cbclib.Cbc_writeBasis(self._model, fpstr, CHAR_ONE, 2)
else:
raise ValueError(
"Enter a valid extension (.lp, .mps or .bas) \
to indicate the file format"
)
i would say this need to be fixed in the c-interface on cbc side. But there is nobody at the moment who will fix this at cbc side
As @sebheger said, it would be helpful if you would report these issues over at Cbc rather than here. I cannot guarantee anything, as the developer bandwidth is limited, but there is a good chance that low-hanging fruit like this would get addressed. A PR would also be more than welcome.
When will this bug be fixed?