CbcSOS.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef CbcSOS_H
00009 #define CbcSOS_H
00010
00029 class CbcSOS : public CbcObject {
00030
00031 public:
00032
00033
00034 CbcSOS ();
00035
00046 CbcSOS (CbcModel * model, int numberMembers,
00047 const int * which, const double * weights, int identifier,
00048 int type = 1);
00049
00050
00051 CbcSOS ( const CbcSOS &);
00052
00054 virtual CbcObject * clone() const;
00055
00056
00057 CbcSOS & operator=( const CbcSOS& rhs);
00058
00059
00060 virtual ~CbcSOS ();
00061
00063 virtual double infeasibility(const OsiBranchingInformation * info,
00064 int &preferredWay) const;
00065
00066 using CbcObject::feasibleRegion ;
00068 virtual void feasibleRegion();
00069
00071 virtual CbcBranchingObject * createCbcBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) ;
00072
00073
00074
00078 virtual CbcObjectUpdateData createUpdateInformation(const OsiSolverInterface * solver,
00079 const CbcNode * node,
00080 const CbcBranchingObject * branchingObject);
00082 virtual void updateInformation(const CbcObjectUpdateData & data) ;
00083 using CbcObject::solverBranch ;
00088 virtual OsiSolverBranch * solverBranch() const;
00090 virtual void redoSequenceEtc(CbcModel * model, int numberColumns, const int * originalColumns);
00091
00093 OsiSOS * osiObject(const OsiSolverInterface * solver) const;
00095 inline int numberMembers() const {
00096 return numberMembers_;
00097 }
00098
00100 inline const int * members() const {
00101 return members_;
00102 }
00103
00105 inline int sosType() const {
00106 return sosType_;
00107 }
00109 inline int numberTimesDown() const {
00110 return numberTimesDown_;
00111 }
00113 inline int numberTimesUp() const {
00114 return numberTimesUp_;
00115 }
00116
00118 inline const double * weights() const {
00119 return weights_;
00120 }
00121
00123 inline void setNumberMembers(int n) {
00124 numberMembers_ = n;
00125 }
00126
00128 inline int * mutableMembers() const {
00129 return members_;
00130 }
00131
00133 inline double * mutableWeights() const {
00134 return weights_;
00135 }
00136
00139 virtual bool canDoHeuristics() const {
00140 return (sosType_ == 1 && integerValued_);
00141 }
00143 inline void setIntegerValued(bool yesNo) {
00144 integerValued_ = yesNo;
00145 }
00146 private:
00148
00150 int * members_;
00163 double * weights_;
00165 mutable double shadowEstimateDown_;
00167 mutable double shadowEstimateUp_;
00169 double downDynamicPseudoRatio_;
00171 double upDynamicPseudoRatio_;
00173 int numberTimesDown_;
00175 int numberTimesUp_;
00177 int numberMembers_;
00179 int sosType_;
00181 bool integerValued_;
00183 bool oddValues_;
00184 };
00185
00191 class CbcSOSBranchingObject : public CbcBranchingObject {
00192
00193 public:
00194
00195
00196 CbcSOSBranchingObject ();
00197
00198
00199 CbcSOSBranchingObject (CbcModel * model, const CbcSOS * clique,
00200 int way,
00201 double separator);
00202
00203
00204 CbcSOSBranchingObject ( const CbcSOSBranchingObject &);
00205
00206
00207 CbcSOSBranchingObject & operator=( const CbcSOSBranchingObject& rhs);
00208
00210 virtual CbcBranchingObject * clone() const;
00211
00212
00213 virtual ~CbcSOSBranchingObject ();
00214
00215 using CbcBranchingObject::branch ;
00217 virtual double branch();
00220 virtual void fix(OsiSolverInterface * solver,
00221 double * lower, double * upper,
00222 int branchState) const ;
00223
00227 virtual void previousBranch() {
00228 CbcBranchingObject::previousBranch();
00229 computeNonzeroRange();
00230 }
00231
00232 using CbcBranchingObject::print ;
00235 virtual void print();
00236
00238 virtual CbcBranchObjType type() const {
00239 return SoSBranchObj;
00240 }
00241
00249 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00250
00259 virtual CbcRangeCompare compareBranchingObject
00260 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00261
00263 void computeNonzeroRange();
00264
00265 private:
00267 const CbcSOS * set_;
00269 double separator_;
00275 int firstNonzero_;
00276 int lastNonzero_;
00277 };
00278 #endif
00279