00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef INCLUDE_MATLABPROGRAM
00010 #define INCLUDE_MATLABPROGRAM
00011
00012 #include "array.h"
00013 #include "matlabexception.h"
00014 #include "matlabmatrix.h"
00015 #include "sparsematrix.h"
00016 #include "arrayofmatrices.h"
00017 #include "ipopt/IpTNLP.hpp"
00018 #include "mex.h"
00019
00020 using Ipopt::TNLP;
00021 using Ipopt::SolverReturn;
00022 using Ipopt::AlgorithmMode;
00023 using Ipopt::IpoptData;
00024 using Ipopt::IpoptCalculatedQuantities;
00025
00026
00027
00028 class MatlabProgram : public TNLP {
00029 public:
00030
00031
00032
00033 MatlabProgram (const ArrayOfMatrices& x0, const ArrayOfMatrices& lb,
00034 const ArrayOfMatrices& ub, const Matrix& constraintlb,
00035 const Matrix& constraintub, const char* objFunc,
00036 const char* gradFunc, const char* constraintFunc,
00037 const char* jacobianFunc, const char* hessianFunc,
00038 const char* iterFunc, const mxArray* auxData,
00039 ArrayOfMatrices& xsol, bool useQuasiNewton);
00040
00041
00042 virtual ~MatlabProgram();
00043
00044
00045
00046 char* geterrormsg() const;
00047
00048
00049 virtual bool get_nlp_info (int& numVariables, int& numConstraints,
00050 int& sizeOfJ, int& sizeOfH,
00051 IndexStyleEnum& indexStyle);
00052
00053
00054 virtual bool get_bounds_info (int numVariables, double* lbptr,
00055 double* ubptr, int numConstraints,
00056 double* clbptr, double* cubptr);
00057
00058
00059 virtual bool get_starting_point (int numVariables, bool initializeVars,
00060 double* variables,
00061 bool initializez, double* zl,
00062 double* zu, int numConstraints,
00063 bool initializeLambda, double* lambda);
00064
00065
00066 virtual bool eval_f (int numVariables, const double* variables,
00067 bool ignoreThis, double& objective);
00068
00069
00070 virtual bool eval_grad_f (int numVariables, const double* variables,
00071 bool ignoreThis, double* gradient);
00072
00073
00074 virtual bool eval_g (int numVariables, const double* variables,
00075 bool ignoreThis, int numConstraints,
00076 double* constraints);
00077
00078
00079
00080
00081 virtual bool eval_jac_g (int numVariables, const double* variables,
00082 bool ignoreThis, int numConstraints,
00083 int sizeOfJ, int* rows, int *cols,
00084 double* Jacobian);
00085
00086
00087
00088
00089 virtual bool eval_h (int numVariables, const double* variables,
00090 bool ignoreThis, double sigma,
00091 int numConstraints, const double* multipliers,
00092 bool ignoreThisToo, int sizeOfH, int* rows,
00093 int* cols, double* Hessian);
00094
00095
00096 virtual void finalize_solution (SolverReturn status, int numVariables,
00097 const double* variables, const double* zl,
00098 const double* zu, int numConstraints,
00099 const double* constraints,
00100 const double* lambda, double objective,
00101 const IpoptData* ip_data,
00102 IpoptCalculatedQuantities* ip_cq);
00103
00104
00105
00106 virtual bool intermediate_callback (AlgorithmMode mode,
00107 int iteration, double objective,
00108 double inf_pr, double inf_du,
00109 double mu, double d_norm,
00110 double regularization_ize,
00111 double alpha_du, double alpha_pr,
00112 int ls_trials,
00113 const IpoptData* ip_data,
00114 IpoptCalculatedQuantities* ip_cq);
00115
00116 protected:
00117 const ArrayOfMatrices& lb;
00118 const ArrayOfMatrices& ub;
00119 const Matrix& constraintlb;
00120 const Matrix& constraintub;
00121 const mxArray* auxData;
00122
00123 ArrayOfMatrices& xsol;
00124 ArrayOfMatrices* x;
00125
00126
00127 Array<double>* lambda;
00128
00129
00130
00131
00132
00133 mxArray** prhs;
00134 mxArray* lambdarhs;
00135
00136
00137 bool useQuasiNewton;
00138
00139
00140
00141
00142 SparseMatrixStructure* JacobianStructure;
00143 SparseMatrixStructure* HessianStructure;
00144
00145
00146 const char* objFunc;
00147 const char* gradFunc;
00148 const char* constraintFunc;
00149 const char* jacobianFunc;
00150 const char* hessianFunc;
00151 const char* iterFunc;
00152
00153
00154
00155 MatlabProgram (const MatlabProgram& source);
00156 MatlabProgram& operator= (const MatlabProgram& source) { return *this; };
00157
00158 private:
00159
00160
00161 double computeObjective (const ArrayOfMatrices& x);
00162
00163
00164
00165 void computeGradient (const ArrayOfMatrices& x, ArrayOfMatrices& grad);
00166
00167
00168
00169
00170 void computeConstraints (const ArrayOfMatrices& x, Array<double>& g);
00171
00172
00173
00174
00175
00176 void computeJacobian (const ArrayOfMatrices& x, double* Jacobian);
00177
00178
00179
00180 void computeHessian (const ArrayOfMatrices& x,
00181 const Array<double>& lambda,
00182 double sigma, double* Hessian);
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194 mxArray* callMatlabJacobianRoutine (const ArrayOfMatrices& x,
00195 bool returnStructureOnly = true);
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207 mxArray* callMatlabHessianRoutine (const ArrayOfMatrices& x,
00208 const Array<double>& lambda,
00209 bool returnStructureOnly = true,
00210 double sigma = 0);
00211 };
00212
00213 #endif