00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __IPAMPLTMINLP_HPP__
00015 #define __IPAMPLTMINLP_HPP__
00016
00017 #include "BonTMINLP.hpp"
00018 #include "IpSmartPtr.hpp"
00019 #include "CoinPackedMatrix.hpp"
00020 #include "OsiCuts.hpp"
00021 #include "BonRegisteredOptions.hpp"
00022 #include "BonTypes.hpp"
00023
00024
00025 struct ASL_pfgh;
00026 struct SufDecl;
00027 struct SufDesc;
00028
00029
00030
00031 namespace Ipopt
00032 {
00033 class AmplSuffixHandler;
00034 class AmplOptionsList;
00035 class AmplTNLP;
00036 }
00037
00038 namespace Bonmin
00039 {
00040
00046 class AmplTMINLP : public TMINLP
00047 {
00048 public:
00052 AmplTMINLP(const Ipopt::SmartPtr<const Ipopt::Journalist>& jnlst,
00053 const Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00054 const Ipopt::SmartPtr<Ipopt::OptionsList> options,
00055 char**& argv,
00056 Ipopt::AmplSuffixHandler* suffix_handler = NULL,
00057 const std::string& appName = "bonmin",
00058 std::string* nl_file_content = NULL);
00059
00060 virtual void Initialize(const Ipopt::SmartPtr<const Ipopt::Journalist>& jnlst,
00061 const Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00062 const Ipopt::SmartPtr<Ipopt::OptionsList> options,
00063 char**& argv,
00064 Ipopt::AmplSuffixHandler* suffix_handler =NULL,
00065 const std::string& appName = "bonmin",
00066 std::string* nl_file_content = NULL);
00067
00069 void read_priorities();
00070
00072 void read_sos();
00073
00075 void read_convexities();
00076
00078 void read_onoff();
00079
00081 void read_obj_suffixes();
00082
00084 AmplTMINLP();
00085
00086 virtual AmplTMINLP * createEmpty()
00087 {
00088 AmplTMINLP * tminlp = new AmplTMINLP;
00089 return tminlp;
00090 }
00091
00093 virtual ~AmplTMINLP();
00095
00097 const ASL_pfgh* AmplSolverObject() const;
00098
00099
00105 virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
00106 Ipopt::Index& nnz_h_lag,
00107 Ipopt::TNLP::IndexStyleEnum& index_style);
00108
00110 virtual bool get_variables_types(Ipopt::Index n, VariableType* var_types);
00111
00113 virtual bool get_variables_linearity(Ipopt::Index n, Ipopt::TNLP::LinearityType * var_types);
00114
00117 virtual bool get_constraints_linearity(Ipopt::Index m,
00118 Ipopt::TNLP::LinearityType* const_types);
00119
00121 virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
00122 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u);
00123
00126 virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x,
00127 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
00128 Ipopt::Index m, bool init_lambda, Ipopt::Number* lambda);
00129
00131 virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00132 Ipopt::Number& obj_value);
00133
00136 virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00137 Ipopt::Number* grad_f);
00138
00140 virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00141 Ipopt::Index m, Ipopt::Number* g);
00142
00146 virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00147 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow,
00148 Ipopt::Index *jCol, Ipopt::Number* values);
00149
00153 virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00154 Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda,
00155 bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow,
00156 Ipopt::Index* jCol, Ipopt::Number* values);
00157
00159 virtual bool eval_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00160 Ipopt::Index i, Ipopt::Number& gi);
00163 virtual bool eval_grad_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00164 Ipopt::Index i, Ipopt::Index& nele_grad_gi, Ipopt::Index* jCol,
00165 Ipopt::Number* values);
00167
00182 virtual void finalize_solution(TMINLP::SolverReturn status,
00183 Ipopt::Index n, const Ipopt::Number* x, Ipopt::Number obj_value);
00184
00186 void write_solution(const std::string & message, const Ipopt::Number *x_sol);
00188
00190
00191
00192 virtual const BranchingInfo * branchingInfo() const
00193 {
00194 return &branch_;
00195 }
00196
00197 virtual const SosInfo * sosConstraints() const
00198 {
00199 return &sos_;
00200 }
00201
00202 virtual const PerturbInfo* perturbInfo() const
00203 {
00204 return &perturb_info_;
00205 }
00206
00210 virtual void fillApplicationOptions(Ipopt::AmplOptionsList* amplOptList)
00211 {}
00213
00214
00216 virtual void getLinearPartOfObjective(double * obj);
00217
00218
00220 virtual bool hasUpperBoundingObjective()
00221 {
00222 return upperBoundingObj_ != -1;
00223 }
00224
00227 virtual bool eval_upper_bound_f(Ipopt::Index n, const Ipopt::Number* x,
00228 Ipopt::Number& obj_value);
00229
00231 virtual bool get_constraint_convexities(int m, TMINLP::Convexity * constraints_convexities)const
00232 {
00233 if (constraintsConvexities_ != NULL) {
00234 CoinCopyN(constraintsConvexities_, m, constraints_convexities);
00235 }
00236 else {
00237 CoinFillN(constraints_convexities, m, TMINLP::Convex);
00238 }
00239 return true;
00240 }
00242 virtual bool get_number_nonconvex(int & number_non_conv, int & number_concave) const
00243 {
00244 number_non_conv = numberNonConvex_;
00245 number_concave = numberSimpleConcave_;
00246 return true;
00247 }
00249 virtual bool get_constraint_convexities(int number_non_conv, MarkedNonConvex * non_convexes) const
00250 {
00251 assert(number_non_conv == numberNonConvex_);
00252 CoinCopyN( nonConvexConstraintsAndRelaxations_, number_non_conv, non_convexes);
00253 return true;
00254 }
00256 virtual bool get_simple_concave_constraints(int number_concave, SimpleConcaveConstraint * simple_concave) const
00257 {
00258 assert(number_concave == numberSimpleConcave_);
00259 CoinCopyN(simpleConcaves_, numberSimpleConcave_, simple_concave);
00260 return true;
00261 }
00262
00264 virtual bool hasLinearObjective()
00265 {
00266 return hasLinearObjective_;
00267 }
00268
00270 virtual const int * get_const_xtra_id() const{
00271 return c_extra_id_();
00272 }
00273 private:
00282
00284 AmplTMINLP(const AmplTMINLP&);
00285
00287 void operator=(const AmplTMINLP&);
00289
00290 std::string appName_;
00291
00293 int upperBoundingObj_;
00295 Ipopt::AmplTNLP* ampl_tnlp_;
00297 Ipopt::SmartPtr<const Ipopt::Journalist> jnlst_;
00298
00300 BranchingInfo branch_;
00302 SosInfo sos_;
00304 PerturbInfo perturb_info_;
00306 Ipopt::SmartPtr<Ipopt::AmplSuffixHandler> suffix_handler_;
00307
00309 TMINLP::Convexity * constraintsConvexities_;
00310
00312 vector<int> c_extra_id_;
00313
00315 int numberNonConvex_;
00317 MarkedNonConvex * nonConvexConstraintsAndRelaxations_;
00319 int numberSimpleConcave_;
00321 SimpleConcaveConstraint * simpleConcaves_;
00322
00324 bool hasLinearObjective_;
00325
00327 int writeAmplSolFile_;
00328 };
00329 }
00330
00331 #endif
00332