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 OsiCut_H 00006 #define OsiCut_H 00007 00008 #include "OsiCollections.hpp" 00009 #include "OsiSolverInterface.hpp" 00010 00019 /* 00020 COIN_NOTEST_DUPLICATE is rooted in CoinUtils. Check there before you 00021 meddle here. 00022 */ 00023 #ifdef COIN_FAST_CODE 00024 #ifndef COIN_NOTEST_DUPLICATE 00025 #define COIN_NOTEST_DUPLICATE 00026 #endif 00027 #endif 00028 00029 #ifndef COIN_NOTEST_DUPLICATE 00030 #define COIN_DEFAULT_VALUE_FOR_DUPLICATE true 00031 #else 00032 #define COIN_DEFAULT_VALUE_FOR_DUPLICATE false 00033 #endif 00034 00035 00036 class OsiCut { 00037 00038 public: 00039 00040 //------------------------------------------------------------------- 00043 00044 inline void setEffectiveness( double e ); 00046 inline double effectiveness() const; 00048 00051 00052 inline void setGloballyValid( bool trueFalse ) 00053 { globallyValid_=trueFalse ? 1 : 0;} 00054 inline void setGloballyValid( ) 00055 { globallyValid_=1;} 00056 inline void setNotGloballyValid( ) 00057 { globallyValid_=0;} 00059 inline bool globallyValid() const 00060 { return globallyValid_!=0;} 00062 inline void setGloballyValidAsInteger( int trueFalse ) 00063 { globallyValid_=trueFalse;} 00065 inline int globallyValidAsInteger() const 00066 { return globallyValid_;} 00068 00071 00072 virtual void print() const {} 00074 00075 #if 0 00076 / **@name Times used */ 00077 / /@{ 00078 / // Set times used 00079 inline void setTimesUsed( int t ); 00080 / // Increment times used 00081 inline void incrementTimesUsed(); 00082 / // Get times used 00083 inline int timesUsed() const; 00084 / /@} 00085 00086 / **@name Times tested */ 00087 / /@{ 00088 / // Set times tested 00089 inline void setTimesTested( int t ); 00090 / // Increment times tested 00091 inline void incrementTimesTested(); 00092 / // Get times tested 00093 inline int timesTested() const; 00094 / /@} 00095 #endif 00096 00097 //---------------------------------------------------------------- 00098 00101 00102 inline virtual bool operator==(const OsiCut& rhs) const; 00104 inline virtual bool operator!=(const OsiCut& rhs) const; 00106 inline virtual bool operator< (const OsiCut& rhs) const; 00108 inline virtual bool operator> (const OsiCut& rhs) const; 00110 00111 //---------------------------------------------------------------- 00112 // consistent() - returns true if the cut is consistent with repect to itself. 00113 // This might include checks to ensure that a packed vector 00114 // itself does not have a negative index. 00115 // consistent(const OsiSolverInterface& si) - returns true if cut is consistent with 00116 // respect to the solver interface's model. This might include a check to 00117 // make sure a column index is not greater than the number 00118 // of columns in the problem. 00119 // infeasible(const OsiSolverInterface& si) - returns true if the cut is infeasible 00120 // "with respect to itself". This might include a check to ensure 00121 // the lower bound is greater than the upper bound, or if the 00122 // cut simply replaces bounds that the new bounds are feasible with 00123 // respect to the old bounds. 00124 //----------------------------------------------------------------- 00132 inline virtual bool consistent() const=0; 00133 00139 inline virtual bool consistent(const OsiSolverInterface& si) const=0; 00140 00162 inline virtual bool infeasible(const OsiSolverInterface &si) const=0; 00163 00168 virtual double violated(const double * solution) const=0; 00170 00171 protected: 00172 00175 00176 OsiCut (); 00177 00179 OsiCut ( const OsiCut &); 00180 00182 OsiCut & operator=( const OsiCut& rhs); 00183 00185 virtual ~OsiCut (); 00187 00188 private: 00189 00192 00193 double effectiveness_; 00195 int globallyValid_; 00196 #if 0 00197 00198 int timesUsed_; 00200 int timesTested_; 00201 #endif 00202 00203 }; 00204 00205 00206 //------------------------------------------------------------------- 00207 // Set/Get member data 00208 //------------------------------------------------------------------- 00209 void OsiCut::setEffectiveness(double e) { effectiveness_=e; } 00210 double OsiCut::effectiveness() const { return effectiveness_; } 00211 00212 #if 0 00213 void OsiCut::setTimesUsed( int t ) { timesUsed_=t; } 00214 void OsiCut::incrementTimesUsed() { timesUsed_++; } 00215 int OsiCut::timesUsed() const { return timesUsed_; } 00216 00217 void OsiCut::setTimesTested( int t ) { timesTested_=t; } 00218 void OsiCut::incrementTimesTested() { timesTested_++; } 00219 int OsiCut::timesTested() const{ return timesTested_; } 00220 #endif 00221 00222 //---------------------------------------------------------------- 00223 // == operator 00224 //------------------------------------------------------------------- 00225 bool 00226 OsiCut::operator==(const OsiCut& rhs) const 00227 { 00228 return effectiveness()==rhs.effectiveness(); 00229 } 00230 bool 00231 OsiCut::operator!=(const OsiCut& rhs) const 00232 { 00233 return !( (*this)==rhs ); 00234 } 00235 bool 00236 OsiCut::operator< (const OsiCut& rhs) const 00237 { 00238 return effectiveness()<rhs.effectiveness(); 00239 } 00240 bool 00241 OsiCut::operator> (const OsiCut& rhs) const 00242 { 00243 return effectiveness()>rhs.effectiveness(); 00244 } 00245 #endif