Osi
trunk
|
00001 // Copyright (C) 2000, International Business Machines 00002 // Corporation and others. All Rights Reserved. 00003 // This code is licensed under the terms of the Eclipse Public License (EPL). 00004 00005 #ifndef OsiRowCut_H 00006 #define OsiRowCut_H 00007 00008 #include "CoinPackedVector.hpp" 00009 00010 #include "OsiCollections.hpp" 00011 #include "OsiCut.hpp" 00012 00013 //#define OSI_INLINE_ROWCUT_METHODS 00014 #ifdef OSI_INLINE_ROWCUT_METHODS 00015 #define OsiRowCut_inline inline 00016 #else 00017 #define OsiRowCut_inline 00018 #endif 00019 00029 class OsiRowCut : public OsiCut { 00030 friend void OsiRowCutUnitTest(const OsiSolverInterface * baseSiP, 00031 const std::string & mpsDir); 00032 00033 public: 00034 00037 00038 OsiRowCut_inline double lb() const; 00040 OsiRowCut_inline void setLb(double lb); 00042 OsiRowCut_inline double ub() const; 00044 OsiRowCut_inline void setUb(double ub); 00046 00049 00050 char sense() const; 00052 double rhs() const; 00054 double range() const; 00056 00057 //------------------------------------------------------------------- 00060 00061 OsiRowCut_inline void setRow( 00062 int size, 00063 const int * colIndices, 00064 const double * elements, 00065 bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE); 00067 OsiRowCut_inline void setRow( const CoinPackedVector & v ); 00069 OsiRowCut_inline const CoinPackedVector & row() const; 00071 OsiRowCut_inline CoinPackedVector & mutableRow() ; 00073 00076 #if __GNUC__ != 2 00077 using OsiCut::operator== ; 00078 #endif 00079 00082 OsiRowCut_inline bool operator==(const OsiRowCut& rhs) const; 00083 00084 #if __GNUC__ != 2 00085 using OsiCut::operator!= ; 00086 #endif 00087 00088 OsiRowCut_inline bool operator!=(const OsiRowCut& rhs) const; 00090 00091 00092 //---------------------------------------------------------------- 00102 OsiRowCut_inline bool consistent() const; 00103 00112 OsiRowCut_inline bool consistent(const OsiSolverInterface& im) const; 00113 00121 OsiRowCut_inline bool infeasible(const OsiSolverInterface &im) const; 00126 virtual double violated(const double * solution) const; 00128 00131 00132 void operator+=(double value) 00133 { row_ += value; } 00134 00136 void operator-=(double value) 00137 { row_ -= value; } 00138 00140 void operator*=(double value) 00141 { row_ *= value; } 00142 00144 void operator/=(double value) 00145 { row_ /= value; } 00147 00149 void sortIncrIndex() 00150 {row_.sortIncrIndex();} 00151 00154 00155 OsiRowCut & operator=( const OsiRowCut& rhs); 00156 00158 OsiRowCut ( const OsiRowCut &); 00159 00161 virtual OsiRowCut * clone() const; 00162 00164 OsiRowCut (); 00165 00172 OsiRowCut(double cutlb, double cutub, 00173 int capacity, int size, 00174 int *&colIndices, double *&elements); 00175 00177 virtual ~OsiRowCut (); 00179 00182 00183 virtual void print() const ; 00185 00186 private: 00187 00188 00191 00192 CoinPackedVector row_; 00194 double lb_; 00196 double ub_; 00198 }; 00199 00200 #ifdef OSI_INLINE_ROWCUT_METHODS 00201 00202 //------------------------------------------------------------------- 00203 // Set/Get lower & upper bounds 00204 //------------------------------------------------------------------- 00205 double OsiRowCut::lb() const { return lb_; } 00206 void OsiRowCut::setLb(double lb) { lb_ = lb; } 00207 double OsiRowCut::ub() const { return ub_; } 00208 void OsiRowCut::setUb(double ub) { ub_ = ub; } 00209 00210 //------------------------------------------------------------------- 00211 // Set row elements 00212 //------------------------------------------------------------------- 00213 void OsiRowCut::setRow(int size, 00214 const int * colIndices, const double * elements) 00215 { 00216 row_.setVector(size,colIndices,elements); 00217 } 00218 void OsiRowCut::setRow( const CoinPackedVector & v ) 00219 { 00220 row_ = v; 00221 } 00222 00223 //------------------------------------------------------------------- 00224 // Get the row 00225 //------------------------------------------------------------------- 00226 const CoinPackedVector & OsiRowCut::row() const 00227 { 00228 return row_; 00229 } 00230 00231 //------------------------------------------------------------------- 00232 // Get the row so we can change 00233 //------------------------------------------------------------------- 00234 CoinPackedVector & OsiRowCut::mutableRow() 00235 { 00236 return row_; 00237 } 00238 00239 //---------------------------------------------------------------- 00240 // == operator 00241 //------------------------------------------------------------------- 00242 bool 00243 OsiRowCut::operator==(const OsiRowCut& rhs) const 00244 { 00245 if ( this->OsiCut::operator!=(rhs) ) return false; 00246 if ( row() != rhs.row() ) return false; 00247 if ( lb() != rhs.lb() ) return false; 00248 if ( ub() != rhs.ub() ) return false; 00249 return true; 00250 } 00251 bool 00252 OsiRowCut::operator!=(const OsiRowCut& rhs) const 00253 { 00254 return !( (*this)==rhs ); 00255 } 00256 00257 00258 //---------------------------------------------------------------- 00259 // consistent & infeasible 00260 //------------------------------------------------------------------- 00261 bool OsiRowCut::consistent() const 00262 { 00263 const CoinPackedVector & r=row(); 00264 r.duplicateIndex("consistent", "OsiRowCut"); 00265 if ( r.getMinIndex() < 0 ) return false; 00266 return true; 00267 } 00268 bool OsiRowCut::consistent(const OsiSolverInterface& im) const 00269 { 00270 const CoinPackedVector & r=row(); 00271 if ( r.getMaxIndex() >= im.getNumCols() ) return false; 00272 00273 return true; 00274 } 00275 bool OsiRowCut::infeasible(const OsiSolverInterface &im) const 00276 { 00277 if ( lb() > ub() ) return true; 00278 00279 return false; 00280 } 00281 00282 #endif 00283 00290 class OsiRowCut2 : public OsiRowCut { 00291 00292 public: 00293 00296 00297 inline int whichRow() const 00298 { return whichRow_;} 00300 inline void setWhichRow(int row) 00301 { whichRow_=row;} 00303 00306 00307 OsiRowCut2 & operator=( const OsiRowCut2& rhs); 00308 00310 OsiRowCut2 ( const OsiRowCut2 &); 00311 00313 virtual OsiRowCut * clone() const; 00314 00316 OsiRowCut2 (int row=-1); 00317 00319 virtual ~OsiRowCut2 (); 00321 00322 private: 00323 00324 00327 00328 int whichRow_; 00330 }; 00331 #endif