[Coin-lpsolver] primal/dual tolerance

Matthew Galati magh at lehigh.edu
Sun Nov 21 14:47:14 EST 2004


Hi CLP,

Is this a bug, or just a tolerance issue?

Solving the initial LP relaxation for dsbmip (from MIPLIB), using 
default CLP, the LP solution violates three constraints at 1.0e-5.

row 462, lhs: -0.0000143764, LB: 0.0000000000
ind: 582, el: -1.0000000000, sol: 0.0000143764, sum: -0.0000143764
ind: 1107, el: -1.0000000000, sol: 0.0000000000, sum: -0.0000143764
ind: 1108, el: -1.0000000000, sol: 0.0000000000, sum: -0.0000143764
ind: 1736, el: 16560.0000000000, sol: 0.0000000000, sum: -0.0000143764

row 491, lhs: -0.0000143764, LB: 0.0000000000
ind: 666, el: -1.0000000000, sol: 0.0000000000, sum: 0.0000000000
ind: 826, el: -1.0000000000, sol: 0.0000143764, sum: -0.0000143764
ind: 1195, el: -1.0000000000, sol: 0.0000000000, sum: -0.0000143764
ind: 1196, el: -1.0000000000, sol: 0.0000000000, sum: -0.0000143764
ind: 1772, el: 16560.0000000000, sol: 0.0000000000, sum: -0.0000143764

row 555, lhs: -0.0000143764, LB: 0.0000000000
ind: 750, el: -1.0000000000, sol: 0.0000000000, sum: 0.0000000000
ind: 902, el: -1.0000000000, sol: 0.0000143764, sum: -0.0000143764
ind: 1283, el: -1.0000000000, sol: 0.0000000000, sum: -0.0000143764
ind: 1284, el: -1.0000000000, sol: 0.0000000000, sum: -0.0000143764
ind: 1836, el: 16560.0000000000, sol: 0.0000000000, sum: -0.0000143764

If I set the primal/dual tolerance to 1.0e-10, it satisfies all 
constraints at 1.0e-5.

The code I used is below:

---------------------------------------------------------------------------------------
int main(int argc, char ** argv){
  OsiClpSolverInterface si;
  si.readMps("dsbmip.mps");
  si.messageHandler()->setLogLevel(20);
  /*si.setDblParam(OsiPrimalTolerance, 1.0e-10);
    si.setDblParam(OsiDualTolerance, 1.0e-10);*/

  //si.resolve();
  si.initialSolve();
  const double * sol = si.getColSolution();

  const CoinPackedMatrix * rowA  = si.getMatrixByRow();
  const double           * rowLB = si.getRowLower();
  const double           * rowUB = si.getRowUpper();
  double                 * lhs = new double[si.getNumRows()];

  rowA->times(sol, lhs);
  for(int r = 0; r < si.getNumRows(); r++){
    if((lhs[r] + 1.0e-5) < rowLB[r]){
      printf( "\nrow %d, lhs: %12.10f, LB: %12.10f", r, lhs[r], rowLB[r] );

      //check by hand
      const CoinShallowPackedVector & row = rowA->getVector(r);
      const int    * ind = row.getIndices();
      const double * els = row.getElements();
      double sum = 0.0;
      for(int j = 0; j < row.getNumElements(); j++){
        sum += sol[ind[j]] * els[j];
        if((fabs(els[j]) > 1.0e-20) || (fabs(sol[ind[j]]) > 1.0e-20))
          printf("\nind: %d, el: %12.10f, sol: %12.10f, sum: %12.10f",
                 ind[j], els[j], sol[ind[j]], sum);
      }

    }
    if((lhs[r] - 1.0e-5) > rowUB[r]){
      printf( "\nrow %d, lhs: %12.10f, UB: %12.10f", r, lhs[r], rowUB[r] );
    }
  }
}

---------------------------------------------------------------------------------------
[magala at ordlnx2 TEST]$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.3/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man 
--infodir=/usr/share/info --enable-shared --enable-threads=posix 
--disable-checking --disable-libunwind-exceptions --with-system-zlib 
--enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)


Thanks.

-- 
Matthew Galati 





More information about the Clp mailing list