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
00013 #include "BCP_USER.hpp"
00014
00015 #include "BCP_buffer.hpp"
00016 #include "BCP_vector.hpp"
00017 #include "BCP_string.hpp"
00018 #include "BCP_warmstart.hpp"
00019 #include "BCP_solution.hpp"
00020 #include "BCP_var.hpp"
00021 #include "BCP_cut.hpp"
00022 #include "BCP_matrix.hpp"
00023
00024 #include "BCP_enum.hpp"
00025 #include "BCP_enum_branch.hpp"
00026
00027 #include "BCP_lp_param.hpp"
00028 #include "BCP_lp_result.hpp"
00029 #include "BCP_lp_pool.hpp"
00030 #include "BCP_lp_branch.hpp"
00031
00032
00033
00034 class BCP_lp_prob;
00035
00036
00037
00038
00039
00040
00041
00042
00043
00072 class BCP_lp_user {
00073 private:
00074 BCP_lp_user(const BCP_lp_user&);
00075 BCP_lp_user& operator=(const BCP_lp_user&);
00076
00077 private:
00078 bool using_deprecated_set_user_data_for_children;
00079 BCP_lp_prob * p;
00080 OsiBabSolver* babSolver_;
00081
00082 public:
00089
00090 void setLpProblemPointer(BCP_lp_prob * ptr) { p = ptr; }
00092 BCP_lp_prob * getLpProblemPointer() { return p; }
00095 void setOsiBabSolver(OsiBabSolver* ptr) { babSolver_ = ptr; }
00096 OsiBabSolver* getOsiBabSolver() { return babSolver_; }
00097
00100
00101 double upper_bound() const;
00103 int current_phase() const;
00105 int current_level() const;
00107 int current_index() const;
00109 int current_iteration() const;
00112 BCP_user_data* get_user_data();
00117
00118 char get_param(const BCP_lp_par::chr_params key) const;
00120 int get_param(const BCP_lp_par::int_params key) const;
00122 double get_param(const BCP_lp_par::dbl_params key) const;
00124 const BCP_string& get_param(const BCP_lp_par::str_params key) const;
00125
00127 void set_param(const BCP_lp_par::chr_params key, const bool val);
00129 void set_param(const BCP_lp_par::chr_params key, const char val);
00131 void set_param(const BCP_lp_par::int_params key, const int val);
00133 void set_param(const BCP_lp_par::dbl_params key, const double val);
00135 void set_param(const BCP_lp_par::str_params key, const char * val);
00140 void send_feasible_solution(const BCP_solution* sol);
00141
00144 BCP_lp_user() : p(0), babSolver_(0) {}
00147 virtual ~BCP_lp_user() {}
00150
00158 void
00159 select_nonzeros(const double * first, const double * last,
00160 const double etol, BCP_vec<int>& nonzeros) const;
00163 void
00164 select_zeros(const double * first, const double * last,
00165 const double etol, BCP_vec<int>& zeros) const;
00168 void
00169 select_positives(const double * first, const double * last,
00170 const double etol, BCP_vec<int>& positives) const;
00173 void
00174 select_fractions(const double * first, const double * last,
00175 const double etol, BCP_vec<int>& fractions) const;
00178
00187 virtual void
00188 unpack_module_data(BCP_buffer & buf);
00189
00200 virtual void
00201 pack_warmstart(const BCP_warmstart* ws, BCP_buffer& buf);
00203 virtual BCP_warmstart*
00204 unpack_warmstart(BCP_buffer& buf);
00205
00207 virtual void
00208 pack_var_algo(const BCP_var_algo* var, BCP_buffer& buf);
00210 virtual BCP_var_algo*
00211 unpack_var_algo(BCP_buffer& buf);
00212
00214 virtual void
00215 pack_cut_algo(const BCP_cut_algo* cut, BCP_buffer& buf);
00217 virtual BCP_cut_algo*
00218 unpack_cut_algo(BCP_buffer& buf);
00219
00221 virtual void
00222 pack_user_data(const BCP_user_data* ud, BCP_buffer& buf);
00224 virtual BCP_user_data*
00225 unpack_user_data(BCP_buffer& buf);
00228
00229
00231 const BCP_proc_id* process_id() const;
00233 void
00234 send_message(const BCP_proc_id* const target, const BCP_buffer& buf);
00236 void
00237 broadcast_message(const BCP_process_t proc_type, const BCP_buffer& buf);
00240 virtual void
00241 process_message(BCP_buffer& buf);
00242
00253 virtual OsiSolverInterface *
00254 initialize_solver_interface();
00255
00256
00274 virtual void
00275 initialize_new_search_tree_node(const BCP_vec<BCP_var*>& vars,
00276 const BCP_vec<BCP_cut*>& cuts,
00277 const BCP_vec<BCP_obj_status>& var_status,
00278 const BCP_vec<BCP_obj_status>& cut_status,
00279 BCP_vec<int>& var_changed_pos,
00280 BCP_vec<double>& var_new_bd,
00281 BCP_vec<int>& cut_changed_pos,
00282 BCP_vec<double>& cut_new_bd);
00283
00284
00292 virtual void
00293 modify_lp_parameters(OsiSolverInterface* lp, bool in_strong_branching);
00294
00295
00322 virtual void
00323 process_lp_result(const BCP_lp_result& lpres,
00324 const BCP_vec<BCP_var*>& vars,
00325 const BCP_vec<BCP_cut*>& cuts,
00326 const double old_lower_bound,
00327 double& true_lower_bound,
00328 BCP_solution*& sol,
00329 BCP_vec<BCP_cut*>& new_cuts,
00330 BCP_vec<BCP_row*>& new_rows,
00331 BCP_vec<BCP_var*>& new_vars,
00332 BCP_vec<BCP_col*>& new_cols);
00333
00334
00346 virtual double
00347 compute_lower_bound(const double old_lower_bound,
00348 const BCP_lp_result& lpres,
00349 const BCP_vec<BCP_var*>& vars,
00350 const BCP_vec<BCP_cut*>& cuts);
00351
00352
00373 virtual BCP_solution*
00374 test_feasibility(const BCP_lp_result& lp_result,
00375 const BCP_vec<BCP_var*>& vars,
00376 const BCP_vec<BCP_cut*>& cuts);
00392 BCP_solution_generic*
00393 test_binary(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00394 const double etol) const;
00397 BCP_solution_generic*
00398 test_integral(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00399 const double etol) const;
00401 BCP_solution_generic*
00402 test_full(const BCP_lp_result& lpres, const BCP_vec<BCP_var*>& vars,
00403 const double etol) const;
00412 virtual BCP_solution*
00413 generate_heuristic_solution(const BCP_lp_result& lpres,
00414 const BCP_vec<BCP_var*>& vars,
00415 const BCP_vec<BCP_cut*>& cuts);
00418
00433 virtual void
00434 pack_feasible_solution(BCP_buffer& buf, const BCP_solution* sol);
00435
00436
00458 virtual void
00459 pack_primal_solution(BCP_buffer& buf,
00460 const BCP_lp_result& lp_result,
00461 const BCP_vec<BCP_var*>& vars,
00462 const BCP_vec<BCP_cut*>& cuts);
00463
00485 virtual void
00486 pack_dual_solution(BCP_buffer& buf,
00487 const BCP_lp_result& lp_result,
00488 const BCP_vec<BCP_var*>& vars,
00489 const BCP_vec<BCP_cut*>& cuts);
00492
00513 virtual void
00514 display_lp_solution(const BCP_lp_result& lp_result,
00515 const BCP_vec<BCP_var*>& vars,
00516 const BCP_vec<BCP_cut*>& cuts,
00517 const bool final_lp_solution);
00520
00521
00522
00523
00524
00532
00539 virtual int
00540 next_indexed_var(int prev_index);
00547 virtual BCP_var_indexed*
00548 create_indexed_var(int index, const BCP_vec<BCP_cut*>& cuts,
00549 BCP_col& col);
00552
00564 virtual void
00565 restore_feasibility(const BCP_lp_result& lpres,
00566 const std::vector<double*> dual_rays,
00567 const BCP_vec<BCP_var*>& vars,
00568 const BCP_vec<BCP_cut*>& cuts,
00569 BCP_vec<BCP_var*>& vars_to_add,
00570 BCP_vec<BCP_col*>& cols_to_add);
00571
00572
00608 virtual void
00609 cuts_to_rows(const BCP_vec<BCP_var*>& vars,
00610 BCP_vec<BCP_cut*>& cuts,
00611 BCP_vec<BCP_row*>& rows,
00612
00613 const BCP_lp_result& lpres,
00614 BCP_object_origin origin, bool allow_multiple);
00615
00636 virtual void
00637 vars_to_cols(const BCP_vec<BCP_cut*>& cuts,
00638 BCP_vec<BCP_var*>& vars,
00639 BCP_vec<BCP_col*>& cols,
00640
00641 const BCP_lp_result& lpres,
00642 BCP_object_origin origin, bool allow_multiple);
00645
00661 virtual void
00662 generate_cuts_in_lp(const BCP_lp_result& lpres,
00663 const BCP_vec<BCP_var*>& vars,
00664 const BCP_vec<BCP_cut*>& cuts,
00665 BCP_vec<BCP_cut*>& new_cuts,
00666 BCP_vec<BCP_row*>& new_rows);
00667
00684 virtual void
00685 generate_vars_in_lp(const BCP_lp_result& lpres,
00686 const BCP_vec<BCP_var*>& vars,
00687 const BCP_vec<BCP_cut*>& cuts,
00688 const bool before_fathom,
00689 BCP_vec<BCP_var*>& new_vars,
00690 BCP_vec<BCP_col*>& new_cols);
00691
00699 virtual BCP_object_compare_result
00700 compare_cuts(const BCP_cut* c0, const BCP_cut* c1);
00701
00710 virtual BCP_object_compare_result
00711 compare_vars(const BCP_var* v0, const BCP_var* v1);
00714
00715 virtual void
00716 select_vars_to_delete(const BCP_lp_result& lpres,
00717 const BCP_vec<BCP_var*>& vars,
00718 const BCP_vec<BCP_cut*>& cuts,
00719 const bool before_fathom,
00720 BCP_vec<int>& deletable);
00721 virtual void
00722 select_cuts_to_delete(const BCP_lp_result& lpres,
00723 const BCP_vec<BCP_var*>& vars,
00724 const BCP_vec<BCP_cut*>& cuts,
00725 const bool before_fathom,
00726 BCP_vec<int>& deletable);
00727
00745 virtual void
00746 logical_fixing(const BCP_lp_result& lpres,
00747 const BCP_vec<BCP_var*>& vars,
00748 const BCP_vec<BCP_cut*>& cuts,
00749 const BCP_vec<BCP_obj_status>& var_status,
00750 const BCP_vec<BCP_obj_status>& cut_status,
00751 const int var_bound_changes_since_logical_fixing,
00752 BCP_vec<int>& changed_pos, BCP_vec<double>& new_bd);
00757 void
00758 reduced_cost_fixing(const double* dj, const double* x, const double gap,
00759 BCP_vec<BCP_var*>& vars, int& newly_changed);
00760
00761
00798 virtual BCP_branching_decision
00799 select_branching_candidates(const BCP_lp_result& lpres,
00800 const BCP_vec<BCP_var*>& vars,
00801 const BCP_vec<BCP_cut*>& cuts,
00802 const BCP_lp_var_pool& local_var_pool,
00803 const BCP_lp_cut_pool& local_cut_pool,
00804 BCP_vec<BCP_lp_branching_object*>& cands);
00811 void
00812 branch_close_to_half(const BCP_lp_result& lpres,
00813 const BCP_vec<BCP_var*>& vars,
00814 const int to_be_selected,
00815 const double etol,
00816 BCP_vec<BCP_lp_branching_object*>& candidates);
00821 void
00822 branch_close_to_one(const BCP_lp_result& lpres,
00823 const BCP_vec<BCP_var*>& vars,
00824 const int to_be_selected,
00825 const double etol,
00826 BCP_vec<BCP_lp_branching_object*>& candidates);
00831 void
00832 append_branching_vars(const double* x,
00833 const BCP_vec<BCP_var*>& vars,
00834 const BCP_vec<int>& select_pos,
00835 BCP_vec<BCP_lp_branching_object*>& candidates);
00852 virtual BCP_branching_object_relation
00853 compare_branching_candidates(BCP_presolved_lp_brobj* new_solved,
00854 BCP_presolved_lp_brobj* old_solved);
00874 virtual void
00875 set_actions_for_children(BCP_presolved_lp_brobj* best);
00876
00885 virtual void
00886 set_user_data_for_children(BCP_presolved_lp_brobj* best,
00887 const int selected);
00891 virtual void
00892 set_user_data_for_children(BCP_presolved_lp_brobj* best);
00895
00896
00918 virtual void
00919 purge_slack_pool(const BCP_vec<BCP_cut*>& slack_pool,
00920 BCP_vec<int>& to_be_purged);
00922 };
00923
00924
00925
00926 #endif