00001
00002
00003 #ifndef OsiRowCut_H
00004 #define OsiRowCut_H
00005
00006 #include "CoinPackedVector.hpp"
00007
00008 #include "OsiCollections.hpp"
00009 #include "OsiCut.hpp"
00010
00011
00012 #ifdef OSI_INLINE_ROWCUT_METHODS
00013 #define OsiRowCut_inline inline
00014 #else
00015 #define OsiRowCut_inline
00016 #endif
00017
00027 class OsiRowCut : public OsiCut {
00028 friend void OsiRowCutUnitTest(const OsiSolverInterface * baseSiP,
00029 const std::string & mpsDir);
00030
00031 public:
00032
00035
00036 OsiRowCut_inline double lb() const;
00038 OsiRowCut_inline void setLb(double lb);
00040 OsiRowCut_inline double ub() const;
00042 OsiRowCut_inline void setUb(double ub);
00044
00047
00048 char sense() const;
00050 double rhs() const;
00052 double range() const;
00054
00055
00058
00059 OsiRowCut_inline void setRow(
00060 int size,
00061 const int * colIndices,
00062 const double * elements,
00063 bool testForDuplicateIndex = COIN_DEFAULT_VALUE_FOR_DUPLICATE);
00065 OsiRowCut_inline void setRow( const CoinPackedVector & v );
00067 OsiRowCut_inline const CoinPackedVector & row() const;
00069 OsiRowCut_inline CoinPackedVector & mutableRow() ;
00071
00074 #if __GNUC__ != 2
00075 using OsiCut::operator== ;
00076 #endif
00077
00080 OsiRowCut_inline bool operator==(const OsiRowCut& rhs) const;
00081
00082 #if __GNUC__ != 2
00083 using OsiCut::operator!= ;
00084 #endif
00086 OsiRowCut_inline bool operator!=(const OsiRowCut& rhs) const;
00087
00088
00089
00090
00100 OsiRowCut_inline bool consistent() const;
00101
00110 OsiRowCut_inline bool consistent(const OsiSolverInterface& im) const;
00111
00119 OsiRowCut_inline bool infeasible(const OsiSolverInterface &im) const;
00124 virtual double violated(const double * solution) const;
00126
00129
00130 void operator+=(double value)
00131 { row_ += value; }
00132
00134 void operator-=(double value)
00135 { row_ -= value; }
00136
00138 void operator*=(double value)
00139 { row_ *= value; }
00140
00142 void operator/=(double value)
00143 { row_ /= value; }
00145
00147 void sortIncrIndex()
00148 {row_.sortIncrIndex();}
00149
00152
00153 OsiRowCut & operator=( const OsiRowCut& rhs);
00154
00156 OsiRowCut ( const OsiRowCut &);
00157
00159 virtual OsiRowCut * clone() const;
00160
00162 OsiRowCut ();
00163
00170 OsiRowCut(double cutlb, double cutub,
00171 int capacity, int size,
00172 int *&colIndices, double *&elements);
00173
00175 virtual ~OsiRowCut ();
00177
00180
00181 virtual void print() const ;
00183
00184 private:
00185
00186
00189
00190 CoinPackedVector row_;
00192 double lb_;
00194 double ub_;
00196 };
00197
00198 #ifdef OSI_INLINE_ROWCUT_METHODS
00199
00200
00201
00202
00203 double OsiRowCut::lb() const { return lb_; }
00204 void OsiRowCut::setLb(double lb) { lb_ = lb; }
00205 double OsiRowCut::ub() const { return ub_; }
00206 void OsiRowCut::setUb(double ub) { ub_ = ub; }
00207
00208
00209
00210
00211 void OsiRowCut::setRow(int size,
00212 const int * colIndices, const double * elements)
00213 {
00214 row_.setVector(size,colIndices,elements);
00215 }
00216 void OsiRowCut::setRow( const CoinPackedVector & v )
00217 {
00218 row_ = v;
00219 }
00220
00221
00222
00223
00224 const CoinPackedVector & OsiRowCut::row() const
00225 {
00226 return row_;
00227 }
00228
00229
00230
00231
00232 CoinPackedVector & OsiRowCut::mutableRow()
00233 {
00234 return row_;
00235 }
00236
00237
00238
00239
00240 bool
00241 OsiRowCut::operator==(const OsiRowCut& rhs) const
00242 {
00243 if ( this->OsiCut::operator!=(rhs) ) return false;
00244 if ( row() != rhs.row() ) return false;
00245 if ( lb() != rhs.lb() ) return false;
00246 if ( ub() != rhs.ub() ) return false;
00247 return true;
00248 }
00249 bool
00250 OsiRowCut::operator!=(const OsiRowCut& rhs) const
00251 {
00252 return !( (*this)==rhs );
00253 }
00254
00255
00256
00257
00258
00259 bool OsiRowCut::consistent() const
00260 {
00261 const CoinPackedVector & r=row();
00262 r.duplicateIndex("consistent", "OsiRowCut");
00263 if ( r.getMinIndex() < 0 ) return false;
00264 return true;
00265 }
00266 bool OsiRowCut::consistent(const OsiSolverInterface& im) const
00267 {
00268 const CoinPackedVector & r=row();
00269 if ( r.getMaxIndex() >= im.getNumCols() ) return false;
00270
00271 return true;
00272 }
00273 bool OsiRowCut::infeasible(const OsiSolverInterface &im) const
00274 {
00275 if ( lb() > ub() ) return true;
00276
00277 return false;
00278 }
00279
00280 #endif
00281
00282
00288 void
00289 OsiRowCutUnitTest(const OsiSolverInterface * baseSiP,
00290 const std::string & mpsDir);
00291
00298 class OsiRowCut2 : public OsiRowCut {
00299
00300 public:
00301
00304
00305 inline int whichRow() const
00306 { return whichRow_;}
00308 inline void setWhichRow(int row)
00309 { whichRow_=row;}
00311
00314
00315 OsiRowCut2 & operator=( const OsiRowCut2& rhs);
00316
00318 OsiRowCut2 ( const OsiRowCut2 &);
00319
00321 virtual OsiRowCut * clone() const;
00322
00324 OsiRowCut2 (int row=-1);
00325
00327 virtual ~OsiRowCut2 ();
00329
00330 private:
00331
00332
00335
00336 int whichRow_;
00338 };
00339 #endif