[Coin-discuss] patch to loadProblem cplex version.

Vivian.DeSmedt at aisystems.be Vivian.DeSmedt at aisystems.be
Mon Jan 27 11:58:11 EST 2003


Dear Osi,

In order to pass my small test suite. I propose this patch to the
loadProblem version of the Osi cplex interface:

Could someone validate my change and integrate the patch.

Regard,
Vivian.


void
OsiCpxSolverInterface::loadProblem(const int numcols, const int numrows,
                       const int* start, const int* index,
                       const double* value,
                       const double* collb, const double* colub,
                       const double* obj,
                       const char* rowsen, const double* rowrhs,
                       const double* rowrng )
{
  const int nc = numcols;
  const int nr = numrows;

  if( nr == 0 || nc == 0 ) {
    // empty LP? -> kill old LP
    gutsOfDestructor();
    return;
  }

  assert( rowsen != NULL );
  assert( rowrhs != NULL );

  int i;

  // Set column values to defaults if NULL pointer passed
  int * len = new int[nc + 1];
  double * clb = new double[nc];
  double * cub = new double[nc];
  double * ob = new double[nc];
  double * rr = new double[nr];
  double * rhs = new double[nr];
  char * sen = new char[nr];

  std::adjacent_difference(start, start + (nc+1), len);

  if ( collb != NULL )
    CoinDisjointCopyN(collb, nc, clb);
  else
    CoinFillN(clb, nc, 0.0);

  if ( colub!=NULL )
    CoinDisjointCopyN(colub, nc, cub);
  else
    CoinFillN(cub, nc, getInfinity());

  if ( obj!=NULL )
    CoinDisjointCopyN(obj, nc, ob);
  else
    CoinFillN(ob, nc, 0.0);

  if ( rowrng != NULL ) {
    for ( i=0; i<nr; i++ ) {
      if (rowsen[i] == 'R') {
     if ( rowrng[i] >= 0 ) {
       rhs[i] = rowrhs[i] - rowrng[i];
       rr[i] = rowrng[i];
     } else {
       rhs[i] = rowrhs[i];
       rr[i] = -rowrng[i];
     }
      } else {
     rhs[i] = rowrhs[i];
     rr[i] = 0.0;
      }
    }
  } else {
    CoinDisjointCopyN(rowrhs, nr, rhs);
  }

  CoinDisjointCopyN(rowsen, nr, sen);

  int objDirection = CPXgetobjsen( env_, getMutableLpPtr() );

  int err = CPXcopylp( env_, getLpPtr(),
                 nc, nr,
                 // Leave ObjSense alone(set to current value).
                 objDirection, ob, rhs, sen,
                 const_cast<int *>(start),
                 len + 1, const_cast<int *>(index),
                 const_cast<double *>(value),
                 clb, cub, rr);

  checkCPXerror( err, "CPXcopylp", "loadProblem" );

  delete[] len;
  delete[] clb;
  delete[] cub;
  delete[] ob;
  delete[] rr;
  delete[] rhs;
  delete[] sen;
}




More information about the Coin-discuss mailing list