BM.hpp
Go to the documentation of this file.
1 // (C) Copyright International Business Machines Corporation and Carnegie Mellon University 2006, 2007
2 // All Rights Reserved.
3 // This code is published under the Eclipse Public License.
4 //
5 // Authors :
6 // Laszlo Ladanyi, International Business Machines Corporation
7 // Pierre Bonami, Carnegie Mellon University,
8 //
9 // Date : 03/15/2006
10 #ifndef _BM_H
11 #define _BM_H
12 
13 #include "BCP_USER.hpp"
14 #include "BCP_parameters.hpp"
15 #include "BCP_tm_user.hpp"
16 #include "BCP_lp_user.hpp"
17 
18 #include "BB_cut.hpp"
19 
20 #include "BonIpoptWarmStart.hpp"
21 
22 #define BM_DISREGARD_SOS
23 
24 //#############################################################################
25 
26 class BM_node : public BCP_user_data {
27 public:
33 public:
36  buf.unpack(numNlpFailed_);
37  }
38  ~BM_node() {}
39 
40  inline void pack(BCP_buffer& buf) const {
41  buf.pack(numNlpFailed_);
42  }
43 };
44 
45 //#############################################################################
46 
47 enum BM_message {
51 };
52 
56 };
57 
58 //#############################################################################
59 
60 class BM_par {
61 public:
62  enum chr_params {
63  //
67  };
68  enum int_params {
69  //
74 
75  // twice the number of candidates if all candidates have 2 children.
76  // We want to do SB on at least this many (if there are this many)
78 
80  // The level where (and below) there are no min number of branches to
81  // be considered and SB need not be done (we can use pseudo costs
82  // instead)
84 
86  };
87  enum dbl_params {
89  //
91  };
92  enum str_params {
95  //
97  };
100  //
102  };
103 };
104 
105 //#############################################################################
106 
107 class BM_stats {
108 public:
111  numberSbSolves_(0),
112  numberFixed_(0),
116  {}
117 
118  ~BM_stats();
119 
120  inline void incNumberNodeSolves() {
122  }
123  inline void incNumberSbSolves(int cnt) {
124  numberSbSolves_ += cnt;
125  }
126  inline void incNumberFixed() {
127  numberFixed_++;
128  }
129  inline void updateStrongBrachingInfo(int chosenIndex, int listLength) {
131  sumStrongBranchingListIndices_ += chosenIndex;
133  (double)(listLength-chosenIndex)/(double)listLength;
134  }
135 private:
148 };
149 
150 //#############################################################################
151 
152 // Data needed to be sent off to do strong branching
153 
155  // These are the input for doing the branching
157  int objInd;
158  int colInd;
159  double solval;
160  double bd;
161  // These are the results of doing the branching
162  int status;
163  double objval;
164  int iter;
165  double time;
166 };
167 
168 //#############################################################################
169 
170 class BM_tm : public BCP_tm_user {
171 
172 public:
173 
178  OsiPseudoCosts pseudoCosts_;
179 
180 public:
181 
184  BM_tm() {}
186 
188  virtual ~BM_tm() {}
190 
193  virtual void pack_module_data(BCP_buffer& buf, BCP_process_t ptype);
194 
196 
198  virtual void initialize_core(BCP_vec<BCP_var_core*>& vars,
200  BCP_lp_relax*& matrix);
201 
208  virtual void
209  create_root(BCP_vec<BCP_var*>& added_vars,
210  BCP_vec<BCP_cut*>& added_cuts,
211  BCP_user_data*& user_data);
212 
214  virtual void display_feasible_solution(const BCP_solution* sol);
215 
218  virtual void
220 
222  void pack_pseudo_costs(BCP_buffer& buf);
223 
225  virtual void display_final_information(const BCP_lp_statistics& lp_stat);
226 
227  virtual void init_new_phase(int phase,
228  BCP_column_generation& colgen,
229  CoinSearchTreeBase*& candidates);
230 
231  void readIpopt();
232 
233  private:
234 
236  void write_AMPL_solution(const BCP_solution* sol,
237  bool write_file, bool write_screen);
238 
239 };
240 
241 //#############################################################################
242 
244 {
247  int objInd;
248  int colInd;
249  int status[2];
250  int iter[2];
251  double objval[2];
252  double varChange[2];
253  double time[2];
254 };
255 
256 //#############################################################################
257 
258 #include <OsiAuxInfo.hpp>
259 #include <OsiCuts.hpp>
260 #include "CglGomory.hpp"
261 #include "CglProbing.hpp"
262 #include "CglKnapsackCover.hpp"
263 #include "CglMixedIntegerRounding.hpp"
264 #include "BonOaFeasChecker.hpp"
265 #include "BonOaNlpOptim.hpp"
266 #include "BonEcpCuts.hpp"
267 #include "BonOACutGenerator2.hpp"
268 
269 #include "BCP_lp_user.hpp"
270 #include "BonAmplSetup.hpp"
271 #include "BonChooseVariable.hpp"
272 
273 class BM_lp : public BCP_lp_user
274 {
275  /* There's no totalTime_ and nodeTime_. Look at the top of BM.cpp */
276  // double totalTime_;
277  // double nodeTime_;
279 
284 
288 
290 
296 
297  OsiCuts cuts_;
298 
302  int* objInd_;
303  int objNum_;
304 
313  int* infInd_;
314  double* infUseful_;
315  int infNum_;
316  int* feasInd_;
317  double* feasUseful_;
318  int feasNum_;
319 
325 
328 
331 
332 public:
333  BM_lp();
334  virtual ~BM_lp();
335 
336  inline int& numNlpFailed() {
337  return (dynamic_cast<BM_node*>(get_user_data()))->numNlpFailed_;
338  }
339 
340  virtual void
342 
345  virtual void
347 
348  virtual OsiSolverInterface *
350 
351  virtual void
352  load_problem(OsiSolverInterface& osi, BCP_problem_core* core,
353  BCP_var_set& vars, BCP_cut_set& cuts);
354 
355  virtual void
356  modify_lp_parameters(OsiSolverInterface* lp, bool in_strong_branching);
357 
358  virtual BCP_solution*
359  test_feasibility(const BCP_lp_result& lp_result,
360  const BCP_vec<BCP_var*>& vars,
361  const BCP_vec<BCP_cut*>& cuts);
363  const BCP_vec<BCP_var*>& vars);
365  const BCP_vec<BCP_var*>& vars,
366  const BCP_vec<BCP_cut*>& cuts);
367 
368  virtual void
369  generate_cuts_in_lp(const BCP_lp_result& lpres,
370  const BCP_vec<BCP_var*>& vars,
371  const BCP_vec<BCP_cut*>& cuts,
372  BCP_vec<BCP_cut*>& new_cuts,
373  BCP_vec<BCP_row*>& new_rows);
374  virtual void
375  cuts_to_rows(const BCP_vec<BCP_var*>& vars, // on what to expand
376  BCP_vec<BCP_cut*>& cuts, // what to expand
377  BCP_vec<BCP_row*>& rows, // the expanded rows
378  // things that the user can use for lifting cuts if allowed
379  const BCP_lp_result& lpres,
380  BCP_object_origin origin, bool allow_multiple);
381  virtual double
382  compute_lower_bound(const double old_lower_bound,
383  const BCP_lp_result& lpres,
384  const BCP_vec<BCP_var*>& vars,
385  const BCP_vec<BCP_cut*>& cuts);
386 
387  virtual void
389  const BCP_vec<BCP_cut*>& cuts,
390  const BCP_vec<BCP_obj_status>& vs,
391  const BCP_vec<BCP_obj_status>& cs,
392  BCP_vec<int>& var_changed_pos,
393  BCP_vec<double>& var_new_bd,
394  BCP_vec<int>& cut_changed_pos,
395  BCP_vec<double>& cut_new_bd);
396 
397  virtual BCP_branching_decision
399  const BCP_vec<BCP_var*>& vars,
400  const BCP_vec<BCP_cut*>& cuts,
401  const BCP_lp_var_pool& local_var_pool,
402  const BCP_lp_cut_pool& local_cut_pool,
404  bool force_branch = false);
405 
406  BCP_branching_decision bbBranch(OsiBranchingInformation& brInfo,
409 
411  void send_pseudo_cost_update(OsiBranchingInformation& branchInfo);
412  void unpack_pseudo_costs(BCP_buffer& buf);
413  int sort_objects(OsiBranchingInformation& branchInfo,
414  Bonmin::BonChooseVariable* choose, int& branchNum);
415  void clear_SB_results();
416  void collect_branch_data(OsiBranchingInformation& branchInfo,
417  OsiSolverInterface* solver,
418  const int branchNum,
419  BM_BranchData* branchData);
420  void do_distributed_SB(OsiBranchingInformation& branchInfo,
421  OsiSolverInterface* solver,
422  const CoinWarmStart* cws,
423  const int branchNum,
424  const int* pids, const int pidNum);
425  bool isBranchFathomable(int status, double obj);
426  int process_SB_results(OsiBranchingInformation& branchInfo,
427  OsiSolverInterface* solver,
429  OsiBranchingObject*& branchObject);
430  int try_to_branch(OsiBranchingInformation& branchInfo,
431  OsiSolverInterface* solver,
433  OsiBranchingObject*& branchObject,
434  bool allowVarFix);
435 
436  virtual void
438  const int selected);
439 
440 };
441 
442 //#############################################################################
443 
444 #include "BCP_USER.hpp"
445 
446 class BM_pack : public BCP_user_pack {
447 public:
448  virtual ~BM_pack() {}
449 
450  virtual void pack_user_data(const BCP_user_data* ud, BCP_buffer& buf);
452 
453  virtual void pack_cut_algo(const BCP_cut_algo* cut, BCP_buffer& buf);
454  virtual BCP_cut_algo* unpack_cut_algo(BCP_buffer& buf);
455 
456 };
457 
458 //#############################################################################
459 
460 class BM_init : public USER_initialize {
461 
462 public:
463 
464  virtual BCP_tm_user * tm_init(BCP_tm_prob& p,
465  const int argnum,
466  const char * const * arglist);
467 
468  virtual BCP_lp_user * lp_init(BCP_lp_prob& p);
469 
471 };
472 
473 #endif
BCP_object_origin
This enumerative constant describes the origin (originating process) of an object (variable or cut)...
Definition: BCP_enum.hpp:249
BM_SB_result * bestSbResult_
A pointer to the entry that got selected.
Definition: BM.hpp:324
int feasNum_
Definition: BM.hpp:318
double time[2]
Definition: BM.hpp:253
virtual void display_feasible_solution(const BCP_solution *sol)
Print a feasible solution.
Definition: BM_tm.cpp:251
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...
Definition: BM_lp.cpp:291
This class describes the core of the MIP problem, the variables/cuts in it as well as the matrix corr...
double time
Definition: BM.hpp:165
BCP_branching_decision bbBranch(OsiBranchingInformation &brInfo, BCP_vec< BCP_lp_branching_object * > &cands)
double * feasUseful_
Definition: BM.hpp:317
BCP_buffer & pack(const T &value)
Pack a single object of type T.
Definition: BCP_buffer.hpp:177
double objval
Definition: BM.hpp:163
Definition: BM.hpp:26
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-&gt;user_data()...
virtual void create_root(BCP_vec< BCP_var * > &added_vars, BCP_vec< BCP_cut * > &added_cuts, BCP_user_data *&user_data)
Create the set of extra variables and cuts that should be added to the formulation in the root node...
Definition: BM_tm.cpp:137
int iter[2]
Definition: BM.hpp:250
BCP_buffer & unpack(T &value)
Unpack a single object of type T.
Definition: BCP_buffer.hpp:186
int iter
Definition: BM.hpp:164
This class chooses a variable to branch on.
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.
Definition: BM_lp.cpp:165
BM_lp()
Definition: BM_lp.cpp:30
virtual void process_message(BCP_buffer &buf)
Process a message that has been sent by another process&#39; user part to this process&#39; user part...
Definition: BM_tm.cpp:210
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.
Definition: BM_lp.cpp:136
void updateStrongBrachingInfo(int chosenIndex, int listLength)
Definition: BM.hpp:129
void pack_pseudo_costs(BCP_buffer &buf)
Definition: BM_tm.cpp:335
int branchEval
0: Not done 1: Only down 2: only up 3: both ways
Definition: BM.hpp:246
This is the class from which the user should derive her own algorithmic cuts.
Definition: BCP_cut.hpp:242
BM_BoundChange
Definition: BM.hpp:53
BCP_process_t
This enumerative constant describes the various process types.
void write_AMPL_solution(const BCP_solution *sol, bool write_file, bool write_screen)
auxilliary method for handling output for AMPL
Definition: BM_tm.cpp:147
void collect_branch_data(OsiBranchingInformation &branchInfo, OsiSolverInterface *solver, const int branchNum, BM_BranchData *branchData)
~BM_stats()
Definition: BM.cpp:139
BM_stats()
Definition: BM.hpp:109
virtual BCP_tm_user * tm_init(BCP_tm_prob &p, const int argnum, const char *const *arglist)
Definition: BM.cpp:111
str_params
Definition: BM.hpp:92
double varChange[2]
Definition: BM.hpp:252
int process_SB_results(OsiBranchingInformation &branchInfo, OsiSolverInterface *solver, Bonmin::BonChooseVariable *choose, OsiBranchingObject *&branchObject)
double node_start_time
The time when we started to process the node.
Definition: BM.hpp:327
~BM_node()
Definition: BM.hpp:38
double objval[2]
Definition: BM.hpp:251
double bd
Definition: BM.hpp:160
OsiCuts cuts_
Definition: BM.hpp:297
BM_message
Definition: BM.hpp:47
BCP_string nl_file_content
Definition: BM.hpp:281
chr_params
Definition: BM.hpp:62
NO OLD DOC.
Definition: BCP_lp.hpp:102
This class is just a collection of pointers to cuts with a number of methods to manipulate these cuts...
Definition: BCP_cut.hpp:279
NO OLD DOC.
Definition: BCP_lp.hpp:56
void do_distributed_SB(OsiBranchingInformation &branchInfo, OsiSolverInterface *solver, const CoinWarmStart *cws, const int branchNum, const int *pids, const int pidNum)
This class is a very simple impelementation of a constant length string.
Definition: BCP_string.hpp:13
int in_strong
Definition: BM.hpp:278
BCP_branching_decision hybridBranch()
The BCP_lp_user class is the base class from which the user can derive a problem specific class to be...
Definition: BCP_lp_user.hpp:75
Definition: BM.hpp:273
BM_stats bm_stats
Class for collecting statistics.
Definition: BM.hpp:330
virtual void modify_lp_parameters(OsiSolverInterface *lp, bool in_strong_branching)
Definition: BM_lp.cpp:153
int objNum_
Definition: BM.hpp:303
int * feasInd_
Definition: BM.hpp:316
void unpack_pseudo_costs(BCP_buffer &buf)
int numNlpFailed_
A counter for how many times in a row did the NLP code fail.
Definition: BM.hpp:295
int infNum_
Definition: BM.hpp:315
Definition: BM.hpp:446
int_params
Definition: BM.hpp:68
virtual OsiSolverInterface * initialize_solver_interface()
Create LP solver environment.
Definition: BM_lp.cpp:62
double integerTolerance_
Definition: BM.hpp:289
Bonmin::BonminAmplSetup bonmin_
This contains the setup for running Bonmin in particular nlp solver, continuous solver, cut generators,...
Definition: BM.hpp:287
virtual BCP_lp_user * lp_init(BCP_lp_prob &p)
Definition: BM.cpp:103
double sumStrongBranchingListPositions_
Sum of all relative list positions.
Definition: BM.hpp:147
virtual void process_message(BCP_buffer &buf)
Process a message that has been sent by another process&#39; user part to this process&#39; user part...
int * infInd_
Every time when branching decisions are to be made, we create 6 arrays, 3 for those objects that are ...
Definition: BM.hpp:313
int numNlpFailed_
A counter for how many times in a row did the NLP code fail.
Definition: BM.hpp:32
void pack(BCP_buffer &buf) const
Definition: BM.hpp:40
BCP_solution * test_feasibility_hybrid(const BCP_lp_result &lp_result, const BCP_vec< BCP_var * > &vars, const BCP_vec< BCP_cut * > &cuts)
Definition: BM_lp.cpp:201
BCP_user_data * get_user_data()
Return a pointer to the BCP_user_data structure the user (may have) stored in this node...
Definition: BCP_lp_user.cpp:36
int colInd
Definition: BM.hpp:248
virtual void pack_cut_algo(const BCP_cut_algo *cut, BCP_buffer &buf)
Pack an algorithmic cut.
Definition: BM_pack.cpp:192
void fint fint fint real fint real real real real real real real real real fint real fint * lp
This class is an abstract base class for the initializer class the user has to provide.
Definition: BCP_USER.hpp:160
str_array_params
Definition: BM.hpp:98
virtual BCP_user_pack * packer_init(BCP_user_class *p)
Definition: BM.cpp:132
void clear_SB_results()
int objInd
Definition: BM.hpp:247
virtual ~BM_tm()
Default destructor.
Definition: BM.hpp:188
BM_node(BCP_buffer &buf)
Definition: BM.hpp:35
int numberSbSolves_
Total number of NLP solves for strong-branching.
Definition: BM.hpp:139
void fint fint fint * phase
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 > &vs, const BCP_vec< BCP_obj_status > &cs, 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.
Definition: BM_lp.cpp:89
BM_tm()
Default constructor.
Definition: BM.hpp:185
BCP_string ipopt_file_content
Definition: BM.hpp:280
NO OLD DOC.
Definition: BCP_tm.hpp:136
virtual void init_new_phase(int phase, BCP_column_generation &colgen, CoinSearchTreeBase *&candidates)
Do whatever initialization is necessary before the phase-th phase.
Definition: BM_tm.cpp:277
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 * > &cans, bool force_branch=false)
Decide whether to branch or not and select a set of branching candidates if branching is decided upon...
double solval
Definition: BM.hpp:159
virtual ~BM_pack()
Definition: BM.hpp:448
int changeType
Definition: BM.hpp:156
BCP_branching_decision
This enumerative constant is the return value of the select_branching_candidates() method in [BCP_lp_...
virtual void pack_user_data(const BCP_user_data *ud, BCP_buffer &buf)
Pack an user data.
Definition: BM_pack.cpp:166
Definition: BM.hpp:107
Definition: BM.hpp:170
int objInd
Definition: BM.hpp:157
void send_pseudo_cost_update(OsiBranchingInformation &branchInfo)
Methods invoked from bbBranch()
Definition: BM.hpp:460
int * objInd_
These are the indices of the integral (i.e., things that can be branched on) objects in the solver...
Definition: BM.hpp:302
virtual BCP_cut_algo * unpack_cut_algo(BCP_buffer &buf)
Unpack an algorithmic cut.
Definition: BM_pack.cpp:201
Definition: BM.hpp:60
int numberFixed_
Total number of times variables were fixed due to strong branching.
Definition: BM.hpp:141
double * infUseful_
Definition: BM.hpp:314
int colInd
Definition: BM.hpp:158
int & numNlpFailed()
Definition: BM.hpp:336
virtual void display_final_information(const BCP_lp_statistics &lp_stat)
Output the final solution.
Definition: BM_tm.cpp:222
A presolved branching object candidate.
BCP_string ipopt_file_content
Definition: BM.hpp:175
BCP_buffer bm_buf
Definition: BM.hpp:283
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.
Definition: BM_lp.cpp:248
void incNumberSbSolves(int cnt)
Definition: BM.hpp:123
This class is just a collection of pointers to variables with a number of methods to manipulate these...
Definition: BCP_var.hpp:316
int try_to_branch(OsiBranchingInformation &branchInfo, OsiSolverInterface *solver, Bonmin::BonChooseVariable *choose, OsiBranchingObject *&branchObject, bool allowVarFix)
BCP_parameter_set< BM_par > par
Definition: BM.hpp:282
virtual ~BM_lp()
Definition: BM_lp.cpp:49
This class describes the message buffer used for all processes of BCP.
Definition: BCP_buffer.hpp:39
BCP_parameter_set< BM_par > par
Definition: BM.hpp:177
virtual BCP_user_data * unpack_user_data(BCP_buffer &buf)
Unpack an user data.
Definition: BM_pack.cpp:179
virtual void pack_module_data(BCP_buffer &buf, BCP_process_t ptype)
Pack the initial information (info that the user wants to send over) for the process specified by the...
Definition: BM_pack.cpp:16
BCP_solution * test_feasibility_BB(const BCP_lp_result &lp_result, const BCP_vec< BCP_var * > &vars)
Definition: BM_lp.cpp:181
int sumStrongBranchingListIndices_
Sum of all list indices.
Definition: BM.hpp:145
BM_node()
Definition: BM.hpp:34
BCP_column_generation
This enumerative constant describes what to do when a search tree node becomes fathomable for the cur...
Definition: BCP_enum.hpp:65
BM_SB_result * sbResult_
This is where we keep the results in case of distributed strong branching.
Definition: BM.hpp:322
void incNumberNodeSolves()
Definition: BM.hpp:120
The BCP_tm_user class is the base class from which the user can derive a problem specific class to be...
Definition: BCP_tm_user.hpp:58
void receive_pseudo_cost_update(BCP_buffer &buf)
Definition: BM_tm.cpp:306
This class holds the results after solving an LP relaxation.
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.
Definition: BM_lp.cpp:313
int status
Definition: BM.hpp:162
bool isBranchFathomable(int status, double obj)
int numberNodeSolves_
Total number of NLP solves as node solves.
Definition: BM.hpp:137
dbl_params
Definition: BM.hpp:87
int sort_objects(OsiBranchingInformation &branchInfo, Bonmin::BonChooseVariable *choose, int &branchNum)
void incNumberFixed()
Definition: BM.hpp:126
An object of type BCP_lp_relax holds the description of an lp relaxation.
Definition: BCP_matrix.hpp:267
OsiPseudoCosts pseudoCosts_
Definition: BM.hpp:178
virtual void unpack_module_data(BCP_buffer &buf)
Unpack the initial information sent to the LP process by the Tree Manager.
Definition: BM_pack.cpp:35
virtual void initialize_core(BCP_vec< BCP_var_core * > &vars, BCP_vec< BCP_cut_core * > &cuts, BCP_lp_relax *&matrix)
Pass the core constraints and core variables to bcp.
Definition: BM_tm.cpp:61
void readIpopt()
Definition: BM_tm.cpp:29
int status[2]
Definition: BM.hpp:249
This is the abstract base class for a solution to a Mixed Integer Programming problem.
BCP_string nl_file_content
Definition: BM.hpp:176
int numberStrongBranching_
Total number of times this node did strong branching.
Definition: BM.hpp:143