/home/coin/SVN-release/CoinAll-1.1.0/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 
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 // All these functions are defined in BCP_lp_user.cpp, except for those that
00039 // have no counterparts in p.defaults, i.e., for those that have no builtin
00040 // pairs.
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     // Functions related to indexed vars. Must be written if BCP is supposed to
00522     // track the indexed variables yet to be priced out, i.e., if the parameter
00523     // MaintainIndexedVarPricingList is set to true.
00524 
00532     // *FIXME* : A link here to the description of various variable types?
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, // on what to expand
00610                  BCP_vec<BCP_cut*>& cuts,       // what to expand
00611                  BCP_vec<BCP_row*>& rows,       // the expanded rows
00612                  // things that the user can use for lifting cuts if allowed
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, // on what to expand
00638                  BCP_vec<BCP_var*>& vars,       // what to expand
00639                  BCP_vec<BCP_col*>& cols,       // the expanded cols
00640                  // things that the user can use for lifting vars if allowed
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     // purging the slack cut pool (candidates for branching on cut)
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

Generated on Sun Nov 14 14:06:29 2010 for Coin-All by  doxygen 1.4.7