00001
00002
00003 #ifndef BonChooseVariable_H
00004 #define BonChooseVariable_H
00005
00006 #include "OsiChooseVariable.hpp"
00007 #ifdef BONMIN_CURVATURE_BRANCHING
00008 #include "BonCurvatureEstimator.hpp"
00009 #endif
00010 #include "BonOsiTMINLPInterface.hpp"
00011 #include "CoinMessageHandler.hpp"
00012 #include "BonBabSetupBase.hpp"
00013
00014 class CbcModel;
00015
00016 #define OLD_USEFULLNESS
00017
00018 namespace Bonmin
00019 {
00020
00021 class HotInfo : public OsiHotInfo {
00022 public:
00024 HotInfo();
00025
00027 HotInfo( OsiSolverInterface * solver,
00028 const OsiBranchingInformation *info,
00029 const OsiObject * const * objects, int whichObject);
00030
00032 HotInfo(const HotInfo & other);
00033
00035 HotInfo & operator=(const HotInfo & rhs);
00036
00038 virtual OsiHotInfo * clone() const;
00039
00041 virtual ~HotInfo();
00042
00044 int updateInformation( const OsiSolverInterface * solver, const OsiBranchingInformation * info,
00045 OsiChooseVariable * choose);
00046
00048 double upInfeasibility() const{
00049 return infeasibilities_[1];
00050 }
00051
00053 double downInfeasibility() const{
00054 return infeasibilities_[0];
00055 }
00056
00057
00059 void setUpInfeasibility(double x){
00060 assert(branchingObject_->numberBranches()==2);
00061 infeasibilities_[1] = x;
00062 }
00063
00065 void setDownInfeasibility(double x){
00066 assert(branchingObject_->numberBranches()==2);
00067 infeasibilities_[0] = x;
00068 }
00069 private:
00071 vector<double> infeasibilities_;
00072 };
00073
00081 class BonChooseVariable : public OsiChooseVariable
00082 {
00083 protected:
00096 virtual int doStrongBranching( OsiSolverInterface * solver,
00097 OsiBranchingInformation *info,
00098 int numberToDo, int returnCriterion);
00099 #ifndef OLD_USEFULLNESS
00100
00101 enum CandidateSortCriterion {
00102 DecrPs = 0,
00103 IncrPs,
00104 DecrInfeas,
00105 IncrInfeas};
00106 #endif
00107
00109 enum StrongStatus{
00110 NotDone=-1,
00111 Feasible,
00112 Infeasible ,
00113 NotFinished };
00114 public:
00117 enum Messages_Types {
00118 PS_COST_HISTORY = 0,
00119 PS_COST_MULT,
00120 PS_COST_ESTIMATES,
00121 CANDIDATE_LIST,
00122 CANDIDATE_LIST2,
00123 CANDIDATE_LIST3,
00124 SB_HEADER,
00125 SB_RES,
00126 BRANCH_VAR,
00127 CHOSEN_VAR,
00128 UPDATE_PS_COST,
00129 BON_CHOOSE_MESSAGES_DUMMY_END
00130 };
00131
00132 class Messages : public CoinMessages
00133 {
00134 public:
00135 Messages();
00136 };
00137
00138 void passInMessageHandler(CoinMessageHandler * handler) {
00139 int logLevel = handler_->logLevel();
00140 delete handler_;
00141 handler_ = handler->clone();
00142 handler_->setLogLevel(logLevel);
00143 }
00144
00145 CoinMessageHandler& message(Messages_Types type) const {
00146 return handler_->message(type, messages_);
00147 }
00152 enum DoStrongReturnStatuses{
00153 provenInfeasible = -1 ,
00154 doneNoFixing ,
00155 doneCanFix ,
00156 interuptedCanFix ,
00157 maxTime };
00158
00160 enum chooseVariableReturnStatuses{
00161 infeasibleNode = -1,
00162 hasCandidate ,
00163 feasibleNode ,
00164 canFixAndStrongBranch ,
00165 canFixAndBranch,
00166 canFixNoCandidate
00167 };
00169 BonChooseVariable (BabSetupBase& b, const OsiSolverInterface* solver);
00170
00172 BonChooseVariable (const BonChooseVariable &);
00173
00175 BonChooseVariable & operator= (const BonChooseVariable& rhs);
00176
00178 virtual OsiChooseVariable * clone() const;
00179
00181 virtual ~BonChooseVariable ();
00182
00183 static void registerOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions);
00184
00186 double maxminCrit(const OsiBranchingInformation* info) const;
00187 void computeMultipliers(double& upMult, double& downMult) const;
00188 double computeUsefulness(const double MAXMIN_CRITERION,
00189 const double upMult, const double dowMult,
00190 const double value,
00191 const OsiObject* object, int i,
00192 double& value2) const;
00193
00196 virtual int setupList ( OsiBranchingInformation *info, bool initialize);
00197
00211 virtual int chooseVariable( OsiSolverInterface * solver, OsiBranchingInformation *info, bool fixVariables);
00225
00226 virtual void updateInformation(const OsiBranchingInformation *info,
00227 int branch, OsiHotInfo * hotInfo);
00228 #if 1
00230 virtual void updateInformation( int whichObject, int branch,
00231 double changeInObjective, double changeInValue,
00232 int status);
00233 #endif
00234
00236 void setCbcModel(CbcModel* cbc_model)
00237 {
00238 cbc_model_ = cbc_model;
00239 }
00240
00241 void setOnlyPseudoWhenTrusted(bool only_pseudo_when_trusted)
00242 {
00243 only_pseudo_when_trusted_ = only_pseudo_when_trusted;
00244 }
00245
00246
00248 const OsiPseudoCosts & pseudoCosts() const{
00249 return pseudoCosts_;}
00250
00252 OsiPseudoCosts & pseudoCosts() {
00253 return pseudoCosts_;}
00254 protected:
00255
00257 Ipopt::SmartPtr<Ipopt::Journalist> jnlst_;
00258
00260 int bb_log_level_;
00261
00263 vector<HotInfo> results_;
00264
00266 int determineStatus(OsiSolverInterface * solver) const {
00267 if (solver->isProvenOptimal())
00268 return 0;
00269 else if (solver->isIterationLimitReached()
00270 &&!solver->isDualObjectiveLimitReached())
00271 return 2;
00272 else
00273 return 1;
00274 }
00275
00276 private:
00278 BonChooseVariable ();
00279
00281 double time_limit_;
00282
00284 double start_time_;
00285 protected:
00287 CbcModel* cbc_model_;
00288
00292 bool only_pseudo_when_trusted_;
00293
00296 int number_not_trusted_;
00297
00299 CoinMessageHandler * handler_;
00300
00302 Messages messages_;
00303
00308 double maxmin_crit_no_sol_;
00311 double maxmin_crit_have_sol_;
00313 double setup_pseudo_frac_;
00316 int numberBeforeTrustedList_;
00318 int numberStrongRoot_;
00320 int numberStrongBackup_;
00322 int numberLookAhead_;
00323 #ifndef OLD_USEFULLNESS
00324
00325 CandidateSortCriterion sortCrit_;
00326 #endif
00327
00328 int minNumberStrongBranch_;
00330 OsiPseudoCosts pseudoCosts_;
00332 int trustStrongForPseudoCosts_;
00333
00335
00337 bool isRootNode(const OsiBranchingInformation *info) const;
00338
00340 static const std::string CNAME;
00341 };
00342
00343 }
00344 #endif