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_;
00182 };
00183
00189 class CbcSOSBranchingObject : public CbcBranchingObject {
00190
00191 public:
00192
00193
00194 CbcSOSBranchingObject ();
00195
00196
00197 CbcSOSBranchingObject (CbcModel * model, const CbcSOS * clique,
00198 int way,
00199 double separator);
00200
00201
00202 CbcSOSBranchingObject ( const CbcSOSBranchingObject &);
00203
00204
00205 CbcSOSBranchingObject & operator=( const CbcSOSBranchingObject& rhs);
00206
00208 virtual CbcBranchingObject * clone() const;
00209
00210
00211 virtual ~CbcSOSBranchingObject ();
00212
00213 using CbcBranchingObject::branch ;
00215 virtual double branch();
00218 virtual void fix(OsiSolverInterface * solver,
00219 double * lower, double * upper,
00220 int branchState) const ;
00221
00225 virtual void previousBranch() {
00226 CbcBranchingObject::previousBranch();
00227 computeNonzeroRange();
00228 }
00229
00230 using CbcBranchingObject::print ;
00233 virtual void print();
00234
00236 virtual CbcBranchObjType type() const {
00237 return SoSBranchObj;
00238 }
00239
00247 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00248
00257 virtual CbcRangeCompare compareBranchingObject
00258 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00259
00261 void computeNonzeroRange();
00262
00263 private:
00265 const CbcSOS * set_;
00267 double separator_;
00273 int firstNonzero_;
00274 int lastNonzero_;
00275 };
00276 #endif
00277