coin-Cgl
CglClique.hpp
Go to the documentation of this file.
1 #ifndef _CglClique_h_
2 #define _CglClique_h_
3 
4 #include "CglCutGenerator.hpp"
5 
6 //class OsiCuts;
7 //class OsiSolverInterface;
8 
9 class CglClique : public CglCutGenerator {
10 
11  friend void CglCliqueUnitTest(const OsiSolverInterface * siP,
12  const std::string mpdDir );
13 public:
15  CglClique(const CglClique& rhs);
17  virtual CglCutGenerator * clone() const;
18 
20  CglClique& operator=(const CglClique& rhs);
21 
22 public:
23 
24  virtual void
25  generateCuts(const OsiSolverInterface& si, OsiCuts & cs,
26  const CglTreeInfo info = CglTreeInfo()) const;
27 
48  CglClique(bool setPacking = false, bool justOriginalRows = false);
50  virtual ~CglClique() {}
52  virtual std::string generateCpp( FILE * fp);
53 
54  void considerRows(const int numRows, const int* rowInd);
55 
56 public:
63  };
64 
66  scl_next_node_rule = method;
67  }
68 
71  }
74  }
75 
76  void setStarCliqueReport(bool yesno = true) { scl_report_result = yesno; }
77  void setRowCliqueReport(bool yesno = true) { rcl_report_result = yesno; }
78 
79  void setDoStarClique(bool yesno = true) { do_star_clique = yesno; }
80  void setDoRowClique(bool yesno = true) { do_row_clique = yesno; }
81 
82  void setMinViolation(double minviol) { petol = minviol; }
83  double getMinViolation() const { return petol; }
84 
85 private:
86 
87  struct frac_graph ;
88  friend struct frac_graph ;
89 
92  struct fnode {
94  int *nbrs;
97  double *edgecosts;
99  int degree;
101  double val;
102  };
103 
106  struct frac_graph {
108  int nodenum;
110  int edgenum;
112  double density;
121  int *all_nbr;
123  double *all_edgecost;
124 
126  nodenum(0), edgenum(0), density(0),
128  nodes(0), all_nbr(0), all_edgecost(0) {}
129  };
130 
131 protected:
138  mutable int sp_numrows;
139  mutable int* sp_orig_row_ind;
140  mutable int sp_numcols;
141  mutable int* sp_orig_col_ind;
142  mutable double* sp_colsol;
143  mutable int* sp_col_start;
144  mutable int* sp_col_ind;
145  mutable int* sp_row_start;
146  mutable int* sp_row_ind;
147 
151  mutable bool* node_node;
152 
154  mutable double petol;
155 
164 
174 
189  mutable const int* cl_perm_indices;
191  mutable int cl_perm_length;
192 
195  mutable int* cl_indices;
197  mutable int cl_length;
198 
202  mutable int* cl_del_indices;
204  mutable int cl_del_length;
205 
208 private:
211  void selectFractionalBinaries(const OsiSolverInterface& si) const;
214  void selectFractionals(const OsiSolverInterface& si) const;
216  void selectRowCliques(const OsiSolverInterface& si,int numOriginalRows) const;
218  void createSetPackingSubMatrix(const OsiSolverInterface& si) const;
220  void createFractionalGraph() const;
222  int createNodeNode() const;
224  void deleteSetPackingSubMatrix() const;
226  void deleteFractionalGraph() const;
228  void find_scl(OsiCuts& cs) const;
230  void find_rcl(OsiCuts& cs) const;
232  int scl_choose_next_node(const int current_nodenum,
233  const int *current_indices,
234  const int *current_degrees,
235  const double *current_values) const;
237  void scl_delete_node(const int del_ind, int& current_nodenum,
238  int *current_indices, int *current_degrees,
239  double *current_values) const;
241  int enumerate_maximal_cliques(int& pos, bool* scl_label, OsiCuts& cs) const;
243  int greedy_maximal_clique(OsiCuts& cs) const;
245  void recordClique(const int len, int* indices, OsiCuts& cs) const;
246 };
247 //#############################################################################
253 void CglCliqueUnitTest(const OsiSolverInterface * siP,
254  const std::string mpdDir);
256 class CglProbing;
257 class CglFakeClique : public CglClique {
258 
259 public:
261  CglFakeClique(const CglFakeClique& rhs);
263  virtual CglCutGenerator * clone() const;
264 
267 
268  virtual void
269  generateCuts(const OsiSolverInterface& si, OsiCuts & cs,
270  const CglTreeInfo info = CglTreeInfo()) const;
271 
291  CglFakeClique(OsiSolverInterface * solver=NULL,bool setPacking = false);
293  virtual ~CglFakeClique();
295  void assignSolver(OsiSolverInterface * fakeSolver);
296 protected:
298  mutable OsiSolverInterface * fakeSolver_;
300  mutable CglProbing * probing_;
301 };
302 
303 #endif