00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __BONCUTSTRENGTHENER_HPP__
00010 #define __BONCUTSTRENGTHENER_HPP__
00011
00012 #include "BonTMINLP.hpp"
00013 #include "CoinPackedVector.hpp"
00014 #include "BonTNLPSolver.hpp"
00015
00016 namespace Bonmin
00017 {
00018 using namespace Ipopt;
00019
00020 enum CutStrengtheningType{
00021 CS_None=0,
00022 CS_StrengthenedGlobal=1,
00023 CS_UnstrengthenedGlobal_StrengthenedLocal=2,
00024 CS_StrengthenedGlobal_StrengthenedLocal=3
00025 };
00026
00027 enum DisjunctiveCutType{
00028 DC_None=0,
00029 DC_MostFractional=1
00030 };
00031
00034 class CutStrengthener: public ReferencedObject
00035 {
00038 class StrengtheningTNLP: public TNLP {
00039 public:
00041 StrengtheningTNLP(SmartPtr<TMINLP> tminlp,
00042 const CoinPackedVector& cut,
00043 bool lower_bound,
00044 Index n,
00045 const Number* starting_point,
00046 const double* x_l_orig,
00047 const double* x_u_orig,
00048 Index constr_index,
00049 Index nvar_constr ,
00050 const Index* jCol);
00051
00053 ~StrengtheningTNLP();
00054
00058 virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,
00059 Index& nnz_h_lag, IndexStyleEnum& index_style);
00060
00062 virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u,
00063 Index m, Number* g_l, Number* g_u);
00064
00066 virtual bool get_starting_point(Index n, bool init_x, Number* x,
00067 bool init_z, Number* z_L, Number* z_U,
00068 Index m, bool init_lambda,
00069 Number* lambda);
00070
00072 virtual bool eval_f(Index n, const Number* x, bool new_x, Number& obj_value);
00073
00075 virtual bool eval_grad_f(Index n, const Number* x, bool new_x, Number* grad_f);
00076
00078 virtual bool eval_g(Index n, const Number* x, bool new_x, Index m, Number* g);
00079
00084 virtual bool eval_jac_g(Index n, const Number* x, bool new_x,
00085 Index m, Index nele_jac, Index* iRow, Index *jCol,
00086 Number* values);
00087
00092 virtual bool eval_h(Index n, const Number* x, bool new_x,
00093 Number obj_factor, Index m, const Number* lambda,
00094 bool new_lambda, Index nele_hess, Index* iRow,
00095 Index* jCol, Number* values);
00096
00098
00101 virtual void finalize_solution(SolverReturn status,
00102 Index n, const Number* x, const Number* z_L, const Number* z_U,
00103 Index m, const Number* g, const Number* lambda,
00104 Number obj_value,
00105 const IpoptData* ip_data,
00106 IpoptCalculatedQuantities* ip_cq);
00108
00110 Number StrengthenedBound() const;
00111
00112 private:
00115 StrengtheningTNLP();
00116 StrengtheningTNLP(const StrengtheningTNLP&);
00117 StrengtheningTNLP& operator=(const StrengtheningTNLP&);
00119
00122 const SmartPtr<TMINLP> tminlp_;
00123
00125 Number* obj_grad_;
00126
00128 const Index n_orig_;
00129
00131 Index m_orig_;
00132
00134 Number* starting_point_;
00135
00138 Number* x_full_;
00139
00141 Number* x_l_;
00142
00144 Number* x_u_;
00145
00147 const Index constr_index_;
00148
00150 const Index nvar_constr_;
00151
00153 Index* var_indices_;
00154
00156 bool lower_bound_;
00157
00159 bool have_final_bound_;
00160
00162 Number strengthened_bound_;
00163
00165 Number* grad_f_;
00166
00168 void update_x_full(const Number *x);
00169 };
00170
00171 public:
00176 CutStrengthener(SmartPtr<TNLPSolver> tnlp_solver,
00177 SmartPtr<OptionsList> options);
00178
00180 virtual ~CutStrengthener();
00182
00184 bool ComputeCuts(OsiCuts &cs,
00185 TMINLP* tminlp,
00186 TMINLP2TNLP* problem,
00187 const int gindex, CoinPackedVector& cut,
00188 double& cut_lb, double& cut_ub,
00189 const double g_val, const double g_lb,
00190 const double g_ub,
00191 int n, const double* x,
00192 double infty);
00193
00194 private:
00204 CutStrengthener();
00205
00207 CutStrengthener(const CutStrengthener&);
00208
00210 void operator=(const CutStrengthener&);
00212
00214 bool StrengthenCut(SmartPtr<TMINLP> tminlp ,
00215 int constr_index ,
00216 const CoinPackedVector& row ,
00217 int n ,
00218 const double* x ,
00219 const double* x_l ,
00220 const double* x_u ,
00221 double& lb,
00222 double& ub);
00223
00225 bool HandleOneCut(bool is_tight, TMINLP* tminlp,
00226 TMINLP2TNLP* problem,
00227 const double* minlp_lb,
00228 const double* minlp_ub,
00229 const int gindex, CoinPackedVector& cut,
00230 double& cut_lb, double& cut_ub,
00231 int n, const double* x,
00232 double infty);
00233
00235 SmartPtr<TNLPSolver> tnlp_solver_;
00236
00238 int cut_strengthening_type_;
00240 int disjunctive_cut_type_;
00242 int oa_log_level_;
00243 };
00244
00245 }
00246 #endif