summaryrefslogtreecommitdiff
path: root/build/Bonmin/include/coin/BonChooseVariable.hpp
diff options
context:
space:
mode:
authorHarpreet2016-08-04 15:25:44 +0530
committerHarpreet2016-08-04 15:25:44 +0530
commit9fd2976931c088dc523974afb901e96bad20f73c (patch)
tree22502de6e6988d5cd595290d11266f8432ad825b /build/Bonmin/include/coin/BonChooseVariable.hpp
downloadFOSSEE-Optim-toolbox-development-9fd2976931c088dc523974afb901e96bad20f73c.tar.gz
FOSSEE-Optim-toolbox-development-9fd2976931c088dc523974afb901e96bad20f73c.tar.bz2
FOSSEE-Optim-toolbox-development-9fd2976931c088dc523974afb901e96bad20f73c.zip
initial add
Diffstat (limited to 'build/Bonmin/include/coin/BonChooseVariable.hpp')
-rw-r--r--build/Bonmin/include/coin/BonChooseVariable.hpp345
1 files changed, 345 insertions, 0 deletions
diff --git a/build/Bonmin/include/coin/BonChooseVariable.hpp b/build/Bonmin/include/coin/BonChooseVariable.hpp
new file mode 100644
index 0000000..82e7575
--- /dev/null
+++ b/build/Bonmin/include/coin/BonChooseVariable.hpp
@@ -0,0 +1,345 @@
+// Copyright (C) 2006, 2008 International Business Machines
+// Corporation and others. All Rights Reserved.
+#ifndef BonChooseVariable_H
+#define BonChooseVariable_H
+
+#include "OsiChooseVariable.hpp"
+#ifdef BONMIN_CURVATURE_BRANCHING
+#include "BonCurvatureEstimator.hpp"
+#endif
+#include "BonOsiTMINLPInterface.hpp"
+#include "CoinMessageHandler.hpp"
+#include "BonBabSetupBase.hpp"
+// Forward declaration
+class CbcModel;
+
+#define OLD_USEFULLNESS
+
+namespace Bonmin
+{
+
+ class HotInfo : public OsiHotInfo {
+ public:
+ /// Default constructor
+ HotInfo();
+
+ /// Constructor from usefull information
+ HotInfo( OsiSolverInterface * solver,
+ const OsiBranchingInformation *info,
+ const OsiObject * const * objects, int whichObject);
+
+ /// Copy constructor
+ HotInfo(const HotInfo & other);
+
+ /// Assignment operator
+ HotInfo & operator=(const HotInfo & rhs);
+
+ /// Clone
+ virtual OsiHotInfo * clone() const;
+
+ /// Destructor
+ virtual ~HotInfo();
+
+ /// Fill in some usefull information after a strong branching is done:
+ int updateInformation( const OsiSolverInterface * solver, const OsiBranchingInformation * info,
+ OsiChooseVariable * choose);
+
+ /// up infeasibility
+ double upInfeasibility() const{
+ return infeasibilities_[1];
+ }
+
+ /// down infeasibility
+ double downInfeasibility() const{
+ return infeasibilities_[0];
+ }
+
+
+ /// Set the down infeasibility
+ void setUpInfeasibility(double x){
+ assert(branchingObject_->numberBranches()==2);
+ infeasibilities_[1] = x;
+ }
+
+ /// Set the down infeasibility
+ void setDownInfeasibility(double x){
+ assert(branchingObject_->numberBranches()==2);
+ infeasibilities_[0] = x;
+ }
+ private:
+ /// infeasibilities of children
+ vector<double> infeasibilities_;
+ };
+
+ /** This class chooses a variable to branch on
+
+ This is the base class for the branching rules in Bonmin (inherits
+ from OsiChooseVariable). This class implements a simple strong branching algorithm where the changes in the objective
+ value induced by branching on a specific object are estimated with the pure virtual function fill_changes.
+ */
+
+ class BonChooseVariable : public OsiChooseVariable
+ {
+ protected:
+ /** This is a utility function which does strong branching on
+ a list of objects and stores the results in OsiHotInfo.objects.
+ On entry the object sequence is stored in the OsiHotInfo object
+ and maybe more.
+ It returns -
+ -1 - one branch was infeasible both ways
+ 0 - all inspected - nothing can be fixed
+ 1 - all inspected - some can be fixed (returnCriterion==0)
+ 2 - may be returning early - one can be fixed (last one done) (returnCriterion==1)
+ 3 - returning because max time
+
+ */
+ virtual int doStrongBranching( OsiSolverInterface * solver,
+ OsiBranchingInformation *info,
+ int numberToDo, int returnCriterion);
+#ifndef OLD_USEFULLNESS
+ /** Criterion applied to sort candidates.*/
+ enum CandidateSortCriterion {
+ DecrPs = 0,
+ IncrPs,
+ DecrInfeas,
+ IncrInfeas};
+#endif
+
+ /** Statuses for strong branching candidates.*/
+ enum StrongStatus{
+ NotDone=-1,
+ Feasible/** Child is proven feasible.*/,
+ Infeasible /** Child is proven infeasible.*/,
+ NotFinished /** Child is not finished.*/};
+ public:
+ /** \name Message handling.*/
+ /** @{ */
+ enum Messages_Types {
+ PS_COST_HISTORY = 0,
+ PS_COST_MULT,
+ PS_COST_ESTIMATES,
+ CANDIDATE_LIST,
+ CANDIDATE_LIST2,
+ CANDIDATE_LIST3,
+ SB_START,
+ SB_HEADER,
+ SB_RES,
+ BRANCH_VAR,
+ CHOSEN_VAR,
+ UPDATE_PS_COST,
+ BON_CHOOSE_MESSAGES_DUMMY_END
+ };
+
+ class Messages : public CoinMessages
+ {
+ public:
+ Messages();
+ };
+
+ void passInMessageHandler(CoinMessageHandler * handler) {
+ int logLevel = handler_->logLevel();
+ delete handler_;
+ handler_ = handler->clone();
+ handler_->setLogLevel(logLevel);
+ }
+
+ CoinMessageHandler& message(Messages_Types type) const {
+ return handler_->message(type, messages_);
+ }
+ /** @} */
+
+
+
+ enum DoStrongReturnStatuses{
+ provenInfeasible = -1 /** One branch has two infeasible children.*/,
+ doneNoFixing /** All done no variable can be fixed.*/,
+ doneCanFix /** Several variable can be fixed.*/,
+ interuptedCanFix /** Interupted and found a variable to fix.*/,
+ maxTime /** Interupted because of time limit.*/};
+
+ /** Return statuses for chooseVariable.*/
+ enum chooseVariableReturnStatuses{
+ infeasibleNode = -1/** Node has been proven infeasible.*/,
+ hasCandidate /** Normal termination, found a variable to branch on.*/,
+ feasibleNode /** All variable are feasible, the node is feasible.*/,
+ canFixAndStrongBranch /** Found variable to fix and also has remaining candidate for strong branching.*/,
+ canFixAndBranch/** Found variable to fix and also has a (non-strong) branching candidate.*/,
+ canFixNoCandidate /** Can fix variables but does not have strong branching candidates.*/
+ };
+ /// Constructor from solver (so we can set up arrays etc)
+ BonChooseVariable (BabSetupBase& b, const OsiSolverInterface* solver);
+
+ /// Copy constructor
+ BonChooseVariable (const BonChooseVariable &);
+
+ /// Assignment operator
+ BonChooseVariable & operator= (const BonChooseVariable& rhs);
+
+ /// Clone
+ virtual OsiChooseVariable * clone() const;
+
+ /// Destructor
+ virtual ~BonChooseVariable ();
+
+ static void registerOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions);
+
+ /** Helper functions for setupList and chooseVariable */
+ double maxminCrit(const OsiBranchingInformation* info) const;
+ void computeMultipliers(double& upMult, double& downMult) const;
+ double computeUsefulness(const double MAXMIN_CRITERION,
+ const double upMult, const double dowMult,
+ const double value,
+ const OsiObject* object, int i,
+ double& value2) const;
+
+ /** Sets up strong list and clears all if initialize is true.
+ Returns number of infeasibilities. */
+ virtual int setupList ( OsiBranchingInformation *info, bool initialize);
+
+ /** Choose a variable
+ Returns -
+ -1 Node is infeasible
+ 0 Normal termination - we have a candidate
+ 1 All looks satisfied - no candidate
+ 2 We can change the bound on a variable - but we also have a strong branching candidate
+ 3 We can change the bound on a variable - but we have a non-strong branching candidate
+ 4 We can change the bound on a variable - no other candidates
+ We can pick up branch from bestObjectIndex() and bestWhichWay()
+ We can pick up a forced branch (can change bound) from firstForcedObjectIndex() and firstForcedWhichWay()
+ If we have a solution then we can pick up from goodObjectiveValue() and goodSolution()
+ If fixVariables is true then 2,3,4 are all really same as problem changed
+ */
+ virtual int chooseVariable( OsiSolverInterface * solver, OsiBranchingInformation *info, bool fixVariables);
+ /** This is a utility function which does strong branching on
+ a list of objects and stores the results in OsiHotInfo.objects.
+ On entry the object sequence is stored in the OsiHotInfo object
+ and maybe more.
+ It returns -
+ -1 - one branch was infeasible both ways
+ 0 - all inspected - nothing can be fixed
+ 1 - all inspected - some can be fixed (returnCriterion==0)
+ 2 - may be returning early - one can be fixed (last one done) (returnCriterion==1)
+ 3 - returning because max time
+
+ */
+
+ /// Given a candidate fill in useful information e.g. estimates
+ virtual void updateInformation(const OsiBranchingInformation *info,
+ int branch, OsiHotInfo * hotInfo);
+#if 1
+ /// Given a branch fill in useful information e.g. estimates
+ virtual void updateInformation( int whichObject, int branch,
+ double changeInObjective, double changeInValue,
+ int status);
+#endif
+
+ /** Method for setting CbcModel, which is used to get statusOfSearch */
+ void setCbcModel(CbcModel* cbc_model)
+ {
+ cbc_model_ = cbc_model;
+ }
+
+ void setOnlyPseudoWhenTrusted(bool only_pseudo_when_trusted)
+ {
+ only_pseudo_when_trusted_ = only_pseudo_when_trusted;
+ }
+
+
+ /** Access to pseudo costs storage.*/
+ const OsiPseudoCosts & pseudoCosts() const{
+ return pseudoCosts_;}
+
+ /** Access to pseudo costs storage.*/
+ OsiPseudoCosts & pseudoCosts() {
+ return pseudoCosts_;}
+ protected:
+
+ /// Holding on the a pointer to the journalist
+ Ipopt::SmartPtr<Ipopt::Journalist> jnlst_;
+
+ /// verbosity level
+ int bb_log_level_;
+
+ /** Stores strong branching results.*/
+ vector<HotInfo> results_;
+
+ /** Determine status of strong branching solution.*/
+ int determineStatus(OsiSolverInterface * solver) const {
+ if (solver->isProvenOptimal())
+ return 0; // optimal
+ else if (solver->isIterationLimitReached()
+ &&!solver->isDualObjectiveLimitReached())
+ return 2; // unknown
+ else
+ return 1; // infeasible
+ }
+
+ private:
+ /** Default Constructor, forbiden for some reason.*/
+ BonChooseVariable ();
+
+ /** Global time limit for algorithm. */
+ double time_limit_;
+
+ /** Starting time of algorithm.*/
+ double start_time_;
+ protected:
+ /// CbcModel, used to get status of search
+ CbcModel* cbc_model_;
+
+ /** Flag indicating whether we don't want to mix strong branching
+ * and pseudo costs during the decision which variable to branch
+ * on */
+ bool only_pseudo_when_trusted_;
+
+ /** Number of variables put into the list because there were not
+ * trusted */
+ int number_not_trusted_;
+
+ /** Message handler.*/
+ CoinMessageHandler * handler_;
+
+ /** Messages.*/
+ Messages messages_;
+ // ToDo: Make this options
+ /** @name Algoirithmic options */
+ //@{
+ /** maxmin weight in branching decision when no solution has been
+ * found yet */
+ double maxmin_crit_no_sol_;
+ /** maxmin weight in branching decision when no solution has been
+ * found yet */
+ double maxmin_crit_have_sol_;
+ /** fraction of branching candidates that are not trusted yet */
+ double setup_pseudo_frac_;
+ /** number of times a branch has to happen so that it is trusted in
+ * setupList */
+ int numberBeforeTrustedList_;
+ /** number of strong branching points at root node */
+ int numberStrongRoot_;
+ /** backup of numberStrong_ before Root node solve */
+ int numberStrongBackup_;
+ /** number of look-ahead strong-branching steps */
+ int numberLookAhead_;
+#ifndef OLD_USEFULLNESS
+ /** Criterion to use in setup list.*/
+ CandidateSortCriterion sortCrit_;
+#endif
+ /** Always strong branch that many first candidate in the list regardless of numberTrusted.*/
+ int minNumberStrongBranch_;
+ /** Stores the pseudo costs. */
+ OsiPseudoCosts pseudoCosts_;
+ /** Wether or not to trust strong branching results for updating pseudo costs.*/
+ int trustStrongForPseudoCosts_;
+
+ //@}
+
+ /** detecting if this is root node */
+ bool isRootNode(const OsiBranchingInformation *info) const;
+
+ /** Stores the class name for throwing errors.*/
+ static const std::string CNAME;
+ };
+
+}
+#endif