00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _BM_H
00011 #define _BM_H
00012
00013 #include "BCP_USER.hpp"
00014 #include "BCP_tm_user.hpp"
00015 #include "BCP_lp_user.hpp"
00016
00017 #include "BM_var.hpp"
00018 #include "BB_cut.hpp"
00019
00020
00021
00022 class BM_node : public BCP_user_data {
00023 public:
00028 int numNlpFailed_;
00029 public:
00030 BM_node() : numNlpFailed_(0) {}
00031 BM_node(BCP_buffer& buf) : numNlpFailed_(0) {
00032 buf.unpack(numNlpFailed_);
00033 }
00034 ~BM_node() {}
00035
00036 inline void pack(BCP_buffer& buf) const {
00037 buf.pack(numNlpFailed_);
00038 }
00039 };
00040
00041
00042
00043 enum BM_WarmStartStrategy {
00044 WarmStartNone,
00045 WarmStartFromRoot,
00046 WarmStartFromParent
00047 };
00048
00049 class BM_par {
00050 public:
00051 enum chr_params {
00052
00053 BranchOnSos,
00054 CombinedDistanceAndPriority,
00055 PureBranchAndBound,
00056 PrintBranchingInfo,
00057 SosWithLowPriorityMoreImportant,
00058 VarWithLowPriorityMoreImportant,
00059 end_of_chr_params
00060 };
00061 enum int_params {
00062
00063 NumNlpFailureMax,
00064 WarmStartStrategy,
00065 end_of_int_params
00066 };
00067 enum dbl_params {
00068
00069 end_of_dbl_params
00070 };
00071 enum str_params {
00072 NL_filename,
00073 IpoptParamfile,
00074
00075 end_of_str_params
00076 };
00077 enum str_array_params {
00078
00079 end_of_str_array_params
00080 };
00081 };
00082
00083
00084
00085 class BM_tm : public BCP_tm_user {
00086
00087 public:
00088
00090 BCP_string ipopt_file_content;
00091 BCP_string nl_file_content;
00092 BCP_parameter_set<BM_par> par;
00093
00094 public:
00095
00098
00099 BM_tm() {}
00100
00102 virtual ~BM_tm() {}
00104
00107 virtual void pack_module_data(BCP_buffer& buf, BCP_process_t ptype);
00108
00109 virtual void pack_var_algo(const BCP_var_algo* var, BCP_buffer& buf) {
00110 BM_pack_var(var, buf);
00111 }
00112 virtual BCP_var_algo* unpack_var_algo(BCP_buffer& buf) {
00113 return BM_unpack_var(buf);
00114 }
00115
00116 virtual void pack_cut_algo(const BCP_cut_algo* cut, BCP_buffer& buf) {
00117 BB_pack_cut(cut, buf);
00118 }
00119 virtual BCP_cut_algo* unpack_cut_algo(BCP_buffer& buf) {
00120 return BB_unpack_cut(buf);
00121 }
00122
00123 virtual BCP_solution* unpack_feasible_solution(BCP_buffer& buf);
00124
00126 virtual void pack_user_data(const BCP_user_data* ud, BCP_buffer& buf);
00127
00129 virtual BCP_user_data* unpack_user_data(BCP_buffer& buf);
00131
00133 virtual void initialize_core(BCP_vec<BCP_var_core*>& vars,
00134 BCP_vec<BCP_cut_core*>& cuts,
00135 BCP_lp_relax*& matrix);
00136
00143 virtual void
00144 create_root(BCP_vec<BCP_var*>& added_vars,
00145 BCP_vec<BCP_cut*>& added_cuts,
00146 BCP_user_data*& user_data,
00147 BCP_pricing_status& pricing_status);
00148
00150 virtual void display_feasible_solution(const BCP_solution* sol);
00151
00152 void readIpopt();
00153
00154 };
00155
00156
00157
00158 #include <OsiAuxInfo.hpp>
00159 #include <OsiCuts.hpp>
00160 #include "BCP_lp_user.hpp"
00161 #include "IpCbcOACutGenerator2.hpp"
00162 #include "BonminAmplInterface.hpp"
00163 class BM_lp : public BCP_lp_user
00164 {
00165 struct BmSosInfo {
00166 int length;
00167 int type;
00168 int priority;
00169 int *indices;
00170 double *weights;
00171 int first;
00172 int last;
00173 BmSosInfo(const TMINLP::SosInfo * sosinfo, int i);
00174 ~BmSosInfo() {
00175 delete[] indices;
00176 delete[] weights;
00177 }
00178 };
00179 std::vector<BmSosInfo*> sos;
00180 void setSosFrom(const TMINLP::SosInfo * sosinfo);
00181
00182 BCP_string ipopt_file_content;
00183 BCP_string nl_file_content;
00184 BCP_parameter_set<BM_par> par;
00185
00186 OsiBabSolver babSolver_;
00187 BonminAmplInterface nlp;
00188 CoinWarmStart* ws;
00189
00190 double lower_bound_;
00191 double* primal_solution_;
00192
00197 int numNlpFailed_;
00198
00202 double* branching_priority_;
00203
00204 IpCbcOACutGenerator2* feasChecker_;
00205 OsiCuts cuts_;
00206
00207 public:
00208 BM_lp();
00209 virtual ~BM_lp();
00210
00211 inline int& numNlpFailed() {
00212 return (dynamic_cast<BM_node*>(get_user_data()))->numNlpFailed_;
00213 }
00214
00215 virtual void
00216 unpack_module_data(BCP_buffer& buf);
00217
00218 virtual void pack_var_algo(const BCP_var_algo* var, BCP_buffer& buf) {
00219 BM_pack_var(var, buf);
00220 }
00221 virtual BCP_var_algo* unpack_var_algo(BCP_buffer& buf) {
00222 return BM_unpack_var(buf);
00223 }
00224
00225 virtual void pack_cut_algo(const BCP_cut_algo* cut, BCP_buffer& buf) {
00226 BB_pack_cut(cut, buf);
00227 }
00228 virtual BCP_cut_algo* unpack_cut_algo(BCP_buffer& buf) {
00229 return BB_unpack_cut(buf);
00230 }
00231
00232 virtual void
00233 pack_feasible_solution(BCP_buffer& buf, const BCP_solution* sol);
00234
00235 virtual void
00236 pack_user_data(const BCP_user_data* ud, BCP_buffer& buf);
00237 virtual BCP_user_data*
00238 unpack_user_data(BCP_buffer& buf);
00239
00240 virtual void
00241 process_message(BCP_buffer& buf);
00242
00243 virtual OsiSolverInterface *
00244 initialize_solver_interface();
00245
00246 virtual BCP_solution*
00247 test_feasibility(const BCP_lp_result& lp_result,
00248 const BCP_vec<BCP_var*>& vars,
00249 const BCP_vec<BCP_cut*>& cuts);
00250 virtual void
00251 generate_cuts_in_lp(const BCP_lp_result& lpres,
00252 const BCP_vec<BCP_var*>& vars,
00253 const BCP_vec<BCP_cut*>& cuts,
00254 BCP_vec<BCP_cut*>& new_cuts,
00255 BCP_vec<BCP_row*>& new_rows);
00256 virtual void
00257 cuts_to_rows(const BCP_vec<BCP_var*>& vars,
00258 BCP_vec<BCP_cut*>& cuts,
00259 BCP_vec<BCP_row*>& rows,
00260
00261 const BCP_lp_result& lpres,
00262 BCP_object_origin origin, bool allow_multiple);
00263 virtual void
00264 vars_to_cols(const BCP_vec<BCP_cut*>& cuts,
00265 BCP_vec<BCP_var*>& vars,
00266 BCP_vec<BCP_col*>& cols,
00267 const BCP_lp_result& lpres,
00268 BCP_object_origin origin, bool allow_multiple);
00269 virtual double
00270 compute_lower_bound(const double old_lower_bound,
00271 const BCP_lp_result& lpres,
00272 const BCP_vec<BCP_var*>& vars,
00273 const BCP_vec<BCP_cut*>& cuts);
00274
00275 virtual void
00276 initialize_new_search_tree_node(const BCP_vec<BCP_var*>& vars,
00277 const BCP_vec<BCP_cut*>& cuts,
00278 const BCP_vec<BCP_obj_status>& vs,
00279 const BCP_vec<BCP_obj_status>& cs,
00280 BCP_vec<int>& var_changed_pos,
00281 BCP_vec<double>& var_new_bd,
00282 BCP_vec<int>& cut_changed_pos,
00283 BCP_vec<double>& cut_new_bd);
00284
00285 virtual BCP_branching_decision
00286 select_branching_candidates(const BCP_lp_result& lpres,
00287 const BCP_vec<BCP_var*>& vars,
00288 const BCP_vec<BCP_cut*>& cuts,
00289 const BCP_lp_var_pool& local_var_pool,
00290 const BCP_lp_cut_pool& local_cut_pool,
00291 BCP_vec<BCP_lp_branching_object*>& cans);
00292
00293 virtual void
00294 set_user_data_for_children(BCP_presolved_lp_brobj* best,
00295 const int selected);
00296
00297 virtual void
00298 modify_lp_parameters(OsiSolverInterface* lp, bool in_strong_branching);
00299
00300 private:
00301
00302
00303
00304 int in_strong;
00305
00306 };
00307
00308
00309
00310 #include "BCP_USER.hpp"
00311
00312 class BM_init : public USER_initialize {
00313
00314 public:
00315
00316 virtual BCP_tm_user * tm_init(BCP_tm_prob& p,
00317 const int argnum,
00318 const char * const * arglist);
00319
00320 virtual BCP_lp_user * lp_init(BCP_lp_prob& p);
00321 };
00322
00323
00324
00325 class BM_solution : public BCP_solution {
00326 public:
00327 double _objective;
00328 BCP_vec<int> _ind;
00329 BCP_vec<double> _values;
00330
00331 public:
00332 BM_solution() : _objective(0), _ind(), _values() {}
00333 virtual ~BM_solution() {}
00334
00335 inline virtual double objective_value() const { return _objective; }
00336 inline void setObjective(double obj) { _objective = obj; }
00337
00338 void add_entry(int i, double value) {
00339 _ind.push_back(i);
00340 _values.push_back(value);
00341 }
00342 };
00343
00344 #endif