source: trunk/Docs/cbcmodelclass.xml @ 119

Last change on this file since 119 was 119, checked in by rlh, 16 years ago

Revisions for book chapter

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.5 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2  <chapter id="cbcmodelclass">
3  <title>
4   The CBC Model Class
5  </title>
6  <section id="hierarchy">
7  <title>
8  Overview
9  </title>
10  <para>
11  The class that controls CBC is <classname>CbcModel</classname>.  This class is where most
12  of the parameter setting is done. The absolute minimum number of actions for <classname>CbcModel</classname> is two:
13
14    <itemizedlist>
15    <listitem>
16    <simpara>
17    <function>CbcModel(OsiSolverInterface &amp; linearSolver)</function> as constructor, and
18    </simpara>
19    </listitem>
20    <listitem>
21    <simpara>
22    <function>branchAndBound()</function> for solving the problem.   
23    </simpara>
24    </listitem>
25    </itemizedlist>
26  </para>
27  </section>
28
29  <section id="firstexample">
30  <title>
31  First Example
32  </title>
33  <para>
34  Below is our first CBC sample program.  This program is short enough to present in full.
35  This code can be found in the CBC Samples directory, <filename>COIN/Cbc/Samples</filename>.
36  Most of the remaining examples in this Guide will take the form of small code fragments.
37  </para>
38  <example id="minimum.cpp">
39  <title>minimum.cpp</title>
40  <programlisting>
41  <![CDATA[ 
42// Copyright (C) 2005, International Business Machines
43// Corporation and others.  All Rights Reserved.
44
45#include "CbcModel.hpp"
46
47// Using CLP as the solver
48#include "OsiClpSolverInterface.hpp"
49
50int main (int argc, const char *argv[])
51{
52  OsiClpSolverInterface solver1;
53
54  // Read in example model in MPS file format
55  // and assert that it is a clean model
56  int numMpsReadErrors = solver1.readMps("../../Mps/Sample/p0033.mps","");
57  assert(numMpsReadErrors==0);
58
59  // Pass the solver (with the problem data) to CbcModel
60  CbcModel model(solver1);
61
62  // Do complete search
63  model.branchAndBound();
64
65  /* Print the solution.  CbcModel clones solver so we
66     need to get current copy from the CbcModel */
67  int numberColumns = model.solver()->getNumCols();
68   
69  const double * solution = model.solver()->getColSolution();
70   
71  for (int iColumn=0;iColumn<numberColumns;iColumn++) {
72    double value=solution[iColumn];
73    if (fabs(value)>1.0e-7&&model.solver()->isInteger(iColumn))
74      printf("%d has value %g\n",iColumn,value);
75   }
76  return 0;
77}   
78  ]]>   
79  </programlisting>
80  </example>
81  <!-- Clone comment  needs more explaination. What info is safe? When do you need to do a refresh?? -->
82  <!-- printf vs cout  -->
83
84  <para>
85  The sample program <xref linkend="minimum.cpp"/> creates a <classname>OsiClpSolverInterface</classname> solver interface, and reads an MPS file. If there are no errors, the program passes the solver to <classname>CbcModel</classname>
86  which solves it using the branch-and-bound algorithm.  The part of the program which solves the problem
87  is very small (one line!) but before that one line, the LP solver had to be created and populated with data and
88  after that one line the results were printed out.
89 </para>
90</section>
91
92<section id="osiAndCbc">
93<title>
94The Relationship Between OSI and CBC
95</title>
96<para> 
97 Example <xref linkend="minimum.cpp"/> illustrates the dependency of CBC on 
98  the <classname>OsiSolverInterface</classname> class. The constructor of <classname>CbcModel</classname> takes a pointer to an <classname>OsiSolverInterface</classname> (i.e., a solver). The <classname>CbcModel</classname> clones the solver, and uses its own instance of the solver. The <classname>CbcModel</classname>'s solver and the original solver (e.g., <varname>sovler1</varname>) are not in sync unless the user synchronizes them. The user can always access the <classname>CbcModel</classname>'s solver through the <function>model()</function> method.  To synchronize the orignal solver, explicitly refreshing it, e.g., 
99 <programlisting>
100  solver1 = model.solver();
101</programlisting>
102
103For convenience, many of the OSI method's to access problem data have identical method names in  <classname>CbcModel</classname>. (It's just more convenient to type <function>model.getNumCols()</function> rather than <function>model.solver()->getNumCols()</function>). While the method names may be identical, sometimes the values they return are not, e.g., <function>getColSolution()</function>. <classname>CbcModel</classname> refreshes its solver at certain logical points. For instance, the OSI method<function>getColSolution()</function> will contain the best solution so far, while the <classname>CbcModel</classname> method may not. In this case, it is safer to use <function>CbcModel::bestSolution()</function>.
104</para>
105<para>
106All the OSI methods used in <filename>minimum.cpp</filename> have equivalent methods in <classname>CbcModel</classname>. But there are some OSI methods which are not present in CBC. For example, if  the program produced a lot of undesired output, one might add the line
107</para>
108<programlisting>
109  model.solver()->setHintParam(OsiDoReducePrint,true,OsiHintTry);
110</programlisting>
111<para> 
112  <!-- model.solver() returns an OSISolverInterface? -->
113  to reduce the output. There is no <function>model.setHintParam(OsiDoReducePrint,true,OsiHintTry)</function>.
114  </para>
115  </section>
116
117  <section id="gettingsolution">
118  <title>
119  Getting Solution Information Using <classname>CbcModel</classname> Methods
120  </title>
121  <para>
122  The OSI way to check for optimality is to call <function>model.isProvenOptimal()</function>.  Also
123  available are <function>isProvenInfeasible()</function>,
124  <function>isSolutionLimitReached()</function>,
125  <function>isNodeLimitReached()</function> or the feared
126  <function>isAbandoned()</function>. You can also pick up
127  <function>int&nbsp;status()</function> which returns 0 if finished,
128   1 if stopped by user and 2 if difficulties. (Note: a status of 0 is returned, even if the model is proved
129   infeasible.)
130  </para>
131  <para>
132  Similarly, solution values can be accessed via OSI methods.  The OSI methods pick up
133  the current solution in the <classname>CBCModel</classname>.  The current solution will match the best solution found so far if called after <function>branchAndBound()</function> and if a solution was found.
134  </para>
135  <table frame="none">
136  <title>
137  Methods for Getting Solution Information from OSI
138  </title>
139  <tgroup cols="2">
140  <thead>
141    <row>
142      <entry>
143      Purpose
144      </entry>
145      <entry>
146      Name
147      </entry>
148      <entry>
149      Notes
150      </entry>
151    </row>
152  </thead>
153  <tbody>
154    <row>
155      <entry align="left" valign="top">
156      Primal column solution
157      </entry>
158      <entry align="left" valign="top">
159      <function>const double * getColSolution()</function>
160      </entry>
161      <entry align="left" valign="top">
162      The OSI version will return  best solution unless none has been found. It is safer to use <classname>CbcModel</classname> version, <function>CbcModel::bestSolution()</function>
163      </entry>
164    </row>
165    <row>
166      <entry align="left" valign="top">
167      Dual row solution
168      </entry>
169      <entry align="left" valign="top">
170      <function>const double * getRowPrice()</function>
171      </entry>
172      <entry align="left" valign="top">
173      Identical <classname>CbcModel</classname> version available, <function>CbcModel::getRowPrice()</function>.
174      </entry>
175    </row>
176    <row>
177      <entry align="left" valign="top">
178      Primal row solution
179      </entry>
180      <entry align="left" valign="top">
181      <function>const double * getRowActivity()</function>
182      </entry>
183      <entry align="left" valign="top">
184      Identical <classname>CbcModel</classname> version available, <function>CbcModel::getRowActivity()</function>.
185      </entry>
186    </row>
187    <row>
188      <entry align="left" valign="top">
189      Dual column solution
190      </entry>
191      <entry align="left" valign="top">
192      <function>const double * getReducedCost()</function>
193      </entry>
194     <entry align="left" valign="top">
195      Identical <classname>CbcModel</classname> version available, <function>CbcModel::gtReducedCost()</function>.
196      </entry>
197    </row>
198    <row>
199      <entry align="left" valign="top">
200      Number of rows in model
201      </entry>
202      <entry align="left" valign="top">
203      <function>int getNumRows()</function>
204      </entry>
205      <entry align="left" valign="top">
206      Identical <classname>CbcModel</classname> version available, <function>CbcModel::getNumRows()</function>, but note that the number of rows may change due to cuts.
207      </entry>
208    </row>
209    <row>
210      <entry align="left" valign="top">
211      Number of columns in model
212      </entry>
213      <entry align="left" valign="top">
214      <function>int getNumCols()</function>
215      </entry>
216      <entry align="left" valign="top">
217      Identical <classname>CbcModel</classname> version available, <function>CbcModel::getNumCols()</function>.
218      </entry>
219    </row>
220  </tbody>
221  </tgroup>
222  </table>
223  </section>
224
225  <section id="setsandgets">
226  <title>Useful Set and Get Methods in <classname>CbcModel</classname></title>
227  <table frame="none">
228  <title>Useful Set and Get Methods in <classname>CbcModel</classname></title>
229    <tgroup cols="2">
230    <thead>
231    <row>
232    <entry>
233    Method(s)
234    </entry>
235    <entry>
236    Description
237    </entry>
238    </row>
239    </thead>
240    <tbody>
241    <row>
242      <entry align="left" valign="top">
243      <function>bool&nbsp;setMaximumNodes(int value)</function><sbr/>
244      <function>int&nbsp;getMaximumNodes() const</function><sbr/>
245      <function>bool&nbsp;setMaximumSeconds(double value)</function><sbr/>
246
247      <function>double&nbsp;getMaximumSeconds()</function><sbr/>
248      <function>bool&nbsp;setMaximumSolutions(double value)</function><sbr/>
249      <function>double&nbsp;getMaximumSolutions() const</function>
250      </entry>
251      <entry align="left" valign="top">
252      These methods tell CBC to stop after a given number of nodes or
253      seconds or solutions (and returns these values).
254      </entry>
255    </row>
256    <row>
257      <entry align="left" valign="top">
258      <function>bool&nbsp;setIntegerTolerance(double value) const</function><sbr/>
259      <function>double&nbsp;getIntegerTolerance() const</function>
260      </entry>
261      <entry align="left" valign="top">
262      An integer variable
263      is deemed to be at an integral value if it is no further than this tolerance
264      away.
265      </entry>
266    </row>
267    <row>
268      <entry align="left" valign="top">
269      <function>bool&nbsp;setAllowableGap(double value)</function><sbr/>
270      <function>double&nbsp;getAllowableGap() const</function><sbr/>
271      <function>bool&nbsp;setAllowablePercentageGap(double value)</function><sbr/>
272      <function>double&nbsp;getAllowablePercentageGap() const</function><sbr/>
273      <function>bool&nbsp;setAllowableFractionGap(double value)</function><sbr/>
274      <function>double&nbsp;getAllowableFractionGap() const</function><sbr/>
275      </entry>
276      <entry align="left" valign="top">
277      <classname>CbcModel</classname> returns if the gap between the best known solution and the best
278      possible solution is less than this (or as a percentage or fraction).
279      </entry>
280    </row>
281    <row>
282      <entry align="left" valign="top">
283      <function>void&nbsp;setNumberStrong(double value) </function><sbr/>
284      <function>int&nbsp;numberStrong() const </function>
285      </entry>
286      <entry align="left" valign="top">
287      Get or set the maximum number of candidates at a node to
288      be evaluated for strong branching.
289      </entry>
290    </row>
291    <row>
292      <entry align="left" valign="top">
293      <function>void&nbsp;setPrintFrequency(int value) </function><sbr/>
294      <function>int&nbsp;printFrequency() const</function>
295      </entry>
296      <entry align="left" valign="top">
297      Controls the number of nodes evaluated between status prints.
298      Print frequency has very slight overhead if small.
299      </entry>
300    </row>
301    <row>
302      <entry align="left" valign="top">
303      <function>int&nbsp;getNodeCount() const</function>
304      </entry>
305      <entry align="left" valign="top">
306      Returns number of nodes search took
307      </entry>
308    </row>
309    <row>
310      <entry align="left" valign="top">
311      <function>int&nbsp;numberRowsAtContinuous() const</function>
312      </entry>
313      <entry align="left" valign="top">
314      Returns number of rows at continuous
315      </entry>
316    </row>
317    <row>
318      <entry align="left" valign="top">
319      <function>int &nbsp;numberIntegers() const</function><sbr/>
320      <function>const int&nbsp;*&nbsp;integerVariable() const</function>
321      </entry>
322      <entry align="left" valign="top">
323      Returns number of integers and an array giving which ones
324      </entry>
325    </row>
326    <row>
327      <entry align="left" valign="top">
328      <function>bool&nbsp;isBinary(int colIndex) const</function><sbr/>
329      <function>bool&nbsp;isContinuous(int colIndex) const</function><sbr/>
330      <function>bool&nbsp;isInteger(int colIndex) const</function>
331      </entry>
332      <entry align="left" valign="top">
333      Returns information on a variable.  You can use OSI methods
334      to set these attributes (before handing to <classname>CbcModel</classname>)
335      </entry>
336    </row>
337    <row>
338      <entry align="left" valign="top">
339      <function>double&nbsp;getObjValue() const</function>
340      </entry>
341      <entry align="left" valign="top">
342      This method returns the best objective value so far.
343      </entry>
344    </row>
345    <row>
346      <entry align="left" valign="top">
347      <function>double&nbsp;getCurrentObjValue() const</function>
348      </entry>
349      <entry align="left" valign="top">
350      This method returns the current objective value.
351      </entry>
352    </row>
353    <row>
354      <entry align="left" valign="top">
355      <function>const&nbsp;double&nbsp;*&nbsp;getObjCoefficients() const</function><sbr/>
356       </entry>
357      <entry align="left" valign="top">
358      This method return the objective coefficients.
359      </entry>
360    </row>
361    <row>
362      <entry align="left" valign="top">
363      <function>const&nbsp;double&nbsp;*&nbsp;getRowLower() const</function><sbr/>
364       <function>const&nbsp;double&nbsp;*&nbsp;getRowUpper() const</function><sbr/>
365       <function>const&nbsp;double&nbsp;*&nbsp;getColLower() const</function><sbr/>
366       <function>const&nbsp;double&nbsp;*&nbsp;getColUpper() const</function><sbr/>
367       </entry>
368      <entry align="left" valign="top">
369      These methods give lower and upper bounds on row and column activities.
370      </entry>
371    </row>
372    <row>
373      <entry align="left" valign="top">
374      <function>const&nbsp;CoinPackMatrix&nbsp;*&nbsp;getMatrixByRow() const</function>
375      </entry>
376      <entry align="left" valign="top">
377      This method returns a pointer to a row copy of matrix
378      <classname>CoinPackedMatrix</classname> which can be further examined.
379      </entry>
380    </row>
381    <row>
382      <entry align="left" valign="top">
383      <function>const CoinPackMatrix * getMatrixByCol() const</function>
384      </entry>
385      <entry align="left" valign="top">
386      This method returns a pointer to a column copy of matrix
387      <classname>CoinPackedMatrix</classname> which can be further examined.
388      </entry>
389    </row>
390    <row>
391      <entry align="left" valign="top">
392    <function>CoinBigIndex&nbsp;getNumElements() const</function> 
393     <footnote> 
394     <para> 
395        <type>CoinBigIndex</type> is a <function>typedef</function> which in
396        most cases is the same as <type>int</type>.
397        </para> 
398    </footnote> 
399      </entry>
400      <entry align="left" valign="top">
401      Returns the number of elements in the problem matrix.
402      </entry>
403    </row>
404    <row>
405      <entry align="left" valign="top">
406      <function>void setObjSense(double&nbsp;value)</function><sbr/>
407      <function>double getObjSense() const</function> 
408      </entry>
409      <entry align="left" valign="top">
410      These methods set and get the objective sense.  The parameter
411      <parameter>value</parameter> should be +1 to minimize and -1 to maximize.
412      </entry>
413    </row>
414    </tbody>
415  </tgroup>
416  </table>
417  </section>
418  <section id="majormethods">
419  <title>
420  Impacting the Solution Process
421  </title>
422  <para>
423  The methods in <xref linkend="majorMethods"/> can have a major impact on CBC's search.. A brief description is given in the table, along with main parameters. ( The description here may not give all parameters if they are exotic.) The remainder of this documents describes some of the common usages of these methods.
424  </para>
425  <table frame="none" id="majorMethods">
426  <title>Major Methods</title>
427    <tgroup cols="2">
428    <thead>
429    <row>
430    <entry>
431    Method(s)
432    </entry>
433    <entry>
434    Description
435    </entry>
436    </row>
437    </thead>
438    <tbody>
439    <row>
440      <entry align="left" valign="top">
441      <function>passInPriorities(const int * priorities, bool ifNotSimpleIntegers,
442                        int defaultValue=1000)</function>
443      </entry>
444      <entry align="left" valign="top">
445      Normally this is a list of priorities (1 being highest) and the other
446      <parameter>ifNotSimpleIntegers</parameter> being false which set priorities for all integer
447      variables.  If two variables are unsatisfied and one has a higher priority
448      then it is always preferred whatever its value.  This can be very powerful
449      but also see PseudoCosts in <classname>CbcObject</classname> discussion.
450      </entry>
451    </row>
452    <row>
453      <entry align="left" valign="top">
454      <function>addCutGenerator(CglCutGenerator *,int howOften, const char * name)</function>
455      </entry>
456      <entry align="left" valign="top">
457      This is used to add a cut generator to <classname>CbcModel</classname>.  Any cut generator in CGL can be used. If <parameter>howOften</parameter> &gt; 0 then <parameter>name</parameter> will be called at root node and again every <parameter>howOften</parameter> nodes. There is an option to override and to call <parameter>name</parameter> depth 0,k,2k, etc.  If <parameter>howOften</parameter> = -1 then the code determines how effective <parameter>name</parameter>is at root node and dynamically sets <parameter>howOften</parameter>. If <parameter>howOften</parameter> = -99 then <parameter>name></parameter> is just used at root node.
458      There is also a redundant <parameter>howOften</parameter> = -100 setting which switches <parameter>name</parameter> off. This parameter setting is useful for testing.  For usage see <filename>sample2.cpp</filename> in the <filename>COIN/Cbc/Samples</filename> directory <xref linkend="moreexamples"/> which uses the most common cut generators.
459      </entry>
460    </row>
461    <row>
462      <entry align="left" valign="top">
463      <function>addHeuristic(CbcHeuristic *)</function>
464      </entry>
465      <entry align="left" valign="top">
466      This adds one heuristic to <classname>CbcModel</classname>.See the section on <classname>CbcHeuristic</classname>  to obtain
467      a list of available heuristics and a guide as to building new ones.
468      </entry>
469    </row>
470    <row>
471      <entry align="left" valign="top">
472      <function>addObjects(int&nbsp;number,CbcObject&nbsp;**&nbsp;objects) </function>
473      </entry>
474      <entry align="left" valign="top">
475      This adds members of the base class <classname>CbcObject</classname> to <classname>CbcModel</classname>.  See the section
476      on <classname>CbcObject</classname> for detailed nformation.  The <parameter>objects</parameter> are cloned by the code so the
477      user should delete them after the call to <function>addObjects</function>.  There are two
478      main cases.  The first is when the originally created objects are left and
479      new ones added (maybe with a higher priority);  this might be used when
480      simple integer objects exist and Special Ordered Sets of type 1 are going
481      to be added, which while not necessary will give extra power in branching.
482      The second case is when the old ones are being deleted. 
483      For usage see <filename>sos.cpp</filename> in the <filename>COIN/Cbc/Samples</filename> directory <xref linkend="moreexamples"/>.
484      </entry>
485    </row>
486    <row>
487      <entry align="left" valign="top">
488      <function>CglPreProcess::preProcess(OsiSolverInterface &amp;)</function>
489      </entry>
490      <entry align="left" valign="top">
491      This is not really part of CBC and can be used by other mixed integer
492      solvers but it can be a useful tool.  It tries to fix variables and
493      strengthen coefficients and also do a normal presolve.  Owing to the
494      odd nature of integer programming it may not always reduce the time
495      taken but is definitely worth trying.  For an example of using
496      <function>CglPreProcess()</function> (and <function>CglPostProcess()</function>) see <filename>sample2.cpp</filename> in the CBC Samples
497      directory <xref linkend="moreexamples"/>.
498      </entry>
499    </row>
500    <row>
501      <entry align="left" valign="top">
502      <function>setNodeComparison(CbcCompareBase&nbsp;*)</function>
503      </entry>
504      <entry align="left" valign="top">
505       This is used to invoke a non-default node comparisons
506       in determining the next node on tree to explore. The order a tree is explored
507       can make a large difference in runtime. Specialized comparisons are easy to implement.
508       See the section on <classname>CbcCompare</classname>.
509      </entry>
510    </row>
511    </tbody>
512  </tgroup>
513  </table>
514  </section>
515
516<section id="mostAndLeastUsefulClasses">
517 <title>
518  Most (and Least) Useful Classes Used by CBC
519</title>
520<para>
521<classname>CbcModel</classname> uses other classes in CBC, some of which are virtual and may have multiple instances. Not all classes are created equal. The two tables below list the classes within <classname>CbcModel</classname> that are of most interest and of least interest.
522</para>
523    <table frame="none">
524  <title>Classes Used by CbcModel - Most Useful</title>
525    <tgroup cols="3">
526    <thead>
527    <row>
528    <entry>
529    Class name
530    </entry>
531    <entry>
532    Description
533    </entry>
534    <entry>
535    Notes
536    </entry>
537    </row>
538    </thead>
539    <tbody>
540    <row>
541      <entry align="left" valign="top">
542      <classname>CbcCompareBase</classname>
543      </entry>
544      <entry align="left" valign="top">
545      Controls which node on tree is selected
546      </entry>
547      <entry align="left" valign="top">
548      The default is <classname>CbcCompareDefault</classname>. Other comparison classes in <filename>CbcCompareActual.hpp</filename> include
549      <classname>CbcCompareDepth</classname> and <classname>CbcCompareObjective</classname>. It is very easy for user to
550      experiment with different comparisons.
551      </entry>
552    </row>
553    <row>
554      <entry align="left" valign="top">
555      <classname>CbcCutGenerator</classname>
556      </entry>
557      <entry align="left" valign="top">
558      A wrapper for <classname>CglCutGenerator</classname> with additional data to control when the cut generator is used.
559      </entry>
560      <entry align="left" valign="top">
561      Other than knowing how to add a cut generator to <classname>CbcModel</classname>, there is not much the average user needs to know about this class. <!-- what's the default? -->
562      </entry>
563    </row>
564    <row>
565      <entry align="left" valign="top">
566      <classname>CbcHeuristic</classname>
567      </entry>
568      <entry align="left" valign="top">
569      Heuristic that attempts to generate valid solutions
570      </entry>
571      <entry align="left" valign="top">
572      Users can get a lot of value out of coding specialized heuristics.  There can be
573      as many different heuristics as you like. <!-- What's the default? -->
574      </entry>
575    </row>
576    <row>
577      <entry align="left" valign="top">
578      <classname>CbcObject</classname>
579      </entry>
580      <entry align="left" valign="top">
581      Defines what it means for a variable to be satisfied.
582      </entry>
583      <entry align="left" valign="top">
584      Virtual class. The branching model used in CBC is based on the idea of an "object". An object has (i) feasible region, (ii) can be evaluated for infeaibility, (iii) can be branched on, e.g., a method of generating a branching object, which defines an up branch and a down branch and (iv) allows comparsion of the effect of branching. Instances include simple integer, simple integer with pseudocosts, SOS (type 1 and 2), and lotsizing (see CbcBranch....hpp).
585      </entry>
586    </row>
587    <row>
588      <entry align="left" valign="top">
589      <classname>OsiSolverInterface</classname>
590      </entry>
591      <entry align="left" valign="top">
592      Defines the LP solver being used and the LP model. Normally
593      a pointer to the desired <classname>OsiSolverInteface</classname> is passed to <classname>CbcModel</classname> before branch and cut.
594      </entry>
595      <entry align="left" valign="top">
596      Virtual class. The user instantiates the solver interface of their choice, e.g.,
597      <classname>OsiClpSolverInterface</classname>.
598      </entry>
599    </row>
600    </tbody>
601  </tgroup>
602  </table>
603
604There is not much about the classes listed in <xref linkend="least"/> that the average user needs to know about.
605    <table frame="none" id="least">
606  <title>Classes Used by CbcModel - Least Useful</title>
607    <tgroup cols="3">
608    <thead>
609    <row>
610    <entry>
611    Class name
612    </entry>
613    <entry>
614    Description
615    </entry>
616    <entry>
617    Notes
618    </entry>
619    </row>
620    </thead>
621    <tbody>
622    <row>
623      <entry align="left" valign="top">
624      <classname>CbcBranchDecision</classname>
625      </entry>
626      <entry align="left" valign="top">
627      Used in choosing which variable to branch on, however, most of
628      the work is done by the definitions in <classname>CbcObject</classname>.
629      </entry>
630      <entry align="left" valign="top">
631      Defaults to <classname>CbcBranchDefaultDecision</classname>.
632      </entry>
633    </row>
634    <row>
635      <entry align="left" valign="top">
636      <classname>CbcCountRowCut</classname>
637      </entry>
638      <entry align="left" valign="top">
639      Interface to <classname>OsiRowCut</classname>. It counts the usage so cuts can gracefully vanish.
640      </entry>
641      <entry align="left" valign="top">
642      See <classname>OsiRowCut</classname> for more details. <!-- Default? -->
643      </entry>
644    </row>
645    <row>
646      <entry align="left" valign="top">
647      <classname>CbcNode</classname>
648      </entry>
649      <entry align="left" valign="top">
650      Controls which variable/entity is selected to be branch on.
651      </entry>
652      <entry align="left" valign="top">
653      Controlled via <classname>CbcModel</classname> parameters.  <!-- Default? -->
654      </entry>
655    </row>
656    <row>
657      <entry align="left" valign="top">
658      <classname>CbcNodeInfo</classname>
659      </entry>
660      <entry align="left" valign="top">
661      Contains data on bounds, basis, etc. for one node of the search tree.
662      </entry>
663      <entry align="left" valign="top">
664      Header is located in <filename>CbcNode.hpp</filename>. <!-- Defaults? -->
665      </entry>
666    </row>
667    <row>
668      <entry align="left" valign="top">
669      <classname>CbcTree</classname>
670      </entry>
671      <entry align="left" valign="top">
672      Defines how the search tree is stored.
673      </entry>
674      <entry align="left" valign="top">
675      This class can be changed but it is not likely to be modified.<!-- Defaults? -->
676      </entry>
677    </row>
678    <row>
679      <entry align="left" valign="top">
680      <classname>CoinMessageHandler</classname>
681      </entry>
682      <entry align="left" valign="top">
683      Deals with message handling
684      </entry>
685      <entry align="left" valign="top">
686      The user can inherit from <classname>CoinMessageHandler</classname> to specialize message handling. 
687      <!-- Defaults? -->
688      </entry>
689    </row>
690    <row>
691      <entry align="left" valign="top">
692      <classname>CoinWarmStartBasis</classname>
693      </entry>
694      <entry align="left" valign="top">
695      Basis representation to be used by solver
696      </entry>
697      <entry align="left" valign="top">
698      <!-- Defaults? -->
699      </entry>
700    </row>
701    </tbody>
702  </tgroup>
703  </table>
704</section>
705
706  </chapter>
Note: See TracBrowser for help on using the repository browser.