/home/coin/SVN-release/OS-2.0.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     //=========================================================================
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, // on what to expand
00577                  BCP_vec<BCP_cut*>& cuts,       // what to expand
00578                  BCP_vec<BCP_row*>& rows,       // the expanded rows
00579                  // things that the user can use for lifting cuts if allowed
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, // on what to expand
00605                  BCP_vec<BCP_var*>& vars,       // what to expand
00606                  BCP_vec<BCP_col*>& cols,       // the expanded cols
00607                  // things that the user can use for lifting vars if allowed
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     // purging the slack cut pool (candidates for branching on cut)
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

Generated on Thu Oct 8 03:02:51 2009 by  doxygen 1.4.7