Bonmin
1.7
|
00001 // (C) Copyright International Business Machines Corporation and Carnegie Mellon University 2004, 2006 00002 // All Rights Reserved. 00003 // This code is published under the Common Public License. 00004 // 00005 // Authors : 00006 // Pierre Bonami, Carnegie Mellon University, 00007 // Carl D. Laird, Carnegie Mellon University, 00008 // Andreas Waechter, International Business Machines Corporation 00009 // 00010 // Date : 12/01/2004 00011 00012 #ifndef __TMINLP2TNLP_HPP__ 00013 #define __TMINLP2TNLP_HPP__ 00014 00015 #include "IpTNLP.hpp" 00016 #include "BonTMINLP.hpp" 00017 #include "IpSmartPtr.hpp" 00018 #include "IpIpoptApplication.hpp" 00019 #include "IpOptionsList.hpp" 00020 #include "BonTypes.hpp" 00021 00022 namespace Bonmin 00023 { 00024 class IpoptInteriorWarmStarter; 00025 00032 class TMINLP2TNLP : public Ipopt::TNLP 00033 { 00034 public: 00037 TMINLP2TNLP(const Ipopt::SmartPtr<TMINLP> tminlp 00038 #ifdef WARM_STARTER 00039 , 00040 const OptionsList& options 00041 #endif 00042 ); 00043 00047 TMINLP2TNLP(const TMINLP2TNLP&); 00048 00050 virtual TMINLP2TNLP * clone() const{ 00051 return new TMINLP2TNLP(*this);} 00052 00054 virtual ~TMINLP2TNLP(); 00056 00059 00061 inline Ipopt::Index num_variables() const 00062 { 00063 assert(x_l_.size() == x_u_.size()); 00064 return static_cast<int>(x_l_.size()); 00065 } 00066 00068 inline Ipopt::Index num_constraints() const 00069 { 00070 assert(g_l_.size() == g_u_.size()); 00071 return static_cast<int>(g_l_.size()); 00072 } 00074 Ipopt::Index nnz_h_lag() 00075 { 00076 return nnz_h_lag_; 00077 } 00079 const TMINLP::VariableType* var_types() 00080 { 00081 return &var_types_[0]; 00082 } 00083 00085 const Ipopt::Number* x_l() 00086 { 00087 return &x_l_[0]; 00088 } 00090 const Ipopt::Number* x_u() 00091 { 00092 return &x_u_[0]; 00093 } 00094 00096 const Ipopt::Number* orig_x_l() const 00097 { 00098 return &orig_x_l_[0]; 00099 } 00101 const Ipopt::Number* orig_x_u() const 00102 { 00103 return orig_x_u_(); 00104 } 00105 00107 const Ipopt::Number* g_l() 00108 { 00109 return g_l_(); 00110 } 00112 const Ipopt::Number* g_u() 00113 { 00114 return g_u_(); 00115 } 00116 00118 const Ipopt::Number * x_init() const 00119 { 00120 return x_init_(); 00121 } 00122 00124 const Ipopt::Number * x_init_user() const 00125 { 00126 return x_init_user_(); 00127 } 00128 00130 const Ipopt::Number * duals_init() const 00131 { 00132 return duals_init_; 00133 } 00134 00136 const Ipopt::Number* x_sol() const 00137 { 00138 return x_sol_(); 00139 } 00140 00142 const Ipopt::Number* g_sol() const 00143 { 00144 return g_sol_(); 00145 } 00146 00148 const Ipopt::Number* duals_sol() const 00149 { 00150 return duals_sol_(); 00151 } 00152 00154 Ipopt::SolverReturn optimization_status() const 00155 { 00156 return return_status_; 00157 } 00158 00160 Ipopt::Number obj_value() const 00161 { 00162 return obj_value_; 00163 } 00164 00166 void set_obj_value(Ipopt::Number value) 00167 { 00168 obj_value_ = value; 00169 } 00170 00172 void force_fractionnal_sol(); 00173 00175 void SetVariablesBounds(Ipopt::Index n, 00176 const Ipopt::Number * x_l, 00177 const Ipopt::Number * x_u); 00178 00180 void SetVariablesLowerBounds(Ipopt::Index n, 00181 const Ipopt::Number * x_l); 00182 00184 void SetVariablesUpperBounds(Ipopt::Index n, 00185 const Ipopt::Number * x_u); 00186 00188 void SetVariableBounds(Ipopt::Index var_no, Ipopt::Number x_l, Ipopt::Number x_u); 00189 00191 void SetVariableLowerBound(Ipopt::Index var_no, Ipopt::Number x_l); 00192 00194 void SetVariableUpperBound(Ipopt::Index var_no, Ipopt::Number x_u); 00195 00197 void resetStartingPoint(); 00198 00200 void setxInit(Ipopt::Index n,const Ipopt::Number* x_init); 00201 00203 void setDualsInit(Ipopt::Index n, const Ipopt::Number* duals_init); 00204 00207 int has_x_init(){ 00208 if(x_init_.empty()) return 0; 00209 if(duals_init_) return 2; 00210 return 1; 00211 } 00213 void Set_x_sol(Ipopt::Index n, const Ipopt::Number* x_sol); 00214 00216 void Set_dual_sol(Ipopt::Index n, const Ipopt::Number* dual_sol); 00217 00219 void SetVariableType(Ipopt::Index n, TMINLP::VariableType type); 00221 00225 void outputDiffs(const std::string& probName, const std::string* varNames); 00226 00230 virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g, 00231 Ipopt::Index& nnz_h_lag, 00232 TNLP::IndexStyleEnum& index_style); 00233 00237 virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u, 00238 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u); 00239 00242 virtual bool get_constraints_linearity(Ipopt::Index m, LinearityType* const_types) 00243 { 00244 return tminlp_->get_constraints_linearity(m, const_types); 00245 } 00246 00249 virtual bool get_variables_linearity(Ipopt::Index n, LinearityType* var_types) 00250 { 00251 return tminlp_->get_variables_linearity(n, var_types); 00252 } 00253 00255 virtual bool hasLinearObjective(){return tminlp_->hasLinearObjective();} 00263 virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x, 00264 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U, 00265 Ipopt::Index m, bool init_lambda, 00266 Ipopt::Number* lambda); 00267 00270 virtual bool get_scaling_parameters(Ipopt::Number& obj_scaling, 00271 bool& use_x_scaling, Ipopt::Index n, 00272 Ipopt::Number* x_scaling, 00273 bool& use_g_scaling, Ipopt::Index m, 00274 Ipopt::Number* g_scaling); 00275 00276 00279 virtual bool get_warm_start_iterate(Ipopt::IteratesVector& warm_start_iterate); 00280 00282 virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, 00283 Ipopt::Number& obj_value); 00284 00287 virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, 00288 Ipopt::Number* grad_f); 00289 00291 virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x, 00292 Ipopt::Index m, Ipopt::Number* g); 00293 00299 virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x, 00300 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow, 00301 Ipopt::Index *jCol, Ipopt::Number* values); 00302 00304 virtual bool eval_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x, 00305 Ipopt::Index i, Ipopt::Number& gi); 00308 virtual bool eval_grad_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x, 00309 Ipopt::Index i, Ipopt::Index& nele_grad_gi, Ipopt::Index* jCol, 00310 Ipopt::Number* values); 00311 00319 virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x, 00320 Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda, 00321 bool new_lambda, Ipopt::Index nele_hess, 00322 Ipopt::Index* iRow, Ipopt::Index* jCol, Ipopt::Number* values); 00324 00328 virtual void finalize_solution(Ipopt::SolverReturn status, 00329 Ipopt::Index n, const Ipopt::Number* x, const Ipopt::Number* z_L, const Ipopt::Number* z_U, 00330 Ipopt::Index m, const Ipopt::Number* g, const Ipopt::Number* lambda, 00331 Ipopt::Number obj_value, 00332 const Ipopt::IpoptData* ip_data, 00333 Ipopt::IpoptCalculatedQuantities* ip_cq); 00337 virtual bool intermediate_callback(Ipopt::AlgorithmMode mode, 00338 Ipopt::Index iter, Ipopt::Number obj_value, 00339 Ipopt::Number inf_pr, Ipopt::Number inf_du, 00340 Ipopt::Number mu, Ipopt::Number d_norm, 00341 Ipopt::Number regularization_size, 00342 Ipopt::Number alpha_du, Ipopt::Number alpha_pr, 00343 Ipopt::Index ls_trials, 00344 const Ipopt::IpoptData* ip_data, 00345 Ipopt::IpoptCalculatedQuantities* ip_cq); 00347 00353 void SetWarmStarter(Ipopt::SmartPtr<IpoptInteriorWarmStarter> warm_starter); 00354 00355 Ipopt::SmartPtr<IpoptInteriorWarmStarter> GetWarmStarter(); 00356 00358 00360 virtual bool hasUpperBoundingObjective(){ 00361 return tminlp_->hasUpperBoundingObjective();} 00362 00364 double evaluateUpperBoundingFunction(const double * x); 00365 00369 00370 00372 virtual void addCuts(unsigned int numberCuts, const OsiRowCut ** cuts){ 00373 if(numberCuts > 0) 00374 throw CoinError("BonTMINLP2TNLP", "addCuts", "Not implemented");} 00375 00376 00378 virtual void addCuts(const OsiCuts &cuts){ 00379 if(cuts.sizeRowCuts() > 0 || cuts.sizeColCuts() > 0) 00380 throw CoinError("BonTMINLP2TNLP", "addCuts", "Not implemented");} 00381 00383 virtual void removeCuts(unsigned int number ,const int * toRemove){ 00384 if(number > 0) 00385 throw CoinError("BonTMINLP2TNLP", "removeCuts", "Not implemented");} 00386 00388 00389 00391 virtual const int * get_const_xtra_id() const{ 00392 return tminlp_->get_const_xtra_id(); 00393 } 00394 00396 double check_solution(OsiObject ** objects = 0, int nObjects = -1); 00397 protected: 00402 00403 vector<TMINLP::VariableType> var_types_; 00405 vector<Ipopt::Number> x_l_; 00407 vector<Ipopt::Number> x_u_; 00409 vector<Ipopt::Number> orig_x_l_; 00411 vector<Ipopt::Number> orig_x_u_; 00413 vector<Ipopt::Number> g_l_; 00415 vector<Ipopt::Number> g_u_; 00417 vector<Ipopt::Number> x_init_; 00419 Ipopt::Number * duals_init_; 00421 vector<Ipopt::Number> x_init_user_; 00423 vector<Ipopt::Number> x_sol_; 00425 vector<Ipopt::Number> g_sol_; 00427 vector<Ipopt::Number> duals_sol_; 00431 Ipopt::Index nnz_h_lag() const{ 00432 return nnz_h_lag_;} 00434 Ipopt::Index nnz_jac_g() const{ 00435 return nnz_jac_g_;} 00436 00438 TNLP::IndexStyleEnum index_style() const{ 00439 return index_style_;} 00440 private: 00450 TMINLP2TNLP(); 00451 00453 TMINLP2TNLP& operator=(const TMINLP2TNLP&); 00455 00457 Ipopt::SmartPtr<TMINLP> tminlp_; 00458 00461 00462 Ipopt::Index nnz_jac_g_; 00464 Ipopt::Index nnz_h_lag_; 00466 TNLP::IndexStyleEnum index_style_; 00467 00469 Ipopt::SolverReturn return_status_; 00471 Ipopt::Number obj_value_; 00473 00477 Ipopt::SmartPtr<IpoptInteriorWarmStarter> curr_warm_starter_; 00479 Ipopt::Number nlp_lower_bound_inf_; 00481 Ipopt::Number nlp_upper_bound_inf_; 00485 bool warm_start_entire_iterate_; 00487 bool need_new_warm_starter_; 00489 00490 00493 void throw_exception_on_bad_variable_bound(Ipopt::Index i); 00494 00495 private: 00496 // Delete all arrays 00497 void gutsOfDelete(); 00498 00504 void gutsOfCopy(const TMINLP2TNLP &source); 00505 }; 00506 00507 } // namespace Ipopt 00508 00509 #endif