00001
00002
00003
00004
00005
00006
00007 #ifndef GAMS_H
00008 #define GAMS_H
00009
00010 #include "standard.h"
00011 #ifdef COIN_HAS_GAMSIO
00012 #define GDX_AVAILABLE
00013
00014 #include "param.h"
00015 #include "problem.h"
00016 #include "opt.h"
00017 #include "preprocessapi.h"
00018
00019 class gamsLocOpt;
00020 class SolCandidate;
00021
00022 extern "C" struct dictRec;
00023
00026 class gams {
00027 friend class gamsLocOpt;
00028 friend class gamsFunc;
00029
00030 private:
00031 Pointer<Param> param;
00032
00033
00034 ivector con_type;
00035
00036 dvector rhs;
00037 dvector lower, upper;
00038 bool is_minimization;
00039 double obj_sign;
00040 int objcon, objvar;
00041 Pointer<char> objcon_name;
00042
00043 bool reformed;
00044
00047 multimap<double, Pointer<char> > written_gdx;
00048 int written_gdx_limit;
00049
00057 char* getRowName (int i, char *name, int bufLen);
00058
00066 char* getColName (int j, char *name, int bufLen);
00067 #ifdef GDX_AVAILABLE
00068 void gdx_error(int n);
00069 #endif
00070 public:
00071 static void init_cplex_licence(int connr=0, int varnr=0, int nnz=0, int nlnz=0, int ndisc=0);
00072
00073 void init_snopt_licence();
00074
00075 struct dictRec* dict;
00076
00077 gams(Pointer<Param> param_=NULL);
00078
00079 ~gams();
00080
00081 Pointer<MinlpProblem> get_problem(char* gamsfile);
00082
00083 void write_sol_file(const dvector& sol_point, int model_status, int solver_status, int iter, double time, Pointer<MinlpProblem> prob);
00084 void write_sol_set(const set<SolCandidate>& sol_set);
00085
00086 void write_matlab(const dvector& x, const char* filename, vector<Pointer<char> >& var_names);
00087
00088 void write_gams(const dvector& x, const char* filename, const vector<bool>& discr);
00089 #ifdef GDX_AVAILABLE
00090
00092 void write_gdx(const dvector& x, char* filename, double val);
00093 void write_gdx(const dvector& x, char* filename);
00094 void read_gdx(dvector& x, char* filename);
00095 #endif
00096
00097 void write_box(const dvector& lower, const dvector& upper);
00098 };
00099
00100
00101 extern gams* gamsptr;
00102
00103 class gamsNLData {
00104 public:
00106 unsigned int* instr;
00107 double* nlCons;
00108 int* startIdx;
00109 int* numInstr;
00110
00112 int lenins;
00114 int maxins;
00115
00117 double* s;
00118 double* sbar;
00119 double* resstack;
00120 int resstacksize;
00121
00122 int* jacNX;
00123 int* jacVR;
00124 double* jacVL;
00125 int* hesLagCL;
00126 int* hesLagRW;
00127 int* hesLagNX;
00128 double* hesLagVL;
00129
00130 int jacOneLenMax;
00131 int hesLagHeadPtr;
00132 int hesOneLenMax;
00133 int hesLagLenMax;
00134
00137 int domain_violations;
00138
00139 gamsNLData()
00140 : instr(NULL), nlCons(NULL), startIdx(NULL), numInstr(NULL),
00141 lenins(1), maxins(1), resstacksize(1),
00142 s(NULL), sbar(NULL),
00143 jacNX(NULL), jacVR(NULL), jacVL(NULL),
00144 hesLagCL(NULL), hesLagRW(NULL), hesLagNX(NULL), hesLagVL(NULL),
00145 jacOneLenMax(-1),
00146 hesLagHeadPtr(-1), hesOneLenMax(-1), hesLagLenMax(-1),
00147 domain_violations(0)
00148 { }
00149
00150 ~gamsNLData() {
00151 if (instr) delete[] instr;
00152 if (nlCons) delete[] nlCons;
00153 if (startIdx) delete[] startIdx;
00154 if (numInstr) delete[] numInstr;
00155 if (s) delete[] s;
00156 if (sbar) delete[] sbar;
00157 if (resstack) delete[] resstack;
00158 if (jacNX) delete jacNX;
00159 if (jacVR) delete jacVR;
00160 if (jacVL) delete jacVL;
00161 if (hesLagCL) delete hesLagCL;
00162 if (hesLagRW) delete hesLagRW;
00163 if (hesLagNX) delete hesLagNX;
00164 if (hesLagVL) delete hesLagVL;
00165 }
00166
00167 };
00168
00169 class gamsFunc : public Func {
00170 private:
00171 Pointer<gamsNLData> data;
00172
00173 int connr;
00174
00175 Func::CurvatureType curv_type;
00176
00177 public:
00178 gamsFunc(int n, int connr_, Pointer<gamsNLData> data_, Pointer<SparsityInfo> sparsity_=NULL)
00179 : Func(n), connr(connr_), data(data_), curv_type(Func::UNKNOWN)
00180 { sparsity=sparsity_; }
00181
00182 double eval(const UserVector<double>& x) const {
00183 return eval((Pointer<double>)x);
00184 }
00185
00186 double eval(const double* x) const;
00187
00188 int valgrad(double& val, UserVector<double>& g, const UserVector<double>& x) const {
00189 dvector g0(g.dim());
00190 int ret=valgrad(val, (Pointer<double>)g0, (Pointer<double>)x);
00191 g=g0;
00192 return ret;
00193 }
00194
00195 int valgrad(double& val, double* g, const double* x) const;
00196
00197 void grad(UserVector<double>& g, const UserVector<double>& x) const {
00198 dvector g0(g.dim());
00199 double val;
00200 valgrad(val, (Pointer<double>)g0, (Pointer<double>)x);
00201 g=g0;
00202 }
00203
00204 void grad(dvector& g, const dvector& x) const {
00205 double val;
00206 valgrad(val, (Pointer<double>)g, (Pointer<double>)x);
00207 }
00208
00209 void grad(double* g, const double* x) const {
00210 double val;
00211 valgrad(val, g, x);
00212 }
00213 using Func::grad;
00214
00215 void HessMult(UserVector<double>& y, const UserVector<double>& x, const UserVector<double>& z) const {
00216 dvector y0(y.dim());
00217 HessMult((Pointer<double>)y0, (Pointer<double>)x, (Pointer<double>)z);
00218 y=y0;
00219 }
00220
00221 void HessMult(dvector& y, const dvector& x, const dvector& z) const {
00222 HessMult((Pointer<double>)y, (Pointer<double>)x, (Pointer<double>)z);
00223 }
00224
00225 void HessMult(double* y, const double* x, const double* z) const;
00226 using Func::HessMult;
00227
00228 #ifdef FILIB_AVAILABLE
00229 bool is_interval_compliant() const { return true; }
00230
00231 interval<double> eval(const IntervalVector& x) const;
00232
00233 int valgrad(interval<double>& val, IntervalVector& y, const IntervalVector& x) const;
00234 #endif
00235
00236 void set_curvature(CurvatureType ct) { curv_type=ct; };
00237 CurvatureType get_curvature() const { return curv_type; };
00238
00239 void print(ostream& out) const {
00240 out << "GamsFunc " << connr << endl;
00241 }
00242 };
00243
00274 class gamsLocOpt : public LocOpt {
00275 friend class gams;
00276 private:
00277 Pointer<Param> param;
00278 Pointer<MinlpProblem> prob;
00279 bool second_run;
00280
00281 dvector lower_discr;
00282 dvector upper_discr;
00283 dvector lower;
00284 dvector upper;
00285
00286 dvector con_val;
00287 dvector duals_con;
00288 dvector duals_var;
00289 ivector basind_con;
00290 ivector basind_var;
00291
00292 int model_status, solver_status;
00293
00294 int recent_calls;
00295 Pointer<char> tmpsolfn;
00296 char** args;
00297
00298 int optfile;
00299 int subsolver;
00300 Pointer<char> solvername;
00301 void* iolibsave;
00302
00305 char** preprocessargs;
00306 bool preprocess_keepgdx;
00307
00308 bool write_solcand;
00309 bool write_startpoint;
00310
00313 double rd;
00314
00318 int do_preprocessing(const dvector& start);
00319
00320 static void* preprocess_handle;
00321
00322 LocOptPreprocessing* preprocessing;
00323
00324 public:
00325 gamsLocOpt(Pointer<MinlpProblem> prob_, Pointer<Param> param_, Pointer<ostream> out_solver_p_=out_out_p, Pointer<ostream> out_solver_log_p_=out_log_p);
00326
00327 ~gamsLocOpt();
00328
00329 int solve() { return solve(prob->primal_point); }
00330
00331 int solve(dvector& start);
00332
00333 dvector get_lag_multipliers();
00334 };
00335
00336 #endif // COIN_HAS_GAMSIO
00337 #endif