coin-or / Cgl

Cut Generator Library
Other
24 stars 14 forks source link

Potential error in CglTwomir #33

Closed svigerske closed 5 years ago

svigerske commented 5 years ago

Issue created by migration from Trac.

Original creator: jwatson

Original creation time: 2009-12-11 05:43:05

Assignee: somebody

Version: release 0.5.1

I have isolated a situation in which I believe CglTwomir is returning invalid cuts. I have attached a test driver (driver.cpp), a test input file (mas74.mps, from miplib2003), and the output trace I obtain on our rather vanilla RedHat linux server.

The “catch” is that I’m using CPLEX 11.2, and the OsiCpxSolverInterface. Although this technically shouldn’t matter, I suppose (the behavior also occurs with other versions of CPLEX).

A quick summary of the unexpected behavior: 1) The LP relaxation for mas74 solves fine – relaxation is around 10K. Validated with various other solvers. 2) 3 two-mir cuts are found and successfully applied. 3) Upon re-solve after cut addition, the LP relaxation is something like 21K, which is far above the integer optimal of ~11K. Obviously incorrect behavior.

Any help is greatly appreciated – I am seeing similar behavior on a handful of other test instances.

Thanks!

Jean-Paul

svigerske commented 5 years ago

Attachment driver.cpp by jwatson created at 2009-12-11 05:44:19

svigerske commented 5 years ago

Attachment driver.output by jwatson created at 2009-12-11 05:44:34

svigerske commented 5 years ago

Attachment mas74.mps by jwatson created at 2009-12-11 05:44:50

svigerske commented 5 years ago

Comment by @rlougee created at 2009-12-11 10:51:43

Forwarded to CglTwomir project manager, Oktay Gunluk.

svigerske commented 5 years ago

Still a problem with current Cgl/master and CPLEX 12.8.0.0. Could this be related to #36?

svigerske commented 5 years ago

Indeed, when using

Index: src/CglTwomir/CglTwomir.cpp
===================================================================
--- src/CglTwomir/CglTwomir.cpp (revision 1463)
+++ src/CglTwomir/CglTwomir.cpp (working copy)
@@ -740,9 +740,9 @@
         DGG_setEqualityConstraint(data,j);

       /* check if the row is bounded above/below and define variable bounds */
-      if ( rowUpper[i] < COIN_DBL_MAX )
+      if ( rowUpper[i] < si->getInfinity() )
         DGG_setIsConstraintBoundedAbove(data,j);
-      if ( rowLower[i] > -1*COIN_DBL_MAX )
+      if ( rowLower[i] > -si->getInfinity() )
         DGG_setIsConstraintBoundedBelow(data,j);

       data->lb[j] = 0.0;

then 22 cuts are generated instead of only 3 and the LP relax value only increases to 10576.4.