source: trunk/Cbc/src/CbcBranchDecision.hpp

Last change on this file was 2465, checked in by unxusr, 7 months ago

script to format sources

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.2 KB
Line 
1// $Id: CbcBranchDecision.hpp 2465 2019-01-03 19:26:52Z unxusr $
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// Edwin 11/12/2009 carved from CbcBranchBase
7
8#ifndef CbcBranchDecision_H
9#define CbcBranchDecision_H
10
11#include "CbcBranchBase.hpp"
12
13/** Abstract branching decision base class
14
15  In the abstract, an CbcBranchDecision object is expected to be able to
16  compare two possible branching choices.
17
18  The #betterBranch() method is the crucial routine. It is expected to be able
19  to compare two \link CbcBranchingObject CbcBranchingObjects \endlink.
20
21  See CbcObject for an overview of the three classes (CbcObject,
22  CbcBranchingObject, and CbcBranchDecision) which make up cbc's branching
23  model.
24*/
25class CbcModel;
26class OsiChooseVariable;
27
28class CbcBranchDecision {
29public:
30  /// Default Constructor
31  CbcBranchDecision();
32
33  // Copy constructor
34  CbcBranchDecision(const CbcBranchDecision &);
35
36  /// Destructor
37  virtual ~CbcBranchDecision();
38
39  /// Clone
40  virtual CbcBranchDecision *clone() const = 0;
41
42  /// Initialize <i>e.g.</i> before starting to choose a branch at a node
43  virtual void initialize(CbcModel *model) = 0;
44
45  /** \brief Compare two branching objects. Return nonzero if branching
46           using \p thisOne is better than branching using \p bestSoFar.
47
48      If \p bestSoFar is NULL, the routine should return a nonzero value.
49      This routine is used only after strong branching.
50      Either this or bestBranch is used depending which user wants.
51
52    */
53
54  virtual int
55  betterBranch(CbcBranchingObject *thisOne,
56    CbcBranchingObject *bestSoFar,
57    double changeUp, int numberInfeasibilitiesUp,
58    double changeDown, int numberInfeasibilitiesDown)
59    = 0;
60
61  /** \brief Compare N branching objects. Return index of best
62        and sets way of branching in chosen object.
63
64      Either this or betterBranch is used depending which user wants.
65    */
66
67  virtual int
68  bestBranch(CbcBranchingObject **objects, int numberObjects, int numberUnsatisfied,
69    double *changeUp, int *numberInfeasibilitiesUp,
70    double *changeDown, int *numberInfeasibilitiesDown,
71    double objectiveValue);
72
73  /** Says whether this method can handle both methods -
74        1 better, 2 best, 3 both */
75  virtual int whichMethod()
76  {
77    return 2;
78  }
79
80  /** Saves a clone of current branching object.  Can be used to update
81        information on object causing branch - after branch */
82  virtual void saveBranchingObject(OsiBranchingObject *) {}
83  /** Pass in information on branch just done.
84        assumes object can get information from solver */
85  virtual void updateInformation(OsiSolverInterface *,
86    const CbcNode *) {}
87  /** Sets or gets best criterion so far */
88  virtual void setBestCriterion(double) {}
89  virtual double getBestCriterion() const
90  {
91    return 0.0;
92  }
93  /// Create C++ lines to get to current state
94  virtual void generateCpp(FILE *) {}
95  /// Model
96  inline CbcModel *cbcModel() const
97  {
98    return model_;
99  }
100  /* If chooseMethod_ id non-null then the rest is fairly pointless
101       as choosemethod_ will be doing all work
102     This comment makes more sense if you realise that there's a conversion in
103     process from the Cbc branching classes to Osi branching classes. The test
104     for use of the Osi branching classes is CbcModel::branchingMethod_
105     non-null (i.e., it points to one of these CbcBranchDecision objects) and
106     that branch decision object has an OsiChooseVariable method set. In which
107     case, we'll use it, rather than the choose[*]Variable methods defined in
108     CbcNode.
109        */
110
111  OsiChooseVariable *chooseMethod() const
112  {
113    return chooseMethod_;
114  }
115  /// Set (clone) chooseMethod
116  void setChooseMethod(const OsiChooseVariable &method);
117
118protected:
119  // Clone of branching object
120  CbcBranchingObject *object_;
121  /// Pointer to model
122  CbcModel *model_;
123  /* If chooseMethod_ id non-null then the rest is fairly pointless
124       as choosemethod_ will be doing all work
125    */
126  OsiChooseVariable *chooseMethod_;
127
128private:
129  /// Assignment is illegal
130  CbcBranchDecision &operator=(const CbcBranchDecision &rhs);
131};
132#endif
133
134/* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
135*/
Note: See TracBrowser for help on using the repository browser.