/* $Id$ * * Name: CouenneLPtightenBoundsCLP-light.cpp * Authors: Pietro Belotti, Carnegie Mellon University * Purpose: adaptation of OsiClpSolverInterface::tightenBounds() -- light version * * (C) Carnegie-Mellon University, 2009. * This file is licensed under the Eclipse Public License (EPL) */ #include "CouennePrecisions.hpp" #include "CouenneProblem.hpp" #include "CouenneCutGenerator.hpp" #include "CouenneExprVar.hpp" namespace Couenne { // Tighten bounds - lightweight. Returns -1 if infeasible, otherwise // number of variables tightened. template int CouenneSolverInterface::tightenBoundsCLP_Light (int lightweight) { // Copied from OsiClpSolverInterface::tightenBounds int numberRows = T::getNumRows(), numberColumns = T::getNumCols(); const double * columnUpper = T::getColUpper(); const double * columnLower = T::getColLower(); const double * rowUpper = T::getRowUpper(); const double * rowLower = T::getRowLower(); // Column copy of matrix const double * element = T::getMatrixByCol()->getElements(); const int * row = T::getMatrixByCol()->getIndices(); const CoinBigIndex * columnStart = T::getMatrixByCol()->getVectorStarts(); const int * columnLength = T::getMatrixByCol()->getVectorLengths(); //const double *objective = T::getObjCoefficients() ; //double direction = T::getObjSense(); double * down = new double [numberRows]; int * first = new int[numberRows]; CoinZeroN(first,numberRows); CoinZeroN(down,numberRows); double * sum = new double [numberRows]; CoinZeroN(sum,numberRows); int numberTightened=0; for (int iColumn=0;iColumn &vars = cutgen_ -> Problem () -> Variables (); for (int iRow=0;iRow-1.0e20) lowerRow -= down[iRow]; double upperRow = rowUpper[iRow]; if (upperRow<1.0e20) upperRow -= down[iRow]; double lower = columnLower[iColumn]; double upper = columnUpper[iColumn]; double value=0.0; for (CoinBigIndex j = columnStart[iColumn]; j 0.0) { if (lowerRow > -1.0e20) newLower = lowerRow / value; if (upperRow < 1.0e20) newUpper = upperRow / value; } else { if (upperRow < 1.0e20) newLower = upperRow / value; if (lowerRow > -1.0e20) newUpper = lowerRow / value; } double tolerance2 = 1.0e-6 + 1.0e-8 * sum [iRow]; if (vars [iColumn] -> isInteger ()) { newLower = (newLower-floor(newLower)lower+10.0*tolerance2|| newUppernewUpper+tolerance) { //printf("XXYY inf on bound\n"); numberTightened=-1; break; } T::setColLower(iColumn,newLower); T::setColUpper(iColumn,CoinMax(newLower,newUpper)); } } } delete [] first; delete [] down; delete [] sum; return numberTightened; } }