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
00295 virtual void
00296 modify_lp_parameters(OsiSolverInterface* lp, const int changeType,
00297 bool in_strong_branching);
00298
00299
00326 virtual void
00327 process_lp_result(const BCP_lp_result& lpres,
00328 const BCP_vec<BCP_var*>& vars,
00329 const BCP_vec<BCP_cut*>& cuts,
00330 const double old_lower_bound,
00331 double& true_lower_bound,
00332 BCP_solution*& sol,
00333 BCP_vec<BCP_cut*>& new_cuts,
00334 BCP_vec<BCP_row*>& new_rows,
00335 BCP_vec<BCP_var*>& new_vars,
00336 BCP_vec<BCP_col*>& new_cols);
00337
00338
00350 virtual double
00351 compute_lower_bound(const double old_lower_bound,
00352 const BCP_lp_result& lpres,
00353 const BCP_vec<BCP_var*>& vars,
00354 const BCP_vec<BCP_cut*>& cuts);
00355
00356
00377 virtual BCP_solution*
00378 test_feasibility(const BCP_lp_result& lp_result,
00379 const BCP_vec<BCP_var*>& vars,
00380 const BCP_vec<BCP_cut*>& cuts);
00396 BCP_solution_generic*
00397 test_binary(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00398 const double etol) const;
00401 BCP_solution_generic*
00402 test_integral(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00403 const double etol) const;
00405 BCP_solution_generic*
00406 test_full(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00407 const double etol) const;
00416 virtual BCP_solution*
00417 generate_heuristic_solution(const BCP_lp_result& lpres,
00418 const BCP_vec<BCP_var*>& vars,
00419 const BCP_vec<BCP_cut*>& cuts);
00422
00437 virtual void
00438 pack_feasible_solution(BCP_buffer& buf, const BCP_solution* sol);
00439
00440
00462 virtual void
00463 pack_primal_solution(BCP_buffer& buf,
00464 const BCP_lp_result& lp_result,
00465 const BCP_vec<BCP_var*>& vars,
00466 const BCP_vec<BCP_cut*>& cuts);
00467
00489 virtual void
00490 pack_dual_solution(BCP_buffer& buf,
00491 const BCP_lp_result& lp_result,
00492 const BCP_vec<BCP_var*>& vars,
00493 const BCP_vec<BCP_cut*>& cuts);
00496
00517 virtual void
00518 display_lp_solution(const BCP_lp_result& lp_result,
00519 const BCP_vec<BCP_var*>& vars,
00520 const BCP_vec<BCP_cut*>& cuts,
00521 const bool final_lp_solution);
00524
00531 virtual void
00532 restore_feasibility(const BCP_lp_result& lpres,
00533 const std::vector<double*> dual_rays,
00534 const BCP_vec<BCP_var*>& vars,
00535 const BCP_vec<BCP_cut*>& cuts,
00536 BCP_vec<BCP_var*>& vars_to_add,
00537 BCP_vec<BCP_col*>& cols_to_add);
00538
00539
00575 virtual void
00576 cuts_to_rows(const BCP_vec<BCP_var*>& vars,
00577 BCP_vec<BCP_cut*>& cuts,
00578 BCP_vec<BCP_row*>& rows,
00579
00580 const BCP_lp_result& lpres,
00581 BCP_object_origin origin, bool allow_multiple);
00582
00603 virtual void
00604 vars_to_cols(const BCP_vec<BCP_cut*>& cuts,
00605 BCP_vec<BCP_var*>& vars,
00606 BCP_vec<BCP_col*>& cols,
00607
00608 const BCP_lp_result& lpres,
00609 BCP_object_origin origin, bool allow_multiple);
00612
00628 virtual void
00629 generate_cuts_in_lp(const BCP_lp_result& lpres,
00630 const BCP_vec<BCP_var*>& vars,
00631 const BCP_vec<BCP_cut*>& cuts,
00632 BCP_vec<BCP_cut*>& new_cuts,
00633 BCP_vec<BCP_row*>& new_rows);
00634
00651 virtual void
00652 generate_vars_in_lp(const BCP_lp_result& lpres,
00653 const BCP_vec<BCP_var*>& vars,
00654 const BCP_vec<BCP_cut*>& cuts,
00655 const bool before_fathom,
00656 BCP_vec<BCP_var*>& new_vars,
00657 BCP_vec<BCP_col*>& new_cols);
00658
00666 virtual BCP_object_compare_result
00667 compare_cuts(const BCP_cut* c0, const BCP_cut* c1);
00668
00677 virtual BCP_object_compare_result
00678 compare_vars(const BCP_var* v0, const BCP_var* v1);
00681
00682 virtual void
00683 select_vars_to_delete(const BCP_lp_result& lpres,
00684 const BCP_vec<BCP_var*>& vars,
00685 const BCP_vec<BCP_cut*>& cuts,
00686 const bool before_fathom,
00687 BCP_vec<int>& deletable);
00688 virtual void
00689 select_cuts_to_delete(const BCP_lp_result& lpres,
00690 const BCP_vec<BCP_var*>& vars,
00691 const BCP_vec<BCP_cut*>& cuts,
00692 const bool before_fathom,
00693 BCP_vec<int>& deletable);
00694
00712 virtual void
00713 logical_fixing(const BCP_lp_result& lpres,
00714 const BCP_vec<BCP_var*>& vars,
00715 const BCP_vec<BCP_cut*>& cuts,
00716 const BCP_vec<BCP_obj_status>& var_status,
00717 const BCP_vec<BCP_obj_status>& cut_status,
00718 const int var_bound_changes_since_logical_fixing,
00719 BCP_vec<int>& changed_pos, BCP_vec<double>& new_bd);
00724 void
00725 reduced_cost_fixing(const double* dj, const double* x, const double gap,
00726 BCP_vec<BCP_var*>& vars, int& newly_changed);
00727
00728
00768 virtual BCP_branching_decision
00769 select_branching_candidates(const BCP_lp_result& lpres,
00770 const BCP_vec<BCP_var*>& vars,
00771 const BCP_vec<BCP_cut*>& cuts,
00772 const BCP_lp_var_pool& local_var_pool,
00773 const BCP_lp_cut_pool& local_cut_pool,
00774 BCP_vec<BCP_lp_branching_object*>& cands,
00775 bool force_branch = false);
00778 virtual int
00779 try_to_branch(OsiBranchingInformation& branchInfo,
00780 OsiSolverInterface* solver,
00781 OsiChooseVariable* choose,
00782 OsiBranchingObject*& branchObject,
00783 bool allowVarFix);
00788 void
00789 branch_close_to_half(const BCP_lp_result& lpres,
00790 const BCP_vec<BCP_var*>& vars,
00791 const int to_be_selected,
00792 const double etol,
00793 BCP_vec<BCP_lp_branching_object*>& candidates);
00798 void
00799 branch_close_to_one(const BCP_lp_result& lpres,
00800 const BCP_vec<BCP_var*>& vars,
00801 const int to_be_selected,
00802 const double etol,
00803 BCP_vec<BCP_lp_branching_object*>& candidates);
00808 void
00809 append_branching_vars(const double* x,
00810 const BCP_vec<BCP_var*>& vars,
00811 const BCP_vec<int>& select_pos,
00812 BCP_vec<BCP_lp_branching_object*>& candidates);
00829 virtual BCP_branching_object_relation
00830 compare_branching_candidates(BCP_presolved_lp_brobj* new_solved,
00831 BCP_presolved_lp_brobj* old_solved);
00851 virtual void
00852 set_actions_for_children(BCP_presolved_lp_brobj* best);
00853
00862 virtual void
00863 set_user_data_for_children(BCP_presolved_lp_brobj* best,
00864 const int selected);
00868 virtual void
00869 set_user_data_for_children(BCP_presolved_lp_brobj* best);
00872
00873
00895 virtual void
00896 purge_slack_pool(const BCP_vec<BCP_cut*>& slack_pool,
00897 BCP_vec<int>& to_be_purged);
00899 };
00900
00901
00902
00903 #endif