Cbc  2.8.12
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CbcNode.hpp
Go to the documentation of this file.
1 /* $Id: CbcNode.hpp 1573 2011-01-05 01:12:36Z lou $ */
2 // Copyright (C) 2002, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 
6 #ifndef CbcNode_H
7 #define CbcNode_H
8 
9 #include <string>
10 #include <vector>
11 
12 #include "CoinWarmStartBasis.hpp"
13 #include "CoinSearchTree.hpp"
14 #include "CbcBranchBase.hpp"
15 #include "CbcNodeInfo.hpp"
16 #include "CbcFullNodeInfo.hpp"
17 #include "CbcPartialNodeInfo.hpp"
18 
19 class OsiSolverInterface;
20 class OsiSolverBranch;
21 
22 class OsiCuts;
23 class OsiRowCut;
24 class OsiRowCutDebugger;
25 class CoinWarmStartBasis;
26 class CbcCountRowCut;
27 class CbcModel;
28 class CbcNode;
29 class CbcSubProblem;
30 class CbcGeneralBranchingObject;
31 
49 class CbcNode : public CoinTreeNode {
50 
51 public:
52 
54  CbcNode ();
55 
57  CbcNode (CbcModel * model, CbcNode * lastNode);
58 
60  CbcNode (const CbcNode &);
61 
63  CbcNode & operator= (const CbcNode& rhs);
64 
66  ~CbcNode ();
67 
83  void
84  createInfo(CbcModel * model,
85  CbcNode * lastNode,
86  const CoinWarmStartBasis *lastws,
87  const double * lastLower, const double * lastUpper,
88  int numberOldActiveCuts, int numberNewCuts);
89 
110  int chooseBranch (CbcModel * model,
111  CbcNode * lastNode,
112  int numberPassesLeft);
138  int chooseDynamicBranch (CbcModel * model,
139  CbcNode * lastNode,
140  OsiSolverBranch * & branches,
141  int numberPassesLeft);
168  int chooseOsiBranch (CbcModel * model,
169  CbcNode * lastNode,
170  OsiBranchingInformation * usefulInfo,
171  int branchState);
187  int chooseClpBranch (CbcModel * model,
188  CbcNode * lastNode);
189  int analyze(CbcModel * model, double * results);
191  void decrementCuts(int change = 1);
192 
194  void decrementParentCuts(CbcModel * model, int change = 1);
195 
197  void nullNodeInfo();
206  void initializeInfo();
207 
209  int branch(OsiSolverInterface * solver);
210 
214  double checkIsCutoff(double cutoff);
215  // Information to make basis and bounds
216  inline CbcNodeInfo * nodeInfo() const {
217  return nodeInfo_;
218  }
219 
220  // Objective value
221  inline double objectiveValue() const {
222  return objectiveValue_;
223  }
224  inline void setObjectiveValue(double value) {
225  objectiveValue_ = value;
226  }
228  inline int numberBranches() const {
229  if (branch_)
230  return (branch_->numberBranches()) ;
231  else
232  return (-1) ;
233  }
234 
235  /* Active arm of the attached OsiBranchingObject.
236 
237  In the simplest instance, coded -1 for the down arm of the branch, +1 for
238  the up arm. But see OsiBranchingObject::way()
239  Use nodeInfo--.numberBranchesLeft_ to see how active
240  */
241  int way() const;
243  inline int depth() const {
244  return depth_;
245  }
247  inline void setDepth(int value) {
248  depth_ = value;
249  }
251  inline int numberUnsatisfied() const {
252  return numberUnsatisfied_;
253  }
255  inline void setNumberUnsatisfied(int value) {
256  numberUnsatisfied_ = value;
257  }
259  inline double sumInfeasibilities() const {
260  return sumInfeasibilities_;
261  }
263  inline void setSumInfeasibilities(double value) {
264  sumInfeasibilities_ = value;
265  }
266  // Guessed objective value (for solution)
267  inline double guessedObjectiveValue() const {
268  return guessedObjectiveValue_;
269  }
270  inline void setGuessedObjectiveValue(double value) {
271  guessedObjectiveValue_ = value;
272  }
274  inline const OsiBranchingObject * branchingObject() const {
275  return branch_;
276  }
278  inline OsiBranchingObject * modifiableBranchingObject() const {
279  return branch_;
280  }
282  inline void setBranchingObject(OsiBranchingObject * branchingObject) {
283  branch_ = branchingObject;
284  }
286  inline int nodeNumber() const {
287  return nodeNumber_;
288  }
289  inline void setNodeNumber(int node) {
290  nodeNumber_ = node;
291  }
293  inline bool onTree() const {
294  return (state_&1) != 0;
295  }
297  inline void setOnTree(bool yesNo) {
298  if (yesNo) state_ |= 1;
299  else state_ &= ~1;
300  }
302  inline bool active() const {
303  return (state_&2) != 0;
304  }
306  inline void setActive(bool yesNo) {
307  if (yesNo) state_ |= 2;
308  else state_ &= ~2;
309  }
311  void print() const;
313  inline void checkInfo() const {
314  assert (nodeInfo_->numberBranchesLeft() ==
315  branch_->numberBranchesLeft());
316  }
317 
318 private:
319  // Data
321  CbcNodeInfo * nodeInfo_;
323  double objectiveValue_;
325  double guessedObjectiveValue_;
327  double sumInfeasibilities_;
329  OsiBranchingObject * branch_;
331  int depth_;
333  int numberUnsatisfied_;
335  int nodeNumber_;
340  int state_;
341 };
342 
343 
344 #endif
345 
void setObjectiveValue(double value)
Definition: CbcNode.hpp:224
void createInfo(CbcModel *model, CbcNode *lastNode, const CoinWarmStartBasis *lastws, const double *lastLower, const double *lastUpper, int numberOldActiveCuts, int numberNewCuts)
Create a description of the subproblem at this node.
void initializeInfo()
Initialize reference counts in attached CbcNodeInfo.
void setActive(bool yesNo)
Sets true if active.
Definition: CbcNode.hpp:306
void checkInfo() const
Debug.
Definition: CbcNode.hpp:313
void setNumberUnsatisfied(int value)
Set the number of objects unsatisfied at this node.
Definition: CbcNode.hpp:255
void setOnTree(bool yesNo)
Sets true if on tree.
Definition: CbcNode.hpp:297
void setSumInfeasibilities(double value)
Set sum of "infeasibilities" reported by each object.
Definition: CbcNode.hpp:263
void nullNodeInfo()
Nulls out node info.
int numberBranches() const
Number of arms defined for the attached OsiBranchingObject.
Definition: CbcNode.hpp:228
void decrementParentCuts(CbcModel *model, int change=1)
Decrement all active cut counts in chain starting at parent.
int numberUnsatisfied() const
Get the number of objects unsatisfied at this node.
Definition: CbcNode.hpp:251
int depth() const
Depth in branch-and-cut search tree.
Definition: CbcNode.hpp:243
bool onTree() const
Returns true if on tree.
Definition: CbcNode.hpp:293
double guessedObjectiveValue() const
Definition: CbcNode.hpp:267
void setNodeNumber(int node)
Definition: CbcNode.hpp:289
const OsiBranchingObject * branchingObject() const
Branching object for this node.
Definition: CbcNode.hpp:274
int chooseDynamicBranch(CbcModel *model, CbcNode *lastNode, OsiSolverBranch *&branches, int numberPassesLeft)
Create a branching object for the node - when dynamic pseudo costs.
int chooseOsiBranch(CbcModel *model, CbcNode *lastNode, OsiBranchingInformation *usefulInfo, int branchState)
Create a branching object for the node.
CbcNode()
Default Constructor.
~CbcNode()
Destructor.
CbcNode & operator=(const CbcNode &rhs)
Assignment operator.
OsiBranchingObject * modifiableBranchingObject() const
Modifiable branching object for this node.
Definition: CbcNode.hpp:278
double objectiveValue() const
Definition: CbcNode.hpp:221
OsiRowCut augmented with bookkeeping.
Information required while the node is live.
Definition: CbcNode.hpp:49
CbcNodeInfo * nodeInfo() const
Definition: CbcNode.hpp:216
double sumInfeasibilities() const
Get sum of "infeasibilities" reported by each object.
Definition: CbcNode.hpp:259
void setDepth(int value)
Set depth in branch-and-cut search tree.
Definition: CbcNode.hpp:247
int branch(OsiSolverInterface *solver)
Does next branch and updates state.
bool active() const
Returns true if active.
Definition: CbcNode.hpp:302
int analyze(CbcModel *model, double *results)
int nodeNumber() const
The node number.
Definition: CbcNode.hpp:286
Information required to recreate the subproblem at this node.
Definition: CbcNodeInfo.hpp:68
double checkIsCutoff(double cutoff)
Double checks in case node can change its mind! Returns objective value Can change objective etc...
void setBranchingObject(OsiBranchingObject *branchingObject)
Set branching object for this node (takes ownership)
Definition: CbcNode.hpp:282
void print() const
Print.
int chooseClpBranch(CbcModel *model, CbcNode *lastNode)
Create a branching object for the node.
int numberBranchesLeft() const
Return number of branches left in object.
Simple Branch and bound class.
Definition: CbcModel.hpp:100
void setGuessedObjectiveValue(double value)
Definition: CbcNode.hpp:270
int chooseBranch(CbcModel *model, CbcNode *lastNode, int numberPassesLeft)
Create a branching object for the node.
void decrementCuts(int change=1)
Decrement active cut counts.
int way() const