Ipopt  3.12.12
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
AmplTNLP.hpp
Go to the documentation of this file.
1 // Copyright (C) 2004, 2009 International Business Machines and others.
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // $Id: AmplTNLP.hpp 2242 2013-04-24 19:26:30Z stefan $
6 //
7 // Authors: Carl Laird, Andreas Waechter IBM 2004-08-13
8 
9 #ifndef __IPAMPLTNLP_HPP__
10 #define __IPAMPLTNLP_HPP__
11 
12 #include "IpUtils.hpp"
13 #include "IpTNLP.hpp"
14 #include "IpJournalist.hpp"
15 #include "IpOptionsList.hpp"
16 
17 #include <map>
18 #include <string>
19 
20 /* non Ipopt forward declaration */
21 struct ASL_pfgh;
22 struct SufDecl;
23 struct SufDesc;
24 
25 namespace Ipopt
26 {
28  {
29  public:
31 
33 
35  {
38  };
39 
41  {
46  };
47 
48  void AddAvailableSuffix(std::string suffix_string, Suffix_Source source, Suffix_Type type)
49  {
50  suffix_ids_.push_back(suffix_string);
51  suffix_types_.push_back(type);
52  suffix_sources_.push_back(source);
53  // suffix_values_.push_back();
54  }
55 
56  const Index* GetIntegerSuffixValues(std::string suffix_string, Suffix_Source source) const;
57 
58  const Number* GetNumberSuffixValues(std::string suffix_string, Suffix_Source source) const;
59 
60  std::vector<Index> GetIntegerSuffixValues(Index n, std::string suffix_string, Suffix_Source source) const;
61 
62  std::vector<Number> GetNumberSuffixValues(Index n, std::string suffix_string, Suffix_Source source) const;
63 
64  private:
74  //AmplSuffixHandler();
75 
78 
80  void operator=(const AmplSuffixHandler&);
82 
83  mutable ASL_pfgh* asl_;
84 
85  SufDecl* suftab_;
86 
87  std::vector<std::string> suffix_ids_;
88  std::vector<Suffix_Type> suffix_types_;
89  std::vector<Suffix_Source> suffix_sources_;
90 
92  void PrepareAmplForSuffixes(ASL_pfgh* asl);
93 
95  // void RetrieveSuffixesFromAmpl(ASL_pfgh* asl);
96 
97  friend class AmplTNLP;
98  };
99 
103  {
104  public:
109  WS_Option, /* this is for AMPL's internal wantsol callback */
110  HaltOnError_Option /* this is for our setting of the nerror_ member */
111  };
112 
116  {
117  public:
118  AmplOption(const std::string ipopt_option_name,
119  AmplOptionType type,
120  const std::string description);
121 
123  {
124  delete [] description_;
125  }
126 
127  const std::string& IpoptOptionName() const
128  {
129  return ipopt_option_name_;
130  }
132  {
133  return type_;
134  }
135  char* Description() const
136  {
137  return description_;
138  }
139  private:
149  AmplOption();
150 
152  AmplOption(const AmplOption&);
153 
155  void operator=(const AmplOption&);
157 
158  const std::string ipopt_option_name_;
161  };
162 
164  {
165  public:
166  PrivatInfo(const std::string ipopt_name,
167  SmartPtr<OptionsList> options,
169  void** nerror = NULL)
170  :
171  ipopt_name_(ipopt_name),
172  options_(options),
173  jnlst_(jnlst),
174  nerror_(nerror)
175  {}
176  const std::string& IpoptName() const
177  {
178  return ipopt_name_;
179  }
181  {
182  return options_;
183  }
185  {
186  return jnlst_;
187  }
188  void** NError()
189  {
190  return nerror_;
191  }
192  private:
193  const std::string ipopt_name_;
196  void** nerror_;
197  };
198 
199  public:
202  :
203  keywds_(NULL),
204  nkeywds_(0)
205  {}
206 
209 
211  void AddAmplOption(const std::string ampl_option_name,
212  const std::string ipopt_option_name,
214  const std::string description)
215  {
216  SmartPtr<AmplOption> new_option =
217  new AmplOption(ipopt_option_name, type, description);
218  ampl_options_map_[ampl_option_name] = ConstPtr(new_option);
219  }
220 
223  {
224  return (Index)ampl_options_map_.size();
225  }
226 
228  void* Keywords(const SmartPtr<OptionsList>& options,
230  void** nerror);
231 
232  private:
242  //AmplOptionsList();
243 
246 
248  void operator=(const AmplOptionsList&);
250 
251  void MakeValidLatexString(std::string source, std::string& dest) const;
252 
254 
256  std::map<std::string, SmartPtr<const AmplOption> > ampl_options_map_;
257  // AW: I think it should be with const like in the following line
258  // but with const the AIX compiler fails
259  // std::map<const std::string, SmartPtr<const AmplOption> > ampl_options_map_;
260 
262  void* keywds_;
263 
266  };
267 
271  class AmplTNLP : public TNLP
272  {
273  public:
278  const SmartPtr<OptionsList> options,
279  char**& argv, SmartPtr<AmplSuffixHandler>
280  suffix_handler = NULL, bool allow_discrete = false,
281  SmartPtr<AmplOptionsList> ampl_options_list = NULL,
282  const char* ampl_option_string = NULL,
283  const char* ampl_invokation_string = NULL,
284  const char* ampl_banner_string = NULL,
285  std::string* nl_file_content = NULL);
286 
288  virtual ~AmplTNLP();
290 
292  DECLARE_STD_EXCEPTION(NONPOSITIVE_SCALING_FACTOR);
293 
299  virtual bool get_nlp_info(Index& n, Index& m, Index& nnz_jac_g,
300  Index& nnz_h_lag, IndexStyleEnum& index_style);
301 
304  virtual bool get_var_con_metadata(Index n,
305  StringMetaDataMapType& var_string_md,
306  IntegerMetaDataMapType& var_integer_md,
307  NumericMetaDataMapType& var_numeric_md,
308  Index m,
309  StringMetaDataMapType& con_string_md,
310  IntegerMetaDataMapType& con_integer_md,
311  NumericMetaDataMapType& con_numeric_md);
312 
314  virtual bool get_bounds_info(Index n, Number* x_l, Number* x_u,
315  Index m, Number* g_l, Number* g_u);
316 
320  virtual bool get_constraints_linearity(Index m,
321  LinearityType* const_types);
322 
325  virtual bool get_starting_point(Index n, bool init_x, Number* x,
326  bool init_z, Number* z_L, Number* z_U,
327  Index m, bool init_lambda, Number* lambda);
328 
330  virtual bool eval_f(Index n, const Number* x, bool new_x,
331  Number& obj_value);
332 
335  virtual bool eval_grad_f(Index n, const Number* x, bool new_x,
336  Number* grad_f);
337 
339  virtual bool eval_g(Index n, const Number* x, bool new_x,
340  Index m, Number* g);
341 
345  virtual bool eval_jac_g(Index n, const Number* x, bool new_x,
346  Index m, Index nele_jac, Index* iRow,
347  Index *jCol, Number* values);
348 
352  virtual bool eval_h(Index n, const Number* x, bool new_x,
353  Number obj_factor, Index m, const Number* lambda,
354  bool new_lambda, Index nele_hess, Index* iRow,
355  Index* jCol, Number* values);
356 
360  bool& use_x_scaling, Index n,
361  Number* x_scaling,
362  bool& use_g_scaling, Index m,
363  Number* g_scaling);
365 
368  virtual void finalize_solution(SolverReturn status,
369  Index n, const Number* x, const Number* z_L, const Number* z_U,
370  Index m, const Number* g, const Number* lambda,
371  Number obj_value,
372  const IpoptData* ip_data,
375 
379  virtual bool get_list_of_nonlinear_variables(Index num_nonlin_vars,
380  Index* pos_nonlin_vars);
382 
383 
387  ASL_pfgh* AmplSolverObject()
388  {
389  return asl_;
390  }
391 
395  void write_solution_file(const std::string& message) const;
396 
402  void get_discrete_info(Index& nlvb_,
403  Index& nlvbi_,
404  Index& nlvc_,
405  Index& nlvci_,
406  Index& nlvo_,
407  Index& nlvoi_,
408  Index& nbv_,
409  Index& niv_) const;
411 
417  void set_active_objective(Index obj_no);
418 
424  void set_string_metadata_for_var(std::string tag, std::vector<std::string> meta_data)
425  {
426  var_string_md_[tag] = meta_data;
427  }
428 
429  void set_integer_metadata_for_var(std::string tag, std::vector<Index> meta_data)
430  {
431  var_integer_md_[tag] = meta_data;
432  }
433 
434  void set_numeric_metadata_for_var(std::string tag, std::vector<Number> meta_data)
435  {
436  var_numeric_md_[tag] = meta_data;
437  }
438 
439  void set_string_metadata_for_con(std::string tag, std::vector<std::string> meta_data)
440  {
441  con_string_md_[tag] = meta_data;
442  }
443 
444  void set_integer_metadata_for_con(std::string tag, std::vector<Index> meta_data)
445  {
446  con_integer_md_[tag] = meta_data;
447  }
448 
449  void set_numeric_metadata_for_con(std::string tag, std::vector<Number> meta_data)
450  {
451  con_numeric_md_[tag] = meta_data;
452  }
454 
457  {
458  return suffix_handler_;
459  }
460 
461  private:
471  AmplTNLP();
472 
474  AmplTNLP(const AmplTNLP&);
475 
477  void operator=(const AmplTNLP&);
479 
482 
484  ASL_pfgh* asl_;
485 
487  double obj_sign_;
488 
491  Index nz_h_full_; // number of nonzeros in the full_x hessian
492  /* the rest of the problem size data is available easily through the ampl variables */
494 
505 
521 
523  void* Oinfo_ptr_;
524 
526  void* nerror_;
527 
530 
532  bool internal_objval(const Number* x, Number& obj_val);
533 
535  bool internal_conval(const Number* x, Index m, Number* g=NULL);
536 
539  bool apply_new_x(bool new_x, Index n, const Number* x);
540 
544  char* get_options(const SmartPtr<OptionsList>& options,
545  SmartPtr<AmplOptionsList>& ampl_options_list,
546  const char* ampl_option_string,
547  const char* ampl_invokation_string,
548  const char* ampl_banner_string, char**& argv);
549 
551  bool nerror_ok(void* nerror);
552 
554  void call_hesset();
555 
563  };
564 
565 
566 
567 } // namespace Ipopt
568 
569 #endif
const std::string ipopt_option_name_
Definition: AmplTNLP.hpp:158
std::map< std::string, std::vector< Number > > NumericMetaDataMapType
Definition: IpTNLP.hpp:86
StringMetaDataMapType con_string_md_
Definition: AmplTNLP.hpp:560
Number * x
Input: Starting point Output: Optimal solution.
virtual Index get_number_of_nonlinear_variables()
bool internal_objval(const Number *x, Number &obj_val)
Make the objective call to ampl.
SmartPtr< AmplSuffixHandler > get_suffix_handler()
Method for returning the suffix handler.
Definition: AmplTNLP.hpp:456
PrivatInfo(const std::string ipopt_name, SmartPtr< OptionsList > options, SmartPtr< const Journalist > jnlst, void **nerror=NULL)
Definition: AmplTNLP.hpp:166
Class for all IPOPT specific calculated quantities.
Number Number Index Number Number Index Index Index index_style
indexing style for iRow &amp; jCol, 0 for C style, 1 for Fortran style
void * nerror_
nerror flag passed to ampl calls - set to NULL to halt on error
Definition: AmplTNLP.hpp:526
DECLARE_STD_EXCEPTION(NONPOSITIVE_SCALING_FACTOR)
Exceptions.
void * Keywords(const SmartPtr< OptionsList > &options, SmartPtr< const Journalist > jnlst, void **nerror)
ASL keywords list for the stored options.
Index NumberOfAmplOptions()
Number of AMPL Options.
Definition: AmplTNLP.hpp:222
Number Number Index m
Number of constraints.
void PrintLatex(SmartPtr< const Journalist > jnlst)
virtual bool get_starting_point(Index n, bool init_x, Number *x, bool init_z, Number *z_L, Number *z_U, Index m, bool init_lambda, Number *lambda)
provides a starting point for the nlp variables.
void set_numeric_metadata_for_var(std::string tag, std::vector< Number > meta_data)
Definition: AmplTNLP.hpp:434
void * Oinfo_ptr_
Pointer to the Oinfo structure.
Definition: AmplTNLP.hpp:523
void AddAvailableSuffix(std::string suffix_string, Suffix_Source source, Suffix_Type type)
Definition: AmplTNLP.hpp:48
void get_discrete_info(Index &nlvb_, Index &nlvbi_, Index &nlvc_, Index &nlvci_, Index &nlvo_, Index &nlvoi_, Index &nbv_, Index &niv_) const
ampl orders the variables like (continuous, binary, integer).
Number Number * g
Values of constraint at final point (output only - ignored if set to NULL)
const SmartPtr< const Journalist > & Jnlst() const
Definition: AmplTNLP.hpp:184
virtual bool get_list_of_nonlinear_variables(Index num_nonlin_vars, Index *pos_nonlin_vars)
double Number
Type of all numbers.
Definition: IpTypes.hpp:17
bool set_active_objective_called_
true when set_active_objective has been called
Definition: AmplTNLP.hpp:519
virtual bool get_bounds_info(Index n, Number *x_l, Number *x_u, Index m, Number *g_l, Number *g_u)
returns bounds of the nlp.
virtual ~AmplTNLP()
Default destructor.
void set_integer_metadata_for_con(std::string tag, std::vector< Index > meta_data)
Definition: AmplTNLP.hpp:444
Number Number Number * obj_val
Final value of objective function (output only - ignored if set to NULL)
bool nerror_ok(void *nerror)
returns true if the ampl nerror code is ok
ASL_pfgh * asl_
pointer to the main ASL structure
Definition: AmplTNLP.hpp:484
bool hesset_called_
true when we have called hesset
Definition: AmplTNLP.hpp:517
bool conval_called_with_current_x_
true when the constraint values have been calculated with the current x, set to false in apply_new_x...
Definition: AmplTNLP.hpp:515
const Number * GetNumberSuffixValues(std::string suffix_string, Suffix_Source source) const
AmplOptionType Type() const
Definition: AmplTNLP.hpp:131
double obj_sign_
Sign of the objective fn (1 for min, -1 for max)
Definition: AmplTNLP.hpp:487
void set_integer_metadata_for_var(std::string tag, std::vector< Index > meta_data)
Definition: AmplTNLP.hpp:429
IntegerMetaDataMapType con_integer_md_
Definition: AmplTNLP.hpp:561
LinearityType
Type of the constraints.
Definition: IpTNLP.hpp:54
const std::string & IpoptOptionName() const
Definition: AmplTNLP.hpp:127
AmplOption()
Default Constructor.
void MakeValidLatexString(std::string source, std::string &dest) const
void operator=(const AmplOptionsList &)
Overloaded Equals Operator.
bool objval_called_with_current_x_
true when the objective value has been calculated with the current x, set to false in apply_new_x...
Definition: AmplTNLP.hpp:511
const SmartPtr< OptionsList > & Options() const
Definition: AmplTNLP.hpp:180
void set_string_metadata_for_con(std::string tag, std::vector< std::string > meta_data)
Definition: AmplTNLP.hpp:439
virtual bool eval_grad_f(Index n, const Number *x, bool new_x, Number *grad_f)
evaluates the gradient of the objective for the nlp.
void operator=(const AmplSuffixHandler &)
Overloaded Equals Operator.
Number * lambda_sol_
Definition: AmplTNLP.hpp:502
Template class for Smart Pointers.
Definition: IpSmartPtr.hpp:172
ReferencedObject class.
virtual bool get_scaling_parameters(Number &obj_scaling, bool &use_x_scaling, Index n, Number *x_scaling, bool &use_g_scaling, Index m, Number *g_scaling)
retrieve the scaling parameters for the variables, objective function, and constraints.
Ampl Option class, contains name, type and description for an AMPL option.
Definition: AmplTNLP.hpp:115
const SmartPtr< const Journalist > jnlst_
Definition: AmplTNLP.hpp:195
SolverReturn
enum for the return from the optimize algorithm (obviously we need to add more)
Definition: IpAlgTypes.hpp:22
Index nkeywds_
Number of entries stored in keywds_.
Definition: AmplTNLP.hpp:265
ASL_pfgh * AmplSolverObject()
Return the ampl solver object (ASL*)
Definition: AmplTNLP.hpp:387
virtual bool get_constraints_linearity(Index m, LinearityType *const_types)
Returns the constraint linearity.
char * get_options(const SmartPtr< OptionsList > &options, SmartPtr< AmplOptionsList > &ampl_options_list, const char *ampl_option_string, const char *ampl_invokation_string, const char *ampl_banner_string, char **&argv)
Method for obtaining the name of the NL file and the options set from AMPL.
~AmplOptionsList()
Destructor.
Number Number Index Number Number Index nele_jac
Number of non-zero elements in constraint Jacobian.
virtual bool get_nlp_info(Index &n, Index &m, Index &nnz_jac_g, Index &nnz_h_lag, IndexStyleEnum &index_style)
returns dimensions of the nlp.
IntegerMetaDataMapType var_integer_md_
Definition: AmplTNLP.hpp:558
std::vector< std::string > suffix_ids_
Definition: AmplTNLP.hpp:87
std::vector< Suffix_Type > suffix_types_
Definition: AmplTNLP.hpp:88
void PrepareAmplForSuffixes(ASL_pfgh *asl)
Method called by AmplTNLP to prepare the asl for the suffixes.
Class to organize all the data required by the algorithm.
Definition: IpIpoptData.hpp:83
void AddAmplOption(const std::string ampl_option_name, const std::string ipopt_option_name, AmplOptionsList::AmplOptionType type, const std::string description)
Adding a new AMPL Option.
Definition: AmplTNLP.hpp:211
Number * z_U_sol_
Definition: AmplTNLP.hpp:500
int Index
Type of all indices of vectors, matrices etc.
Definition: IpTypes.hpp:19
SmartPtr< const Journalist > jnlst_
Journlist.
Definition: AmplTNLP.hpp:481
const std::string & IpoptName() const
Definition: AmplTNLP.hpp:176
void set_numeric_metadata_for_con(std::string tag, std::vector< Number > meta_data)
Definition: AmplTNLP.hpp:449
virtual bool eval_g(Index n, const Number *x, bool new_x, Index m, Number *g)
evaluates the constraint residuals for the nlp.
Number Number * x_scaling
std::map< std::string, std::vector< Index > > IntegerMetaDataMapType
Definition: IpTNLP.hpp:85
void call_hesset()
calls hesset ASL function
Number Number Index Number Number Index Index nele_hess
Number of non-zero elements in Hessian of Lagrangian.
std::map< std::string, std::vector< std::string > > StringMetaDataMapType
Definition: IpTNLP.hpp:84
SmartPtr< const U > ConstPtr(const SmartPtr< U > &smart_ptr)
Definition: IpSmartPtr.hpp:572
void operator=(const AmplTNLP &)
Overloaded Equals Operator.
Ampl Interface.
Definition: AmplTNLP.hpp:271
void * keywds_
pointer to the keywords
Definition: AmplTNLP.hpp:262
virtual bool get_var_con_metadata(Index n, StringMetaDataMapType &var_string_md, IntegerMetaDataMapType &var_integer_md, NumericMetaDataMapType &var_numeric_md, Index m, StringMetaDataMapType &con_string_md, IntegerMetaDataMapType &con_integer_md, NumericMetaDataMapType &con_numeric_md)
returns names and other meta data for the variables and constraints Overloaded from TNLP ...
SmartPtr< AmplSuffixHandler > suffix_handler_
Suffix Handler.
Definition: AmplTNLP.hpp:529
void set_string_metadata_for_var(std::string tag, std::vector< std::string > meta_data)
Definition: AmplTNLP.hpp:424
virtual bool eval_f(Index n, const Number *x, bool new_x, Number &obj_value)
evaluates the objective value for the nlp.
Number * g_sol_
Definition: AmplTNLP.hpp:501
Class for storing a number of AMPL options that should be registered to the AMPL Solver library inter...
Definition: AmplTNLP.hpp:102
Number Number Number * g_scaling
AmplOptionsList()
Default Constructor.
Definition: AmplTNLP.hpp:201
virtual bool eval_jac_g(Index n, const Number *x, bool new_x, Index m, Index nele_jac, Index *iRow, Index *jCol, Number *values)
specifies the jacobian structure (if values is NULL) and evaluates the jacobian values (if values is ...
NumericMetaDataMapType con_numeric_md_
Definition: AmplTNLP.hpp:562
std::vector< Suffix_Source > suffix_sources_
Definition: AmplTNLP.hpp:89
AmplTNLP()
Default Constructor.
virtual void finalize_solution(SolverReturn status, Index n, const Number *x, const Number *z_L, const Number *z_U, Index m, const Number *g, const Number *lambda, Number obj_value, const IpoptData *ip_data, IpoptCalculatedQuantities *ip_cq)
This method is called when the algorithm is complete so the TNLP can store/write the solution...
IndexStyleEnum
overload this method to return the number of variables and constraints, and the number of non-zeros i...
Definition: IpTNLP.hpp:80
bool apply_new_x(bool new_x, Index n, const Number *x)
Internal function to update the internal and ampl state if the x value changes.
bool internal_conval(const Number *x, Index m, Number *g=NULL)
Make the constraint call to ampl.
void operator=(const AmplOption &)
Overloaded Equals Operator.
Base class for all NLP&#39;s that use standard triplet matrix form and dense vectors. ...
Definition: IpTNLP.hpp:50
const AmplOptionType type_
Definition: AmplTNLP.hpp:159
Number * z_L_sol_
Definition: AmplTNLP.hpp:499
void write_solution_file(const std::string &message) const
Write the solution file.
NumericMetaDataMapType var_numeric_md_
Definition: AmplTNLP.hpp:559
void set_active_objective(Index obj_no)
A method for setting the index of the objective function to be considered.
Number obj_scaling
Number * x_sol_
Solution Vectors.
Definition: AmplTNLP.hpp:498
const SmartPtr< OptionsList > options_
Definition: AmplTNLP.hpp:194
const Index * GetIntegerSuffixValues(std::string suffix_string, Suffix_Source source) const
StringMetaDataMapType var_string_md_
meta data to pass on to TNLP
Definition: AmplTNLP.hpp:557
virtual bool eval_h(Index n, const Number *x, bool new_x, Number obj_factor, Index m, const Number *lambda, bool new_lambda, Index nele_hess, Index *iRow, Index *jCol, Number *values)
specifies the structure of the hessian of the lagrangian (if values is NULL) and evaluates the values...
std::map< std::string, SmartPtr< const AmplOption > > ampl_options_map_
map for storing registered AMPL options
Definition: AmplTNLP.hpp:256