Bonmin  1.8.8
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:
52  AmplTMINLP(const Ipopt::SmartPtr<const Ipopt::Journalist>& jnlst,
53  const Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
54  const Ipopt::SmartPtr<Ipopt::OptionsList> options,
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,
61  const Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
62  const Ipopt::SmartPtr<Ipopt::OptionsList> options,
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 
113  virtual bool get_variables_linearity(Ipopt::Index n, Ipopt::TNLP::LinearityType * var_types);
114 
117  virtual bool get_constraints_linearity(Ipopt::Index m,
118  Ipopt::TNLP::LinearityType* const_types);
119 
121  virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
122  Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_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,
141  Ipopt::Index m, Ipopt::Number* g);
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 
210  virtual void fillApplicationOptions(Ipopt::AmplOptionsList* amplOptList)
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 
295  Ipopt::AmplTNLP* ampl_tnlp_;
297  Ipopt::SmartPtr<const Ipopt::Journalist> jnlst_;
298 
300  BranchingInfo branch_;
302  SosInfo sos_;
304  PerturbInfo perturb_info_;
306  Ipopt::SmartPtr<Ipopt::AmplSuffixHandler> suffix_handler_;
307 
310 
313 
321  SimpleConcaveConstraint * simpleConcaves_;
322 
325 
328  };
329 } // namespace Ipopt
330 
331 #endif
332 
virtual bool get_number_nonconvex(int &number_non_conv, int &number_concave) const
Get dimension information on nonconvex constraints.
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_variables_types(Ipopt::Index n, VariableType *var_types)
returns the vector of variable types
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
std::string appName_
Name of application.
virtual bool get_simple_concave_constraints(int number_concave, SimpleConcaveConstraint *simple_concave) const
Fill array containing indices of simple concave constraints.
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.
virtual bool get_constraint_convexities(int number_non_conv, MarkedNonConvex *non_convexes) const
Get array describing the constraints marked nonconvex in the model.
virtual bool get_constraint_convexities(int m, TMINLP::Convexity *constraints_convexities) const
Get accest to constraint convexities.
void read_sos()
read the sos constraints from ampl suffixes
virtual void getLinearPartOfObjective(double *obj)
This methods gives the linear part of the objective function.
void read_convexities()
Read suffixes which indicate which constraints are convex.
void read_onoff()
Read suffixes used to apply perspective in OA to some of the constraints.
Ipopt::AmplTNLP * ampl_tnlp_
pointer to the internal AmplTNLP
SosInfo sos_
Storage of sos constraints.
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.
PerturbInfo perturb_info_
Storage for perturbation radii.
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)
Constructor.
virtual bool hasLinearObjective()
Say if problem has a linear objective (for OA)
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.
void write_solution(const std::string &message, const Ipopt::Number *x_sol)
Write the solution using ampl&#39;s write_sol (called by finalize_solution).
virtual bool hasUpperBoundingObjective()
Do we have an alternate objective for upper bounding?
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...
BranchingInfo branch_
Storage of branching priorities information.
int numberNonConvex_
Ipopt::Number of nonConvex constraints.
virtual void fillApplicationOptions(Ipopt::AmplOptionsList *amplOptList)
Additional application specific options.
virtual const BranchingInfo * branchingInfo() const
virtual const PerturbInfo * perturbInfo() const
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.
Constraint is convex.
Definition: BonTMINLP.hpp:349
Ipopt::SmartPtr< const Ipopt::Journalist > jnlst_
Journalist.
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 ...
bool hasLinearObjective_
Flag to indicate if objective function is linear.
SolverReturn
Return statuses of algorithm.
Definition: BonTMINLP.hpp:64
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 ...
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 bool get_variables_linearity(Ipopt::Index n, Ipopt::TNLP::LinearityType *var_types)
return the variables linearity (linear or not)
MarkedNonConvex * nonConvexConstraintsAndRelaxations_
Store marked non-convex constraints and their relaxations.
vector< int > c_extra_id_
Store onoff information.
Convexity
Used to mark constraints of the problem.
Definition: BonTMINLP.hpp:348
virtual const SosInfo * sosConstraints() const
TMINLP::Convexity * constraintsConvexities_
Store constraints types.
void operator=(const AmplTMINLP &)
Overloaded Equals Operator.
int writeAmplSolFile_
Flag to say if AMPL solution file should be written.
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
AmplTMINLP()
Default constructor.
int numberSimpleConcave_
Ipopt::Number of simpleConcave constraints.
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.
SimpleConcaveConstraint * simpleConcaves_
Store simple concave constraints descriptions.
virtual AmplTMINLP * createEmpty()
Constructor.
void read_obj_suffixes()
Read suffixes on objective functions for upper bounding.
Ampl MINLP Interface.
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.
int upperBoundingObj_
Index of the objective to use for upper bounding.
void read_priorities()
read the branching priorities from ampl suffixes.
virtual bool get_constraints_linearity(Ipopt::Index m, Ipopt::TNLP::LinearityType *const_types)
Returns the constraint linearity.
virtual ~AmplTMINLP()
destructor
Ipopt::SmartPtr< Ipopt::AmplSuffixHandler > suffix_handler_
Store a suffix handler.
virtual const int * get_const_xtra_id() const
Access array describing onoff constraint.
VariableType
Type of the variables.
Definition: BonTMINLP.hpp:192