Cbc
trunk
|
00001 // $Id$ 00002 // Copyright (C) 2002, International Business Machines 00003 // Corporation and others. All Rights Reserved. 00004 // This code is licensed under the terms of the Eclipse Public License (EPL). 00005 00006 // Edwin 11/9/2009-- carved out of CbcBranchActual 00007 00008 #ifndef CbcSimpleInteger_H 00009 #define CbcSimpleInteger_H 00010 00011 #include "CbcBranchingObject.hpp" 00012 00023 class CbcIntegerBranchingObject : public CbcBranchingObject { 00024 00025 public: 00026 00028 CbcIntegerBranchingObject (); 00029 00037 CbcIntegerBranchingObject (CbcModel *model, int variable, 00038 int way , double value) ; 00039 00047 CbcIntegerBranchingObject (CbcModel *model, int variable, int way, 00048 double lowerValue, double upperValue) ; 00049 00051 CbcIntegerBranchingObject ( const CbcIntegerBranchingObject &); 00052 00054 CbcIntegerBranchingObject & operator= (const CbcIntegerBranchingObject& rhs); 00055 00057 virtual CbcBranchingObject * clone() const; 00058 00060 virtual ~CbcIntegerBranchingObject (); 00061 00063 void fillPart ( int variable, int way , double value) ; 00064 using CbcBranchingObject::branch ; 00069 virtual double branch(); 00072 virtual void fix(OsiSolverInterface * solver, 00073 double * lower, double * upper, 00074 int branchState) const ; 00077 virtual bool tighten(OsiSolverInterface * ) ; 00078 00079 #ifdef JJF_ZERO 00080 // No need to override. Default works fine. 00084 virtual void previousBranch(); 00085 #endif 00086 00087 using CbcBranchingObject::print ; 00090 virtual void print(); 00091 00093 inline const double * downBounds() const { 00094 return down_; 00095 } 00097 inline const double * upBounds() const { 00098 return up_; 00099 } 00101 inline void setDownBounds(const double bounds[2]) { 00102 memcpy(down_, bounds, 2*sizeof(double)); 00103 } 00105 inline void setUpBounds(const double bounds[2]) { 00106 memcpy(up_, bounds, 2*sizeof(double)); 00107 } 00108 #ifdef FUNNY_BRANCHING 00109 00111 inline const int * variables() const { 00112 return variables_; 00113 } 00114 // New bound 00115 inline const double * newBounds() const { 00116 return newBounds_; 00117 } 00119 inline int numberExtraChangedBounds() const { 00120 return numberExtraChangedBounds_; 00121 } 00123 int applyExtraBounds(int iColumn, double lower, double upper, int way) ; 00125 void deactivate(); 00127 inline bool active() const { 00128 return (down_[1] != -COIN_DBL_MAX); 00129 } 00130 #endif 00131 00133 virtual CbcBranchObjType type() const { 00134 return SimpleIntegerBranchObj; 00135 } 00136 00145 virtual CbcRangeCompare compareBranchingObject 00146 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false); 00147 00148 protected: 00150 double down_[2]; 00152 double up_[2]; 00153 #ifdef FUNNY_BRANCHING 00154 00156 int * variables_; 00157 // New bound 00158 double * newBounds_; 00160 int numberExtraChangedBounds_; 00161 #endif 00162 }; 00163 00165 00166 00167 class CbcSimpleInteger : public CbcObject { 00168 00169 public: 00170 00171 // Default Constructor 00172 CbcSimpleInteger (); 00173 00174 // Useful constructor - passed model and index 00175 CbcSimpleInteger (CbcModel * model, int iColumn, double breakEven = 0.5); 00176 00177 // Useful constructor - passed model and Osi object 00178 CbcSimpleInteger (CbcModel * model, const OsiSimpleInteger * object); 00179 00180 // Copy constructor 00181 CbcSimpleInteger ( const CbcSimpleInteger &); 00182 00184 virtual CbcObject * clone() const; 00185 00186 // Assignment operator 00187 CbcSimpleInteger & operator=( const CbcSimpleInteger& rhs); 00188 00189 // Destructor 00190 virtual ~CbcSimpleInteger (); 00192 OsiSimpleInteger * osiObject() const; 00194 virtual double infeasibility(const OsiBranchingInformation * info, 00195 int &preferredWay) const; 00196 00197 using CbcObject::feasibleRegion ; 00203 virtual double feasibleRegion(OsiSolverInterface * solver, const OsiBranchingInformation * info) const; 00204 00210 virtual CbcBranchingObject * createCbcBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) ; 00212 void fillCreateBranch(CbcIntegerBranchingObject * branching, const OsiBranchingInformation * info, int way) ; 00213 00214 using CbcObject::solverBranch ; 00219 virtual OsiSolverBranch * solverBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info) const; 00220 00227 virtual void feasibleRegion(); 00228 00233 virtual int columnNumber() const; 00235 inline void setColumnNumber(int value) { 00236 columnNumber_ = value; 00237 } 00238 00243 virtual void resetBounds(const OsiSolverInterface * solver) ; 00244 00247 virtual void resetSequenceEtc(int numberColumns, const int * originalColumns) ; 00249 inline double originalLowerBound() const { 00250 return originalLower_; 00251 } 00252 inline void setOriginalLowerBound(double value) { 00253 originalLower_ = value; 00254 } 00255 inline double originalUpperBound() const { 00256 return originalUpper_; 00257 } 00258 inline void setOriginalUpperBound(double value) { 00259 originalUpper_ = value; 00260 } 00262 inline double breakEven() const { 00263 return breakEven_; 00264 } 00266 inline void setBreakEven(double value) { 00267 breakEven_ = value; 00268 } 00269 00270 00271 protected: 00273 00275 double originalLower_; 00277 double originalUpper_; 00279 double breakEven_; 00281 int columnNumber_; 00283 int preferredWay_; 00284 }; 00285 #endif 00286