Cgl trunk
|
00001 // LAST EDIT: 00002 //----------------------------------------------------------------------------- 00003 // Implementation of Residual Capacity Inequalities 00004 // Francisco Barahona (barahon@us.ibm.com) 00005 // 00006 // date: May 18, 2006 00007 //----------------------------------------------------------------------------- 00008 // Copyright (C) 2004, International Business Machines Corporation and others. 00009 // All Rights Reserved. 00010 // This code is published under the Eclipse Public License. 00011 00012 #ifndef CglResidualCapacity_H 00013 #define CglResidualCapacity_H 00014 00015 #include <iostream> 00016 #include <fstream> 00017 //#include <vector> 00018 00019 #include "CoinError.hpp" 00020 00021 #include "CglCutGenerator.hpp" 00022 00023 //============================================================================= 00024 00025 #ifndef CGL_DEBUG 00026 #define CGL_DEBUG 0 00027 #endif 00028 00029 //============================================================================= 00030 00031 00032 00033 00034 //============================================================================= 00035 00047 class CglResidualCapacity : public CglCutGenerator { 00048 00049 friend void CglResidualCapacityUnitTest(const OsiSolverInterface * siP, 00050 const std::string mpdDir ); 00051 00052 00053 private: 00054 //--------------------------------------------------------------------------- 00055 // Enumeration constants that describe the various types of rows 00056 enum RowType { 00060 ROW_L, 00064 ROW_G, 00067 ROW_BOTH, 00070 ROW_OTHER 00071 }; 00072 00073 00074 public: 00077 00078 void setEpsilon(double value); 00080 double getEpsilon() const; 00082 void setTolerance(double value); 00084 double getTolerance() const; 00086 void setDoPreproc(int value); 00088 bool getDoPreproc() const; 00090 00097 virtual void generateCuts(const OsiSolverInterface & si, OsiCuts & cs, 00098 const CglTreeInfo info = CglTreeInfo()) const; 00100 00101 //--------------------------------------------------------------------------- 00104 00105 CglResidualCapacity (); 00106 00108 CglResidualCapacity ( const double tolerance ); 00109 00111 CglResidualCapacity ( 00112 const CglResidualCapacity &); 00113 00115 virtual CglCutGenerator * clone() const; 00116 00118 CglResidualCapacity & 00119 operator=( 00120 const CglResidualCapacity& rhs); 00121 00123 virtual 00124 ~CglResidualCapacity (); 00126 virtual void refreshPrep(); 00128 00129 00130 00131 private: 00132 //-------------------------------------------------------------------------- 00133 // Private member methods 00134 00135 // Construct 00136 void gutsOfConstruct ( const double tolerance); 00137 00138 // Delete 00139 void gutsOfDelete(); 00140 00141 // Copy 00142 void gutsOfCopy (const CglResidualCapacity& rhs); 00143 00144 // Do preprocessing. 00145 // It determines the type of each row. 00146 // It may change sense and RHS for ranged rows 00147 void resCapPreprocess(const OsiSolverInterface& si) const; 00148 00149 // Determine the type of a given row. 00150 RowType determineRowType(const OsiSolverInterface& si, 00151 const int rowLen, const int* ind, 00152 const double* coef, const char sense, 00153 const double rhs, 00154 const double* colLowerBound, 00155 const double* colUpperBound) const; 00156 // helps the function above 00157 bool treatAsLessThan(const OsiSolverInterface& si, 00158 const int rowLen, const int* ind, 00159 const double* coef, 00160 const double rhs, 00161 const double* colLowerBound, 00162 const double* colUpperBound) const; 00163 00164 // Generate Residual Capacity cuts 00165 void generateResCapCuts( const OsiSolverInterface& si, 00166 const double* xlp, 00167 const double* colUpperBound, 00168 const double* colLowerBound, 00169 const CoinPackedMatrix& matrixByRow, 00170 const double* LHS, 00171 const double* coefByRow, 00172 const int* colInds, 00173 const int* rowStarts, 00174 const int* rowLengths, 00175 OsiCuts& cs ) const; 00176 00177 00178 // Residual Capacity separation 00179 bool resCapSeparation(const OsiSolverInterface& si, 00180 const int rowLen, const int* ind, 00181 const double* coef, 00182 const double rhs, 00183 const double *xlp, 00184 const double* colUpperBound, 00185 const double* colLowerBound, 00186 OsiRowCut& resCapCut) const; 00187 00188 00189 00190 private: 00191 //--------------------------------------------------------------------------- 00192 // Private member data 00194 double EPSILON_; 00197 double TOLERANCE_; 00205 int doPreproc_; 00206 // The number of rows of the problem. 00207 mutable int numRows_; 00208 // The number columns of the problem. 00209 mutable int numCols_; 00210 // Indicates whether preprocessing has been done. 00211 mutable bool doneInitPre_; 00212 // Array with the row types of the rows in the model. 00213 mutable RowType* rowTypes_; 00214 // The indices of the rows of the initial matrix 00215 mutable int* indRows_; 00216 // Sense of rows (modified if ranges) 00217 mutable char * sense_; 00218 // RHS of rows (modified if ranges) 00219 mutable double * RHS_; 00220 // The number of rows of type ROW_L 00221 mutable int numRowL_; 00222 // The indices of the rows of type ROW_L 00223 mutable int* indRowL_; 00224 // The number of rows of type ROW_G 00225 mutable int numRowG_; 00226 // The indices of the rows of type ROW_G 00227 mutable int* indRowG_; 00228 }; 00229 00230 //############################################################################# 00236 void CglResidualCapacityUnitTest(const OsiSolverInterface * siP, 00237 const std::string mpdDir); 00238 00239 00240 #endif