view


Q: How do I activate the experimental simplex code - Aboca ?
A: With great care.

  • Download Clp/trunk
  • Check it works - you should not notice much difference.
  • Point to CoinUtils/trunk. Copy Dependencies to xxxxxx and edit to be CoinUtils/trunk/CoinUtils. Then do svn propset svn:externals -F xxxxxx . (note .). Then do svn up.
  • Check it works - you should not notice much difference.
  • Add -DCLP_HAS_ABC=2 to CXXDEFS in configure and build.

Now you should have a serial version of Aboca. It is full of bugs so be patient. Aboca is activated by clp -abc on .....

Now the fun starts. If you have a recent Intel compiler then all you need to do is use -DCLP_HAS_ABC=4 (you also have to add -DINTEL_COMPILER to avoid a bad syntax error). If you want to use the Cilk branch of gcc 4.8 then download and build svn://gcc.gnu.org/svn/gcc/branches/cilkplus

To use on a four core machine export CILK_NWORKERS=4. -abc on then divides some stuff into 2*nworkers - you can override this for uniform testing by e.g. -abc eight

Enjoy! There is a unreadable version of my talk at Berlin at ISMP 2012 talk Some formatting went wrong when I converted from .odp to .ppt. Also see configure notes

Q: What happens if I type ?? ?
A: Normally if you type xx? and more than one parameter matches then a list of all parameters starting xx is printed out. If only one matches then a one line description of what it does is also printed out. If you use a double query then in the first case a one line description is printed for each parameter, while in the second case a longer description is also printed out and the possible options and current value.

Setting the hidden parameter verbose to a value greater than zero also has the same effect even with a single query.

Q: Are all the options for Cbc listed with a query?
A: You must be joking. To see all parameters, either use allC(ommands) or set verbose to 15 and then use ? or ??

Q: What can I do about degeneracy?
A: The stand-alone version of Clp by default switches on perturbation if it thinks the problem needs it. For primal it looks at values of bounds and rhs and if they have sufficiently different values it does not perturb, otherwise it modifies the bounds/rhs by small random amounts. For dual it looks at the costs. Even when it does not perturb it will switch on perturbation after so many iterations if it thinks it is a good idea.

Normally the perturbed problem takes fewer iterations but a few more iterations may be needed to clean up and use the original costs/bounds/rhs. For advanced use you can vary the amount of perturbation with the "pertValue" parameter. The default is 50, but it can be set to 51 through 61 where 51 is a very small perturbation and 61 is a large one. 50 normally is the same as 56 but gives the code a bit more freedom as to what to do. To give an idea of possibilities let us use a degenerate problem "nug12". On my laptop using Clp with Lapack installed (so factorization can switch to dense if it wants) the default uses the dual algorithm and takes 92,341 iterations and 177.8 seconds. Using a larger perturbation pertValue=59 it takes 52,102 iterations and 78.9 seconds.

However there is another thing we can do. In "Pivot selection methods in the Devex LP code" by PMJ Harris there is an explanation of how to use feasibility tolerances in a creative way to allow more options on exactly which variable to pivot in or out of basis. So the default value of the dual tolerance is 1.0e-7 but setting dualTolerance=5.0e-4 (which was Paula Harris' favourite value for the primal tolerance in primal - she argued that was the accuracy of the input data) takes 58,200 iterations and 83.7 seconds. Playing with perturbation and tolerance you can get it down below 40 seconds.

However for this particular problem you can do much better. Using barrier (even Clp's not too good one) gives 70.7 seconds while straightforward primal takes 25,390 iterations and 50.9 seconds. The easy champion is the Idiot heuristic followed by primal so

clp nug20.mps -idiot 200 -primals

takes 7.6 seconds!!! Using this approach you can solve nug20 in two hours but nug30 looked as if it would take a few weeks.

Q: What does tune(PreProcess) do?
A: The "documentation" is not quite correct as the clique size is now ignored (assumed to be 5) and the bottom bits are used for various options. Also if experimenting you may wish to use nnmmkkkk format where nn is number of major passes and mm is number of minor passes. The bit settings in kkkk are -

  • 2 - make some variables integer
  • 4 - make more variables integer
  • 32 - switch on some extra presolve options
  • 64 - try both clique replacement and dominated rows (if reasonable number of plus ones)
  • 128 - use Bron-Kerbosch to replace large numbers of two cliques with maximal cliques
  • 256 - more work if we are trying to find dominated rows
  • 512 - try clique cuts but replace rather than add

Many of these options were added for a client, and are not useful for all problems. However it may be worth experimenting. Note that these were added to Cgl/trunk but are quite safe to use with any version of Cbc - just modify the Externals file and use svn propset svn:externals -F Externals . (The dot is needed) followed by svn update.