Bonmin  1.8.7
BonAmplTMINLP.hpp
Go to the documentation of this file.
1 // (C) Copyright International Business Machines Corporation and
2 // Carnegie Mellon University 2004, 2007
3 //
4 // All Rights Reserved.
5 // This code is published under the Eclipse Public License.
6 //
7 // Authors :
8 // Carl D. Laird, Carnegie Mellon University,
9 // Andreas Waechter, International Business Machines Corporation
10 // Pierre Bonami, Carnegie Mellon University,
11 //
12 // Date : 12/01/2004
13 
14 #ifndef __IPAMPLTMINLP_HPP__
15 #define __IPAMPLTMINLP_HPP__
16 
17 #include "BonTMINLP.hpp"
18 #include "IpSmartPtr.hpp"
19 #include "CoinPackedMatrix.hpp"
20 #include "OsiCuts.hpp"
21 #include "BonRegisteredOptions.hpp"
22 #include "BonTypes.hpp"
23 
24 /* non Ipopt forward declaration */
25 struct ASL_pfgh;
26 struct SufDecl;
27 struct SufDesc;
28 
29 
30 // Declarations, so that we don't have to include the Ipopt AMPL headers
31 namespace Ipopt
32 {
33  class AmplSuffixHandler;
34  class AmplOptionsList;
35  class AmplTNLP;
36 }
37 
38 namespace Bonmin
39 {
40 
46  class AmplTMINLP : public TMINLP
47  {
48  public:
55  char**& argv,
56  Ipopt::AmplSuffixHandler* suffix_handler = NULL,
57  const std::string& appName = "bonmin",
58  std::string* nl_file_content = NULL);
59 
60  virtual void Initialize(const Ipopt::SmartPtr<const Ipopt::Journalist>& jnlst,
63  char**& argv,
64  Ipopt::AmplSuffixHandler* suffix_handler =NULL,
65  const std::string& appName = "bonmin",
66  std::string* nl_file_content = NULL);
67 
69  void read_priorities();
70 
72  void read_sos();
73 
75  void read_convexities();
76 
78  void read_onoff();
79 
81  void read_obj_suffixes();
82 
84  AmplTMINLP();
85 
86  virtual AmplTMINLP * createEmpty()
87  {
88  AmplTMINLP * tminlp = new AmplTMINLP;
89  return tminlp;
90  }
91 
93  virtual ~AmplTMINLP();
95 
97  const ASL_pfgh* AmplSolverObject() const;
98 
99 
105  virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g,
106  Ipopt::Index& nnz_h_lag,
107  Ipopt::TNLP::IndexStyleEnum& index_style);
108 
110  virtual bool get_variables_types(Ipopt::Index n, VariableType* var_types);
111 
114 
118  Ipopt::TNLP::LinearityType* const_types);
119 
121  virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
123 
126  virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x,
127  bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
128  Ipopt::Index m, bool init_lambda, Ipopt::Number* lambda);
129 
131  virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
132  Ipopt::Number& obj_value);
133 
136  virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
137  Ipopt::Number* grad_f);
138 
140  virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
142 
146  virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
147  Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow,
148  Ipopt::Index *jCol, Ipopt::Number* values);
149 
153  virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
154  Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda,
155  bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow,
156  Ipopt::Index* jCol, Ipopt::Number* values);
157 
159  virtual bool eval_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
160  Ipopt::Index i, Ipopt::Number& gi);
163  virtual bool eval_grad_gi(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
164  Ipopt::Index i, Ipopt::Index& nele_grad_gi, Ipopt::Index* jCol,
165  Ipopt::Number* values);
167 
182  virtual void finalize_solution(TMINLP::SolverReturn status,
183  Ipopt::Index n, const Ipopt::Number* x, Ipopt::Number obj_value);
184 
186  void write_solution(const std::string & message, const Ipopt::Number *x_sol);
188 
190 
191 
192  virtual const BranchingInfo * branchingInfo() const
193  {
194  return &branch_;
195  }
196 
197  virtual const SosInfo * sosConstraints() const
198  {
199  return &sos_;
200  }
201 
202  virtual const PerturbInfo* perturbInfo() const
203  {
204  return &perturb_info_;
205  }
206 
211  {}
213 
214 
216  virtual void getLinearPartOfObjective(double * obj);
217 
218 
221  {
222  return upperBoundingObj_ != -1;
223  }
224 
227  virtual bool eval_upper_bound_f(Ipopt::Index n, const Ipopt::Number* x,
228  Ipopt::Number& obj_value);
229 
231  virtual bool get_constraint_convexities(int m, TMINLP::Convexity * constraints_convexities)const
232  {
233  if (constraintsConvexities_ != NULL) {
234  CoinCopyN(constraintsConvexities_, m, constraints_convexities);
235  }
236  else {
237  CoinFillN(constraints_convexities, m, TMINLP::Convex);
238  }
239  return true;
240  }
242  virtual bool get_number_nonconvex(int & number_non_conv, int & number_concave) const
243  {
244  number_non_conv = numberNonConvex_;
245  number_concave = numberSimpleConcave_;
246  return true;
247  }
249  virtual bool get_constraint_convexities(int number_non_conv, MarkedNonConvex * non_convexes) const
250  {
251  assert(number_non_conv == numberNonConvex_);
252  CoinCopyN( nonConvexConstraintsAndRelaxations_, number_non_conv, non_convexes);
253  return true;
254  }
256  virtual bool get_simple_concave_constraints(int number_concave, SimpleConcaveConstraint * simple_concave) const
257  {
258  assert(number_concave == numberSimpleConcave_);
259  CoinCopyN(simpleConcaves_, numberSimpleConcave_, simple_concave);
260  return true;
261  }
262 
264  virtual bool hasLinearObjective()
265  {
266  return hasLinearObjective_;
267  }
268 
270  virtual const int * get_const_xtra_id() const{
271  return c_extra_id_();
272  }
273  private:
282 
284  AmplTMINLP(const AmplTMINLP&);
285 
287  void operator=(const AmplTMINLP&);
289 
290  std::string appName_;
291 
293  int upperBoundingObj_;
295  Ipopt::AmplTNLP* ampl_tnlp_;
298 
300  BranchingInfo branch_;
302  SosInfo sos_;
304  PerturbInfo perturb_info_;
307 
309  TMINLP::Convexity * constraintsConvexities_;
310 
312  vector<int> c_extra_id_;
313 
315  int numberNonConvex_;
317  MarkedNonConvex * nonConvexConstraintsAndRelaxations_;
319  int numberSimpleConcave_;
321  SimpleConcaveConstraint * simpleConcaves_;
322 
324  bool hasLinearObjective_;
325 
327  int writeAmplSolFile_;
328  };
329 } // namespace Ipopt
330 
331 #endif
332 
Constraint is convex.
Definition: BonTMINLP.hpp:349
virtual bool get_nlp_info(Ipopt::Index &n, Ipopt::Index &m, Ipopt::Index &nnz_jac_g, Ipopt::Index &nnz_h_lag, Ipopt::TNLP::IndexStyleEnum &index_style)
returns dimensions of the nlp.
void read_sos()
read the sos constraints from ampl suffixes
void read_onoff()
Read suffixes used to apply perspective in OA to some of the constraints.
virtual bool get_constraints_linearity(Ipopt::Index m, Ipopt::TNLP::LinearityType *const_types)
Returns the constraint linearity.
virtual const BranchingInfo * branchingInfo() const
AmplTMINLP()
Default constructor.
Number Number Index m
virtual bool eval_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Number *g)
evaluates the constraint residuals for the nlp.
void read_priorities()
read the branching priorities from ampl suffixes.
virtual const SosInfo * sosConstraints() const
void read_convexities()
Read suffixes which indicate which constraints are convex.
virtual const PerturbInfo * perturbInfo() const
virtual bool eval_h(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number *lambda, bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values)
specifies the structure of the hessian of the lagrangian (if values is NULL) and evaluates the values...
(C) Copyright International Business Machines Corporation 2007
virtual bool get_variables_types(Ipopt::Index n, VariableType *var_types)
returns the vector of variable types
double Number
virtual void fillApplicationOptions(Ipopt::AmplOptionsList *amplOptList)
Additional application specific options.
Ampl MINLP Interface.
virtual bool get_variables_linearity(Ipopt::Index n, Ipopt::TNLP::LinearityType *var_types)
return the variables linearity (linear or not)
virtual bool get_constraint_convexities(int m, TMINLP::Convexity *constraints_convexities) const
Get accest to constraint convexities.
virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number *x_l, Ipopt::Number *x_u, Ipopt::Index m, Ipopt::Number *g_l, Ipopt::Number *g_u)
returns bounds of the nlp.
virtual bool eval_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number &obj_value)
evaluates the objective value for the nlp.
virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number *x, bool init_z, Ipopt::Number *z_L, Ipopt::Number *z_U, Ipopt::Index m, bool init_lambda, Ipopt::Number *lambda)
provides a starting point for the nlp variables.
void write_solution(const std::string &message, const Ipopt::Number *x_sol)
Write the solution using ampl's write_sol (called by finalize_solution).
virtual void Initialize(const Ipopt::SmartPtr< const Ipopt::Journalist > &jnlst, const Ipopt::SmartPtr< Bonmin::RegisteredOptions > roptions, const Ipopt::SmartPtr< Ipopt::OptionsList > options, char **&argv, Ipopt::AmplSuffixHandler *suffix_handler=NULL, const std::string &appName="bonmin", std::string *nl_file_content=NULL)
void CoinFillN(T *to, const CoinBigIndex size, const T value)
virtual bool get_constraint_convexities(int number_non_conv, MarkedNonConvex *non_convexes) const
Get array describing the constraints marked nonconvex in the model.
const ASL_pfgh * AmplSolverObject() const
Return the ampl solver object (ASL*)
Base class for all MINLPs that use a standard triplet matrix form and dense vectors.
Definition: BonTMINLP.hpp:59
virtual bool get_number_nonconvex(int &number_non_conv, int &number_concave) const
Get dimension information on nonconvex constraints.
virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index *iRow, Ipopt::Index *jCol, Ipopt::Number *values)
specifies the jacobian structure (if values is NULL) and evaluates the jacobian values (if values is ...
virtual bool hasUpperBoundingObjective()
Do we have an alternate objective for upper bounding?
Structure which describes a constraints of the form $f[ y \gt F(x) \f] with a concave function.
Definition: BonTMINLP.hpp:366
virtual void finalize_solution(TMINLP::SolverReturn status, Ipopt::Index n, const Ipopt::Number *x, Ipopt::Number obj_value)
Called after optimizing to return results to ampl.
virtual ~AmplTMINLP()
destructor
int Index
Structure for marked non-convex constraints.
Definition: BonTMINLP.hpp:355
virtual bool eval_gi(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index i, Ipopt::Number &gi)
compute the value of a single constraint
SolverReturn
Return statuses of algorithm.
Definition: BonTMINLP.hpp:64
VariableType
Type of the variables.
Definition: BonTMINLP.hpp:192
virtual bool hasLinearObjective()
Say if problem has a linear objective (for OA)
virtual void getLinearPartOfObjective(double *obj)
This methods gives the linear part of the objective function.
virtual bool eval_upper_bound_f(Ipopt::Index n, const Ipopt::Number *x, Ipopt::Number &obj_value)
This method to returns the value of an alternative objective function for upper bounding (if one has ...
Convexity
Used to mark constraints of the problem.
Definition: BonTMINLP.hpp:348
virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Number *grad_f)
evaluates the gradient of the objective for the nlp.
virtual const int * get_const_xtra_id() const
Access array describing onoff constraint.
void CoinCopyN(const T *from, const CoinBigIndex size, T *to)
virtual bool get_simple_concave_constraints(int number_concave, SimpleConcaveConstraint *simple_concave) const
Fill array containing indices of simple concave constraints.
virtual bool eval_grad_gi(Ipopt::Index n, const Ipopt::Number *x, bool new_x, Ipopt::Index i, Ipopt::Index &nele_grad_gi, Ipopt::Index *jCol, Ipopt::Number *values)
compute the structure or values of the gradient for one constraint
virtual AmplTMINLP * createEmpty()
void read_obj_suffixes()
Read suffixes on objective functions for upper bounding.