00001
00002
00003
00004
00005
00006
00007
00012 #ifndef CbcNWay_H
00013 #define CbcNWay_H
00014
00015 class CbcNWay : public CbcObject {
00016
00017 public:
00018
00019
00020 CbcNWay ();
00021
00024 CbcNWay (CbcModel * model, int numberMembers,
00025 const int * which, int identifier);
00026
00027
00028 CbcNWay ( const CbcNWay &);
00029
00031 virtual CbcObject * clone() const;
00032
00034 CbcNWay & operator=( const CbcNWay& rhs);
00035
00037 virtual ~CbcNWay ();
00038
00040 void setConsequence(int iColumn, const CbcConsequence & consequence);
00041
00043 void applyConsequence(int iSequence, int state) const;
00044
00046 virtual double infeasibility(const OsiBranchingInformation * info,
00047 int &preferredWay) const;
00048
00049 using CbcObject::feasibleRegion ;
00051 virtual void feasibleRegion();
00052
00054 virtual CbcBranchingObject * createCbcBranch(OsiSolverInterface * solver, const OsiBranchingInformation * info, int way) ;
00055
00057 inline int numberMembers() const {
00058 return numberMembers_;
00059 }
00060
00062 inline const int * members() const {
00063 return members_;
00064 }
00066 virtual void redoSequenceEtc(CbcModel * model, int numberColumns, const int * originalColumns);
00067
00068 protected:
00071 int numberMembers_;
00072
00074 int * members_;
00076 CbcConsequence ** consequence_;
00077 };
00081 class CbcNWayBranchingObject : public CbcBranchingObject {
00082
00083 public:
00084
00085
00086 CbcNWayBranchingObject ();
00087
00092 CbcNWayBranchingObject (CbcModel * model, const CbcNWay * nway,
00093 int numberBranches, const int * order);
00094
00095
00096 CbcNWayBranchingObject ( const CbcNWayBranchingObject &);
00097
00098
00099 CbcNWayBranchingObject & operator=( const CbcNWayBranchingObject& rhs);
00100
00102 virtual CbcBranchingObject * clone() const;
00103
00104
00105 virtual ~CbcNWayBranchingObject ();
00106
00107 using CbcBranchingObject::branch ;
00109 virtual double branch();
00110
00111 #ifdef JJF_ZERO
00112
00116 virtual void previousBranch();
00117 #endif
00118
00119 using CbcBranchingObject::print ;
00122 virtual void print();
00125 virtual int numberBranches() const {
00126 return numberInSet_;
00127 }
00129 virtual bool twoWay() const {
00130 return false;
00131 }
00132
00134 virtual CbcBranchObjType type() const {
00135 return NWayBranchObj;
00136 }
00137
00145 virtual int compareOriginalObject(const CbcBranchingObject* brObj) const;
00146
00155 virtual CbcRangeCompare compareBranchingObject
00156 (const CbcBranchingObject* brObj, const bool replaceIfOverlap = false);
00157
00158 private:
00160 int * order_;
00162 const CbcNWay * object_;
00164 int numberInSet_;
00165 };
00166 #endif