Go to the documentation of this file.00001
00002 #ifndef CbcClique_H
00003 #define CbcClique_H
00004
00034
00035
00036 class CbcClique : public CbcObject {
00037
00038 public:
00039
00040
00041 CbcClique ();
00042
00047 CbcClique (CbcModel * model, int cliqueType, int numberMembers,
00048 const int * which, const char * type,
00049 int identifier, int slack = -1);
00050
00051
00052 CbcClique ( const CbcClique &);
00053
00055 virtual CbcObject * clone() const;
00056
00057
00058 CbcClique & operator=( const CbcClique& rhs);
00059
00060
00061 virtual ~CbcClique ();
00062
00064 virtual double infeasibility(const OsiBranchingInformation * info,
00065 int &preferredWay) const;
00066
00067 using CbcObject::feasibleRegion ;
00069 virtual void feasibleRegion();
00070
00072 virtual CbcBranchingObject * createCbcBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) ;
00074 inline int numberMembers() const {
00075 return numberMembers_;
00076 }
00083 inline int numberNonSOSMembers() const {
00084 return numberNonSOSMembers_;
00085 }
00086
00088 inline const int * members() const {
00089 return members_;
00090 }
00091
00101 inline char type(int index) const {
00102 if (type_) return type_[index];
00103 else return 1;
00104 }
00105
00107 inline int cliqueType() const {
00108 return cliqueType_;
00109 }
00111 virtual void redoSequenceEtc(CbcModel * model, int numberColumns, const int * originalColumns);
00112
00113 protected:
00116 int numberMembers_;
00117
00119 int numberNonSOSMembers_;
00120
00122 int * members_;
00123
00133 char * type_;
00134
00140 int cliqueType_;
00141
00148 int slack_;
00149 };
00150
00159 class CbcCliqueBranchingObject : public CbcBranchingObject {
00160
00161 public:
00162
00163
00164 CbcCliqueBranchingObject ();
00165
00166
00167 CbcCliqueBranchingObject (CbcModel * model, const CbcClique * clique,
00168 int way,
00169 int numberOnDownSide, const int * down,
00170 int numberOnUpSide, const int * up);
00171
00172
00173 CbcCliqueBranchingObject ( const CbcCliqueBranchingObject &);
00174
00175
00176 CbcCliqueBranchingObject & operator=( const CbcCliqueBranchingObject& rhs);
00177
00179 virtual CbcBranchingObject * clone() const;
00180
00181
00182 virtual ~CbcCliqueBranchingObject ();
00183
00184 using CbcBranchingObject::branch ;
00186 virtual double branch();
00187
00188 using CbcBranchingObject::print ;
00191 virtual void print();
00192
00194 virtual CbcBranchObjType type() const {
00195 return CliqueBranchObj;
00196 }
00197
00205 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00206
00215 virtual CbcRangeCompare compareBranchingObject
00216 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00217
00218 private:
00220 const CbcClique * clique_;
00222 unsigned int downMask_[2];
00224 unsigned int upMask_[2];
00225 };
00226
00231 class CbcLongCliqueBranchingObject : public CbcBranchingObject {
00232
00233 public:
00234
00235
00236 CbcLongCliqueBranchingObject ();
00237
00238
00239 CbcLongCliqueBranchingObject (CbcModel * model, const CbcClique * clique,
00240 int way,
00241 int numberOnDownSide, const int * down,
00242 int numberOnUpSide, const int * up);
00243
00244
00245 CbcLongCliqueBranchingObject ( const CbcLongCliqueBranchingObject &);
00246
00247
00248 CbcLongCliqueBranchingObject & operator=( const CbcLongCliqueBranchingObject& rhs);
00249
00251 virtual CbcBranchingObject * clone() const;
00252
00253
00254 virtual ~CbcLongCliqueBranchingObject ();
00255
00256 using CbcBranchingObject::branch ;
00258 virtual double branch();
00259
00260 using CbcBranchingObject::print ;
00263 virtual void print();
00264
00266 virtual CbcBranchObjType type() const {
00267 return LongCliqueBranchObj;
00268 }
00269
00277 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00278
00287 virtual CbcRangeCompare compareBranchingObject
00288 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00289
00290 private:
00292 const CbcClique * clique_;
00294 unsigned int * downMask_;
00296 unsigned int * upMask_;
00297 };
00298
00299 #endif
00300