00001
00002
00003 #ifndef _BCP_LP_USER_H
00004 #define _BCP_LP_USER_H
00005
00006
00007
00008 #include <vector>
00009
00010 #include "OsiSolverInterface.hpp"
00011 #include "OsiAuxInfo.hpp"
00012 #include "OsiBranchingObject.hpp"
00013 #include "OsiChooseVariable.hpp"
00014
00015 #include "BCP_USER.hpp"
00016
00017 #include "BCP_buffer.hpp"
00018 #include "BCP_vector.hpp"
00019 #include "BCP_string.hpp"
00020 #include "BCP_warmstart.hpp"
00021 #include "BCP_solution.hpp"
00022 #include "BCP_var.hpp"
00023 #include "BCP_cut.hpp"
00024 #include "BCP_matrix.hpp"
00025
00026 #include "BCP_enum.hpp"
00027 #include "BCP_enum_branch.hpp"
00028 #include "BCP_enum_process_t.hpp"
00029 #include "BCP_lp_param.hpp"
00030 #include "BCP_lp_result.hpp"
00031 #include "BCP_lp_pool.hpp"
00032 #include "BCP_lp_branch.hpp"
00033
00034
00035
00036 class BCP_lp_prob;
00037 class BCP_problem_core;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00075 class BCP_lp_user : public BCP_user_class {
00076 private:
00077 BCP_lp_user(const BCP_lp_user&);
00078 BCP_lp_user& operator=(const BCP_lp_user&);
00079
00080 private:
00081 bool using_deprecated_set_user_data_for_children;
00082 BCP_lp_prob * p;
00083 OsiBabSolver* babSolver_;
00084
00085 public:
00092
00093 void setLpProblemPointer(BCP_lp_prob * ptr) { p = ptr; }
00095 BCP_lp_prob * getLpProblemPointer() { return p; }
00098 void setOsiBabSolver(OsiBabSolver* ptr) { babSolver_ = ptr; }
00099 OsiBabSolver* getOsiBabSolver() { return babSolver_; }
00100
00103
00104 double upper_bound() const;
00107 bool over_ub(double lb) const;
00109 int current_phase() const;
00111 int current_level() const;
00113 int current_index() const;
00115 int current_iteration() const;
00117 double start_time() const;
00120 BCP_user_data* get_user_data();
00123 void print(const bool ifprint, const char * format, ...) const;
00124
00127
00128 char get_param(const BCP_lp_par::chr_params key) const;
00130 int get_param(const BCP_lp_par::int_params key) const;
00132 double get_param(const BCP_lp_par::dbl_params key) const;
00134 const BCP_string& get_param(const BCP_lp_par::str_params key) const;
00135
00137 void set_param(const BCP_lp_par::chr_params key, const bool val);
00139 void set_param(const BCP_lp_par::chr_params key, const char val);
00141 void set_param(const BCP_lp_par::int_params key, const int val);
00143 void set_param(const BCP_lp_par::dbl_params key, const double val);
00145 void set_param(const BCP_lp_par::str_params key, const char * val);
00150 void send_feasible_solution(const BCP_solution* sol);
00151
00154 BCP_lp_user() : p(0), babSolver_(0) {}
00157 virtual ~BCP_lp_user() {}
00160
00168 void
00169 select_nonzeros(const double * first, const double * last,
00170 const double etol, BCP_vec<int>& nonzeros) const;
00173 void
00174 select_zeros(const double * first, const double * last,
00175 const double etol, BCP_vec<int>& zeros) const;
00178 void
00179 select_positives(const double * first, const double * last,
00180 const double etol, BCP_vec<int>& positives) const;
00183 void
00184 select_fractions(const double * first, const double * last,
00185 const double etol, BCP_vec<int>& fractions) const;
00188
00197 virtual void
00198 unpack_module_data(BCP_buffer & buf);
00199
00202
00204 int process_id() const;
00206 int parent() const;
00208 void
00209 send_message(const int target, const BCP_buffer& buf,
00210 BCP_message_tag tag = BCP_Msg_User);
00212 void
00213 receive_message(const int sender, BCP_buffer& buf,
00214 BCP_message_tag tag = BCP_Msg_User);
00216 void
00217 broadcast_message(const BCP_process_t proc_type, const BCP_buffer& buf);
00220 virtual void
00221 process_message(BCP_buffer& buf);
00222
00233 virtual OsiSolverInterface *
00234 initialize_solver_interface();
00235
00236
00241 virtual void
00242 initialize_int_and_sos_list(std::vector<OsiObject *>& intAndSosObjects);
00243
00244
00262 virtual void
00263 initialize_new_search_tree_node(const BCP_vec<BCP_var*>& vars,
00264 const BCP_vec<BCP_cut*>& cuts,
00265 const BCP_vec<BCP_obj_status>& var_status,
00266 const BCP_vec<BCP_obj_status>& cut_status,
00267 BCP_vec<int>& var_changed_pos,
00268 BCP_vec<double>& var_new_bd,
00269 BCP_vec<int>& cut_changed_pos,
00270 BCP_vec<double>& cut_new_bd);
00271
00272
00277 virtual void
00278 load_problem(OsiSolverInterface& osi, BCP_problem_core* core,
00279 BCP_var_set& vars, BCP_cut_set& cuts);
00280
00281
00289 virtual void
00290 modify_lp_parameters(OsiSolverInterface* lp, bool in_strong_branching);
00291
00292
00319 virtual void
00320 process_lp_result(const BCP_lp_result& lpres,
00321 const BCP_vec<BCP_var*>& vars,
00322 const BCP_vec<BCP_cut*>& cuts,
00323 const double old_lower_bound,
00324 double& true_lower_bound,
00325 BCP_solution*& sol,
00326 BCP_vec<BCP_cut*>& new_cuts,
00327 BCP_vec<BCP_row*>& new_rows,
00328 BCP_vec<BCP_var*>& new_vars,
00329 BCP_vec<BCP_col*>& new_cols);
00330
00331
00343 virtual double
00344 compute_lower_bound(const double old_lower_bound,
00345 const BCP_lp_result& lpres,
00346 const BCP_vec<BCP_var*>& vars,
00347 const BCP_vec<BCP_cut*>& cuts);
00348
00349
00370 virtual BCP_solution*
00371 test_feasibility(const BCP_lp_result& lp_result,
00372 const BCP_vec<BCP_var*>& vars,
00373 const BCP_vec<BCP_cut*>& cuts);
00389 BCP_solution_generic*
00390 test_binary(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00391 const double etol) const;
00394 BCP_solution_generic*
00395 test_integral(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00396 const double etol) const;
00398 BCP_solution_generic*
00399 test_full(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00400 const double etol) const;
00409 virtual BCP_solution*
00410 generate_heuristic_solution(const BCP_lp_result& lpres,
00411 const BCP_vec<BCP_var*>& vars,
00412 const BCP_vec<BCP_cut*>& cuts);
00415
00430 virtual void
00431 pack_feasible_solution(BCP_buffer& buf, const BCP_solution* sol);
00432
00433
00455 virtual void
00456 pack_primal_solution(BCP_buffer& buf,
00457 const BCP_lp_result& lp_result,
00458 const BCP_vec<BCP_var*>& vars,
00459 const BCP_vec<BCP_cut*>& cuts);
00460
00482 virtual void
00483 pack_dual_solution(BCP_buffer& buf,
00484 const BCP_lp_result& lp_result,
00485 const BCP_vec<BCP_var*>& vars,
00486 const BCP_vec<BCP_cut*>& cuts);
00489
00510 virtual void
00511 display_lp_solution(const BCP_lp_result& lp_result,
00512 const BCP_vec<BCP_var*>& vars,
00513 const BCP_vec<BCP_cut*>& cuts,
00514 const bool final_lp_solution);
00517
00524 virtual void
00525 restore_feasibility(const BCP_lp_result& lpres,
00526 const std::vector<double*> dual_rays,
00527 const BCP_vec<BCP_var*>& vars,
00528 const BCP_vec<BCP_cut*>& cuts,
00529 BCP_vec<BCP_var*>& vars_to_add,
00530 BCP_vec<BCP_col*>& cols_to_add);
00531
00532
00568 virtual void
00569 cuts_to_rows(const BCP_vec<BCP_var*>& vars,
00570 BCP_vec<BCP_cut*>& cuts,
00571 BCP_vec<BCP_row*>& rows,
00572
00573 const BCP_lp_result& lpres,
00574 BCP_object_origin origin, bool allow_multiple);
00575
00596 virtual void
00597 vars_to_cols(const BCP_vec<BCP_cut*>& cuts,
00598 BCP_vec<BCP_var*>& vars,
00599 BCP_vec<BCP_col*>& cols,
00600
00601 const BCP_lp_result& lpres,
00602 BCP_object_origin origin, bool allow_multiple);
00605
00621 virtual void
00622 generate_cuts_in_lp(const BCP_lp_result& lpres,
00623 const BCP_vec<BCP_var*>& vars,
00624 const BCP_vec<BCP_cut*>& cuts,
00625 BCP_vec<BCP_cut*>& new_cuts,
00626 BCP_vec<BCP_row*>& new_rows);
00627
00644 virtual void
00645 generate_vars_in_lp(const BCP_lp_result& lpres,
00646 const BCP_vec<BCP_var*>& vars,
00647 const BCP_vec<BCP_cut*>& cuts,
00648 const bool before_fathom,
00649 BCP_vec<BCP_var*>& new_vars,
00650 BCP_vec<BCP_col*>& new_cols);
00651
00659 virtual BCP_object_compare_result
00660 compare_cuts(const BCP_cut* c0, const BCP_cut* c1);
00661
00670 virtual BCP_object_compare_result
00671 compare_vars(const BCP_var* v0, const BCP_var* v1);
00674
00675 virtual void
00676 select_vars_to_delete(const BCP_lp_result& lpres,
00677 const BCP_vec<BCP_var*>& vars,
00678 const BCP_vec<BCP_cut*>& cuts,
00679 const bool before_fathom,
00680 BCP_vec<int>& deletable);
00681 virtual void
00682 select_cuts_to_delete(const BCP_lp_result& lpres,
00683 const BCP_vec<BCP_var*>& vars,
00684 const BCP_vec<BCP_cut*>& cuts,
00685 const bool before_fathom,
00686 BCP_vec<int>& deletable);
00687
00705 virtual void
00706 logical_fixing(const BCP_lp_result& lpres,
00707 const BCP_vec<BCP_var*>& vars,
00708 const BCP_vec<BCP_cut*>& cuts,
00709 const BCP_vec<BCP_obj_status>& var_status,
00710 const BCP_vec<BCP_obj_status>& cut_status,
00711 const int var_bound_changes_since_logical_fixing,
00712 BCP_vec<int>& changed_pos, BCP_vec<double>& new_bd);
00717 void
00718 reduced_cost_fixing(const double* dj, const double* x, const double gap,
00719 BCP_vec<BCP_var*>& vars, int& newly_changed);
00720
00721
00761 virtual BCP_branching_decision
00762 select_branching_candidates(const BCP_lp_result& lpres,
00763 const BCP_vec<BCP_var*>& vars,
00764 const BCP_vec<BCP_cut*>& cuts,
00765 const BCP_lp_var_pool& local_var_pool,
00766 const BCP_lp_cut_pool& local_cut_pool,
00767 BCP_vec<BCP_lp_branching_object*>& cands,
00768 bool force_branch = false);
00771 virtual int
00772 try_to_branch(OsiBranchingInformation& branchInfo,
00773 OsiSolverInterface* solver,
00774 OsiChooseVariable* choose,
00775 OsiBranchingObject*& branchObject,
00776 bool allowVarFix);
00781 void
00782 branch_close_to_half(const BCP_lp_result& lpres,
00783 const BCP_vec<BCP_var*>& vars,
00784 const int to_be_selected,
00785 const double etol,
00786 BCP_vec<BCP_lp_branching_object*>& candidates);
00791 void
00792 branch_close_to_one(const BCP_lp_result& lpres,
00793 const BCP_vec<BCP_var*>& vars,
00794 const int to_be_selected,
00795 const double etol,
00796 BCP_vec<BCP_lp_branching_object*>& candidates);
00801 void
00802 append_branching_vars(const double* x,
00803 const BCP_vec<BCP_var*>& vars,
00804 const BCP_vec<int>& select_pos,
00805 BCP_vec<BCP_lp_branching_object*>& candidates);
00822 virtual BCP_branching_object_relation
00823 compare_branching_candidates(BCP_presolved_lp_brobj* new_solved,
00824 BCP_presolved_lp_brobj* old_solved);
00844 virtual void
00845 set_actions_for_children(BCP_presolved_lp_brobj* best);
00846
00855 virtual void
00856 set_user_data_for_children(BCP_presolved_lp_brobj* best,
00857 const int selected);
00861 virtual void
00862 set_user_data_for_children(BCP_presolved_lp_brobj* best);
00865
00866
00888 virtual void
00889 purge_slack_pool(const BCP_vec<BCP_cut*>& slack_pool,
00890 BCP_vec<int>& to_be_purged);
00892 };
00893
00894
00895
00896 #endif