Bonmin  1.7
BonTMINLP2TNLP.hpp
Go to the documentation of this file.
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