00001
00002
00003
00004
00005
00006
00007
00008 #ifndef CbcClique_H
00009 #define CbcClique_H
00010
00041 class CbcClique : public CbcObject {
00042
00043 public:
00044
00046 CbcClique ();
00047
00051 CbcClique (CbcModel * model, int cliqueType, int numberMembers,
00052 const int * which, const char * type,
00053 int identifier, int slack = -1);
00054
00056 CbcClique ( const CbcClique &);
00057
00059 virtual CbcObject * clone() const;
00060
00062 CbcClique & operator=( const CbcClique& rhs);
00063
00065 virtual ~CbcClique ();
00066
00068 virtual double infeasibility(const OsiBranchingInformation * info,
00069 int &preferredWay) const;
00070
00071 using CbcObject::feasibleRegion ;
00073 virtual void feasibleRegion();
00074
00076 virtual CbcBranchingObject * createCbcBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) ;
00078 inline int numberMembers() const {
00079 return numberMembers_;
00080 }
00086 inline int numberNonSOSMembers() const {
00087 return numberNonSOSMembers_;
00088 }
00089
00091 inline const int * members() const {
00092 return members_;
00093 }
00094
00104 inline char type(int index) const {
00105 if (type_) return type_[index];
00106 else return 1;
00107 }
00108
00110 inline int cliqueType() const {
00111 return cliqueType_;
00112 }
00114 virtual void redoSequenceEtc(CbcModel * model, int numberColumns, const int * originalColumns);
00115
00116 protected:
00119 int numberMembers_;
00120
00122 int numberNonSOSMembers_;
00123
00125 int * members_;
00126
00136 char * type_;
00137
00143 int cliqueType_;
00144
00151 int slack_;
00152 };
00153
00162 class CbcCliqueBranchingObject : public CbcBranchingObject {
00163
00164 public:
00165
00166
00167 CbcCliqueBranchingObject ();
00168
00169
00170 CbcCliqueBranchingObject (CbcModel * model, const CbcClique * clique,
00171 int way,
00172 int numberOnDownSide, const int * down,
00173 int numberOnUpSide, const int * up);
00174
00175
00176 CbcCliqueBranchingObject ( const CbcCliqueBranchingObject &);
00177
00178
00179 CbcCliqueBranchingObject & operator=( const CbcCliqueBranchingObject& rhs);
00180
00182 virtual CbcBranchingObject * clone() const;
00183
00184
00185 virtual ~CbcCliqueBranchingObject ();
00186
00187 using CbcBranchingObject::branch ;
00189 virtual double branch();
00190
00191 using CbcBranchingObject::print ;
00194 virtual void print();
00195
00197 virtual CbcBranchObjType type() const {
00198 return CliqueBranchObj;
00199 }
00200
00208 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00209
00218 virtual CbcRangeCompare compareBranchingObject
00219 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00220
00221 private:
00223 const CbcClique * clique_;
00225 unsigned int downMask_[2];
00227 unsigned int upMask_[2];
00228 };
00229
00234 class CbcLongCliqueBranchingObject : public CbcBranchingObject {
00235
00236 public:
00237
00238
00239 CbcLongCliqueBranchingObject ();
00240
00241
00242 CbcLongCliqueBranchingObject (CbcModel * model, const CbcClique * clique,
00243 int way,
00244 int numberOnDownSide, const int * down,
00245 int numberOnUpSide, const int * up);
00246
00247
00248 CbcLongCliqueBranchingObject ( const CbcLongCliqueBranchingObject &);
00249
00250
00251 CbcLongCliqueBranchingObject & operator=( const CbcLongCliqueBranchingObject& rhs);
00252
00254 virtual CbcBranchingObject * clone() const;
00255
00256
00257 virtual ~CbcLongCliqueBranchingObject ();
00258
00259 using CbcBranchingObject::branch ;
00261 virtual double branch();
00262
00263 using CbcBranchingObject::print ;
00266 virtual void print();
00267
00269 virtual CbcBranchObjType type() const {
00270 return LongCliqueBranchObj;
00271 }
00272
00280 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00281
00290 virtual CbcRangeCompare compareBranchingObject
00291 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00292
00293 private:
00295 const CbcClique * clique_;
00297 unsigned int * downMask_;
00299 unsigned int * upMask_;
00300 };
00301
00302 #endif
00303