/home/coin/SVN-release/Bcp-1.2.1/Bcp/src/include/BCP_lp_user.hpp

Go to the documentation of this file.
00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #ifndef _BCP_LP_USER_H
00004 #define _BCP_LP_USER_H
00005 
00006 // This file is fully prepared for doxygen.
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 // All these functions are defined in BCP_lp_user.cpp, except for those that
00042 // have no counterparts in p.defaults, i.e., for those that have no builtin
00043 // pairs.
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, // on what to expand
00570                  BCP_vec<BCP_cut*>& cuts,       // what to expand
00571                  BCP_vec<BCP_row*>& rows,       // the expanded rows
00572                  // things that the user can use for lifting cuts if allowed
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, // on what to expand
00598                  BCP_vec<BCP_var*>& vars,       // what to expand
00599                  BCP_vec<BCP_col*>& cols,       // the expanded cols
00600                  // things that the user can use for lifting vars if allowed
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     // purging the slack cut pool (candidates for branching on cut)
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

Generated on Thu Jan 15 03:00:58 2009 for coin-Bcp by  doxygen 1.4.7