00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
00243 virtual bool get_constraints_linearity(Ipopt::Index m, LinearityType* const_types)
00244 {
00245 return tminlp_->get_constraints_linearity(m, const_types);
00246 }
00247
00249 virtual bool hasLinearObjective(){return tminlp_->hasLinearObjective();}
00257 virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x,
00258 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
00259 Ipopt::Index m, bool init_lambda,
00260 Ipopt::Number* lambda);
00261
00264 virtual bool get_scaling_parameters(Ipopt::Number& obj_scaling,
00265 bool& use_x_scaling, Ipopt::Index n,
00266 Ipopt::Number* x_scaling,
00267 bool& use_g_scaling, Ipopt::Index m,
00268 Ipopt::Number* g_scaling);
00269
00270
00273 virtual bool get_warm_start_iterate(Ipopt::IteratesVector& warm_start_iterate);
00274
00276 virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00277 Ipopt::Number& obj_value);
00278
00281 virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00282 Ipopt::Number* grad_f);
00283
00285 virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00286 Ipopt::Index m, Ipopt::Number* g);
00287
00293 virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00294 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow,
00295 Ipopt::Index *jCol, Ipopt::Number* values);
00296
00298 virtual bool eval_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00299 Ipopt::Index i, Ipopt::Number& gi);
00302 virtual bool eval_grad_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00303 Ipopt::Index i, Ipopt::Index& nele_grad_gi, Ipopt::Index* jCol,
00304 Ipopt::Number* values);
00305
00313 virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00314 Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda,
00315 bool new_lambda, Ipopt::Index nele_hess,
00316 Ipopt::Index* iRow, Ipopt::Index* jCol, Ipopt::Number* values);
00318
00322 virtual void finalize_solution(Ipopt::SolverReturn status,
00323 Ipopt::Index n, const Ipopt::Number* x, const Ipopt::Number* z_L, const Ipopt::Number* z_U,
00324 Ipopt::Index m, const Ipopt::Number* g, const Ipopt::Number* lambda,
00325 Ipopt::Number obj_value,
00326 const Ipopt::IpoptData* ip_data,
00327 Ipopt::IpoptCalculatedQuantities* ip_cq);
00331 virtual bool intermediate_callback(Ipopt::AlgorithmMode mode,
00332 Ipopt::Index iter, Ipopt::Number obj_value,
00333 Ipopt::Number inf_pr, Ipopt::Number inf_du,
00334 Ipopt::Number mu, Ipopt::Number d_norm,
00335 Ipopt::Number regularization_size,
00336 Ipopt::Number alpha_du, Ipopt::Number alpha_pr,
00337 Ipopt::Index ls_trials,
00338 const Ipopt::IpoptData* ip_data,
00339 Ipopt::IpoptCalculatedQuantities* ip_cq);
00341
00347 void SetWarmStarter(Ipopt::SmartPtr<IpoptInteriorWarmStarter> warm_starter);
00348
00349 Ipopt::SmartPtr<IpoptInteriorWarmStarter> GetWarmStarter();
00350
00352
00354 virtual bool hasUpperBoundingObjective(){
00355 return tminlp_->hasUpperBoundingObjective();}
00356
00358 double evaluateUpperBoundingFunction(const double * x);
00359
00363
00364
00366 virtual void addCuts(unsigned int numberCuts, const OsiRowCut ** cuts){
00367 if(numberCuts > 0)
00368 throw CoinError("BonTMINLP2TNLP", "addCuts", "Not implemented");}
00369
00370
00372 virtual void addCuts(const OsiCuts &cuts){
00373 if(cuts.sizeRowCuts() > 0 || cuts.sizeColCuts() > 0)
00374 throw CoinError("BonTMINLP2TNLP", "addCuts", "Not implemented");}
00375
00377 virtual void removeCuts(unsigned int number ,const int * toRemove){
00378 if(number > 0)
00379 throw CoinError("BonTMINLP2TNLP", "removeCuts", "Not implemented");}
00380
00382
00384 double check_solution(OsiObject ** objects = 0, int nObjects = -1);
00385 protected:
00390
00391 vector<TMINLP::VariableType> var_types_;
00393 vector<Ipopt::Number> x_l_;
00395 vector<Ipopt::Number> x_u_;
00397 vector<Ipopt::Number> orig_x_l_;
00399 vector<Ipopt::Number> orig_x_u_;
00401 vector<Ipopt::Number> g_l_;
00403 vector<Ipopt::Number> g_u_;
00405 vector<Ipopt::Number> x_init_;
00407 Ipopt::Number * duals_init_;
00409 vector<Ipopt::Number> x_init_user_;
00411 vector<Ipopt::Number> x_sol_;
00413 vector<Ipopt::Number> g_sol_;
00415 vector<Ipopt::Number> duals_sol_;
00419 Ipopt::Index nnz_h_lag() const{
00420 return nnz_h_lag_;}
00422 Ipopt::Index nnz_jac_g() const{
00423 return nnz_jac_g_;}
00424
00426 TNLP::IndexStyleEnum index_style() const{
00427 return index_style_;}
00428 private:
00438 TMINLP2TNLP();
00439
00441 TMINLP2TNLP& operator=(const TMINLP2TNLP&);
00443
00445 Ipopt::SmartPtr<TMINLP> tminlp_;
00446
00449
00450 Ipopt::Index nnz_jac_g_;
00452 Ipopt::Index nnz_h_lag_;
00454 TNLP::IndexStyleEnum index_style_;
00455
00457 Ipopt::SolverReturn return_status_;
00459 Ipopt::Number obj_value_;
00461
00465 Ipopt::SmartPtr<IpoptInteriorWarmStarter> curr_warm_starter_;
00467 Ipopt::Number nlp_lower_bound_inf_;
00469 Ipopt::Number nlp_upper_bound_inf_;
00473 bool warm_start_entire_iterate_;
00475 bool need_new_warm_starter_;
00477
00478
00481 void throw_exception_on_bad_variable_bound(Ipopt::Index i);
00482
00483 private:
00484
00485 void gutsOfDelete();
00486
00492 void gutsOfCopy(const TMINLP2TNLP &source);
00493 };
00494
00495 }
00496
00497 #endif