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/12/2009 carved from CbcBranchBase 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 // The types of objects that will be derived from this class. 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 // Methods used in heuristics 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 // was - Way to branch - -1 down (first), 1 up, -2 down (second), 2 up (second) 00232 int way_; 00233 00234 }; 00235 #endif 00236