00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef BonBqpdSolver_H
00012 #define BonBqpdSolver_H
00013
00014 #include "BonTNLPSolver.hpp"
00015 #include "BonBranchingTQP.hpp"
00016
00017
00018 namespace Bonmin
00019 {
00020 class BqpdSolver : public TNLPSolver
00021 {
00022 public:
00023 friend class FilterSolver;
00024
00025
00026 class UnsolvedBqpdError: public TNLPSolver::UnsolvedError
00027 {
00028 public:
00029 UnsolvedBqpdError(int errorNum,
00030 Ipopt::SmartPtr<TMINLP2TNLP> model,
00031 const std::string &name):
00032 TNLPSolver::UnsolvedError(errorNum, model, name)
00033 {}
00034 virtual const std::string& errorName() const;
00035
00036 virtual const std::string& solverName() const;
00037 virtual ~UnsolvedBqpdError()
00038 {}
00039
00040 private:
00041 static std::string errorNames_[1];
00042 static std::string solverName_;
00043 };
00044
00046 typedef ipfint fint;
00048 typedef double real;
00049
00050 virtual UnsolvedError*
00051 newUnsolvedError(int num,
00052 Ipopt::SmartPtr<TMINLP2TNLP> problem,
00053 std::string name)
00054 {
00055 return new UnsolvedBqpdError(num, problem, name);
00056 }
00057
00059 BqpdSolver(bool createEmpty = false);
00060
00062 BqpdSolver(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00063 Ipopt::SmartPtr<Ipopt::OptionsList> options,
00064 Ipopt::SmartPtr<Ipopt::Journalist> journalist,
00065 const std::string & prefix
00066 );
00067
00069 virtual ~BqpdSolver();
00070
00073 virtual bool Initialize(std::string params_file);
00074
00077 virtual bool Initialize(std::istream& is);
00078
00081
00082 virtual ReturnStatus OptimizeTNLP(const Ipopt::SmartPtr<Ipopt::TNLP> & tnlp);
00083
00085 virtual ReturnStatus ReOptimizeTNLP(const Ipopt::SmartPtr<Ipopt::TNLP> & tnlp);
00086
00088 virtual bool setWarmStart(const CoinWarmStart * warm,
00089 Ipopt::SmartPtr<TMINLP2TNLP> tnlp);
00090
00094 virtual bool markHotStart(){return cached_->markHotStart();}
00095
00097 virtual CoinWarmStart * getUsedWarmStart(Ipopt::SmartPtr<TMINLP2TNLP> tnlp) const{
00098 throw CoinError(__PRETTY_FUNCTION__,"","Not implemented");
00099 }
00100
00102 virtual CoinWarmStart * getWarmStart(Ipopt::SmartPtr<TMINLP2TNLP> tnlp) const;
00103
00104 virtual CoinWarmStart * getEmptyWarmStart() const;
00105
00107 virtual bool warmStartIsValid(const CoinWarmStart * ws) const;
00108
00109 virtual void enableWarmStart()
00110 {
00111 }
00112 virtual void disableWarmStart()
00113 {
00114 }
00116
00118 virtual Ipopt::SmartPtr<TNLPSolver> clone();
00119
00121 virtual double CPUTime()
00122 {
00123 return (Ipopt::IsValid(cached_)) ? cached_->cpuTime_: 0.;
00124 }
00125
00127 virtual int IterationCount()
00128 {
00129 return 0;
00130 }
00131
00132
00133
00134 virtual void setOutputToDefault()
00135 {
00136 if (Ipopt::IsValid(cached_)) cached_->iprint = default_log_level_;
00137 }
00139 virtual void forceSolverOutput(int log_level)
00140 {
00141 if (Ipopt::IsValid(cached_)) cached_->iprint = log_level;
00142 }
00143
00145 virtual std::string & solverName()
00146 {
00147 return solverName_;
00148 }
00149
00151 void registerOptions()
00152 {
00153 registerOptions(roptions_);
00154 }
00155
00157 virtual int errorCode() const
00158 {
00159 return -1;
00160 }
00161 #ifdef TIME_BQPD
00162 struct Times {
00163 int numsolve;
00164 double create;
00165 double solve;
00166 double resolve;
00167 double warm_start;
00168 int pivots;
00169 Times(): numsolve(0), create(0), solve(0), resolve(0), warm_start(0), pivots(0){
00170 }
00171
00172 Times & operator +=(Times &rhs){
00173 numsolve += rhs.numsolve;
00174 create += rhs.create;
00175 solve += rhs.solve;
00176 resolve += rhs.resolve;
00177 warm_start += rhs.warm_start;
00178 pivots += rhs.pivots;
00179 return *this;
00180 }
00181 };
00182 #endif
00183
00185 static void registerOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions);
00186 private:
00190 TNLPSolver::ReturnStatus callOptimizer();
00196 double fillin_factor_;
00197 int kmax_ipt_;
00198 int mlp_ipt_;
00200 static int m0de_;
00202 static int reinit_freq_;
00204
00206 struct cachedInfo : public Ipopt::ReferencedObject
00207 {
00208 #ifdef TIME_BQPD
00209 Times times_;
00210 #endif
00211
00212 fint n;
00213 fint m;
00214 fint k;
00215 fint kmax;
00216 real* a;
00217 fint* la;
00218 real* x;
00219 real* bl;
00220 real* bu;
00221 real f;
00222 real* g;
00223 real* r;
00224 real* w;
00225 real* e;
00226 fint* ls;
00227 real* alp;
00228 fint* lp;
00229 fint mlp;
00230 fint peq;
00231 real* ws;
00232 fint* lws;
00233 fint m0de;
00234 fint ifail;
00235 fint info[1];
00236 fint iprint;
00237 fint nout;
00238
00240 fint kk,ll,mxws,mxlws;
00241
00243 bool haveHotStart_;
00247
00248 fint irh1,na,na1,nb,nb1,ka1,kb1,kc1,irg1,lu1,lv,lv1,ll1;
00250 real eps,tol,emin;
00252 real vstep;
00254 real sgnf;
00255 fint nrep,npiv,nres;
00257 fint nup,nfreq;
00259 real alpha;
00261 fint ns,ns1,nt,nt1,nu,nu1,nx,nx1,np,np1,nprof,lc;
00262 fint lc1,li,li1,lm,lm1,lp_,lp1,lq,lq1,lr,lr1,ls_,ls1,lt,lt1;
00264 fint m1,m2,mp,mq,lastr,irow;
00266 fint mxm1;
00268 real c;
00270 fint kHot;
00271 real* xHot;
00272 real fHot;
00273 real* gHot;
00274 real* rHot;
00275 real* wHot;
00276 real* eHot;
00277 fint* lsHot;
00278 real* alpHot;
00279 fint* lpHot;
00280 fint peqHot;
00281 real* wsHot;
00282 fint* lwsHot;
00283 fint infoHot[1];
00284 fint kkkHot;
00285 fint lllHot;
00286 fint kkHot;
00287 fint llHot;
00288
00289 Ipopt::SmartPtr<BranchingTQP> tqp_;
00291 double cpuTime_;
00294 bool use_warm_start_in_cache_;
00295 bool bad_warm_start_info_;
00296
00298 int amax_;
00299
00303 double* fillin_factor_;
00305
00307 int next_reinit_;
00309 int pivots_;
00311 cachedInfo()
00312 :
00313 a(NULL),
00314 la(NULL),
00315 x(NULL),
00316 bl(NULL),
00317 bu(NULL),
00318 g(NULL),
00319 r(NULL),
00320 w(NULL),
00321 e(NULL),
00322 ls(NULL),
00323 alp(NULL),
00324 lp(NULL),
00325 ws(NULL),
00326 lws(NULL),
00327 haveHotStart_(false),
00328 xHot(NULL),
00329 gHot(NULL),
00330 rHot(NULL),
00331 wHot(NULL),
00332 eHot(NULL),
00333 lsHot(NULL),
00334 alpHot(NULL),
00335 lpHot(NULL),
00336 wsHot(NULL),
00337 lwsHot(NULL),
00338 cpuTime_(0),
00339 use_warm_start_in_cache_(false),
00340 bad_warm_start_info_(false),
00341 next_reinit_(0),
00342 pivots_(0)
00343 {}
00344
00345 cachedInfo(const Ipopt::SmartPtr<BranchingTQP> &tqp,
00346 Ipopt::SmartPtr<Ipopt::OptionsList>& options,
00347 int kmax_ipt, int mlp_ipt, double* fillin_factor):
00348 a(NULL),
00349 la(NULL),
00350 x(NULL),
00351 bl(NULL),
00352 bu(NULL),
00353 g(NULL),
00354 r(NULL),
00355 w(NULL),
00356 e(NULL),
00357 ls(NULL),
00358 alp(NULL),
00359 lp(NULL),
00360 ws(NULL),
00361 lws(NULL),
00362 haveHotStart_(false),
00363 xHot(NULL),
00364 gHot(NULL),
00365 rHot(NULL),
00366 wHot(NULL),
00367 eHot(NULL),
00368 lsHot(NULL),
00369 alpHot(NULL),
00370 lpHot(NULL),
00371 wsHot(NULL),
00372 lwsHot(NULL),
00373 tqp_(tqp),
00374 cpuTime_(0),
00375 use_warm_start_in_cache_(false),
00376 bad_warm_start_info_(false),
00377 next_reinit_(0),
00378 pivots_(0)
00379 {
00380 initialize(tqp, options, kmax_ipt, mlp_ipt, fillin_factor);
00381 }
00382
00384 void initialize(const Ipopt::SmartPtr<BranchingTQP> &tqp,
00385 Ipopt::SmartPtr<Ipopt::OptionsList>& options,
00386 int kmax_ipt, int mlp_ipt, double* fillin_factor);
00387
00388 void re_initialize();
00390 void optimize();
00391
00393 bool markHotStart();
00394
00396 void unmarkHotStart();
00397
00399 void copyFromHotStart();
00400
00402 ~cachedInfo();
00403 };
00404
00406 Ipopt::SmartPtr<cachedInfo> cached_;
00407
00409 static std::string solverName_;
00410
00412 int default_log_level_;
00413
00414 public:
00415
00416 #ifdef TIME_BQPD
00417 Times ×(){ return cached_->times_;}
00418 #endif
00419
00420 };
00421
00422 }
00423 #endif