00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef FilterSolver_H
00011 #define FilterSolver_H
00012
00013 #include "BonTNLPSolver.hpp"
00014 #include "BonFilterTypes.hpp"
00015 #include "BonBqpdSolver.hpp"
00016 #include "BonFilterWarmStart.hpp"
00017
00018 namespace Bonmin
00019 {
00020 class FilterSolver : public TNLPSolver
00021 {
00022 public:
00023
00024 friend struct BqpdSolver::cachedInfo;
00025
00026 class UnsolvedFilterError: public TNLPSolver::UnsolvedError
00027 {
00028 public:
00029 UnsolvedFilterError(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 ~UnsolvedFilterError()
00038 {}
00039
00040 private:
00041 static std::string errorNames_[1];
00042 static std::string solverName_;
00043 };
00044
00046 typedef FilterTypes::fint fint;
00048 typedef FilterTypes::real real;
00049
00050
00051 virtual UnsolvedError * newUnsolvedError(int num,
00052 Ipopt::SmartPtr<TMINLP2TNLP> problem,
00053 std::string name)
00054 {
00055 return new UnsolvedFilterError(num, problem, name);
00056 }
00057
00058
00060 FilterSolver(bool createEmpty = false);
00061
00062
00064 FilterSolver(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00065 Ipopt::SmartPtr<Ipopt::OptionsList> options,
00066 Ipopt::SmartPtr<Ipopt::Journalist> journalist,
00067 const std::string & prefix
00068 );
00069
00071 FilterSolver(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00072 Ipopt::SmartPtr<Ipopt::OptionsList> options,
00073 Ipopt::SmartPtr<Ipopt::Journalist> journalist
00074 );
00075
00077 FilterSolver(const FilterSolver & other);
00079 virtual ~FilterSolver();
00080
00083 virtual bool Initialize(std::string params_file);
00084
00087 virtual bool Initialize(std::istream& is);
00088
00091
00092 virtual ReturnStatus OptimizeTNLP(const Ipopt::SmartPtr<Ipopt::TNLP> & tnlp);
00093
00095 virtual ReturnStatus ReOptimizeTNLP(const Ipopt::SmartPtr<Ipopt::TNLP> & tnlp);
00096
00098 virtual bool setWarmStart(const CoinWarmStart * warm,
00099 Ipopt::SmartPtr<TMINLP2TNLP> tnlp);
00100
00102 virtual CoinWarmStart * getUsedWarmStart(Ipopt::SmartPtr<TMINLP2TNLP> tnlp) const{
00103 if(warmF_.IsValid())
00104 return new FilterWarmStart(*warmF_);
00105 else return NULL;
00106 }
00107
00108
00110 virtual CoinWarmStart * getWarmStart(Ipopt::SmartPtr<TMINLP2TNLP> tnlp) const;
00111
00112 virtual CoinWarmStart * getEmptyWarmStart() const;
00113
00115 virtual bool warmStartIsValid(const CoinWarmStart * ws) const;
00116
00117
00118 virtual void enableWarmStart()
00119 {
00120 }
00121 virtual void disableWarmStart()
00122 {
00123 warmF_ = NULL;
00124
00125 }
00127
00129 virtual Ipopt::SmartPtr<TNLPSolver> clone();
00130
00132 virtual double CPUTime()
00133 {
00134 return (cached_.IsValid()) ? cached_->cpuTime_: 0.;
00135 }
00136
00138 virtual int IterationCount()
00139 {
00140 return (cached_.IsValid()) ? cached_->istat[1]:0;
00141 }
00142
00144 virtual void setOutputToDefault()
00145 {
00146 if (cached_.IsValid()) cached_->iprint = default_log_level_;
00147 }
00149 virtual void forceSolverOutput(int log_level)
00150 {
00151 if (cached_.IsValid()) cached_->iprint = log_level;
00152 }
00153
00155 virtual std::string & solverName()
00156 {
00157 return solverName_;
00158 }
00159
00161 void registerOptions()
00162 {
00163 registerOptions(roptions_);
00164 }
00165
00167 virtual int errorCode() const
00168 {
00169 return -1;
00170 }
00172 static void registerOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions);
00173 private:
00177 TNLPSolver::ReturnStatus callOptimizer();
00179 Coin::SmartPtr<FilterWarmStart> warmF_;
00180
00182 struct cachedInfo : public Coin::ReferencedObject
00183 {
00184 fint n;
00185 fint m;
00186 fint nnz_h_;
00187 fint kmax;
00188 fint maxa;
00189 fint maxf;
00190 fint mlp;
00191 fint maxWk;
00192 fint maxiWk;
00193 fint iprint;
00194 fint nout;
00195 fint ifail;
00196 real rho;
00197 real * x;
00198 real * c;
00199 real f;
00200 real fmin;
00201 real * bounds;
00202 real * s;
00203 real * a;
00204 fint * la;
00205 real * ws;
00206 fint * lws;
00207 real * lam;
00208 char * cstype;
00209 fint maxiter;
00210 fint * istat;
00211 real * rstat;
00212 Ipopt::TNLP * tnlp_;
00213 fint * hStruct_;
00214 int * permutationJac_;
00215 int * permutationHess_;
00217 double cpuTime_;
00220 bool use_warm_start_in_cache_;
00221
00222
00224 cachedInfo():
00225 n(-1),
00226 m(-1),
00227 nnz_h_(-1),
00228 kmax(-1),
00229 maxa(-1),
00230 maxf(-1),
00231 mlp(-1),
00232 maxWk(-1),
00233 maxiWk(-1),
00234 iprint(-1),
00235 nout(6),
00236 ifail(-100),
00237 rho(0),
00238 x(NULL),
00239 c(NULL),
00240 f(1e100),
00241 fmin(-1e100),
00242 bounds(NULL),
00243 s(NULL),
00244 a(NULL),
00245 la(NULL),
00246 ws(NULL),
00247 lws(NULL),
00248 lam(NULL),
00249 cstype(NULL),
00250 maxiter(1000),
00251 istat(NULL),
00252 rstat(NULL),
00253 tnlp_(NULL),
00254 hStruct_(NULL),
00255 permutationJac_(NULL),
00256 permutationHess_(NULL),
00257 cpuTime_(0),
00258 use_warm_start_in_cache_(false)
00259 {}
00260
00261 cachedInfo(const Ipopt::SmartPtr<Ipopt::TNLP> &tnlp,
00262 Ipopt::SmartPtr<Ipopt::OptionsList>& options):
00263 n(-1),
00264 m(-1),
00265 nnz_h_(-1),
00266 kmax(-1),
00267 maxa(-1),
00268 maxf(-1),
00269 mlp(-1),
00270 maxWk(-1),
00271 maxiWk(-1),
00272 iprint(-1),
00273 nout(6),
00274 ifail(0),
00275 rho(0),
00276 x(NULL),
00277 c(NULL),
00278 f(1e100),
00279 fmin(-1e100),
00280 bounds(NULL),
00281 s(NULL),
00282 a(NULL),
00283 la(NULL),
00284 ws(NULL),
00285 lws(NULL),
00286 lam(NULL),
00287 cstype(NULL),
00288 maxiter(1000),
00289 istat(NULL),
00290 rstat(NULL),
00291 tnlp_(NULL),
00292 hStruct_(NULL),
00293 permutationJac_(NULL),
00294 permutationHess_(NULL),
00295 cpuTime_(0),
00296 use_warm_start_in_cache_(false)
00297 {
00298 initialize(tnlp, options);
00299 }
00300
00302 void initialize(const Ipopt::SmartPtr<Ipopt::TNLP> &tnlp,
00303 Ipopt::SmartPtr<Ipopt::OptionsList>& options);
00304
00306 void optimize();
00307
00309 ~cachedInfo()
00310 {
00311 delete [] x;
00312 delete [] c;
00313 delete [] bounds;
00314 delete [] s;
00315 delete [] a;
00316 delete [] la;
00317 delete [] ws;
00318 delete [] lws;
00319 delete [] lam;
00320 delete [] cstype;
00321 delete [] istat;
00322 delete [] rstat;
00323 delete [] permutationJac_;
00324 delete [] permutationHess_;
00325 delete [] hStruct_;
00326 tnlp_ = NULL;
00327 }
00328
00329 void load_ws(Coin::SmartPtr<FilterWarmStart>);
00330 };
00331
00333 Coin::SmartPtr<cachedInfo> cached_;
00334
00335
00336 static std::string solverName_;
00337
00339 int default_log_level_;
00341 static void TMat2RowPMat(bool symmetric, fint n, fint m, int nnz, const Ipopt::Index* iRow,
00342 const Ipopt::Index* iCol, int * permutation2,
00343 fint * lws, int nnz_offset, int n_offset,
00344 Ipopt::TNLP::IndexStyleEnum index_style);
00345 };
00346
00347 }
00348 #endif