BM.hpp

Go to the documentation of this file.
00001 // (C) Copyright International Business Machines Corporation and Carnegie Mellon University 2006 
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Authors :
00006 // Laszlo Ladanyi, International Business Machines Corporation
00007 // Pierre Bonami, Carnegie Mellon University,
00008 //
00009 // Date : 03/15/2006
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; // 0: type 1  ---- 1: type 2
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, // on what to expand
00258                  BCP_vec<BCP_cut*>& cuts,       // what to expand
00259                  BCP_vec<BCP_row*>& rows,       // the expanded rows
00260                  // things that the user can use for lifting cuts if allowed
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     /* There's no totalTime_ and nodeTime_. Look at the top of BM.cpp */
00302     //   double totalTime_;
00303     //   double nodeTime_;
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

Generated on Fri May 16 21:05:57 2008 for Bonmin by  doxygen 1.4.7