[Cmpl] Time-out and objective questions

Michel Iwaniec michel.iwaniec at gmail.com
Sun Jun 20 19:12:33 EDT 2021


Hi Mike - and many thanks for your reply.

I had completely missed there was a CMPL2 in the works... I was wondering
why activity on the original source repo seemed to have slowed down a bit
in the recent years. Great to hear there's active work on a new version.
Would love to beta test CMPL2 with OverlayPal.

I did actually get crashes when trying to use CMPL 1.12, which is why I've
stuck with the older 1.11 for both Windows and Linux.
I was actually going to report that bug... but with CMPL2 around the corner
I guess it's better to raise any bugs for CMPL2 instead?

I tried cloning the CMPL2 repo but could not get it building with Qt
creator 4.14 for Windows. I'll see if I can figure the compilation problems
out in the week, but if there's going to be a compiled binary that might be
a better start for me.

Unfortunately I think neither Gurobi nor CPLEX are affordable alternatives
for my small niche project. I'll have to stick to the free alternatives for
now.
So I think the only other possible alternative for the solver backend is
GLPK, but I'm not sure how it compares with CBC for integer problems.

However I'm pretty sure that CBC must support a no-objective solve somehow,
given that PuLP allowed me to just omit the objective when using the CBC
backend. But the low-level API of CBC is a bit too much for me to digest at
the moment :)

Kind Regards,
Michel

On Sat, Jun 19, 2021 at 12:03 PM Mike Steglich <mike.steglich at th-wildau.de>
wrote:

> Hi Michel,
>
> Thank you for your interest in CMPL. Your project sounds very interesting!
>
> Please see my answers below:
>
> Am 18.06.2021 um 00:34 schrieb Michel Iwaniec <michel.iwaniec at gmail.com>:
>
> 
> Hi,
>
> I have a few questions regarding CMPL, which are sort-of-related, as they
> both relate to trying to stop CMPL / CBC solving sooner using either a
> time-out value or tweaking the objective.
>
> First a bit of background: My GPL project that uses CMPL + CBC is an
> image-to -background+sprites converter for the 8-bit NES / Famicom console:
> https://github.com/michel-iwaniec/OverlayPal
>
> At the moment I've just been invoking CMPL as a sub-process from my own
> program, although I do plan to build CMPL from source to integrate it more
> properly at some point in the future.
>
> I've been really impressed with CMPL's neat mathematical language, and
> especially the support for variable products.
> I previously used PuLP in Python where I kept introducing "big-M-logic",
> and my code got very difficult to maintain as the model grew in complexity.
> CMPL's variable-product-feature really got things cleaned up again.
>
> Anyway, on to the questions/issues I'm having:
>
> *** Question#1 ***
>
> My program has a need for a variable timeout that can be set from the GUI.
> However, while the CMPL language file allows setting a fixed timeout using
> a parameter "%opt cbc seconds 123" I have not found any way to set this
> from the command-line when executing cmpl(.exe). Nor have I been able to
> specify it in my data file included using the "%data" directive.
>
> So my current work-around is to just create another copy of my .cmpl
> program file that has the "%opt cbc seconds 123" parameter line prepended
> to it, and run this program instead. It works but is an extra step I'd
> rather avoid if I could.
>
> So is setting the timeout using command-line parameters / data files not
> supported, or have I just missed something obvious here?
>
>
> In CMPL1, solver options can only be defined as CMPL headers.  This will
> change in CMPL2, for which we will soon start a beta phase. (I am working
> on the manual as last step before the official beta phase starts.)  I can
> send a link to the current beta versions next week. The source can be found
> here: https://github.com/MikeSteglich/Cmpl2
>
>
>
>
> *** Question#2 ***
>
> Secondly, I'd also like to support a mode where *any* valid solution is
> accepted by CMPL, to avoid spending too much time on refining a valid
> solution. i.e., this mode should accept the first valid solution and only
> use the timeout where finding a solution / deciding the problem is
> unsolvable takes too long to be acceptable.
>
> When I used PuLP + CBC, this was easy enough to do by just leaving out the
> objective of the optimization problem entirely.
>
> But the same trick didn't seem to work with CMPL. If I try to remove the
> "objective" section I get an error from cmpl(.exe) saying "Error
> (interfaces): No objective function found.".
>
> Is there some existing way to achieve this which I haven't thought of?
>
>
> If you use Gurobi or Cplex, %display solutionPool might help. I have put
> this problem for Cbc on my ToDo list.
>
> *** Question#3 ***
>
> Kind of a follow-up to Q#2. Another "mode" that might be useful in my case
> is to combine both of these features, by having the ability to set a
> timeout that is ignored until at least one valid solution is found.
> i.e., the intended behavior is that my program should at least keep
> running until a valid solution has been found, in order to produce a valid
> result for the user... but it should not spend any more time finding a
> better solution if the provided time budget has already been exhausted.
>
> I'm already assuming this sort of configurability is probably a bit too
> specific to support using either the existing command-line parameters or
> language directives. But I was wondering if there might be some relatively
> easy way to do it using CMPL's internal C++ API?
>
> Thanks again for making such a useful open-source tool! :)
>
>
> SolutionPool works in this way in combination with e.g. MipGap …
>
>
> // Michel
> _______________________________________________
> Cmpl mailing list
> Cmpl at list.coin-or.org
> https://list.coin-or.org/mailman/listinfo/cmpl
>
>
> Mike
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://list.coin-or.org/pipermail/cmpl/attachments/20210621/dba109d8/attachment.html>


More information about the Cmpl mailing list