00001
00002
00003
00004
00005
00006
00007
00008 #ifndef CbcBranchingObject_H
00009 #define CbcBranchingObject_H
00010
00011 #include <string>
00012 #include <vector>
00013 #include "CbcBranchBase.hpp"
00014 #include "OsiBranchingObject.hpp"
00015
00016
00017
00018 enum CbcBranchObjType
00019 {
00020 SimpleIntegerBranchObj = 100,
00021 SimpleIntegerDynamicPseudoCostBranchObj = 101,
00022 CliqueBranchObj = 102,
00023 LongCliqueBranchObj = 103,
00024 SoSBranchObj = 104,
00025 NWayBranchObj = 105,
00026 FollowOnBranchObj = 106,
00027 DummyBranchObj = 107,
00028 GeneralDepthBranchObj = 108,
00029 OneGeneralBranchingObj = 110,
00030 CutBranchingObj = 200,
00031 LotsizeBranchObj = 300,
00032 DynamicPseudoCostBranchObj = 400
00033 };
00034
00053 class CbcBranchingObject : public OsiBranchingObject {
00054
00055 public:
00056
00058 CbcBranchingObject ();
00059
00061 CbcBranchingObject (CbcModel * model, int variable, int way , double value);
00062
00064 CbcBranchingObject ( const CbcBranchingObject &);
00065
00067 CbcBranchingObject & operator=( const CbcBranchingObject& rhs);
00068
00070 virtual CbcBranchingObject * clone() const = 0;
00071
00073 virtual ~CbcBranchingObject ();
00074
00079 virtual int fillStrongInfo( CbcStrongInfo & ) {
00080 return 0;
00081 }
00083 inline void resetNumberBranchesLeft() {
00084 branchIndex_ = 0;
00085 }
00087 inline void setNumberBranches(int value) {
00088 branchIndex_ = 0;
00089 numberBranches_ = value;
00090 }
00091
00098 virtual double branch() = 0;
00105 virtual double branch(OsiSolverInterface * ) {
00106 return branch();
00107 }
00110 virtual void fix(OsiSolverInterface * ,
00111 double * , double * ,
00112 int ) const {}
00113
00116 virtual bool tighten(OsiSolverInterface * ) {return false;}
00117
00121 virtual void previousBranch() {
00122 assert(branchIndex_ > 0);
00123 branchIndex_--;
00124 way_ = -way_;
00125 }
00126
00127 using OsiBranchingObject::print ;
00130 virtual void print() const {}
00131
00143 inline int variable() const {
00144 return variable_;
00145 }
00146
00154 inline int way() const {
00155 return way_;
00156 }
00157
00162 inline void way(int way) {
00163 way_ = way;
00164 }
00165
00167 inline void setModel(CbcModel * model) {
00168 model_ = model;
00169 }
00171 inline CbcModel * model() const {
00172 return model_;
00173 }
00174
00176 inline CbcObject * object() const {
00177 return originalCbcObject_;
00178 }
00180 inline void setOriginalObject(CbcObject * object) {
00181 originalCbcObject_ = object;
00182 }
00183
00184
00185
00190 virtual CbcBranchObjType type() const = 0;
00191
00199 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const {
00200 const CbcBranchingObject* br = dynamic_cast<const CbcBranchingObject*>(brObj);
00201 return variable() - br->variable();
00202 }
00203
00212 virtual CbcRangeCompare compareBranchingObject
00213 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false) = 0;
00214
00215 protected:
00216
00218 CbcModel * model_;
00220 CbcObject * originalCbcObject_;
00221
00223 int variable_;
00224
00232 int way_;
00233
00234 };
00235 #endif
00236