00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef TNLPSolver_H
00012 #define TNLPSolver_H
00013 #include "IpTNLP.hpp"
00014 #include "BonTMINLP2TNLP.hpp"
00015
00016
00017 #include "IpOptionsList.hpp"
00018 #include "CoinWarmStart.hpp"
00019 #include "BonRegisteredOptions.hpp"
00020 #include "CoinTime.hpp"
00021 namespace Bonmin {
00026 class TNLPSolver: public Ipopt::ReferencedObject{
00027 public:
00028
00029 enum ReturnStatus {
00030 iterationLimit = -3,
00031 timeLimit = 5,
00032 doesNotConverge = -8,
00033 computationError = -2,
00034 notEnoughFreedom = -1,
00035 illDefinedProblem = -4,
00036 illegalOption =-5,
00037 externalException =-6,
00038 exception =-7,
00039 solvedOptimal = 1,
00040 solvedOptimalTol =2,
00041 provenInfeasible =3,
00042 unbounded = 4,
00043 numReturnCodes
00044 };
00045
00046
00047
00048
00049
00052 class UnsolvedError
00053 {
00054 public:
00056 UnsolvedError(int errorNum = -10000,
00057 Ipopt::SmartPtr<TMINLP2TNLP> model = NULL,
00058 std::string name="")
00059 :
00060 errorNum_(errorNum),
00061 model_(model),
00062 name_(name)
00063 {if(name_=="")
00064 {
00065 #ifndef NDEBUG
00066 std::cerr<<"FIXME"<<std::endl;
00067 #endif
00068 }}
00070 void printError(std::ostream & os);
00072 virtual const std::string& errorName() const = 0;
00074 virtual const std::string& solverName() const = 0;
00076 int errorNum() const{
00077 return errorNum_;}
00079 virtual ~UnsolvedError(){}
00082 void writeDiffFiles(const std::string prefix=std::string()) const;
00083 private:
00085 int errorNum_;
00086
00088 Ipopt::SmartPtr< TMINLP2TNLP > model_;
00089
00091 std::string name_;
00092 }
00093 ;
00094
00095 virtual UnsolvedError * newUnsolvedError(int num,
00096 Ipopt::SmartPtr<TMINLP2TNLP> problem,
00097 std::string name) = 0;
00098
00099
00100
00102 TNLPSolver();
00103
00105 TNLPSolver(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions,
00106 Ipopt::SmartPtr<Ipopt::OptionsList> options,
00107 Ipopt::SmartPtr<Ipopt::Journalist> journalist,
00108 const std::string & prefix);
00109
00111 virtual Ipopt::SmartPtr<TNLPSolver> clone() = 0;
00112
00114 virtual ~TNLPSolver();
00115
00118 virtual bool Initialize(std::string params_file) = 0;
00119
00122 virtual bool Initialize(std::istream& is) = 0;
00123
00126
00127 virtual ReturnStatus OptimizeTNLP(const Ipopt::SmartPtr<Ipopt::TNLP> & tnlp) = 0;
00128
00130 virtual ReturnStatus ReOptimizeTNLP(const Ipopt::SmartPtr<Ipopt::TNLP> & tnlp) = 0;
00131
00133 virtual bool setWarmStart(const CoinWarmStart * warm,
00134 Ipopt::SmartPtr<TMINLP2TNLP> tnlp) = 0;
00135
00137 virtual CoinWarmStart * getUsedWarmStart(Ipopt::SmartPtr<TMINLP2TNLP> tnlp) const = 0;
00138
00140 virtual CoinWarmStart * getWarmStart(Ipopt::SmartPtr<TMINLP2TNLP> tnlp) const = 0;
00141
00142 virtual CoinWarmStart * getEmptyWarmStart() const = 0;
00143
00145 virtual bool warmStartIsValid(const CoinWarmStart * ws) const = 0;
00146
00148 virtual void enableWarmStart() = 0;
00149
00151 virtual void disableWarmStart() = 0;
00153
00155 Ipopt::SmartPtr<Ipopt::Journalist> journalist(){
00156 return journalist_;}
00157
00159 Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions(){
00160 return roptions_;}
00161
00163 Ipopt::SmartPtr<const Ipopt::OptionsList> options() const {
00164 return ConstPtr(options_);}
00165
00167 Ipopt::SmartPtr<Ipopt::OptionsList> options() {
00168 return options_;}
00169
00171 const char * prefix(){
00172 return prefix_.c_str();
00173 }
00175 static void RegisterOptions(Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions){}
00176
00178 virtual double CPUTime() = 0;
00179
00181 virtual int IterationCount() = 0;
00182
00183
00185 virtual void setOutputToDefault() = 0 ;
00187 virtual void forceSolverOutput(int log_level) = 0;
00189 virtual std::string & solverName() = 0;
00190
00193 bool isRecoverable(ReturnStatus &r);
00194
00196 void setup_global_time_limit(double time_limit){
00197 time_limit_ = time_limit + 5;
00198 start_time_ = CoinCpuTime();
00199 }
00200
00202 bool isError(ReturnStatus &r){
00203 return r < 0;}
00205 virtual int errorCode() const = 0;
00206 protected:
00209 bool zeroDimension(const Ipopt::SmartPtr<Ipopt::TNLP> &tnlp,
00210 ReturnStatus &optimization_status);
00211
00213 void initializeOptionsAndJournalist();
00214
00216 Ipopt::SmartPtr<Ipopt::Journalist> journalist_;
00217
00219 Ipopt::SmartPtr<Ipopt::OptionsList> options_;
00220
00222 Ipopt::SmartPtr<Bonmin::RegisteredOptions> roptions_;
00223
00225 std::string prefix_;
00227 double start_time_;
00228
00230 double time_limit_;
00231
00233 int default_log_level_;
00235 TNLPSolver(const TNLPSolver & other);
00236
00237 };
00238 }
00239 #endif
00240
00241