coin-Bcp
|
#include <MCF2_lp.hpp>
Public Member Functions | |
MCF2_lp () | |
virtual | ~MCF2_lp () |
virtual void | unpack_module_data (BCP_buffer &buf) |
Unpack the initial information sent to the LP process by the Tree Manager. More... | |
virtual OsiSolverInterface * | initialize_solver_interface () |
Create LP solver environment. More... | |
virtual void | initialize_new_search_tree_node (const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const BCP_vec< BCP_obj_status > &var_status, const BCP_vec< BCP_obj_status > &cut_status, BCP_vec< int > &var_changed_pos, BCP_vec< double > &var_new_bd, BCP_vec< int > &cut_changed_pos, BCP_vec< double > &cut_new_bd) |
Initializing a new search tree node. More... | |
virtual BCP_solution * | test_feasibility (const BCP_lp_result &lp_result, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts) |
Evaluate and return MIP feasibility of the current solution. More... | |
virtual double | compute_lower_bound (const double old_lower_bound, const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts) |
Compute a true lower bound for the subproblem. More... | |
virtual void | generate_vars_in_lp (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const bool before_fathom, BCP_vec< BCP_var * > &new_vars, BCP_vec< BCP_col * > &new_cols) |
Generate variables within the LP process. More... | |
virtual void | vars_to_cols (const BCP_vec< BCP_cut * > &cuts, BCP_vec< BCP_var * > &vars, BCP_vec< BCP_col * > &cols, const BCP_lp_result &lpres, BCP_object_origin origin, bool allow_multiple) |
Convert a set of variables into corresponding columns for the current LP relaxation. More... | |
virtual BCP_branching_decision | select_branching_candidates (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const BCP_lp_var_pool &local_var_pool, const BCP_lp_cut_pool &local_cut_pool, BCP_vec< BCP_lp_branching_object * > &cands, bool force_branch=false) |
Decide whether to branch or not and select a set of branching candidates if branching is decided upon. More... | |
![]() | |
void | setOsiBabSolver (OsiBabSolver *ptr) |
OsiBabSolver * | getOsiBabSolver () |
void | print (const bool ifprint, const char *format,...) const |
A method to print a message with the process id. More... | |
int | process_id () const |
What is the process id of the current process. More... | |
int | parent () const |
the process id of the parent More... | |
void | send_message (const int target, const BCP_buffer &buf, BCP_message_tag tag=BCP_Msg_User) |
Send a message to a particular process. More... | |
void | receive_message (const int sender, BCP_buffer &buf, BCP_message_tag tag=BCP_Msg_User) |
Wait for a message and receive it. More... | |
void | broadcast_message (const BCP_process_t proc_type, const BCP_buffer &buf) |
Broadcast the message to all processes of the given type. More... | |
virtual void | process_message (BCP_buffer &buf) |
Process a message that has been sent by another process' user part to this process' user part. More... | |
virtual void | initialize_int_and_sos_list (std::vector< OsiObject * > &intAndSosObjects) |
Create the list of objects that can be used for branching (simple integer vars and SOS sets). More... | |
virtual void | load_problem (OsiSolverInterface &osi, BCP_problem_core *core, BCP_var_set &vars, BCP_cut_set &cuts) |
Load the problem specified by core, vars, and cuts into the solver interface. More... | |
virtual void | modify_lp_parameters (OsiSolverInterface *lp, const int changeType, bool in_strong_branching) |
Modify parameters of the LP solver before optimization. More... | |
virtual void | process_lp_result (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const double old_lower_bound, double &true_lower_bound, BCP_solution *&sol, BCP_vec< BCP_cut * > &new_cuts, BCP_vec< BCP_row * > &new_rows, BCP_vec< BCP_var * > &new_vars, BCP_vec< BCP_col * > &new_cols) |
Process the result of an iteration. More... | |
virtual BCP_solution * | generate_heuristic_solution (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts) |
Try to generate a heuristic solution (or return one generated during cut/variable generation. More... | |
virtual void | restore_feasibility (const BCP_lp_result &lpres, const std::vector< double * > dual_rays, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, BCP_vec< BCP_var * > &vars_to_add, BCP_vec< BCP_col * > &cols_to_add) |
Restoring feasibility. More... | |
virtual void | select_vars_to_delete (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const bool before_fathom, BCP_vec< int > &deletable) |
virtual void | select_cuts_to_delete (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const bool before_fathom, BCP_vec< int > &deletable) |
void | reduced_cost_fixing (const double *dj, const double *x, const double gap, BCP_vec< BCP_var * > &vars, int &newly_changed) |
Reduced cost fixing. More... | |
virtual BCP_branching_object_relation | compare_branching_candidates (BCP_presolved_lp_brobj *new_solved, BCP_presolved_lp_brobj *old_solved) |
Decide which branching object is preferred for branching. More... | |
virtual void | set_actions_for_children (BCP_presolved_lp_brobj *best) |
Decide what to do with the children of the selected branching object. More... | |
virtual void | set_user_data_for_children (BCP_presolved_lp_brobj *best, const int selected) |
For each child create a user data object and put it into the appropriate entry in best->user_data() . More... | |
virtual void | set_user_data_for_children (BCP_presolved_lp_brobj *best) |
Deprecated version of the previos method (it does not pass the index of the selected branching candidate). More... | |
void | setLpProblemPointer (BCP_lp_prob *ptr) |
Set the pointer. More... | |
BCP_lp_prob * | getLpProblemPointer () |
Get the pointer. More... | |
double | upper_bound () const |
Return what is the best known upper bound (might be BCP_DBL_MAX) More... | |
bool | over_ub (double lb) const |
Return true / false depending on whether the lb argument is over the current upper bound or not. More... | |
int | current_phase () const |
Return the phase the algorithm is in. More... | |
int | current_level () const |
Return the level of the search tree node being processed. More... | |
int | current_index () const |
Return the internal index of the search tree node being processed. More... | |
int | current_iteration () const |
Return the iteration count within the search tree node being processed. More... | |
double | start_time () const |
Return when the LP process started. More... | |
BCP_user_data * | get_user_data () |
Return a pointer to the BCP_user_data structure the user (may have) stored in this node. More... | |
char | get_param (const BCP_lp_par::chr_params key) const |
int | get_param (const BCP_lp_par::int_params key) const |
double | get_param (const BCP_lp_par::dbl_params key) const |
const BCP_string & | get_param (const BCP_lp_par::str_params key) const |
void | set_param (const BCP_lp_par::chr_params key, const bool val) |
void | set_param (const BCP_lp_par::chr_params key, const char val) |
void | set_param (const BCP_lp_par::int_params key, const int val) |
void | set_param (const BCP_lp_par::dbl_params key, const double val) |
void | set_param (const BCP_lp_par::str_params key, const char *val) |
void | send_feasible_solution (const BCP_solution *sol) |
BCP_lp_user () | |
Being virtual, the destructor invokes the destructor for the real type of the object being deleted. More... | |
virtual | ~BCP_lp_user () |
Being virtual, the destructor invokes the destructor for the real type of the object being deleted. More... | |
void | select_nonzeros (const double *first, const double *last, const double etol, BCP_vec< int > &nonzeros) const |
Select all nonzero entries. More... | |
void | select_zeros (const double *first, const double *last, const double etol, BCP_vec< int > &zeros) const |
Select all zero entries. More... | |
void | select_positives (const double *first, const double *last, const double etol, BCP_vec< int > &positives) const |
Select all positive entries. More... | |
void | select_fractions (const double *first, const double *last, const double etol, BCP_vec< int > &fractions) const |
Select all fractional entries. More... | |
BCP_solution_generic * | test_binary (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const double etol) const |
Test whether all variables are 0/1. More... | |
BCP_solution_generic * | test_integral (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const double etol) const |
Test whether all variables are integer. More... | |
BCP_solution_generic * | test_full (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const double etol) const |
Test whether the variables specified as integers are really integer. More... | |
virtual void | pack_feasible_solution (BCP_buffer &buf, const BCP_solution *sol) |
Pack a MIP feasible solution into a buffer. More... | |
virtual void | pack_primal_solution (BCP_buffer &buf, const BCP_lp_result &lp_result, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts) |
Pack the information necessary for cut generation into the buffer. More... | |
virtual void | pack_dual_solution (BCP_buffer &buf, const BCP_lp_result &lp_result, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts) |
Pack the information necessary for variable generation into the buffer. More... | |
virtual void | display_lp_solution (const BCP_lp_result &lp_result, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const bool final_lp_solution) |
Display the result of most recent LP optimization. More... | |
virtual void | cuts_to_rows (const BCP_vec< BCP_var * > &vars, BCP_vec< BCP_cut * > &cuts, BCP_vec< BCP_row * > &rows, const BCP_lp_result &lpres, BCP_object_origin origin, bool allow_multiple) |
Convert (and possibly lift) a set of cuts into corresponding rows for the current LP relaxation. More... | |
virtual void | generate_cuts_in_lp (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, BCP_vec< BCP_cut * > &new_cuts, BCP_vec< BCP_row * > &new_rows) |
Generate cuts within the LP process. More... | |
virtual BCP_object_compare_result | compare_cuts (const BCP_cut *c0, const BCP_cut *c1) |
Compare two generated cuts. More... | |
virtual BCP_object_compare_result | compare_vars (const BCP_var *v0, const BCP_var *v1) |
Compare two generated variables. More... | |
virtual void | logical_fixing (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts, const BCP_vec< BCP_obj_status > &var_status, const BCP_vec< BCP_obj_status > &cut_status, const int var_bound_changes_since_logical_fixing, BCP_vec< int > &changed_pos, BCP_vec< double > &new_bd) |
This method provides an opportunity for the user to tighten the bounds of variables. More... | |
virtual int | try_to_branch (OsiBranchingInformation &branchInfo, OsiSolverInterface *solver, OsiChooseVariable *choose, OsiBranchingObject *&branchObject, bool allowVarFix) |
Select the "close-to-half" variables for strong branching. More... | |
void | branch_close_to_half (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const int to_be_selected, const double etol, BCP_vec< BCP_lp_branching_object * > &candidates) |
Select the "close-to-half" variables for strong branching. More... | |
void | branch_close_to_one (const BCP_lp_result &lpres, const BCP_vec< BCP_var * > &vars, const int to_be_selected, const double etol, BCP_vec< BCP_lp_branching_object * > &candidates) |
Select the "close-to-one" variables for strong branching. More... | |
void | append_branching_vars (const double *x, const BCP_vec< BCP_var * > &vars, const BCP_vec< int > &select_pos, BCP_vec< BCP_lp_branching_object * > &candidates) |
This helper method creates branching variable candidates and appends them to cans . More... | |
virtual void | purge_slack_pool (const BCP_vec< BCP_cut * > &slack_pool, BCP_vec< int > &to_be_purged) |
Selectively purge the list of slack cuts. More... | |
![]() | |
virtual | ~BCP_user_class () |
Private Attributes | |
OsiSolverInterface * | cg_lp |
BCP_parameter_set< MCF2_par > | par |
MCF2_data | data |
std::vector < MCF2_branch_decision > * | branch_history |
std::map< int, double > * | flows |
BCP_vec< BCP_var * > | gen_vars |
bool | generated_vars |
Definition at line 12 of file MCF2_lp.hpp.
|
inline |
Definition at line 25 of file MCF2_lp.hpp.
|
inlinevirtual |
Definition at line 26 of file MCF2_lp.hpp.
References branch_history, cg_lp, flows, gen_vars, and purge_ptr_vector().
|
virtual |
Unpack the initial information sent to the LP process by the Tree Manager.
This information was packed by the method BCP_tm_user::pack_module_data() invoked with BCP_ProcessType_LP
as the third (target process type) argument.
Default: empty method.
Reimplemented from BCP_lp_user.
|
virtual |
Create LP solver environment.
Create the LP solver class that will be used for solving the LP relaxations. The default implementation picks up which COIN_USE_XXX
is defined and initializes an lp solver of that type. This is probably OK for most users. The only reason to override this method is to be able to choose at runtime which lp solver to instantiate (maybe even different solvers on different processors). In this case she should probably also override the pack_warmstart() and unpack_warmstart() methods in this class and in the BCP_tm_user class.
Reimplemented from BCP_lp_user.
|
virtual |
Initializing a new search tree node.
This method serves as hook for the user to do some preprocessing on a search tree node before the node is processed. Also, logical fixing results can be returned in the last four parameters. This might be very useful if the branching implies significant tightening.
Default: empty method.
vars | (IN) The variables in the current formulation |
cuts | (IN) The cuts in the current formulation |
var_status | (IN) The stati of the variables |
cut_status | (IN) The stati of the cuts |
var_changed_pos | (OUT) The positions of the variables whose bounds should be tightened |
var_new_bd | (OUT) The new lb/ub of those variables |
cut_changed_pos | (OUT) The positions of the cuts whose bounds should be tightened |
cut_new_bd | (OUT) The new lb/ub of those cuts |
Reimplemented from BCP_lp_user.
|
virtual |
Evaluate and return MIP feasibility of the current solution.
If the solution is MIP feasible, return a solution object otherwise return a NULL pointer. The useris also welcome to heuristically generate a solution and return a pointer to that solution (although the user will have another chance (after cuts and variables are generated) to return/create heuristically generated solutions. (After all, it's quite possible that solutions are generated during cut/variable generation.)
Default: test feasibility based on the FeeasibilityTest
parameter in BCP_lp_par which defults to BCP_FullTest_Feasible
.
lp_result | the result of the most recent LP optimization |
vars | variables currently in the formulation |
cuts | variables currently in the formulation |
Reimplemented from BCP_lp_user.
|
virtual |
Compute a true lower bound for the subproblem.
In case column generation is done the lower bound for the subproblem might not be the same as the objective value of the current LP relaxation. Here the user has an option to return a true lower bound.
The default implementation returns the objective value of the current LP relaxation if no column generation is done, otherwise returns the current (somehow previously computed) true lower bound.
Reimplemented from BCP_lp_user.
|
virtual |
Generate variables within the LP process.
Sometimes too much information would need to be transmitted for variable generation or the variable generation is so fast that transmitting the info would take longer than generating the variables. In such cases it might be better to generate the variables locally. This routine provides the opportunity.
Default: empty method.
lpres | solution to the current LP relaxation (IN) |
vars | the variabless currently in the relaxation (IN) |
cuts | the cuts currently in the relaxation (IN) |
before_fathom | if true then BCP is about to fathom the node, so spend some extra effort generating variables if you want to avoid that... |
new_vars | the vector of generated variables (OUT) |
new_cols | the correspontding columns(OUT) |
Reimplemented from BCP_lp_user.
|
virtual |
Convert a set of variables into corresponding columns for the current LP relaxation.
Converting means to compute for each variable the coefficients corresponding to each cut and create BCP_col objects that can be added to the formulation.
See the documentation of cuts_to_rows() above for the use of this method (just reverse the role of cuts and variables.)
cuts | the cuts currently in the relaxation (IN) |
vars | the variables to be converted (IN/OUT) |
cols | the colums the variables convert into (OUT) |
lpres | solution to the current LP relaxation (IN) |
origin | where the do the cuts come from (IN) |
allow_multiple | whether multiple expansion, i.e., lifting, is allowed (IN) |
Default: throw an exception (if this method is invoked then the user must have generated variables and BCP has no way to know how to convert them).
Reimplemented from BCP_lp_user.
|
virtual |
Decide whether to branch or not and select a set of branching candidates if branching is decided upon.
The return value indicates what should be done: branching, continuing with the same node or abandoning the node completely.
Default: Branch if both local pools are empty. If branching is done then several (based on the StrongBranch_CloseToHalfNum
and StrongBranch_CloseToOneNum
parameters in BCP_lp_par) variables are selected for strong branching.
"Close-to-half" variables are those that should be integer and are at a fractional level. The measure of their fractionality is their distance from the closest integer. The most fractional variables will be selected, i.e., those that are close to half. If there are too many such variables then those with higher objective value have priority.
"Close-to-on" is interpreted in a more literal sense. It should be used only if the integer variables are binary as it select those fractional variables which are away from 1 but are still close. If there are too many such variables then those with lower objective value have priority.
lpres | the result of the most recent LP optimization. |
vars | the variables in the current formulation. |
cuts | the cuts in the current formulation. |
local_var_pool | the local pool that holds variables with negative reduced cost. In case of continuing with the node the best so many variables will be added to the formulation (those with the most negative reduced cost). |
local_cut_pool | the local pool that holds violated cuts. In case of continuing with the node the best so many cuts will be added to the formulation (the most violated ones). |
cands | the generated branching candidates. |
force_branch | indicate whether to force branching regardless of the size of the local cut/var pools |
Reimplemented from BCP_lp_user.
|
private |
Definition at line 14 of file MCF2_lp.hpp.
Referenced by ~MCF2_lp().
|
private |
Definition at line 15 of file MCF2_lp.hpp.
|
private |
Definition at line 16 of file MCF2_lp.hpp.
|
private |
Definition at line 17 of file MCF2_lp.hpp.
Referenced by ~MCF2_lp().
|
private |
Definition at line 19 of file MCF2_lp.hpp.
Referenced by ~MCF2_lp().
Definition at line 21 of file MCF2_lp.hpp.
Referenced by ~MCF2_lp().
|
private |
Definition at line 22 of file MCF2_lp.hpp.