[Cgl] CglCutGenerator modifications

fmargot at andrew.cmu.edu fmargot at andrew.cmu.edu
Sat Jul 22 11:11:35 EDT 2006


I would like to start the discussion on modifications to the 
CglCutGenerator class (or derived) in order to incorporate features that
are missing currently. I will start a second thread related to
numerical issues, so I would like to focus on other issues in
the present thread.

Collecting what I heard at the DIMACS workshop and incorporating a
few things of my own, the following list includes some of the modifications
that could be considered:

-------------------------
1) Uniform behavior of the generators regarding the treatment of identical
or near identical cuts. Currently, some generators remove duplicate cuts, 
while most do not. The default might be not to check for duplicate cuts,
but it should be possible to require that duplicate cuts are removed.
Checking for identical cuts is not trivial, hashing might be necessary.
Note that the natural place to implement this might be in class OsiCuts
instead than in Cgl.

-------------------------
2) Uniform behavior of the generators regarding cut density. 
Some generators have a parameter "limit" (or other) for the maximum number 
of nonzero coefficients that can be part of a returned cut. The suggestion
here is to use a more descriptive name than "limit" and enforcing this
upper bound in all generators. The default value for the upper bound
might be generator dependent, or made uniform across generators.

-------------------------
3) Implementing a time limit for the generateCuts() method in each generator
such that cut generation is aborted if the time limit is reached, returning
available cuts at that point. This might not be possible for all generators.

-------------------------
4) Adding a debugging method to set a vector "x_do_not_cut" corresponding
to a point that should not be cut by the generator. For each generated cut, 
check that "x_do_not_cut" is not cut and raise an error otherwise.
The check can be done either at the very end of cut generation or 
in earlier computation, depending on the generator. By default, 
"x_do_not_cut" is NULL and the checks are performed only if 
the user sets it to something.

-------------------------
5) Decoupling the generators with Osi, either totally or partially.
While for most applications an OsiSolverInterface containing the
description of the problem is available, the Cgl library should not
require it. It is possible to add a generateCuts() method with
parameters containing all the information needed by the generator
(constraint matrix, rhs, bounds, etc ...). This would probably be
a method that would be generator dependent as the information that
the generator needs might vary for each generator.

If the complete decoupling with Osi is not possible or deemed unnecessary, 
adding a method to separate an arbitrary point instead of the optimal 
solution held by the OsiSolverInterface is relatively easy.
This is not feasible for all generators, of course, but for those
who can this could be handy. The suggestion here is to add
a virtual method

virtual void generateCuts( const OsiSolverInterface & si, 
double &x_to_separate,
OsiCuts & cs, const CglTreeInfo info = CglTreeInfo()) const=0;

raising an error by default. This would be reimplemented in the
generator classes that can handle that query.
-------------------------

Please comment on the above changes and submit your own suggestions.
What will be implemented in the near future depends on your feedback.

Francois



More information about the Cgl mailing list