00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef TMINLPLinObj_H
00011 #define TMINLPLinObj_H
00012
00013 #include "BonTMINLP.hpp"
00014
00015 namespace Bonmin {
00039 class TMINLPLinObj: public Bonmin::TMINLP {
00040 public:
00042 TMINLPLinObj();
00043
00045 virtual ~TMINLPLinObj();
00046
00048 void setTminlp(Ipopt::SmartPtr<TMINLP> tminlp);
00049
00055 virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
00056 Ipopt::Index& nnz_h_lag, Ipopt::TNLP::IndexStyleEnum& index_style);
00060 virtual bool get_scaling_parameters(Ipopt::Number& obj_scaling,
00061 bool& use_x_scaling, Ipopt::Index n,
00062 Ipopt::Number* x_scaling,
00063 bool& use_g_scaling, Ipopt::Index m,
00064 Ipopt::Number* g_scaling);
00065
00066
00068 virtual bool get_variables_types(Ipopt::Index n, VariableType* var_types){
00069 assert(IsValid(tminlp_));
00070 assert(n == n_);
00071 var_types[n-1] = TMINLP::CONTINUOUS;
00072 return tminlp_->get_variables_types(n - 1, var_types);
00073 }
00074
00077 virtual bool get_constraints_linearity(Ipopt::Index m,
00078 Ipopt::TNLP::LinearityType* const_types);
00079
00083 virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
00084 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u);
00085
00089 virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x,
00090 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
00091 Ipopt::Index m, bool init_lambda,
00092 Ipopt::Number* lambda);
00093
00096 virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00097 Ipopt::Number& obj_value){
00098 assert(n == n_);
00099 obj_value = x[n-1];
00100 return true;}
00101
00104 virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00105 Ipopt::Number* grad_f){
00106 assert(IsValid(tminlp_));
00107 assert(n == n_);
00108 n--;
00109 for(int i = 0 ; i < n ; i++){
00110 grad_f[i] = 0;}
00111 grad_f[n] = 1;
00112 return true;}
00113
00116 virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00117 Ipopt::Index m, Ipopt::Number* g);
00118
00122 virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00123 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow,
00124 Ipopt::Index *jCol, Ipopt::Number* values);
00125
00129 virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00130 Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda,
00131 bool new_lambda, Ipopt::Index nele_hess,
00132 Ipopt::Index* iRow, Ipopt::Index* jCol, Ipopt::Number* values);
00135 virtual bool eval_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00136 Ipopt::Index i, Ipopt::Number& gi);
00140 virtual bool eval_grad_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00141 Ipopt::Index i, Ipopt::Index& nele_grad_gi, Ipopt::Index* jCol,
00142 Ipopt::Number* values);
00144
00145 virtual bool get_variables_linearity(Ipopt::Index n, Ipopt::TNLP::LinearityType* c){
00146 assert(IsValid(tminlp_));
00147 assert(n == n_);
00148 bool r_val = tminlp_->get_variables_linearity(n-1, c);
00149 c[n - 1] = Ipopt::TNLP::LINEAR;
00150 return r_val;
00151 }
00152
00153
00157 virtual void finalize_solution(TMINLP::SolverReturn status,
00158 Ipopt::Index n, const Ipopt::Number* x, Ipopt::Number obj_value){
00159 return tminlp_->finalize_solution(status, n - 1, x,
00160 obj_value);
00161 }
00163
00165 virtual const BranchingInfo * branchingInfo() const{
00166 return tminlp_->branchingInfo();
00167 }
00168
00171 virtual const SosInfo * sosConstraints() const{
00172 return tminlp_->sosConstraints();
00173 }
00175 virtual const PerturbInfo* perturbInfo() const
00176 {
00177 return tminlp_->perturbInfo();
00178 }
00179
00181 virtual bool hasUpperBoundingObjective(){
00182 assert(IsValid(tminlp_));
00183 return tminlp_->hasUpperBoundingObjective();}
00184
00186 virtual bool eval_upper_bound_f(Ipopt::Index n, const Ipopt::Number* x,
00187 Ipopt::Number& obj_value){
00188 assert(IsValid(tminlp_));
00189 return tminlp_->eval_upper_bound_f(n - 1, x, obj_value); }
00190
00192 virtual bool hasLinearObjective(){return true;}
00194 Ipopt::SmartPtr<TMINLP> tminlp(){return tminlp_;}
00195 private:
00197 void gutsOfDestructor();
00198
00200 Ipopt::SmartPtr<TMINLP> tminlp_;
00202 int m_;
00204 int n_;
00206 int nnz_jac_;
00208 int offset_;
00209
00210 };
00211
00212
00213 }
00214
00215 #endif
00216