00001
00015 #ifndef BONMINSOLVER_H
00016 #define BONMINSOLVER_H
00017
00018 #include "OSConfig.h"
00019 #include "OSDefaultSolver.h"
00020 #include "OSrLWriter.h"
00021 #include "OSInstance.h"
00022 #include "OSParameters.h"
00023 #include "OSnLNode.h"
00024 #include "OSiLReader.h"
00025 #include "OSrLReader.h"
00026 #include "OSoLReader.h"
00027 #include "OSInstance.h"
00028 #include "OSExpressionTree.h"
00029 #include "OSnLNode.h"
00030 #include "OSDataStructures.h"
00031 #include "OSFileUtil.h"
00032 #include "OSErrorClass.h"
00033
00034 #include "OSResult.h"
00035 #include "OSInstance.h"
00036 #include "OSOption.h"
00037
00038 #include <cstddef>
00039 #include <cstdlib>
00040 #include <cctype>
00041 #include <cassert>
00042 #include <stack>
00043 #include <string>
00044 #include <iostream>
00045 #include <vector>
00046 #include <map>
00047
00048 #include "BonCbc.hpp"
00049 #include "BonTMINLP.hpp"
00050 #include "BonBonminSetup.hpp"
00051
00052
00053 class BonminProblem : public Bonmin::TMINLP
00054 {
00055
00056
00057
00058 public:
00059
00061 BonminProblem(OSInstance *osinstance_ , OSOption *osoption_);
00062
00064 virtual ~BonminProblem();
00065
00066 OSInstance *osinstance;
00067
00068 OSOption *osoption;
00069
00070 Bonmin::TMINLP::SolverReturn status;
00071
00072
00082 virtual bool get_variables_types(Ipopt::Index n, VariableType* var_types);
00083
00085 virtual bool get_variables_linearity(Ipopt::Index n, Ipopt::TNLP::LinearityType* var_types);
00086
00091 virtual bool get_constraints_linearity(Ipopt::Index m, Ipopt::TNLP::LinearityType* const_types);
00093
00106 virtual bool get_nlp_info(Ipopt::Index& n, Ipopt::Index&m, Ipopt::Index& nnz_jac_g,
00107 Ipopt::Index& nnz_h_lag, Ipopt::TNLP::IndexStyleEnum& index_style);
00108
00109
00110
00112
00113
00114
00116 virtual bool get_bounds_info(Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u,
00117 Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u);
00118
00120 virtual bool get_starting_point(Ipopt::Index n, bool init_x, Ipopt::Number* x,
00121 bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U,
00122 Ipopt::Index m, bool init_lambda,
00123 Ipopt::Number* lambda);
00124
00126 virtual bool eval_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number& obj_value);
00127
00129 virtual bool eval_grad_f(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number* grad_f);
00130
00132 virtual bool eval_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Index m, Ipopt::Number* g);
00133
00138 virtual bool eval_jac_g(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00139 Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow, Ipopt::Index *jCol,
00140 Ipopt::Number* values);
00141
00146 virtual bool eval_h(Ipopt::Index n, const Ipopt::Number* x, bool new_x,
00147 Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda,
00148 bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow,
00149 Ipopt::Index* jCol, Ipopt::Number* values);
00150
00152
00153
00154 virtual bool get_scaling_parameters(Ipopt::Number& obj_scaling,
00155 bool& use_x_scaling, Ipopt::Index n,
00156 Ipopt::Number* x_scaling,
00157 bool& use_g_scaling, Ipopt::Index m,
00158 Ipopt::Number* g_scaling);
00159
00162 virtual void finalize_solution(Bonmin::TMINLP::SolverReturn status_,
00163 Ipopt::Index n, const Ipopt::Number* x, Ipopt::Number obj_value);
00165
00166 virtual const SosInfo * sosConstraints() const
00167 {
00168 return NULL;
00169 }
00170 virtual const BranchingInfo* branchingInfo() const
00171 {
00172 return NULL;
00173 }
00174
00175 void printSolutionAtEndOfAlgorithm()
00176 {
00177 printSol_ = true;
00178 }
00179
00180
00181
00182
00183
00184 private:
00185 bool printSol_;
00186
00187 private:
00199
00200
00202
00203
00204
00205 std::string bonminErrorMsg;
00206
00207
00208 };
00209
00210
00225 class BonminSolver : public DefaultSolver
00226 {
00227 public:
00228
00229
00230
00232 BonminSolver();
00233
00235 ~BonminSolver();
00236
00237
00238
00239 Ipopt::SmartPtr<BonminProblem> tminlp;
00240
00241
00242 Bonmin::Bab bb;
00243
00244 Bonmin::TMINLP::SolverReturn status;
00245
00246
00247
00248
00251 virtual void solve() throw (ErrorClass) ;
00252
00257 virtual void buildSolverInstance() throw(ErrorClass);
00258
00263 virtual void setSolverOptions() throw(ErrorClass);
00264
00270 void dataEchoCheck();
00271
00276 OSiLReader *m_osilreader;
00277
00282 OSoLReader *m_osolreader;
00283
00284
00285
00290 void writeResult();
00291
00292
00293 private:
00294 OSrLWriter *osrlwriter;
00295
00296 Bonmin::BonminSetup bonminSetup;
00297
00298 std::string bonminErrorMsg;
00299 };
00300
00301
00302 #endif