00001
00002
00003
00004
00005
00006 #ifndef CbcNode_H
00007 #define CbcNode_H
00008
00009 #include <string>
00010 #include <vector>
00011
00012 #include "CoinWarmStartBasis.hpp"
00013 #include "CoinSearchTree.hpp"
00014 #include "CbcBranchBase.hpp"
00015 #include "CbcNodeInfo.hpp"
00016 #include "CbcFullNodeInfo.hpp"
00017 #include "CbcPartialNodeInfo.hpp"
00018
00019 class OsiSolverInterface;
00020 class OsiSolverBranch;
00021
00022 class OsiCuts;
00023 class OsiRowCut;
00024 class OsiRowCutDebugger;
00025 class CoinWarmStartBasis;
00026 class CbcCountRowCut;
00027 class CbcModel;
00028 class CbcNode;
00029 class CbcSubProblem;
00030 class CbcGeneralBranchingObject;
00031
00049 class CbcNode : public CoinTreeNode {
00050
00051 public:
00052
00054 CbcNode ();
00055
00057 CbcNode (CbcModel * model, CbcNode * lastNode);
00058
00060 CbcNode (const CbcNode &);
00061
00063 CbcNode & operator= (const CbcNode& rhs);
00064
00066 ~CbcNode ();
00067
00083 void
00084 createInfo(CbcModel * model,
00085 CbcNode * lastNode,
00086 const CoinWarmStartBasis *lastws,
00087 const double * lastLower, const double * lastUpper,
00088 int numberOldActiveCuts, int numberNewCuts);
00089
00110 int chooseBranch (CbcModel * model,
00111 CbcNode * lastNode,
00112 int numberPassesLeft);
00138 int chooseDynamicBranch (CbcModel * model,
00139 CbcNode * lastNode,
00140 OsiSolverBranch * & branches,
00141 int numberPassesLeft);
00168 int chooseOsiBranch (CbcModel * model,
00169 CbcNode * lastNode,
00170 OsiBranchingInformation * usefulInfo,
00171 int branchState);
00187 int chooseClpBranch (CbcModel * model,
00188 CbcNode * lastNode);
00189 int analyze(CbcModel * model, double * results);
00191 void decrementCuts(int change = 1);
00192
00194 void decrementParentCuts(CbcModel * model, int change = 1);
00195
00197 void nullNodeInfo();
00206 void initializeInfo();
00207
00209 int branch(OsiSolverInterface * solver);
00210
00214 double checkIsCutoff(double cutoff);
00215
00216 inline CbcNodeInfo * nodeInfo() const {
00217 return nodeInfo_;
00218 }
00219
00220
00221 inline double objectiveValue() const {
00222 return objectiveValue_;
00223 }
00224 inline void setObjectiveValue(double value) {
00225 objectiveValue_ = value;
00226 }
00228 inline int numberBranches() const {
00229 if (branch_)
00230 return (branch_->numberBranches()) ;
00231 else
00232 return (-1) ;
00233 }
00234
00235
00236
00237
00238
00239
00240
00241 int way() const;
00243 inline int depth() const {
00244 return depth_;
00245 }
00247 inline void setDepth(int value) {
00248 depth_ = value;
00249 }
00251 inline int numberUnsatisfied() const {
00252 return numberUnsatisfied_;
00253 }
00255 inline void setNumberUnsatisfied(int value) {
00256 numberUnsatisfied_ = value;
00257 }
00259 inline double sumInfeasibilities() const {
00260 return sumInfeasibilities_;
00261 }
00263 inline void setSumInfeasibilities(double value) {
00264 sumInfeasibilities_ = value;
00265 }
00266
00267 inline double guessedObjectiveValue() const {
00268 return guessedObjectiveValue_;
00269 }
00270 inline void setGuessedObjectiveValue(double value) {
00271 guessedObjectiveValue_ = value;
00272 }
00274 inline const OsiBranchingObject * branchingObject() const {
00275 return branch_;
00276 }
00278 inline OsiBranchingObject * modifiableBranchingObject() const {
00279 return branch_;
00280 }
00282 inline void setBranchingObject(OsiBranchingObject * branchingObject) {
00283 branch_ = branchingObject;
00284 }
00286 inline int nodeNumber() const {
00287 return nodeNumber_;
00288 }
00289 inline void setNodeNumber(int node) {
00290 nodeNumber_ = node;
00291 }
00293 inline bool onTree() const {
00294 return (state_&1) != 0;
00295 }
00297 inline void setOnTree(bool yesNo) {
00298 if (yesNo) state_ |= 1;
00299 else state_ &= ~1;
00300 }
00302 inline bool active() const {
00303 return (state_&2) != 0;
00304 }
00306 inline void setActive(bool yesNo) {
00307 if (yesNo) state_ |= 2;
00308 else state_ &= ~2;
00309 }
00311 void print() const;
00313 inline void checkInfo() const {
00314 assert (nodeInfo_->numberBranchesLeft() ==
00315 branch_->numberBranchesLeft());
00316 }
00317
00318 private:
00319
00321 CbcNodeInfo * nodeInfo_;
00323 double objectiveValue_;
00325 double guessedObjectiveValue_;
00327 double sumInfeasibilities_;
00329 OsiBranchingObject * branch_;
00331 int depth_;
00333 int numberUnsatisfied_;
00335 int nodeNumber_;
00340 int state_;
00341 };
00342
00343
00344 #endif
00345