summaryrefslogtreecommitdiff
path: root/newstructure/thirdparty/linux/include/coin/CbcModel.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'newstructure/thirdparty/linux/include/coin/CbcModel.hpp')
-rw-r--r--newstructure/thirdparty/linux/include/coin/CbcModel.hpp2952
1 files changed, 0 insertions, 2952 deletions
diff --git a/newstructure/thirdparty/linux/include/coin/CbcModel.hpp b/newstructure/thirdparty/linux/include/coin/CbcModel.hpp
deleted file mode 100644
index ceef661..0000000
--- a/newstructure/thirdparty/linux/include/coin/CbcModel.hpp
+++ /dev/null
@@ -1,2952 +0,0 @@
-/* $Id: CbcModel.hpp 2206 2015-07-07 20:44:40Z stefan $ */
-// Copyright (C) 2002, International Business Machines
-// Corporation and others. All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#ifndef CbcModel_H
-#define CbcModel_H
-#include <string>
-#include <vector>
-#include "CoinMessageHandler.hpp"
-#include "OsiSolverInterface.hpp"
-#include "OsiBranchingObject.hpp"
-#include "OsiCuts.hpp"
-#include "CoinWarmStartBasis.hpp"
-#include "CbcCompareBase.hpp"
-#include "CbcCountRowCut.hpp"
-#include "CbcMessage.hpp"
-#include "CbcEventHandler.hpp"
-#include "ClpDualRowPivot.hpp"
-
-
-class CbcCutGenerator;
-class CbcBaseModel;
-class OsiRowCut;
-class OsiBabSolver;
-class OsiRowCutDebugger;
-class CglCutGenerator;
-class CglStored;
-class CbcCutModifier;
-class CglTreeProbingInfo;
-class CbcHeuristic;
-class OsiObject;
-class CbcThread;
-class CbcTree;
-class CbcStrategy;
-class CbcSymmetry;
-class CbcFeasibilityBase;
-class CbcStatistics;
-class CbcFullNodeInfo;
-class CbcEventHandler ;
-class CglPreProcess;
-class OsiClpSolverInterface;
-class ClpNodeStuff;
-
-// #define CBC_CHECK_BASIS 1
-
-//#############################################################################
-
-/** Simple Branch and bound class
-
- The initialSolve() method solves the initial LP relaxation of the MIP
- problem. The branchAndBound() method can then be called to finish using
- a branch and cut algorithm.
-
- <h3>Search Tree Traversal</h3>
-
- Subproblems (aka nodes) requiring additional evaluation are stored using
- the CbcNode and CbcNodeInfo objects. Ancestry linkage is maintained in the
- CbcNodeInfo object. Evaluation of a subproblem within branchAndBound()
- proceeds as follows:
- <ul>
- <li> The node representing the most promising parent subproblem is popped
- from the heap which holds the set of subproblems requiring further
- evaluation.
- <li> Using branching instructions stored in the node, and information in
- its ancestors, the model and solver are adjusted to create the
- active subproblem.
- <li> If the parent subproblem will require further evaluation
- (<i>i.e.</i>, there are branches remaining) its node is pushed back
- on the heap. Otherwise, the node is deleted. This may trigger
- recursive deletion of ancestors.
- <li> The newly created subproblem is evaluated.
- <li> If the subproblem requires further evaluation, a node is created.
- All information needed to recreate the subproblem (branching
- information, row and column cuts) is placed in the node and the node
- is added to the set of subproblems awaiting further evaluation.
- </ul>
- Note that there is never a node representing the active subproblem; the model
- and solver represent the active subproblem.
-
- <h3>Row (Constraint) Cut Handling</h3>
-
- For a typical subproblem, the sequence of events is as follows:
- <ul>
- <li> The subproblem is rebuilt for further evaluation: One result of a
- call to addCuts() is a traversal of ancestors, leaving a list of all
- cuts used in the ancestors in #addedCuts_. This list is then scanned
- to construct a basis that includes only tight cuts. Entries for
- loose cuts are set to NULL.
- <li> The subproblem is evaluated: One result of a call to solveWithCuts()
- is the return of a set of newly generated cuts for the subproblem.
- #addedCuts_ is also kept up-to-date as old cuts become loose.
- <li> The subproblem is stored for further processing: A call to
- CbcNodeInfo::addCuts() adds the newly generated cuts to the
- CbcNodeInfo object associated with this node.
- </ul>
- See CbcCountRowCut for details of the bookkeeping associated with cut
- management.
-*/
-
-class CbcModel {
-
-public:
-
- enum CbcIntParam {
- /** The maximum number of nodes before terminating */
- CbcMaxNumNode = 0,
- /** The maximum number of solutions before terminating */
- CbcMaxNumSol,
- /** Fathoming discipline
-
- Controls objective function comparisons for purposes of fathoming by bound
- or determining monotonic variables.
-
- If 1, action is taken only when the current objective is strictly worse
- than the target. Implementation is handled by adding a small tolerance to
- the target.
- */
- CbcFathomDiscipline,
- /** Adjusts printout
- 1 does different node message with number unsatisfied on last branch
- */
- CbcPrinting,
- /** Number of branches (may be more than number of nodes as may
- include strong branching) */
- CbcNumberBranches,
- /** Just a marker, so that a static sized array can store parameters. */
- CbcLastIntParam
- };
-
- enum CbcDblParam {
- /** The maximum amount the value of an integer variable can vary from
- integer and still be considered feasible. */
- CbcIntegerTolerance = 0,
- /** The objective is assumed to worsen by this amount for each
- integer infeasibility. */
- CbcInfeasibilityWeight,
- /** The amount by which to tighten the objective function cutoff when
- a new solution is discovered. */
- CbcCutoffIncrement,
- /** Stop when the gap between the objective value of the best known solution
- and the best bound on the objective of any solution is less than this.
-
- This is an absolute value. Conversion from a percentage is left to the
- client.
- */
- CbcAllowableGap,
- /** Stop when the gap between the objective value of the best known solution
- and the best bound on the objective of any solution is less than this
- fraction of of the absolute value of best known solution.
-
- Code stops if either this test or CbcAllowableGap test succeeds
- */
- CbcAllowableFractionGap,
- /** \brief The maximum number of seconds before terminating.
- A double should be adequate! */
- CbcMaximumSeconds,
- /// Cutoff - stored for speed
- CbcCurrentCutoff,
- /// Optimization direction - stored for speed
- CbcOptimizationDirection,
- /// Current objective value
- CbcCurrentObjectiveValue,
- /// Current minimization objective value
- CbcCurrentMinimizationObjectiveValue,
- /** \brief The time at start of model.
- So that other pieces of code can access */
- CbcStartSeconds,
- /** Stop doing heuristics when the gap between the objective value of the
- best known solution and the best bound on the objective of any solution
- is less than this.
-
- This is an absolute value. Conversion from a percentage is left to the
- client.
- */
- CbcHeuristicGap,
- /** Stop doing heuristics when the gap between the objective value of the
- best known solution and the best bound on the objective of any solution
- is less than this fraction of of the absolute value of best known
- solution.
-
- Code stops if either this test or CbcAllowableGap test succeeds
- */
- CbcHeuristicFractionGap,
- /// Smallest non-zero change on a branch
- CbcSmallestChange,
- /// Sum of non-zero changes on a branch
- CbcSumChange,
- /// Largest non-zero change on a branch
- CbcLargestChange,
- /// Small non-zero change on a branch to be used as guess
- CbcSmallChange,
- /** Just a marker, so that a static sized array can store parameters. */
- CbcLastDblParam
- };
-
- //---------------------------------------------------------------------------
-
-public:
- ///@name Solve methods
- //@{
- /** \brief Solve the initial LP relaxation
-
- Invoke the solver's %initialSolve() method.
- */
- void initialSolve();
-
- /** \brief Invoke the branch \& cut algorithm
-
- The method assumes that initialSolve() has been called to solve the
- LP relaxation. It processes the root node, then proceeds to explore the
- branch & cut search tree. The search ends when the tree is exhausted or
- one of several execution limits is reached.
- If doStatistics is 1 summary statistics are printed
- if 2 then also the path to best solution (if found by branching)
- if 3 then also one line per node
- */
- void branchAndBound(int doStatistics = 0);
-private:
-
- /** \brief Evaluate a subproblem using cutting planes and heuristics
-
- The method invokes a main loop which generates cuts, applies heuristics,
- and reoptimises using the solver's native %resolve() method.
- It returns true if the subproblem remains feasible at the end of the
- evaluation.
- */
- bool solveWithCuts(OsiCuts & cuts, int numberTries, CbcNode * node);
- /** Generate one round of cuts - serial mode
- returns -
- 0 - normal
- 1 - must keep going
- 2 - set numberTries to zero
- -1 - infeasible
- */
- int serialCuts(OsiCuts & cuts, CbcNode * node, OsiCuts & slackCuts, int lastNumberCuts);
- /** Generate one round of cuts - parallel mode
- returns -
- 0 - normal
- 1 - must keep going
- 2 - set numberTries to zero
- -1 - infeasible
- */
- int parallelCuts(CbcBaseModel * master, OsiCuts & cuts, CbcNode * node, OsiCuts & slackCuts, int lastNumberCuts);
- /** Input one node output N nodes to put on tree and optional solution update
- This should be able to operate in parallel so is given a solver and is const(ish)
- However we will need to keep an array of solver_ and bases and more
- status is 0 for normal, 1 if solution
- Calling code should always push nodes back on tree
- */
- CbcNode ** solveOneNode(int whichSolver, CbcNode * node,
- int & numberNodesOutput, int & status) ;
- /// Update size of whichGenerator
- void resizeWhichGenerator(int numberNow, int numberAfter);
-public:
-#ifdef CBC_KEEP_DEPRECATED
- // See if anyone is using these any more!!
- /** \brief create a clean model from partially fixed problem
-
- The method creates a new model with given bounds and with no tree.
- */
- CbcModel * cleanModel(const double * lower, const double * upper);
- /** \brief Invoke the branch \& cut algorithm on partially fixed problem
-
- The method presolves the given model and does branch and cut. The search
- ends when the tree is exhausted or maximum nodes is reached.
-
- If better solution found then it is saved.
-
- Returns 0 if search completed and solution, 1 if not completed and solution,
- 2 if completed and no solution, 3 if not completed and no solution.
-
- Normally okay to do cleanModel immediately followed by subBranchandBound
- (== other form of subBranchAndBound)
- but may need to get at model for advanced features.
-
- Deletes model2
- */
- int subBranchAndBound(CbcModel * model2,
- CbcModel * presolvedModel,
- int maximumNodes);
- /** \brief Invoke the branch \& cut algorithm on partially fixed problem
-
- The method creates a new model with given bounds, presolves it
- then proceeds to explore the branch & cut search tree. The search
- ends when the tree is exhausted or maximum nodes is reached.
-
- If better solution found then it is saved.
-
- Returns 0 if search completed and solution, 1 if not completed and solution,
- 2 if completed and no solution, 3 if not completed and no solution.
-
- This is just subModel immediately followed by other version of
- subBranchandBound.
-
- */
- int subBranchAndBound(const double * lower, const double * upper,
- int maximumNodes);
-
- /** \brief Process root node and return a strengthened model
-
- The method assumes that initialSolve() has been called to solve the
- LP relaxation. It processes the root node and then returns a pointer
- to the strengthened model (or NULL if infeasible)
- */
- OsiSolverInterface * strengthenedModel();
- /** preProcess problem - replacing solver
- If makeEquality true then <= cliques converted to ==.
- Presolve will be done numberPasses times.
-
- Returns NULL if infeasible
-
- If makeEquality is 1 add slacks to get cliques,
- if 2 add slacks to get sos (but only if looks plausible) and keep sos info
- */
- CglPreProcess * preProcess( int makeEquality = 0, int numberPasses = 5,
- int tuning = 5);
- /** Does postprocessing - original solver back.
- User has to delete process */
- void postProcess(CglPreProcess * process);
-#endif
- /// Adds an update information object
- void addUpdateInformation(const CbcObjectUpdateData & data);
- /** Do one node - broken out for clarity?
- also for parallel (when baseModel!=this)
- Returns 1 if solution found
- node NULL on return if no branches left
- newNode NULL if no new node created
- */
- int doOneNode(CbcModel * baseModel, CbcNode * & node, CbcNode * & newNode);
-
-public:
- /** \brief Reoptimise an LP relaxation
-
- Invoke the solver's %resolve() method.
- whereFrom -
- 0 - initial continuous
- 1 - resolve on branch (before new cuts)
- 2 - after new cuts
- 3 - obsolete code or something modified problem in unexpected way
- 10 - after strong branching has fixed variables at root
- 11 - after strong branching has fixed variables in tree
-
- returns 1 feasible, 0 infeasible, -1 feasible but skip cuts
- */
- int resolve(CbcNodeInfo * parent, int whereFrom,
- double * saveSolution = NULL,
- double * saveLower = NULL,
- double * saveUpper = NULL);
- /// Make given rows (L or G) into global cuts and remove from lp
- void makeGlobalCuts(int numberRows, const int * which);
- /// Make given cut into a global cut
- int makeGlobalCut(const OsiRowCut * cut);
- /// Make given cut into a global cut
- int makeGlobalCut(const OsiRowCut & cut);
- /// Make given column cut into a global cut
- void makeGlobalCut(const OsiColCut * cut);
- /// Make given column cut into a global cut
- void makeGlobalCut(const OsiColCut & cut);
- /// Make partial cut into a global cut and save
- void makePartialCut(const OsiRowCut * cut, const OsiSolverInterface * solver=NULL);
- /// Make partial cuts into global cuts
- void makeGlobalCuts();
- /// Which cut generator generated this cut
- inline const int * whichGenerator() const
- { return whichGenerator_;}
- //@}
-
- /** \name Presolve methods */
- //@{
-
- /** Identify cliques and construct corresponding objects.
-
- Find cliques with size in the range
- [\p atLeastThisMany, \p lessThanThis] and construct corresponding
- CbcClique objects.
- If \p makeEquality is true then a new model may be returned if
- modifications had to be made, otherwise \c this is returned.
- If the problem is infeasible #numberObjects_ is set to -1.
- A client must use deleteObjects() before a second call to findCliques().
- If priorities exist, clique priority is set to the default.
- */
- CbcModel * findCliques(bool makeEquality, int atLeastThisMany,
- int lessThanThis, int defaultValue = 1000);
-
- /** Do integer presolve, creating a new (presolved) model.
-
- Returns the new model, or NULL if feasibility is lost.
- If weak is true then just does a normal presolve
-
- \todo It remains to work out the cleanest way of getting a solution to
- the original problem at the end. So this is very preliminary.
- */
- CbcModel * integerPresolve(bool weak = false);
-
- /** Do integer presolve, modifying the current model.
-
- Returns true if the model remains feasible after presolve.
- */
- bool integerPresolveThisModel(OsiSolverInterface * originalSolver, bool weak = false);
-
-
- /// Put back information into the original model after integer presolve.
- void originalModel(CbcModel * presolvedModel, bool weak);
-
- /** \brief For variables involved in VUB constraints, see if we can tighten
- bounds by solving lp's
-
- Returns false if feasibility is lost.
- If CglProbing is available, it will be tried as well to see if it can
- tighten bounds.
- This routine is just a front end for tightenVubs(int,const int*,double).
-
- If <tt>type = -1</tt> all variables are processed (could be very slow).
- If <tt>type = 0</tt> only variables involved in VUBs are processed.
- If <tt>type = n > 0</tt>, only the n most expensive VUB variables
- are processed, where it is assumed that x is at its maximum so delta
- would have to go to 1 (if x not at bound).
-
- If \p allowMultipleBinary is true, then a VUB constraint is a row with
- one continuous variable and any number of binary variables.
-
- If <tt>useCutoff < 1.0e30</tt>, the original objective is installed as a
- constraint with \p useCutoff as a bound.
- */
- bool tightenVubs(int type, bool allowMultipleBinary = false,
- double useCutoff = 1.0e50);
-
- /** \brief For variables involved in VUB constraints, see if we can tighten
- bounds by solving lp's
-
- This version is just handed a list of variables to be processed.
- */
- bool tightenVubs(int numberVubs, const int * which,
- double useCutoff = 1.0e50);
- /**
- Analyze problem to find a minimum change in the objective function.
- */
- void analyzeObjective();
-
- /**
- Add additional integers.
- */
- void AddIntegers();
- /**
- Save copy of the model.
- */
- void saveModel(OsiSolverInterface * saveSolver, double * checkCutoffForRestart, bool * feasible);
- /**
- Flip direction of optimization on all models
- */
- void flipModel();
-
- //@}
-
- /** \name Object manipulation routines
-
- See OsiObject for an explanation of `object' in the context of CbcModel.
- */
- //@{
-
- /// Get the number of objects
- inline int numberObjects() const {
- return numberObjects_;
- }
- /// Set the number of objects
- inline void setNumberObjects(int number) {
- numberObjects_ = number;
- }
-
- /// Get the array of objects
- inline OsiObject ** objects() const {
- return object_;
- }
-
- /// Get the specified object
- const inline OsiObject * object(int which) const {
- return object_[which];
- }
- /// Get the specified object
- inline OsiObject * modifiableObject(int which) const {
- return object_[which];
- }
-
- void setOptionalInteger(int index);
-
- /// Delete all object information (and just back to integers if true)
- void deleteObjects(bool findIntegers = true);
-
- /** Add in object information.
-
- Objects are cloned; the owner can delete the originals.
- */
- void addObjects(int numberObjects, OsiObject ** objects);
-
- /** Add in object information.
-
- Objects are cloned; the owner can delete the originals.
- */
- void addObjects(int numberObjects, CbcObject ** objects);
-
- /// Ensure attached objects point to this model.
- void synchronizeModel() ;
-
- /** \brief Identify integer variables and create corresponding objects.
-
- Record integer variables and create an CbcSimpleInteger object for each
- one.
- If \p startAgain is true, a new scan is forced, overwriting any existing
- integer variable information.
- If type > 0 then 1==PseudoCost, 2 new ones low priority
- */
-
- void findIntegers(bool startAgain, int type = 0);
-
-#ifdef SWITCH_VARIABLES
- /// Convert Dynamic to Switching
- int findSwitching();
- /// Fix associated variables
- int fixAssociated(OsiSolverInterface * solver,int cleanBasis);
- /// Debug associated variables
- int checkAssociated(const OsiSolverInterface * solver,
- const double * solution, int printLevel);
-#endif
- //@}
-
- //---------------------------------------------------------------------------
-
- /**@name Parameter set/get methods
-
- The set methods return true if the parameter was set to the given value,
- false if the value of the parameter is out of range.
-
- The get methods return the value of the parameter.
-
- */
- //@{
- /// Set an integer parameter
- inline bool setIntParam(CbcIntParam key, int value) {
- intParam_[key] = value;
- return true;
- }
- /// Set a double parameter
- inline bool setDblParam(CbcDblParam key, double value) {
- dblParam_[key] = value;
- return true;
- }
- /// Get an integer parameter
- inline int getIntParam(CbcIntParam key) const {
- return intParam_[key];
- }
- /// Get a double parameter
- inline double getDblParam(CbcDblParam key) const {
- return dblParam_[key];
- }
- /*! \brief Set cutoff bound on the objective function.
-
- When using strict comparison, the bound is adjusted by a tolerance to
- avoid accidentally cutting off the optimal solution.
- */
- void setCutoff(double value) ;
-
- /// Get the cutoff bound on the objective function - always as minimize
- inline double getCutoff() const { //double value ;
- //solver_->getDblParam(OsiDualObjectiveLimit,value) ;
- //assert( dblParam_[CbcCurrentCutoff]== value * solver_->getObjSense());
- return dblParam_[CbcCurrentCutoff];
- }
-
- /// Set the \link CbcModel::CbcMaxNumNode maximum node limit \endlink
- inline bool setMaximumNodes( int value) {
- return setIntParam(CbcMaxNumNode, value);
- }
-
- /// Get the \link CbcModel::CbcMaxNumNode maximum node limit \endlink
- inline int getMaximumNodes() const {
- return getIntParam(CbcMaxNumNode);
- }
-
- /** Set the
- \link CbcModel::CbcMaxNumSol maximum number of solutions \endlink
- desired.
- */
- inline bool setMaximumSolutions( int value) {
- return setIntParam(CbcMaxNumSol, value);
- }
- /** Get the
- \link CbcModel::CbcMaxNumSol maximum number of solutions \endlink
- desired.
- */
- inline int getMaximumSolutions() const {
- return getIntParam(CbcMaxNumSol);
- }
- /// Set the printing mode
- inline bool setPrintingMode( int value) {
- return setIntParam(CbcPrinting, value);
- }
-
- /// Get the printing mode
- inline int getPrintingMode() const {
- return getIntParam(CbcPrinting);
- }
-
- /** Set the
- \link CbcModel::CbcMaximumSeconds maximum number of seconds \endlink
- desired.
- */
- inline bool setMaximumSeconds( double value) {
- return setDblParam(CbcMaximumSeconds, value);
- }
- /** Get the
- \link CbcModel::CbcMaximumSeconds maximum number of seconds \endlink
- desired.
- */
- inline double getMaximumSeconds() const {
- return getDblParam(CbcMaximumSeconds);
- }
- /// Current time since start of branchAndbound
- double getCurrentSeconds() const ;
-
- /// Return true if maximum time reached
- bool maximumSecondsReached() const ;
-
- /** Set the
- \link CbcModel::CbcIntegerTolerance integrality tolerance \endlink
- */
- inline bool setIntegerTolerance( double value) {
- return setDblParam(CbcIntegerTolerance, value);
- }
- /** Get the
- \link CbcModel::CbcIntegerTolerance integrality tolerance \endlink
- */
- inline double getIntegerTolerance() const {
- return getDblParam(CbcIntegerTolerance);
- }
-
- /** Set the
- \link CbcModel::CbcInfeasibilityWeight
- weight per integer infeasibility \endlink
- */
- inline bool setInfeasibilityWeight( double value) {
- return setDblParam(CbcInfeasibilityWeight, value);
- }
- /** Get the
- \link CbcModel::CbcInfeasibilityWeight
- weight per integer infeasibility \endlink
- */
- inline double getInfeasibilityWeight() const {
- return getDblParam(CbcInfeasibilityWeight);
- }
-
- /** Set the \link CbcModel::CbcAllowableGap allowable gap \endlink
- between the best known solution and the best possible solution.
- */
- inline bool setAllowableGap( double value) {
- return setDblParam(CbcAllowableGap, value);
- }
- /** Get the \link CbcModel::CbcAllowableGap allowable gap \endlink
- between the best known solution and the best possible solution.
- */
- inline double getAllowableGap() const {
- return getDblParam(CbcAllowableGap);
- }
-
- /** Set the \link CbcModel::CbcAllowableFractionGap fraction allowable gap \endlink
- between the best known solution and the best possible solution.
- */
- inline bool setAllowableFractionGap( double value) {
- return setDblParam(CbcAllowableFractionGap, value);
- }
- /** Get the \link CbcModel::CbcAllowableFractionGap fraction allowable gap \endlink
- between the best known solution and the best possible solution.
- */
- inline double getAllowableFractionGap() const {
- return getDblParam(CbcAllowableFractionGap);
- }
- /** Set the \link CbcModel::CbcAllowableFractionGap percentage allowable gap \endlink
- between the best known solution and the best possible solution.
- */
- inline bool setAllowablePercentageGap( double value) {
- return setDblParam(CbcAllowableFractionGap, value*0.01);
- }
- /** Get the \link CbcModel::CbcAllowableFractionGap percentage allowable gap \endlink
- between the best known solution and the best possible solution.
- */
- inline double getAllowablePercentageGap() const {
- return 100.0*getDblParam(CbcAllowableFractionGap);
- }
- /** Set the \link CbcModel::CbcHeuristicGap heuristic gap \endlink
- between the best known solution and the best possible solution.
- */
- inline bool setHeuristicGap( double value) {
- return setDblParam(CbcHeuristicGap, value);
- }
- /** Get the \link CbcModel::CbcHeuristicGap heuristic gap \endlink
- between the best known solution and the best possible solution.
- */
- inline double getHeuristicGap() const {
- return getDblParam(CbcHeuristicGap);
- }
-
- /** Set the \link CbcModel::CbcHeuristicFractionGap fraction heuristic gap \endlink
- between the best known solution and the best possible solution.
- */
- inline bool setHeuristicFractionGap( double value) {
- return setDblParam(CbcHeuristicFractionGap, value);
- }
- /** Get the \link CbcModel::CbcHeuristicFractionGap fraction heuristic gap \endlink
- between the best known solution and the best possible solution.
- */
- inline double getHeuristicFractionGap() const {
- return getDblParam(CbcHeuristicFractionGap);
- }
- /** Set the
- \link CbcModel::CbcCutoffIncrement \endlink
- desired.
- */
- inline bool setCutoffIncrement( double value) {
- return setDblParam(CbcCutoffIncrement, value);
- }
- /** Get the
- \link CbcModel::CbcCutoffIncrement \endlink
- desired.
- */
- inline double getCutoffIncrement() const {
- return getDblParam(CbcCutoffIncrement);
- }
- /// See if can stop on gap
- bool canStopOnGap() const;
-
- /** Pass in target solution and optional priorities.
- If priorities then >0 means only branch if incorrect
- while <0 means branch even if correct. +1 or -1 are
- highest priority */
- void setHotstartSolution(const double * solution, const int * priorities = NULL) ;
-
- /// Set the minimum drop to continue cuts
- inline void setMinimumDrop(double value) {
- minimumDrop_ = value;
- }
- /// Get the minimum drop to continue cuts
- inline double getMinimumDrop() const {
- return minimumDrop_;
- }
-
- /** Set the maximum number of cut passes at root node (default 20)
- Minimum drop can also be used for fine tuning */
- inline void setMaximumCutPassesAtRoot(int value) {
- maximumCutPassesAtRoot_ = value;
- }
- /** Get the maximum number of cut passes at root node */
- inline int getMaximumCutPassesAtRoot() const {
- return maximumCutPassesAtRoot_;
- }
-
- /** Set the maximum number of cut passes at other nodes (default 10)
- Minimum drop can also be used for fine tuning */
- inline void setMaximumCutPasses(int value) {
- maximumCutPasses_ = value;
- }
- /** Get the maximum number of cut passes at other nodes (default 10) */
- inline int getMaximumCutPasses() const {
- return maximumCutPasses_;
- }
- /** Get current cut pass number in this round of cuts.
- (1 is first pass) */
- inline int getCurrentPassNumber() const {
- return currentPassNumber_;
- }
- /** Set current cut pass number in this round of cuts.
- (1 is first pass) */
- inline void setCurrentPassNumber(int value) {
- currentPassNumber_ = value;
- }
-
- /** Set the maximum number of candidates to be evaluated for strong
- branching.
-
- A value of 0 disables strong branching.
- */
- void setNumberStrong(int number);
- /** Get the maximum number of candidates to be evaluated for strong
- branching.
- */
- inline int numberStrong() const {
- return numberStrong_;
- }
- /** Set global preferred way to branch
- -1 down, +1 up, 0 no preference */
- inline void setPreferredWay(int value) {
- preferredWay_ = value;
- }
- /** Get the preferred way to branch (default 0) */
- inline int getPreferredWay() const {
- return preferredWay_;
- }
- /// Get at which depths to do cuts
- inline int whenCuts() const {
- return whenCuts_;
- }
- /// Set at which depths to do cuts
- inline void setWhenCuts(int value) {
- whenCuts_ = value;
- }
- /** Return true if we want to do cuts
- If allowForTopOfTree zero then just does on multiples of depth
- if 1 then allows for doing at top of tree
- if 2 then says if cuts allowed anywhere apart from root
- */
- bool doCutsNow(int allowForTopOfTree) const;
-
- /** Set the number of branches before pseudo costs believed
- in dynamic strong branching.
-
- A value of 0 disables dynamic strong branching.
- */
- void setNumberBeforeTrust(int number);
- /** get the number of branches before pseudo costs believed
- in dynamic strong branching. */
- inline int numberBeforeTrust() const {
- return numberBeforeTrust_;
- }
- /** Set the number of variables for which to compute penalties
- in dynamic strong branching.
-
- A value of 0 disables penalties.
- */
- void setNumberPenalties(int number);
- /** get the number of variables for which to compute penalties
- in dynamic strong branching. */
- inline int numberPenalties() const {
- return numberPenalties_;
- }
- /// Pointer to top of tree
- inline const CbcFullNodeInfo * topOfTree() const
- { return topOfTree_;}
- /// Number of analyze iterations to do
- inline void setNumberAnalyzeIterations(int number) {
- numberAnalyzeIterations_ = number;
- }
- inline int numberAnalyzeIterations() const {
- return numberAnalyzeIterations_;
- }
- /** Get scale factor to make penalties match strong.
- Should/will be computed */
- inline double penaltyScaleFactor() const {
- return penaltyScaleFactor_;
- }
- /** Set scale factor to make penalties match strong.
- Should/will be computed */
- void setPenaltyScaleFactor(double value);
- /** Problem type as set by user or found by analysis. This will be extended
- 0 - not known
- 1 - Set partitioning <=
- 2 - Set partitioning ==
- 3 - Set covering
- 4 - all +- 1 or all +1 and odd
- */
- void inline setProblemType(int number) {
- problemType_ = number;
- }
- inline int problemType() const {
- return problemType_;
- }
- /// Current depth
- inline int currentDepth() const {
- return currentDepth_;
- }
-
- /// Set how often to scan global cuts
- void setHowOftenGlobalScan(int number);
- /// Get how often to scan global cuts
- inline int howOftenGlobalScan() const {
- return howOftenGlobalScan_;
- }
- /// Original columns as created by integerPresolve or preprocessing
- inline int * originalColumns() const {
- return originalColumns_;
- }
- /// Set original columns as created by preprocessing
- void setOriginalColumns(const int * originalColumns,
- int numberGood=COIN_INT_MAX) ;
- /// Create conflict cut (well - most of)
- OsiRowCut * conflictCut(const OsiSolverInterface * solver, bool & localCuts);
-
- /** Set the print frequency.
-
- Controls the number of nodes evaluated between status prints.
- If <tt>number <=0</tt> the print frequency is set to 100 nodes for large
- problems, 1000 for small problems.
- Print frequency has very slight overhead if small.
- */
- inline void setPrintFrequency(int number) {
- printFrequency_ = number;
- }
- /// Get the print frequency
- inline int printFrequency() const {
- return printFrequency_;
- }
- //@}
-
- //---------------------------------------------------------------------------
- ///@name Methods returning info on how the solution process terminated
- //@{
- /// Are there a numerical difficulties?
- bool isAbandoned() const;
- /// Is optimality proven?
- bool isProvenOptimal() const;
- /// Is infeasiblity proven (or none better than cutoff)?
- bool isProvenInfeasible() const;
- /// Was continuous solution unbounded
- bool isContinuousUnbounded() const;
- /// Was continuous solution unbounded
- bool isProvenDualInfeasible() const;
- /// Node limit reached?
- bool isNodeLimitReached() const;
- /// Time limit reached?
- bool isSecondsLimitReached() const;
- /// Solution limit reached?
- bool isSolutionLimitReached() const;
- /// Get how many iterations it took to solve the problem.
- inline int getIterationCount() const {
- return numberIterations_;
- }
- /// Increment how many iterations it took to solve the problem.
- inline void incrementIterationCount(int value) {
- numberIterations_ += value;
- }
- /// Get how many Nodes it took to solve the problem (including those in complete fathoming B&B inside CLP).
- inline int getNodeCount() const {
- return numberNodes_;
- }
- /// Increment how many nodes it took to solve the problem.
- inline void incrementNodeCount(int value) {
- numberNodes_ += value;
- }
- /// Get how many Nodes were enumerated in complete fathoming B&B inside CLP
- inline int getExtraNodeCount() const {
- return numberExtraNodes_;
- }
- /// Get how many times complete fathoming B&B was done
- inline int getFathomCount() const {
- return numberFathoms_;
- }
- /** Final status of problem
- Some of these can be found out by is...... functions
- -1 before branchAndBound
- 0 finished - check isProvenOptimal or isProvenInfeasible to see if solution found
- (or check value of best solution)
- 1 stopped - on maxnodes, maxsols, maxtime
- 2 difficulties so run was abandoned
- (5 event user programmed event occurred)
- */
- inline int status() const {
- return status_;
- }
- inline void setProblemStatus(int value) {
- status_ = value;
- }
- /** Secondary status of problem
- -1 unset (status_ will also be -1)
- 0 search completed with solution
- 1 linear relaxation not feasible (or worse than cutoff)
- 2 stopped on gap
- 3 stopped on nodes
- 4 stopped on time
- 5 stopped on user event
- 6 stopped on solutions
- 7 linear relaxation unbounded
- 8 stopped on iteration limit
- */
- inline int secondaryStatus() const {
- return secondaryStatus_;
- }
- inline void setSecondaryStatus(int value) {
- secondaryStatus_ = value;
- }
- /// Are there numerical difficulties (for initialSolve) ?
- bool isInitialSolveAbandoned() const ;
- /// Is optimality proven (for initialSolve) ?
- bool isInitialSolveProvenOptimal() const ;
- /// Is primal infeasiblity proven (for initialSolve) ?
- bool isInitialSolveProvenPrimalInfeasible() const ;
- /// Is dual infeasiblity proven (for initialSolve) ?
- bool isInitialSolveProvenDualInfeasible() const ;
-
- //@}
-
- //---------------------------------------------------------------------------
- /**@name Problem information methods
-
- These methods call the solver's query routines to return
- information about the problem referred to by the current object.
- Querying a problem that has no data associated with it result in
- zeros for the number of rows and columns, and NULL pointers from
- the methods that return vectors.
-
- Const pointers returned from any data-query method are valid as
- long as the data is unchanged and the solver is not called.
- */
- //@{
- /// Number of rows in continuous (root) problem.
- inline int numberRowsAtContinuous() const {
- return numberRowsAtContinuous_;
- }
-
- /// Get number of columns
- inline int getNumCols() const {
- return solver_->getNumCols();
- }
-
- /// Get number of rows
- inline int getNumRows() const {
- return solver_->getNumRows();
- }
-
- /// Get number of nonzero elements
- inline CoinBigIndex getNumElements() const {
- return solver_->getNumElements();
- }
-
- /// Number of integers in problem
- inline int numberIntegers() const {
- return numberIntegers_;
- }
- // Integer variables
- inline const int * integerVariable() const {
- return integerVariable_;
- }
- /// Whether or not integer
- inline char integerType(int i) const {
- assert (integerInfo_);
- assert (integerInfo_[i] == 0 || integerInfo_[i] == 1);
- return integerInfo_[i];
- }
- /// Whether or not integer
- inline const char * integerType() const {
- return integerInfo_;
- }
-
- /// Get pointer to array[getNumCols()] of column lower bounds
- inline const double * getColLower() const {
- return solver_->getColLower();
- }
-
- /// Get pointer to array[getNumCols()] of column upper bounds
- inline const double * getColUpper() const {
- return solver_->getColUpper();
- }
-
- /** Get pointer to array[getNumRows()] of row constraint senses.
- <ul>
- <li>'L': <= constraint
- <li>'E': = constraint
- <li>'G': >= constraint
- <li>'R': ranged constraint
- <li>'N': free constraint
- </ul>
- */
- inline const char * getRowSense() const {
- return solver_->getRowSense();
- }
-
- /** Get pointer to array[getNumRows()] of rows right-hand sides
- <ul>
- <li> if rowsense()[i] == 'L' then rhs()[i] == rowupper()[i]
- <li> if rowsense()[i] == 'G' then rhs()[i] == rowlower()[i]
- <li> if rowsense()[i] == 'R' then rhs()[i] == rowupper()[i]
- <li> if rowsense()[i] == 'N' then rhs()[i] == 0.0
- </ul>
- */
- inline const double * getRightHandSide() const {
- return solver_->getRightHandSide();
- }
-
- /** Get pointer to array[getNumRows()] of row ranges.
- <ul>
- <li> if rowsense()[i] == 'R' then
- rowrange()[i] == rowupper()[i] - rowlower()[i]
- <li> if rowsense()[i] != 'R' then
- rowrange()[i] is 0.0
- </ul>
- */
- inline const double * getRowRange() const {
- return solver_->getRowRange();
- }
-
- /// Get pointer to array[getNumRows()] of row lower bounds
- inline const double * getRowLower() const {
- return solver_->getRowLower();
- }
-
- /// Get pointer to array[getNumRows()] of row upper bounds
- inline const double * getRowUpper() const {
- return solver_->getRowUpper();
- }
-
- /// Get pointer to array[getNumCols()] of objective function coefficients
- inline const double * getObjCoefficients() const {
- return solver_->getObjCoefficients();
- }
-
- /// Get objective function sense (1 for min (default), -1 for max)
- inline double getObjSense() const {
- //assert (dblParam_[CbcOptimizationDirection]== solver_->getObjSense());
- return dblParam_[CbcOptimizationDirection];
- }
-
- /// Return true if variable is continuous
- inline bool isContinuous(int colIndex) const {
- return solver_->isContinuous(colIndex);
- }
-
- /// Return true if variable is binary
- inline bool isBinary(int colIndex) const {
- return solver_->isBinary(colIndex);
- }
-
- /** Return true if column is integer.
- Note: This function returns true if the the column
- is binary or a general integer.
- */
- inline bool isInteger(int colIndex) const {
- return solver_->isInteger(colIndex);
- }
-
- /// Return true if variable is general integer
- inline bool isIntegerNonBinary(int colIndex) const {
- return solver_->isIntegerNonBinary(colIndex);
- }
-
- /// Return true if variable is binary and not fixed at either bound
- inline bool isFreeBinary(int colIndex) const {
- return solver_->isFreeBinary(colIndex) ;
- }
-
- /// Get pointer to row-wise copy of matrix
- inline const CoinPackedMatrix * getMatrixByRow() const {
- return solver_->getMatrixByRow();
- }
-
- /// Get pointer to column-wise copy of matrix
- inline const CoinPackedMatrix * getMatrixByCol() const {
- return solver_->getMatrixByCol();
- }
-
- /// Get solver's value for infinity
- inline double getInfinity() const {
- return solver_->getInfinity();
- }
- /// Get pointer to array[getNumCols()] (for speed) of column lower bounds
- inline const double * getCbcColLower() const {
- return cbcColLower_;
- }
- /// Get pointer to array[getNumCols()] (for speed) of column upper bounds
- inline const double * getCbcColUpper() const {
- return cbcColUpper_;
- }
- /// Get pointer to array[getNumRows()] (for speed) of row lower bounds
- inline const double * getCbcRowLower() const {
- return cbcRowLower_;
- }
- /// Get pointer to array[getNumRows()] (for speed) of row upper bounds
- inline const double * getCbcRowUpper() const {
- return cbcRowUpper_;
- }
- /// Get pointer to array[getNumCols()] (for speed) of primal solution vector
- inline const double * getCbcColSolution() const {
- return cbcColSolution_;
- }
- /// Get pointer to array[getNumRows()] (for speed) of dual prices
- inline const double * getCbcRowPrice() const {
- return cbcRowPrice_;
- }
- /// Get a pointer to array[getNumCols()] (for speed) of reduced costs
- inline const double * getCbcReducedCost() const {
- return cbcReducedCost_;
- }
- /// Get pointer to array[getNumRows()] (for speed) of row activity levels.
- inline const double * getCbcRowActivity() const {
- return cbcRowActivity_;
- }
- //@}
-
-
- /**@name Methods related to querying the solution */
- //@{
- /// Holds solution at continuous (after cuts if branchAndBound called)
- inline double * continuousSolution() const {
- return continuousSolution_;
- }
- /** Array marked whenever a solution is found if non-zero.
- Code marks if heuristic returns better so heuristic
- need only mark if it wants to on solutions which
- are worse than current */
- inline int * usedInSolution() const {
- return usedInSolution_;
- }
- /// Increases usedInSolution for nonzeros
- void incrementUsed(const double * solution);
- /// Record a new incumbent solution and update objectiveValue
- void setBestSolution(CBC_Message how,
- double & objectiveValue, const double *solution,
- int fixVariables = 0);
- /// Just update objectiveValue
- void setBestObjectiveValue( double objectiveValue);
- /// Deals with event handler and solution
- CbcEventHandler::CbcAction dealWithEventHandler(CbcEventHandler::CbcEvent event,
- double objValue,
- const double * solution);
-
- /** Call this to really test if a valid solution can be feasible
- Solution is number columns in size.
- If fixVariables true then bounds of continuous solver updated.
- Returns objective value (worse than cutoff if not feasible)
- Previously computed objective value is now passed in (in case user does not do solve)
- virtual so user can override
- */
- virtual double checkSolution(double cutoff, double * solution,
- int fixVariables, double originalObjValue);
- /** Test the current solution for feasiblility.
-
- Scan all objects for indications of infeasibility. This is broken down
- into simple integer infeasibility (\p numberIntegerInfeasibilities)
- and all other reports of infeasibility (\p numberObjectInfeasibilities).
- */
- bool feasibleSolution(int & numberIntegerInfeasibilities,
- int & numberObjectInfeasibilities) const;
-
- /** Solution to the most recent lp relaxation.
-
- The solver's solution to the most recent lp relaxation.
- */
-
- inline double * currentSolution() const {
- return currentSolution_;
- }
- /** For testing infeasibilities - will point to
- currentSolution_ or solver-->getColSolution()
- */
- inline const double * testSolution() const {
- return testSolution_;
- }
- inline void setTestSolution(const double * solution) {
- testSolution_ = solution;
- }
- /// Make sure region there and optionally copy solution
- void reserveCurrentSolution(const double * solution = NULL);
-
- /// Get pointer to array[getNumCols()] of primal solution vector
- inline const double * getColSolution() const {
- return solver_->getColSolution();
- }
-
- /// Get pointer to array[getNumRows()] of dual prices
- inline const double * getRowPrice() const {
- return solver_->getRowPrice();
- }
-
- /// Get a pointer to array[getNumCols()] of reduced costs
- inline const double * getReducedCost() const {
- return solver_->getReducedCost();
- }
-
- /// Get pointer to array[getNumRows()] of row activity levels.
- inline const double * getRowActivity() const {
- return solver_->getRowActivity();
- }
-
- /// Get current objective function value
- inline double getCurrentObjValue() const {
- return dblParam_[CbcCurrentObjectiveValue];
- }
- /// Get current minimization objective function value
- inline double getCurrentMinimizationObjValue() const {
- return dblParam_[CbcCurrentMinimizationObjectiveValue];
- }
-
- /// Get best objective function value as minimization
- inline double getMinimizationObjValue() const {
- return bestObjective_;
- }
- /// Set best objective function value as minimization
- inline void setMinimizationObjValue(double value) {
- bestObjective_ = value;
- }
-
- /// Get best objective function value
- inline double getObjValue() const {
- return bestObjective_ * solver_->getObjSense() ;
- }
- /** Get best possible objective function value.
- This is better of best possible left on tree
- and best solution found.
- If called from within branch and cut may be optimistic.
- */
- double getBestPossibleObjValue() const;
- /// Set best objective function value
- inline void setObjValue(double value) {
- bestObjective_ = value * solver_->getObjSense() ;
- }
- /// Get solver objective function value (as minimization)
- inline double getSolverObjValue() const {
- return solver_->getObjValue() * solver_->getObjSense() ;
- }
-
- /** The best solution to the integer programming problem.
-
- The best solution to the integer programming problem found during
- the search. If no solution is found, the method returns null.
- */
-
- inline double * bestSolution() const {
- return bestSolution_;
- }
- /** User callable setBestSolution.
- If check false does not check valid
- If true then sees if feasible and warns if objective value
- worse than given (so just set to COIN_DBL_MAX if you don't care).
- If check true then does not save solution if not feasible
- */
- void setBestSolution(const double * solution, int numberColumns,
- double objectiveValue, bool check = false);
-
- /// Get number of solutions
- inline int getSolutionCount() const {
- return numberSolutions_;
- }
-
- /// Set number of solutions (so heuristics will be different)
- inline void setSolutionCount(int value) {
- numberSolutions_ = value;
- }
- /// Number of saved solutions (including best)
- int numberSavedSolutions() const;
- /// Maximum number of extra saved solutions
- inline int maximumSavedSolutions() const {
- return maximumSavedSolutions_;
- }
- /// Set maximum number of extra saved solutions
- void setMaximumSavedSolutions(int value);
- /// Return a saved solution (0==best) - NULL if off end
- const double * savedSolution(int which) const;
- /// Return a saved solution objective (0==best) - COIN_DBL_MAX if off end
- double savedSolutionObjective(int which) const;
- /// Delete a saved solution and move others up
- void deleteSavedSolution(int which);
-
- /** Current phase (so heuristics etc etc can find out).
- 0 - initial solve
- 1 - solve with cuts at root
- 2 - solve with cuts
- 3 - other e.g. strong branching
- 4 - trying to validate a solution
- 5 - at end of search
- */
- inline int phase() const {
- return phase_;
- }
-
- /// Get number of heuristic solutions
- inline int getNumberHeuristicSolutions() const {
- return numberHeuristicSolutions_;
- }
- /// Set number of heuristic solutions
- inline void setNumberHeuristicSolutions(int value) {
- numberHeuristicSolutions_ = value;
- }
-
- /// Set objective function sense (1 for min (default), -1 for max,)
- inline void setObjSense(double s) {
- dblParam_[CbcOptimizationDirection] = s;
- solver_->setObjSense(s);
- }
-
- /// Value of objective at continuous
- inline double getContinuousObjective() const {
- return originalContinuousObjective_;
- }
- inline void setContinuousObjective(double value) {
- originalContinuousObjective_ = value;
- }
- /// Number of infeasibilities at continuous
- inline int getContinuousInfeasibilities() const {
- return continuousInfeasibilities_;
- }
- inline void setContinuousInfeasibilities(int value) {
- continuousInfeasibilities_ = value;
- }
- /// Value of objective after root node cuts added
- inline double rootObjectiveAfterCuts() const {
- return continuousObjective_;
- }
- /// Sum of Changes to objective by first solve
- inline double sumChangeObjective() const {
- return sumChangeObjective1_;
- }
- /** Number of times global cuts violated. When global cut pool then this
- should be kept for each cut and type of cut */
- inline int numberGlobalViolations() const {
- return numberGlobalViolations_;
- }
- inline void clearNumberGlobalViolations() {
- numberGlobalViolations_ = 0;
- }
- /// Whether to force a resolve after takeOffCuts
- inline bool resolveAfterTakeOffCuts() const {
- return resolveAfterTakeOffCuts_;
- }
- inline void setResolveAfterTakeOffCuts(bool yesNo) {
- resolveAfterTakeOffCuts_ = yesNo;
- }
- /// Maximum number of rows
- inline int maximumRows() const {
- return maximumRows_;
- }
- /// Work basis for temporary use
- inline CoinWarmStartBasis & workingBasis() {
- return workingBasis_;
- }
- /// Get number of "iterations" to stop after
- inline int getStopNumberIterations() const {
- return stopNumberIterations_;
- }
- /// Set number of "iterations" to stop after
- inline void setStopNumberIterations(int value) {
- stopNumberIterations_ = value;
- }
- /// A pointer to model from CbcHeuristic
- inline CbcModel * heuristicModel() const
- { return heuristicModel_;}
- /// Set a pointer to model from CbcHeuristic
- inline void setHeuristicModel(CbcModel * model)
- { heuristicModel_ = model;}
- //@}
-
- /** \name Node selection */
- //@{
- // Comparison functions (which may be overridden by inheritance)
- inline CbcCompareBase * nodeComparison() const {
- return nodeCompare_;
- }
- void setNodeComparison(CbcCompareBase * compare);
- void setNodeComparison(CbcCompareBase & compare);
- //@}
-
- /** \name Problem feasibility checking */
- //@{
- // Feasibility functions (which may be overridden by inheritance)
- inline CbcFeasibilityBase * problemFeasibility() const {
- return problemFeasibility_;
- }
- void setProblemFeasibility(CbcFeasibilityBase * feasibility);
- void setProblemFeasibility(CbcFeasibilityBase & feasibility);
- //@}
-
- /** \name Tree methods and subtree methods */
- //@{
- /// Tree method e.g. heap (which may be overridden by inheritance)
- inline CbcTree * tree() const {
- return tree_;
- }
- /// For modifying tree handling (original is cloned)
- void passInTreeHandler(CbcTree & tree);
- /** For passing in an CbcModel to do a sub Tree (with derived tree handlers).
- Passed in model must exist for duration of branch and bound
- */
- void passInSubTreeModel(CbcModel & model);
- /** For retrieving a copy of subtree model with given OsiSolver.
- If no subtree model will use self (up to user to reset cutoff etc).
- If solver NULL uses current
- */
- CbcModel * subTreeModel(OsiSolverInterface * solver = NULL) const;
- /// Returns number of times any subtree stopped on nodes, time etc
- inline int numberStoppedSubTrees() const {
- return numberStoppedSubTrees_;
- }
- /// Says a sub tree was stopped
- inline void incrementSubTreeStopped() {
- numberStoppedSubTrees_++;
- }
- /** Whether to automatically do presolve before branch and bound (subTrees).
- 0 - no
- 1 - ordinary presolve
- 2 - integer presolve (dodgy)
- */
- inline int typePresolve() const {
- return presolve_;
- }
- inline void setTypePresolve(int value) {
- presolve_ = value;
- }
-
- //@}
-
- /** \name Branching Decisions
-
- See the CbcBranchDecision class for additional information.
- */
- //@{
-
- /// Get the current branching decision method.
- inline CbcBranchDecision * branchingMethod() const {
- return branchingMethod_;
- }
- /// Set the branching decision method.
- inline void setBranchingMethod(CbcBranchDecision * method) {
- delete branchingMethod_;
- branchingMethod_ = method->clone();
- }
- /** Set the branching method
-
- \overload
- */
- inline void setBranchingMethod(CbcBranchDecision & method) {
- delete branchingMethod_;
- branchingMethod_ = method.clone();
- }
- /// Get the current cut modifier method
- inline CbcCutModifier * cutModifier() const {
- return cutModifier_;
- }
- /// Set the cut modifier method
- void setCutModifier(CbcCutModifier * modifier);
- /** Set the cut modifier method
-
- \overload
- */
- void setCutModifier(CbcCutModifier & modifier);
- //@}
-
- /** \name Row (constraint) and Column (variable) cut generation */
- //@{
-
- /** State of search
- 0 - no solution
- 1 - only heuristic solutions
- 2 - branched to a solution
- 3 - no solution but many nodes
- */
- inline int stateOfSearch() const {
- return stateOfSearch_;
- }
- inline void setStateOfSearch(int state) {
- stateOfSearch_ = state;
- }
- /// Strategy worked out - mainly at root node for use by CbcNode
- inline int searchStrategy() const {
- return searchStrategy_;
- }
- /// Set strategy worked out - mainly at root node for use by CbcNode
- inline void setSearchStrategy(int value) {
- searchStrategy_ = value;
- }
- /// Stong branching strategy
- inline int strongStrategy() const {
- return strongStrategy_;
- }
- /// Set strong branching strategy
- inline void setStrongStrategy(int value) {
- strongStrategy_ = value;
- }
-
- /// Get the number of cut generators
- inline int numberCutGenerators() const {
- return numberCutGenerators_;
- }
- /// Get the list of cut generators
- inline CbcCutGenerator ** cutGenerators() const {
- return generator_;
- }
- ///Get the specified cut generator
- inline CbcCutGenerator * cutGenerator(int i) const {
- return generator_[i];
- }
- ///Get the specified cut generator before any changes
- inline CbcCutGenerator * virginCutGenerator(int i) const {
- return virginGenerator_[i];
- }
- /** Add one generator - up to user to delete generators.
- howoften affects how generator is used. 0 or 1 means always,
- >1 means every that number of nodes. Negative values have same
- meaning as positive but they may be switched off (-> -100) by code if
- not many cuts generated at continuous. -99 is just done at root.
- Name is just for printout.
- If depth >0 overrides how often generator is called (if howOften==-1 or >0).
- */
- void addCutGenerator(CglCutGenerator * generator,
- int howOften = 1, const char * name = NULL,
- bool normal = true, bool atSolution = false,
- bool infeasible = false, int howOftenInSub = -100,
- int whatDepth = -1, int whatDepthInSub = -1);
-//@}
- /** \name Strategy and sub models
-
- See the CbcStrategy class for additional information.
- */
- //@{
-
- /// Get the current strategy
- inline CbcStrategy * strategy() const {
- return strategy_;
- }
- /// Set the strategy. Clones
- void setStrategy(CbcStrategy & strategy);
- /// Set the strategy. assigns
- inline void setStrategy(CbcStrategy * strategy) {
- strategy_ = strategy;
- }
- /// Get the current parent model
- inline CbcModel * parentModel() const {
- return parentModel_;
- }
- /// Set the parent model
- inline void setParentModel(CbcModel & parentModel) {
- parentModel_ = &parentModel;
- }
- //@}
-
-
- /** \name Heuristics and priorities */
- //@{
- /*! \brief Add one heuristic - up to user to delete
-
- The name is just used for print messages.
- */
- void addHeuristic(CbcHeuristic * generator, const char *name = NULL,
- int before = -1);
- ///Get the specified heuristic
- inline CbcHeuristic * heuristic(int i) const {
- return heuristic_[i];
- }
- /// Get the number of heuristics
- inline int numberHeuristics() const {
- return numberHeuristics_;
- }
- /// Set the number of heuristics
- inline void setNumberHeuristics(int value) {
- numberHeuristics_ = value;
- }
- /// Pointer to heuristic solver which found last solution (or NULL)
- inline CbcHeuristic * lastHeuristic() const {
- return lastHeuristic_;
- }
- /// set last heuristic which found a solution
- inline void setLastHeuristic(CbcHeuristic * last) {
- lastHeuristic_ = last;
- }
-
- /** Pass in branching priorities.
-
- If ifClique then priorities are on cliques otherwise priorities are
- on integer variables.
- Other type (if exists set to default)
- 1 is highest priority. (well actually -INT_MAX is but that's ugly)
- If hotstart > 0 then branches are created to force
- the variable to the value given by best solution. This enables a
- sort of hot start. The node choice should be greatest depth
- and hotstart should normally be switched off after a solution.
-
- If ifNotSimpleIntegers true then appended to normal integers
-
- This is now deprecated except for simple usage. If user
- creates Cbcobjects then set priority in them
-
- \internal Added for Kurt Spielberg.
- */
- void passInPriorities(const int * priorities, bool ifNotSimpleIntegers);
-
- /// Returns priority level for an object (or 1000 if no priorities exist)
- inline int priority(int sequence) const {
- return object_[sequence]->priority();
- }
-
- /*! \brief Set an event handler
-
- A clone of the handler passed as a parameter is stored in CbcModel.
- */
- void passInEventHandler(const CbcEventHandler *eventHandler) ;
-
- /*! \brief Retrieve a pointer to the event handler */
- inline CbcEventHandler* getEventHandler() const {
- return (eventHandler_) ;
- }
-
- //@}
-
- /**@name Setting/Accessing application data */
- //@{
- /** Set application data.
-
- This is a pointer that the application can store into and
- retrieve from the solver interface.
- This field is available for the application to optionally
- define and use.
- */
- void setApplicationData (void * appData);
-
- /// Get application data
- void * getApplicationData() const;
- /**
- For advanced applications you may wish to modify the behavior of Cbc
- e.g. if the solver is a NLP solver then you may not have an exact
- optimum solution at each step. Information could be built into
- OsiSolverInterface but this is an alternative so that that interface
- does not have to be changed. If something similar is useful to
- enough solvers then it could be migrated
- You can also pass in by using solver->setAuxiliaryInfo.
- You should do that if solver is odd - if solver is normal simplex
- then use this.
- NOTE - characteristics are not cloned
- */
- void passInSolverCharacteristics(OsiBabSolver * solverCharacteristics);
- /// Get solver characteristics
- inline const OsiBabSolver * solverCharacteristics() const {
- return solverCharacteristics_;
- }
- //@}
-
- //---------------------------------------------------------------------------
-
- /**@name Message handling etc */
- //@{
- /// Pass in Message handler (not deleted at end)
- void passInMessageHandler(CoinMessageHandler * handler);
- /// Set language
- void newLanguage(CoinMessages::Language language);
- inline void setLanguage(CoinMessages::Language language) {
- newLanguage(language);
- }
- /// Return handler
- inline CoinMessageHandler * messageHandler() const {
- return handler_;
- }
- /// Return messages
- inline CoinMessages & messages() {
- return messages_;
- }
- /// Return pointer to messages
- inline CoinMessages * messagesPointer() {
- return &messages_;
- }
- /// Set log level
- void setLogLevel(int value);
- /// Get log level
- inline int logLevel() const {
- return handler_->logLevel();
- }
- /** Set flag to say if handler_ is the default handler.
-
- The default handler is deleted when the model is deleted. Other
- handlers (supplied by the client) will not be deleted.
- */
- inline void setDefaultHandler(bool yesNo) {
- defaultHandler_ = yesNo;
- }
- /// Check default handler
- inline bool defaultHandler() const {
- return defaultHandler_;
- }
- //@}
- //---------------------------------------------------------------------------
- ///@name Specialized
- //@{
-
- /**
- Set special options
- 0 bit (1) - check if cuts valid (if on debugger list)
- 1 bit (2) - use current basis to check integer solution (rather than all slack)
- 2 bit (4) - don't check integer solution (by solving LP)
- 3 bit (8) - fast analyze
- 4 bit (16) - non-linear model - so no well defined CoinPackedMatrix
- 5 bit (32) - keep names
- 6 bit (64) - try for dominated columns
- 7 bit (128) - SOS type 1 but all declared integer
- 8 bit (256) - Set to say solution just found, unset by doing cuts
- 9 bit (512) - Try reduced model after 100 nodes
- 10 bit (1024) - Switch on some heuristics even if seems unlikely
- 11 bit (2048) - Mark as in small branch and bound
- 12 bit (4096) - Funny cuts so do slow way (in some places)
- 13 bit (8192) - Funny cuts so do slow way (in other places)
- 14 bit (16384) - Use Cplex! for fathoming
- 15 bit (32768) - Try reduced model after 0 nodes
- 16 bit (65536) - Original model had integer bounds
- 17 bit (131072) - Perturbation switched off
- 18 bit (262144) - donor CbcModel
- 19 bit (524288) - recipient CbcModel
- 20 bit (1048576) - waiting for sub model to return
- 22 bit (4194304) - do not initialize random seed in solver (user has)
- 23 bit (8388608) - leave solver_ with cuts
- 24 bit (16777216) - just get feasible if no cutoff
- */
- inline void setSpecialOptions(int value) {
- specialOptions_ = value;
- }
- /// Get special options
- inline int specialOptions() const {
- return specialOptions_;
- }
- /// Set random seed
- inline void setRandomSeed(int value) {
- randomSeed_ = value;
- }
- /// Get random seed
- inline int getRandomSeed() const {
- return randomSeed_;
- }
- /// Set multiple root tries
- inline void setMultipleRootTries(int value) {
- multipleRootTries_ = value;
- }
- /// Get multiple root tries
- inline int getMultipleRootTries() const {
- return multipleRootTries_;
- }
- /// Tell model to stop on event
- inline void sayEventHappened()
- { eventHappened_=true;}
- /// Says if normal solver i.e. has well defined CoinPackedMatrix
- inline bool normalSolver() const {
- return (specialOptions_&16) == 0;
- }
- /** Says if model is sitting there waiting for mini branch and bound to finish
- This is because an event handler may only have access to parent model in
- mini branch and bound
- */
- inline bool waitingForMiniBranchAndBound() const {
- return (specialOptions_&1048576) != 0;
- }
- /** Set more special options
- at present bottom 6 bits used for shadow price mode
- 1024 for experimental hotstart
- 2048,4096 breaking out of cuts
- 8192 slowly increase minimum drop
- 16384 gomory
- 32768 more heuristics in sub trees
- 65536 no cuts in preprocessing
- 131072 Time limits elapsed
- 18 bit (262144) - Perturb fathom nodes
- 19 bit (524288) - No limit on fathom nodes
- 20 bit (1048576) - Reduce sum of infeasibilities before cuts
- 21 bit (2097152) - Reduce sum of infeasibilities after cuts
- 22 bit (4194304) - Conflict analysis
- 23 bit (8388608) - Conflict analysis - temporary bit
- 24 bit (16777216) - Add cutoff as LP constraint (out)
- 25 bit (33554432) - diving/reordering
- 26 bit (67108864) - load global cuts from file
- 27 bit (134217728) - append binding global cuts to file
- 28 bit (268435456) - idiot branching
- 29 bit (536870912) - don't make fake objective
- 30 bit (1073741824) - Funny SOS or similar - be careful
- */
- inline void setMoreSpecialOptions(int value) {
- moreSpecialOptions_ = value;
- }
- /// Get more special options
- inline int moreSpecialOptions() const {
- return moreSpecialOptions_;
- }
- /** Set more more special options
- 0 bit (1) - find switching variables
- 1 bit (2) - using fake objective until solution
- 2 bit (4) - switching variables exist
- 3 bit (8) - skip most of setBestSolution checks
- 4 bit (16) - very lightweight preprocessing in smallB&B
- 5 bit (32) - event handler needs to be cloned when parallel
- 6 bit (64) - testing - use probing to make cliques
- 7/8 bit (128) - try orbital branching (if nauty)
- 9 bit (512) - branching on objective (later)
- 10 bit (1024) - branching on constraints (later)
- 11/12 bit 2048 - intermittent cuts
- 13/14 bit 8192 - go to bitter end in strong branching (first time)
- */
- inline void setMoreSpecialOptions2(int value) {
- moreSpecialOptions2_ = value;
- }
- /// Get more special options2
- inline int moreSpecialOptions2() const {
- return moreSpecialOptions2_;
- }
- /// Set cutoff as constraint
- inline void setCutoffAsConstraint(bool yesNo) {
- cutoffRowNumber_ = (yesNo) ? -2 : -1;
- }
- /// Set time method
- inline void setUseElapsedTime(bool yesNo) {
- if (yesNo)
- moreSpecialOptions_ |= 131072;
- else
- moreSpecialOptions_ &= ~131072;
- }
- /// Get time method
- inline bool useElapsedTime() const {
- return (moreSpecialOptions_&131072)!=0;
- }
- /// Get useful temporary pointer
- inline void * temporaryPointer() const
- { return temporaryPointer_;}
- /// Set useful temporary pointer
- inline void setTemporaryPointer(void * pointer)
- { temporaryPointer_=pointer;}
- /// Go to dantzig pivot selection if easy problem (clp only)
- void goToDantzig(int numberNodes, ClpDualRowPivot *& savePivotMethod);
- /// Now we may not own objects - just point to solver's objects
- inline bool ownObjects() const {
- return ownObjects_;
- }
- /// Check original model before it gets messed up
- void checkModel();
- //@}
- //---------------------------------------------------------------------------
-
- ///@name Constructors and destructors etc
- //@{
- /// Default Constructor
- CbcModel();
-
- /// Constructor from solver
- CbcModel(const OsiSolverInterface &);
-
- /** Assign a solver to the model (model assumes ownership)
-
- On return, \p solver will be NULL.
- If deleteSolver then current solver deleted (if model owned)
-
- \note Parameter settings in the outgoing solver are not inherited by
- the incoming solver.
- */
- void assignSolver(OsiSolverInterface *&solver, bool deleteSolver = true);
-
- /** \brief Set ownership of solver
-
- A parameter of false tells CbcModel it does not own the solver and
- should not delete it. Once you claim ownership of the solver, you're
- responsible for eventually deleting it. Note that CbcModel clones
- solvers with abandon. Unless you have a deep understanding of the
- workings of CbcModel, the only time you want to claim ownership is when
- you're about to delete the CbcModel object but want the solver to
- continue to exist (as, for example, when branchAndBound has finished
- and you want to hang on to the answer).
- */
- inline void setModelOwnsSolver (bool ourSolver) {
- ownership_ = ourSolver ? (ownership_ | 0x80000000) : (ownership_ & (~0x80000000)) ;
- }
-
- /*! \brief Get ownership of solver
-
- A return value of true means that CbcModel owns the solver and will
- take responsibility for deleting it when that becomes necessary.
- */
- inline bool modelOwnsSolver () {
- return ((ownership_&0x80000000) != 0) ;
- }
-
- /** Copy constructor .
- If cloneHandler is true then message handler is cloned
- */
- CbcModel(const CbcModel & rhs, bool cloneHandler = false);
-
- /** Clone */
- virtual CbcModel *clone (bool cloneHandler);
-
- /// Assignment operator
- CbcModel & operator=(const CbcModel& rhs);
-
- /// Destructor
- virtual ~CbcModel ();
-
- /// Returns solver - has current state
- inline OsiSolverInterface * solver() const {
- return solver_;
- }
-
- /// Returns current solver - sets new one
- inline OsiSolverInterface * swapSolver(OsiSolverInterface * solver) {
- OsiSolverInterface * returnSolver = solver_;
- solver_ = solver;
- return returnSolver;
- }
-
- /// Returns solver with continuous state
- inline OsiSolverInterface * continuousSolver() const {
- return continuousSolver_;
- }
-
- /// Create solver with continuous state
- inline void createContinuousSolver() {
- continuousSolver_ = solver_->clone();
- }
- /// Clear solver with continuous state
- inline void clearContinuousSolver() {
- delete continuousSolver_;
- continuousSolver_ = NULL;
- }
-
- /// A copy of the solver, taken at constructor or by saveReferenceSolver
- inline OsiSolverInterface * referenceSolver() const {
- return referenceSolver_;
- }
-
- /// Save a copy of the current solver so can be reset to
- void saveReferenceSolver();
-
- /** Uses a copy of reference solver to be current solver.
- Because of possible mismatches all exotic integer information is loat
- (apart from normal information in OsiSolverInterface)
- so SOS etc and priorities will have to be redone
- */
- void resetToReferenceSolver();
-
- /// Clears out as much as possible (except solver)
- void gutsOfDestructor();
- /** Clears out enough to reset CbcModel as if no branch and bound done
- */
- void gutsOfDestructor2();
- /** Clears out enough to reset CbcModel cutoff etc
- */
- void resetModel();
- /** Most of copy constructor
- mode - 0 copy but don't delete before
- 1 copy and delete before
- 2 copy and delete before (but use virgin generators)
- */
- void gutsOfCopy(const CbcModel & rhs, int mode = 0);
- /// Move status, nodes etc etc across
- void moveInfo(const CbcModel & rhs);
- //@}
-
- ///@name Multithreading
- //@{
- /// Indicates whether Cbc library has been compiled with multithreading support
- static bool haveMultiThreadSupport();
- /// Get pointer to masterthread
- CbcThread * masterThread() const {
- return masterThread_;
- }
- /// Get pointer to walkback
- CbcNodeInfo ** walkback() const {
- return walkback_;
- }
- /// Get number of threads
- inline int getNumberThreads() const {
- return numberThreads_;
- }
- /// Set number of threads
- inline void setNumberThreads(int value) {
- numberThreads_ = value;
- }
- /// Get thread mode
- inline int getThreadMode() const {
- return threadMode_;
- }
- /** Set thread mode
- always use numberThreads for branching
- 1 set then deterministic
- 2 set then use numberThreads for root cuts
- 4 set then use numberThreads in root mini branch and bound
- 8 set and numberThreads - do heuristics numberThreads at a time
- 8 set and numberThreads==0 do all heuristics at once
- default is 0
- */
- inline void setThreadMode(int value) {
- threadMode_ = value;
- }
- /** Return
- -2 if deterministic threaded and main thread
- -1 if deterministic threaded and serial thread
- 0 if serial
- 1 if opportunistic threaded
- */
- inline int parallelMode() const {
- if (!numberThreads_) {
- if ((threadMode_&1) == 0)
- return 0;
- else
- return -1;
- return 0;
- } else {
- if ((threadMode_&1) == 0)
- return 1;
- else
- return -2;
- }
- }
- /// Thread stuff for master
- inline CbcBaseModel * master() const
- { return master_;}
- /// From here to end of section - code in CbcThread.cpp until class changed
- /// Returns true if locked
- bool isLocked() const;
-#ifdef CBC_THREAD
- /**
- Locks a thread if parallel so that stuff like cut pool
- can be updated and/or used.
- */
- void lockThread();
- /**
- Unlocks a thread if parallel to say cut pool stuff not needed
- */
- void unlockThread();
-#else
- inline void lockThread() {}
- inline void unlockThread() {}
-#endif
- /** Set information in a child
- -3 pass pointer to child thread info
- -2 just stop
- -1 delete simple child stuff
- 0 delete opportunistic child stuff
- 1 delete deterministic child stuff
- */
- void setInfoInChild(int type, CbcThread * info);
- /** Move/copy information from one model to another
- -1 - initialization
- 0 - from base model
- 1 - to base model (and reset)
- 2 - add in final statistics etc (and reset so can do clean destruction)
- */
- void moveToModel(CbcModel * baseModel, int mode);
- /// Split up nodes
- int splitModel(int numberModels, CbcModel ** model,
- int numberNodes);
- /// Start threads
- void startSplitModel(int numberIterations);
- /// Merge models
- void mergeModels(int numberModel, CbcModel ** model,
- int numberNodes);
- //@}
-
- ///@name semi-private i.e. users should not use
- //@{
- /// Get how many Nodes it took to solve the problem.
- int getNodeCount2() const {
- return numberNodes2_;
- }
- /// Set pointers for speed
- void setPointers(const OsiSolverInterface * solver);
- /** Perform reduced cost fixing
-
- Fixes integer variables at their current value based on reduced cost
- penalties. Returns number fixed
- */
- int reducedCostFix() ;
- /** Makes all handlers same. If makeDefault 1 then makes top level
- default and rest point to that. If 2 then each is copy
- */
- void synchronizeHandlers(int makeDefault);
- /// Save a solution to saved list
- void saveExtraSolution(const double * solution, double objectiveValue);
- /// Save a solution to best and move current to saved
- void saveBestSolution(const double * solution, double objectiveValue);
- /// Delete best and saved solutions
- void deleteSolutions();
- /// Encapsulates solver resolve
- int resolve(OsiSolverInterface * solver);
-#ifdef CLP_RESOLVE
- /// Special purpose resolve
- int resolveClp(OsiClpSolverInterface * solver, int type);
-#endif
-
- /** Encapsulates choosing a variable -
- anyAction -2, infeasible (-1 round again), 0 done
- */
- int chooseBranch(CbcNode * & newNode, int numberPassesLeft,
- CbcNode * oldNode, OsiCuts & cuts,
- bool & resolved, CoinWarmStartBasis *lastws,
- const double * lowerBefore, const double * upperBefore,
- OsiSolverBranch * & branches);
- int chooseBranch(CbcNode * newNode, int numberPassesLeft, bool & resolved);
-
- /** Return an empty basis object of the specified size
-
- A useful utility when constructing a basis for a subproblem from scratch.
- The object returned will be of the requested capacity and appropriate for
- the solver attached to the model.
- */
- CoinWarmStartBasis *getEmptyBasis(int ns = 0, int na = 0) const ;
-
- /** Remove inactive cuts from the model
-
- An OsiSolverInterface is expected to maintain a valid basis, but not a
- valid solution, when loose cuts are deleted. Restoring a valid solution
- requires calling the solver to reoptimise. If it's certain the solution
- will not be required, set allowResolve to false to suppress
- reoptimisation.
- If saveCuts then slack cuts will be saved
- On input current cuts are cuts and newCuts
- on exit current cuts will be correct. Returns number dropped
- */
- int takeOffCuts(OsiCuts &cuts,
- bool allowResolve, OsiCuts * saveCuts,
- int numberNewCuts = 0, const OsiRowCut ** newCuts = NULL) ;
-
- /** Determine and install the active cuts that need to be added for
- the current subproblem
-
- The whole truth is a bit more complicated. The first action is a call to
- addCuts1(). addCuts() then sorts through the list, installs the tight
- cuts in the model, and does bookkeeping (adjusts reference counts).
- The basis returned from addCuts1() is adjusted accordingly.
-
- If it turns out that the node should really be fathomed by bound,
- addCuts() simply treats all the cuts as loose as it does the bookkeeping.
-
- */
- int addCuts(CbcNode * node, CoinWarmStartBasis *&lastws);
-
- /** Traverse the tree from node to root and prep the model
-
- addCuts1() begins the job of prepping the model to match the current
- subproblem. The model is stripped of all cuts, and the search tree is
- traversed from node to root to determine the changes required. Appropriate
- bounds changes are installed, a list of cuts is collected but not
- installed, and an appropriate basis (minus the cuts, but big enough to
- accommodate them) is constructed.
-
- Returns true if new problem similar to old
-
- \todo addCuts1() is called in contexts where it's known in advance that
- all that's desired is to determine a list of cuts and do the
- bookkeeping (adjust the reference counts). The work of installing
- bounds and building a basis goes to waste.
- */
- bool addCuts1(CbcNode * node, CoinWarmStartBasis *&lastws);
- /** Returns bounds just before where - initially original bounds.
- Also sets downstream nodes (lower if force 1, upper if 2)
- */
- void previousBounds (CbcNode * node, CbcNodeInfo * where, int iColumn,
- double & lower, double & upper, int force);
- /** Set objective value in a node. This is separated out so that
- odd solvers can use. It may look at extra information in
- solverCharacteriscs_ and will also use bound from parent node
- */
- void setObjectiveValue(CbcNode * thisNode, const CbcNode * parentNode) const;
-
- /** If numberBeforeTrust >0 then we are going to use CbcBranchDynamic.
- Scan and convert CbcSimpleInteger objects
- */
- void convertToDynamic();
- /// Set numberBeforeTrust in all objects
- void synchronizeNumberBeforeTrust(int type = 0);
- /// Zap integer information in problem (may leave object info)
- void zapIntegerInformation(bool leaveObjects = true);
- /// Use cliques for pseudocost information - return nonzero if infeasible
- int cliquePseudoCosts(int doStatistics);
- /// Fill in useful estimates
- void pseudoShadow(int type);
- /** Return pseudo costs
- If not all integers or not pseudo costs - returns all zero
- Length of arrays are numberIntegers() and entries
- correspond to integerVariable()[i]
- User must allocate arrays before call
- */
- void fillPseudoCosts(double * downCosts, double * upCosts,
- int * priority = NULL,
- int * numberDown = NULL, int * numberUp = NULL,
- int * numberDownInfeasible = NULL,
- int * numberUpInfeasible = NULL) const;
- /** Do heuristics at root.
- 0 - don't delete
- 1 - delete
- 2 - just delete - don't even use
- */
- void doHeuristicsAtRoot(int deleteHeuristicsAfterwards = 0);
- /// Adjust heuristics based on model
- void adjustHeuristics();
- /// Get the hotstart solution
- inline const double * hotstartSolution() const {
- return hotstartSolution_;
- }
- /// Get the hotstart priorities
- inline const int * hotstartPriorities() const {
- return hotstartPriorities_;
- }
-
- /// Return the list of cuts initially collected for this subproblem
- inline CbcCountRowCut ** addedCuts() const {
- return addedCuts_;
- }
- /// Number of entries in the list returned by #addedCuts()
- inline int currentNumberCuts() const {
- return currentNumberCuts_;
- }
- /// Global cuts
- inline CbcRowCuts * globalCuts() {
- return &globalCuts_;
- }
- /// Get rid of global cuts
- inline void zapGlobalCuts() {
- globalCuts_ = CbcRowCuts();
- }
- /// Copy and set a pointer to a row cut which will be added instead of normal branching.
- void setNextRowCut(const OsiRowCut & cut);
- /// Get a pointer to current node (be careful)
- inline CbcNode * currentNode() const {
- return currentNode_;
- }
- /// Get a pointer to probing info
- inline CglTreeProbingInfo * probingInfo() const {
- return probingInfo_;
- }
- /// Thread specific random number generator
- inline CoinThreadRandom * randomNumberGenerator() {
- return &randomNumberGenerator_;
- }
- /// Set the number of iterations done in strong branching.
- inline void setNumberStrongIterations(int number) {
- numberStrongIterations_ = number;
- }
- /// Get the number of iterations done in strong branching.
- inline int numberStrongIterations() const {
- return numberStrongIterations_;
- }
- /// Get maximum number of iterations (designed to be used in heuristics)
- inline int maximumNumberIterations() const {
- return maximumNumberIterations_;
- }
- /// Set maximum number of iterations (designed to be used in heuristics)
- inline void setMaximumNumberIterations(int value) {
- maximumNumberIterations_ = value;
- }
- /// Symmetry information
- inline CbcSymmetry * symmetryInfo() const
- { return symmetryInfo_;}
- /// Set depth for fast nodes
- inline void setFastNodeDepth(int value) {
- fastNodeDepth_ = value;
- }
- /// Get depth for fast nodes
- inline int fastNodeDepth() const {
- return fastNodeDepth_;
- }
- /// Get anything with priority >= this can be treated as continuous
- inline int continuousPriority() const {
- return continuousPriority_;
- }
- /// Set anything with priority >= this can be treated as continuous
- inline void setContinuousPriority(int value) {
- continuousPriority_ = value;
- }
- inline void incrementExtra(int nodes, int iterations, int fathoms=1) {
- numberExtraNodes_ += nodes;
- numberExtraIterations_ += iterations;
- numberFathoms_ += fathoms;
- }
- /// Zero extra
- inline void zeroExtra() {
- numberExtraNodes_ = 0;
- numberExtraIterations_ = 0;
- numberFathoms_ = 0;
- }
- /// Number of extra iterations
- inline int numberExtraIterations() const {
- return numberExtraIterations_;
- }
- /// Increment strong info
- void incrementStrongInfo(int numberTimes, int numberIterations,
- int numberFixed, bool ifInfeasible);
- /// Return strong info
- inline const int * strongInfo() const {
- return strongInfo_;
- }
-
- /// Return mutable strong info
- inline int * mutableStrongInfo() {
- return strongInfo_;
- }
- /// Get stored row cuts for donor/recipient CbcModel
- CglStored * storedRowCuts() const {
- return storedRowCuts_;
- }
- /// Set stored row cuts for donor/recipient CbcModel
- void setStoredRowCuts(CglStored * cuts) {
- storedRowCuts_ = cuts;
- }
- /// Says whether all dynamic integers
- inline bool allDynamic () const {
- return ((ownership_&0x40000000) != 0) ;
- }
- /// Create C++ lines to get to current state
- void generateCpp( FILE * fp, int options);
- /// Generate an OsiBranchingInformation object
- OsiBranchingInformation usefulInformation() const;
- /** Warm start object produced by heuristic or strong branching
-
- If get a valid integer solution outside branch and bound then it can take
- a reasonable time to solve LP which produces clean solution. If this object has
- any size then it will be used in solve.
- */
- inline void setBestSolutionBasis(const CoinWarmStartBasis & bestSolutionBasis) {
- bestSolutionBasis_ = bestSolutionBasis;
- }
- /// Redo walkback arrays
- void redoWalkBack();
- //@}
-
- void setMIPStart( const std::vector< std::pair< std::string, double > > &mips ) {
- this->mipStart_ = mips;
- }
-
- const std::vector< std::pair< std::string, double > > &getMIPStart() {
- return this->mipStart_;
- }
-
-
-//---------------------------------------------------------------------------
-
-private:
- ///@name Private member data
- //@{
-
- /// The solver associated with this model.
- OsiSolverInterface * solver_;
-
- /** Ownership of objects and other stuff
-
- 0x80000000 model owns solver
- 0x40000000 all variables CbcDynamicPseudoCost
- */
- unsigned int ownership_ ;
-
- /// A copy of the solver, taken at the continuous (root) node.
- OsiSolverInterface * continuousSolver_;
-
- /// A copy of the solver, taken at constructor or by saveReferenceSolver
- OsiSolverInterface * referenceSolver_;
-
- /// Message handler
- CoinMessageHandler * handler_;
-
- /** Flag to say if handler_ is the default handler.
-
- The default handler is deleted when the model is deleted. Other
- handlers (supplied by the client) will not be deleted.
- */
- bool defaultHandler_;
-
- /// Cbc messages
- CoinMessages messages_;
-
- /// Array for integer parameters
- int intParam_[CbcLastIntParam];
-
- /// Array for double parameters
- double dblParam_[CbcLastDblParam];
-
- /** Pointer to an empty warm start object
-
- It turns out to be useful to have this available as a base from
- which to build custom warm start objects. This is typed as CoinWarmStart
- rather than CoinWarmStartBasis to allow for the possibility that a
- client might want to apply a solver that doesn't use a basis-based warm
- start. See getEmptyBasis for an example of how this field can be used.
- */
- mutable CoinWarmStart *emptyWarmStart_ ;
-
- /// Best objective
- double bestObjective_;
- /// Best possible objective
- double bestPossibleObjective_;
- /// Sum of Changes to objective by first solve
- double sumChangeObjective1_;
- /// Sum of Changes to objective by subsequent solves
- double sumChangeObjective2_;
-
- /// Array holding the incumbent (best) solution.
- double * bestSolution_;
- /// Arrays holding other solutions.
- double ** savedSolutions_;
-
- /** Array holding the current solution.
-
- This array is used more as a temporary.
- */
- double * currentSolution_;
- /** For testing infeasibilities - will point to
- currentSolution_ or solver-->getColSolution()
- */
- mutable const double * testSolution_;
- /** MIPstart values
- values for integer variables which will be converted to a complete integer initial feasible solution
- */
- std::vector< std::pair< std::string, double > > mipStart_;
- /** Warm start object produced by heuristic or strong branching
-
- If get a valid integer solution outside branch and bound then it can take
- a reasonable time to solve LP which produces clean solution. If this object has
- any size then it will be used in solve.
- */
- CoinWarmStartBasis bestSolutionBasis_ ;
- /// Global cuts
- CbcRowCuts globalCuts_;
- /// Global conflict cuts
- CbcRowCuts * globalConflictCuts_;
-
- /// Minimum degradation in objective value to continue cut generation
- double minimumDrop_;
- /// Number of solutions
- int numberSolutions_;
- /// Number of saved solutions
- int numberSavedSolutions_;
- /// Maximum number of saved solutions
- int maximumSavedSolutions_;
- /** State of search
- 0 - no solution
- 1 - only heuristic solutions
- 2 - branched to a solution
- 3 - no solution but many nodes
- */
- int stateOfSearch_;
- /// At which depths to do cuts
- int whenCuts_;
- /// Hotstart solution
- double * hotstartSolution_;
- /// Hotstart priorities
- int * hotstartPriorities_;
- /// Number of heuristic solutions
- int numberHeuristicSolutions_;
- /// Cumulative number of nodes
- int numberNodes_;
- /** Cumulative number of nodes for statistics.
- Must fix to match up
- */
- int numberNodes2_;
- /// Cumulative number of iterations
- int numberIterations_;
- /// Cumulative number of solves
- int numberSolves_;
- /// Status of problem - 0 finished, 1 stopped, 2 difficulties
- int status_;
- /** Secondary status of problem
- -1 unset (status_ will also be -1)
- 0 search completed with solution
- 1 linear relaxation not feasible (or worse than cutoff)
- 2 stopped on gap
- 3 stopped on nodes
- 4 stopped on time
- 5 stopped on user event
- 6 stopped on solutions
- */
- int secondaryStatus_;
- /// Number of integers in problem
- int numberIntegers_;
- /// Number of rows at continuous
- int numberRowsAtContinuous_;
- /**
- -1 - cutoff as constraint not activated
- -2 - waiting to activate
- >=0 - activated
- */
- int cutoffRowNumber_;
- /// Maximum number of cuts
- int maximumNumberCuts_;
- /** Current phase (so heuristics etc etc can find out).
- 0 - initial solve
- 1 - solve with cuts at root
- 2 - solve with cuts
- 3 - other e.g. strong branching
- 4 - trying to validate a solution
- 5 - at end of search
- */
- int phase_;
-
- /// Number of entries in #addedCuts_
- int currentNumberCuts_;
-
- /** Current limit on search tree depth
-
- The allocated size of #walkback_. Increased as needed.
- */
- int maximumDepth_;
- /** Array used to assemble the path between a node and the search tree root
-
- The array is resized when necessary. #maximumDepth_ is the current
- allocated size.
- */
- CbcNodeInfo ** walkback_;
- CbcNodeInfo ** lastNodeInfo_;
- const OsiRowCut ** lastCut_;
- int lastDepth_;
- int lastNumberCuts2_;
- int maximumCuts_;
- int * lastNumberCuts_;
-
- /** The list of cuts initially collected for this subproblem
-
- When the subproblem at this node is rebuilt, a set of cuts is collected
- for inclusion in the constraint system. If any of these cuts are
- subsequently removed because they have become loose, the corresponding
- entry is set to NULL.
- */
- CbcCountRowCut ** addedCuts_;
-
- /** A pointer to a row cut which will be added instead of normal branching.
- After use it should be set to NULL.
- */
- OsiRowCut * nextRowCut_;
-
- /// Current node so can be used elsewhere
- CbcNode * currentNode_;
-
- /// Indices of integer variables
- int * integerVariable_;
- /// Whether of not integer
- char * integerInfo_;
- /// Holds solution at continuous (after cuts)
- double * continuousSolution_;
- /// Array marked whenever a solution is found if non-zero
- int * usedInSolution_;
- /**
- Special options
- 0 bit (1) - check if cuts valid (if on debugger list)
- 1 bit (2) - use current basis to check integer solution (rather than all slack)
- 2 bit (4) - don't check integer solution (by solving LP)
- 3 bit (8) - fast analyze
- 4 bit (16) - non-linear model - so no well defined CoinPackedMatrix
- 5 bit (32) - keep names
- 6 bit (64) - try for dominated columns
- 7 bit (128) - SOS type 1 but all declared integer
- 8 bit (256) - Set to say solution just found, unset by doing cuts
- 9 bit (512) - Try reduced model after 100 nodes
- 10 bit (1024) - Switch on some heuristics even if seems unlikely
- 11 bit (2048) - Mark as in small branch and bound
- 12 bit (4096) - Funny cuts so do slow way (in some places)
- 13 bit (8192) - Funny cuts so do slow way (in other places)
- 14 bit (16384) - Use Cplex! for fathoming
- 15 bit (32768) - Try reduced model after 0 nodes
- 16 bit (65536) - Original model had integer bounds
- 17 bit (131072) - Perturbation switched off
- 18 bit (262144) - donor CbcModel
- 19 bit (524288) - recipient CbcModel
- 20 bit (1048576) - waiting for sub model to return
- 22 bit (4194304) - do not initialize random seed in solver (user has)
- 23 bit (8388608) - leave solver_ with cuts
- 24 bit (16777216) - just get feasible if no cutoff
- */
- int specialOptions_;
- /** More special options
- at present bottom 6 bits used for shadow price mode
- 1024 for experimental hotstart
- 2048,4096 breaking out of cuts
- 8192 slowly increase minimum drop
- 16384 gomory
- 32768 more heuristics in sub trees
- 65536 no cuts in preprocessing
- 131072 Time limits elapsed
- 18 bit (262144) - Perturb fathom nodes
- 19 bit (524288) - No limit on fathom nodes
- 20 bit (1048576) - Reduce sum of infeasibilities before cuts
- 21 bit (2097152) - Reduce sum of infeasibilities after cuts
- */
- int moreSpecialOptions_;
- /** More more special options
- 0 bit (1) - find switching variables
- 1 bit (2) - using fake objective until solution
- 2 bit (4) - switching variables exist
- 3 bit (8) - skip most of setBestSolution checks
- 4 bit (16) - very lightweight preprocessing in smallB&B
- 5 bit (32) - event handler needs to be cloned when parallel
- 6 bit (64) - testing - use probing to make cliques
- 7/8 bit (128) - try orbital branching (if nauty)
- 9 bit (512) - branching on objective (later)
- 10 bit (1024) - branching on constraints (later)
- 11/12 bit 2048 - intermittent cuts
- */
- int moreSpecialOptions2_;
- /// User node comparison function
- CbcCompareBase * nodeCompare_;
- /// User feasibility function (see CbcFeasibleBase.hpp)
- CbcFeasibilityBase * problemFeasibility_;
- /// Tree
- CbcTree * tree_;
- /// Pointer to top of tree
- CbcFullNodeInfo * topOfTree_;
- /// A pointer to model to be used for subtrees
- CbcModel * subTreeModel_;
- /// A pointer to model from CbcHeuristic
- CbcModel * heuristicModel_;
- /// Number of times any subtree stopped on nodes, time etc
- int numberStoppedSubTrees_;
- /// Variable selection function
- CbcBranchDecision * branchingMethod_;
- /// Cut modifier function
- CbcCutModifier * cutModifier_;
- /// Strategy
- CbcStrategy * strategy_;
- /// Parent model
- CbcModel * parentModel_;
- /** Whether to automatically do presolve before branch and bound.
- 0 - no
- 1 - ordinary presolve
- 2 - integer presolve (dodgy)
- */
- /// Pointer to array[getNumCols()] (for speed) of column lower bounds
- const double * cbcColLower_;
- /// Pointer to array[getNumCols()] (for speed) of column upper bounds
- const double * cbcColUpper_;
- /// Pointer to array[getNumRows()] (for speed) of row lower bounds
- const double * cbcRowLower_;
- /// Pointer to array[getNumRows()] (for speed) of row upper bounds
- const double * cbcRowUpper_;
- /// Pointer to array[getNumCols()] (for speed) of primal solution vector
- const double * cbcColSolution_;
- /// Pointer to array[getNumRows()] (for speed) of dual prices
- const double * cbcRowPrice_;
- /// Get a pointer to array[getNumCols()] (for speed) of reduced costs
- const double * cbcReducedCost_;
- /// Pointer to array[getNumRows()] (for speed) of row activity levels.
- const double * cbcRowActivity_;
- /// Pointer to user-defined data structure
- void * appData_;
- /// Presolve for CbcTreeLocal
- int presolve_;
- /** Maximum number of candidates to consider for strong branching.
- To disable strong branching, set this to 0.
- */
- int numberStrong_;
- /** \brief The number of branches before pseudo costs believed
- in dynamic strong branching.
-
- A value of 0 is off.
- */
- int numberBeforeTrust_;
- /** \brief The number of variables for which to compute penalties
- in dynamic strong branching.
- */
- int numberPenalties_;
- /// For threads - stop after this many "iterations"
- int stopNumberIterations_;
- /** Scale factor to make penalties match strong.
- Should/will be computed */
- double penaltyScaleFactor_;
- /// Number of analyze iterations to do
- int numberAnalyzeIterations_;
- /// Arrays with analysis results
- double * analyzeResults_;
- /// Useful temporary pointer
- void * temporaryPointer_;
- /// Number of nodes infeasible by normal branching (before cuts)
- int numberInfeasibleNodes_;
- /** Problem type as set by user or found by analysis. This will be extended
- 0 - not known
- 1 - Set partitioning <=
- 2 - Set partitioning ==
- 3 - Set covering
- */
- int problemType_;
- /// Print frequency
- int printFrequency_;
- /// Number of cut generators
- int numberCutGenerators_;
- // Cut generators
- CbcCutGenerator ** generator_;
- // Cut generators before any changes
- CbcCutGenerator ** virginGenerator_;
- /// Number of heuristics
- int numberHeuristics_;
- /// Heuristic solvers
- CbcHeuristic ** heuristic_;
- /// Pointer to heuristic solver which found last solution (or NULL)
- CbcHeuristic * lastHeuristic_;
- /// Depth for fast nodes
- int fastNodeDepth_;
- /*! Pointer to the event handler */
-# ifdef CBC_ONLY_CLP
- ClpEventHandler *eventHandler_ ;
-# else
- CbcEventHandler *eventHandler_ ;
-# endif
- /// Symmetry information
- CbcSymmetry * symmetryInfo_;
- /// Total number of objects
- int numberObjects_;
-
- /** \brief Integer and Clique and ... information
-
- \note The code assumes that the first objects on the list will be
- SimpleInteger objects for each integer variable, followed by
- Clique objects. Portions of the code that understand Clique objects
- will fail if they do not immediately follow the SimpleIntegers.
- Large chunks of the code will fail if the first objects are not
- SimpleInteger. As of 2003.08, SimpleIntegers and Cliques are the only
- objects.
- */
- OsiObject ** object_;
- /// Now we may not own objects - just point to solver's objects
- bool ownObjects_;
-
- /// Original columns as created by integerPresolve or preprocessing
- int * originalColumns_;
- /// How often to scan global cuts
- int howOftenGlobalScan_;
- /** Number of times global cuts violated. When global cut pool then this
- should be kept for each cut and type of cut */
- int numberGlobalViolations_;
- /// Number of extra iterations in fast lp
- int numberExtraIterations_;
- /// Number of extra nodes in fast lp
- int numberExtraNodes_;
- /// Number of times fast lp entered
- int numberFathoms_;
- /** Value of objective at continuous
- (Well actually after initial round of cuts)
- */
- double continuousObjective_;
- /** Value of objective before root node cuts added
- */
- double originalContinuousObjective_;
- /// Number of infeasibilities at continuous
- int continuousInfeasibilities_;
- /// Maximum number of cut passes at root
- int maximumCutPassesAtRoot_;
- /// Maximum number of cut passes
- int maximumCutPasses_;
- /// Preferred way of branching
- int preferredWay_;
- /// Current cut pass number
- int currentPassNumber_;
- /// Maximum number of cuts (for whichGenerator_)
- int maximumWhich_;
- /// Maximum number of rows
- int maximumRows_;
- /// Random seed
- int randomSeed_;
- /// Multiple root tries
- int multipleRootTries_;
- /// Current depth
- int currentDepth_;
- /// Thread specific random number generator
- mutable CoinThreadRandom randomNumberGenerator_;
- /// Work basis for temporary use
- CoinWarmStartBasis workingBasis_;
- /// Which cut generator generated this cut
- int * whichGenerator_;
- /// Maximum number of statistics
- int maximumStatistics_;
- /// statistics
- CbcStatistics ** statistics_;
- /// Maximum depth reached
- int maximumDepthActual_;
- /// Number of reduced cost fixings
- double numberDJFixed_;
- /// Probing info
- CglTreeProbingInfo * probingInfo_;
- /// Number of fixed by analyze at root
- int numberFixedAtRoot_;
- /// Number fixed by analyze so far
- int numberFixedNow_;
- /// Whether stopping on gap
- bool stoppedOnGap_;
- /// Whether event happened
- mutable bool eventHappened_;
- /// Number of long strong goes
- int numberLongStrong_;
- /// Number of old active cuts
- int numberOldActiveCuts_;
- /// Number of new cuts
- int numberNewCuts_;
- /// Strategy worked out - mainly at root node
- int searchStrategy_;
- /** Strategy for strong branching
- 0 - normal
- when to do all fractional
- 1 - root node
- 2 - depth less than modifier
- 4 - if objective == best possible
- 6 - as 2+4
- when to do all including satisfied
- 10 - root node etc.
- If >=100 then do when depth <= strategy/100 (otherwise 5)
- */
- int strongStrategy_;
- /// Number of iterations in strong branching
- int numberStrongIterations_;
- /** 0 - number times strong branching done, 1 - number fixed, 2 - number infeasible
- Second group of three is a snapshot at node [6] */
- int strongInfo_[7];
- /**
- For advanced applications you may wish to modify the behavior of Cbc
- e.g. if the solver is a NLP solver then you may not have an exact
- optimum solution at each step. This gives characteristics - just for one BAB.
- For actually saving/restoring a solution you need the actual solver one.
- */
- OsiBabSolver * solverCharacteristics_;
- /// Whether to force a resolve after takeOffCuts
- bool resolveAfterTakeOffCuts_;
- /// Maximum number of iterations (designed to be used in heuristics)
- int maximumNumberIterations_;
- /// Anything with priority >= this can be treated as continuous
- int continuousPriority_;
- /// Number of outstanding update information items
- int numberUpdateItems_;
- /// Maximum number of outstanding update information items
- int maximumNumberUpdateItems_;
- /// Update items
- CbcObjectUpdateData * updateItems_;
- /// Stored row cuts for donor/recipient CbcModel
- CglStored * storedRowCuts_;
- /**
- Parallel
- 0 - off
- 1 - testing
- 2-99 threads
- other special meanings
- */
- int numberThreads_;
- /** thread mode
- always use numberThreads for branching
- 1 set then deterministic
- 2 set then use numberThreads for root cuts
- 4 set then use numberThreads in root mini branch and bound
- default is 0
- */
- int threadMode_;
- /// Number of global cuts on entry to a node
- int numberGlobalCutsIn_;
- /// Thread stuff for master
- CbcBaseModel * master_;
- /// Pointer to masterthread
- CbcThread * masterThread_;
-//@}
-};
-/// So we can use osiObject or CbcObject during transition
-void getIntegerInformation(const OsiObject * object, double & originalLower,
- double & originalUpper) ;
-// So we can call from other programs
-// Real main program
-class OsiClpSolverInterface;
-int CbcMain (int argc, const char *argv[], OsiClpSolverInterface & solver, CbcModel ** babSolver);
-int CbcMain (int argc, const char *argv[], CbcModel & babSolver);
-// four ways of calling
-int callCbc(const char * input2, OsiClpSolverInterface& solver1);
-int callCbc(const char * input2);
-int callCbc(const std::string input2, OsiClpSolverInterface& solver1);
-int callCbc(const std::string input2) ;
-// When we want to load up CbcModel with options first
-void CbcMain0 (CbcModel & babSolver);
-int CbcMain1 (int argc, const char *argv[], CbcModel & babSolver);
-// two ways of calling
-int callCbc(const char * input2, CbcModel & babSolver);
-int callCbc(const std::string input2, CbcModel & babSolver);
-// And when CbcMain0 already called to initialize
-int callCbc1(const char * input2, CbcModel & babSolver);
-int callCbc1(const std::string input2, CbcModel & babSolver);
-// And when CbcMain0 already called to initialize (with call back) (see CbcMain1 for whereFrom)
-int callCbc1(const char * input2, CbcModel & babSolver, int (CbcModel * currentSolver, int whereFrom));
-int callCbc1(const std::string input2, CbcModel & babSolver, int (CbcModel * currentSolver, int whereFrom));
-int CbcMain1 (int argc, const char *argv[], CbcModel & babSolver, int (CbcModel * currentSolver, int whereFrom));
-// For uniform setting of cut and heuristic options
-void setCutAndHeuristicOptions(CbcModel & model);
-#endif
-