Go to the documentation of this file.00001
00002 #ifndef CbcSOS_H
00003 #define CbcSOS_H
00004
00023 class CbcSOS : public CbcObject {
00024
00025 public:
00026
00027
00028 CbcSOS ();
00029
00040 CbcSOS (CbcModel * model, int numberMembers,
00041 const int * which, const double * weights, int identifier,
00042 int type = 1);
00043
00044
00045 CbcSOS ( const CbcSOS &);
00046
00048 virtual CbcObject * clone() const;
00049
00050
00051 CbcSOS & operator=( const CbcSOS& rhs);
00052
00053
00054 virtual ~CbcSOS ();
00055
00057 virtual double infeasibility(const OsiBranchingInformation * info,
00058 int &preferredWay) const;
00059
00060 using CbcObject::feasibleRegion ;
00062 virtual void feasibleRegion();
00063
00065 virtual CbcBranchingObject * createCbcBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) ;
00066
00067
00068
00072 virtual CbcObjectUpdateData createUpdateInformation(const OsiSolverInterface * solver,
00073 const CbcNode * node,
00074 const CbcBranchingObject * branchingObject);
00076 virtual void updateInformation(const CbcObjectUpdateData & data) ;
00077 using CbcObject::solverBranch ;
00082 virtual OsiSolverBranch * solverBranch() const;
00084 virtual void redoSequenceEtc(CbcModel * model, int numberColumns, const int * originalColumns);
00085
00087 OsiSOS * osiObject(const OsiSolverInterface * solver) const;
00089 inline int numberMembers() const {
00090 return numberMembers_;
00091 }
00092
00094 inline const int * members() const {
00095 return members_;
00096 }
00097
00099 inline int sosType() const {
00100 return sosType_;
00101 }
00103 inline int numberTimesDown() const {
00104 return numberTimesDown_;
00105 }
00107 inline int numberTimesUp() const {
00108 return numberTimesUp_;
00109 }
00110
00112 inline const double * weights() const {
00113 return weights_;
00114 }
00115
00117 inline void setNumberMembers(int n) {
00118 numberMembers_ = n;
00119 }
00120
00122 inline int * mutableMembers() const {
00123 return members_;
00124 }
00125
00127 inline double * mutableWeights() const {
00128 return weights_;
00129 }
00130
00133 virtual bool canDoHeuristics() const {
00134 return (sosType_ == 1 && integerValued_);
00135 }
00137 inline void setIntegerValued(bool yesNo) {
00138 integerValued_ = yesNo;
00139 }
00140 private:
00142
00144 int * members_;
00157 double * weights_;
00159 mutable double shadowEstimateDown_;
00161 mutable double shadowEstimateUp_;
00163 double downDynamicPseudoRatio_;
00165 double upDynamicPseudoRatio_;
00167 int numberTimesDown_;
00169 int numberTimesUp_;
00171 int numberMembers_;
00173 int sosType_;
00175 bool integerValued_;
00176 };
00177
00183 class CbcSOSBranchingObject : public CbcBranchingObject {
00184
00185 public:
00186
00187
00188 CbcSOSBranchingObject ();
00189
00190
00191 CbcSOSBranchingObject (CbcModel * model, const CbcSOS * clique,
00192 int way,
00193 double separator);
00194
00195
00196 CbcSOSBranchingObject ( const CbcSOSBranchingObject &);
00197
00198
00199 CbcSOSBranchingObject & operator=( const CbcSOSBranchingObject& rhs);
00200
00202 virtual CbcBranchingObject * clone() const;
00203
00204
00205 virtual ~CbcSOSBranchingObject ();
00206
00207 using CbcBranchingObject::branch ;
00209 virtual double branch();
00212 virtual void fix(OsiSolverInterface * solver,
00213 double * lower, double * upper,
00214 int branchState) const ;
00215
00219 virtual void previousBranch() {
00220 CbcBranchingObject::previousBranch();
00221 computeNonzeroRange();
00222 }
00223
00224 using CbcBranchingObject::print ;
00227 virtual void print();
00228
00230 virtual CbcBranchObjType type() const {
00231 return SoSBranchObj;
00232 }
00233
00241 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00242
00251 virtual CbcRangeCompare compareBranchingObject
00252 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00253
00255 void computeNonzeroRange();
00256
00257 private:
00259 const CbcSOS * set_;
00261 double separator_;
00267 int firstNonzero_;
00268 int lastNonzero_;
00269 };
00270 #endif
00271