Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
fm_partition.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file fm_partition.h
1 /* This software is distributed under the GNU Lesser General Public License */
2 //==========================================================================
3 //
4 // fm_partition.h
5 //
6 //==========================================================================
7 // $Id: fm_partition.h,v 1.8 2003/01/31 08:15:05 chris Exp $
8 
9 #ifndef GTL_FM_PARTITION_H
10 #define GTL_FM_PARTITION_H
11 
12 #include <GTL/GTL.h>
13 #include <GTL/graph.h>
14 #include <GTL/node_map.h>
15 #include <GTL/edge_map.h>
16 #include <GTL/algorithm.h>
17 
19 
20 
34 {
35 public:
42  typedef int side_type;
43 
49  const static side_type A;
50 
56  const static side_type B;
57 
65  typedef short int fix_type;
66 
72  const static fix_type FIXA;
73 
79  const static fix_type FIXB;
80 
86  const static fix_type UNFIXED;
87 
93  fm_partition();
94 
100  virtual ~fm_partition();
101 
111  void set_vars(const graph& G, const node_map<int>& node_weight,
112  const edge_map<int>& edge_weight);
113 
126  void set_vars(const graph& G, const node_map<int>& node_weight,
127  const edge_map<int>& edge_weight,
128  const node_map<side_type>& init_side);
129 
140  void set_vars(const graph& G, const node_map<int>& node_weight,
141  const edge_map<int>& edge_weight,
142  const node_map<fix_type>& fixed);
143 
158  void set_vars(const graph& G, const node_map<int>& node_weight,
159  const edge_map<int>& edge_weight,
160  const node_map<side_type>& init_side,
161  const node_map<fix_type>& fixed);
162 
172  void store_cut_edges(const bool set);
173 
185  void store_nodesAB(const bool set);
186 
202  virtual int check(graph& G);
203 
214  int run(graph& G);
215 
221  int get_cutsize();
222 
229  int get_needed_passes();
230 
238  side_type get_side_of_node(const node& n) const;
239 
248  side_type operator [](const node& n) const;
249 
256  int get_weight_on_sideA(const graph& G) const;
257 
264  int get_weight_on_sideB(const graph& G) const;
265 
269  typedef list<edge>::const_iterator cut_edges_iterator;
270 
279  cut_edges_iterator cut_edges_begin() const;
280 
289  cut_edges_iterator cut_edges_end() const;
290 
294  typedef list<node>::const_iterator nodes_of_one_side_iterator;
295 
303  nodes_of_one_side_iterator nodes_of_sideA_begin() const;
304 
313  nodes_of_one_side_iterator nodes_of_sideA_end() const;
314 
322  nodes_of_one_side_iterator nodes_of_sideB_begin() const;
323 
332  nodes_of_one_side_iterator nodes_of_sideB_end() const;
333 
340  virtual void reset();
341 protected:
348 
353  list<edge> cut_edges;
354 
361 
366  list<node> nodesA;
367 
372  list<node> nodesB;
373 
381 
388 
395 
401 
408 
415 
422 
429 
436 
443 
450 
456 
462 
468 
474 
480 
487 
494 
500 
506 
512 
519 
526 
533  vector<list<node> > bucketA;
534 
541  vector<list<node> > bucketB;
542 
549 
555 
561  void divide_up(const graph& G);
562 
567  void hide_self_loops(graph& G);
568 
574  void init_variables(const graph& G);
575 
582  void create_initial_bipart(const graph& G);
583 
589  void shuffle_vector(const int vector_size,
590  vector<graph::node_iterator>& node_vector);
591 
596  void compute_max_vertex_degree(const graph& G);
597 
602  void pass_manager(const graph& G);
603 
608  void copy_side_node_map(const graph& G, node_map<side_type>& dest,
609  const node_map<side_type> source) const;
610 
615  void init_data_structure(const graph& G);
616 
622  void init_filling_buckets(const graph& G);
623 
629  int inital_gain_of_node_on_sideA(const node cur_node);
630 
636  int inital_gain_of_node_on_sideB(const node cur_node);
637 
642  void move_manager(const graph& G);
643 
650  bool move_vertex(const graph& G, node& moved_node);
651 
658  bool balance_holds(const graph& G, const node cur_node);
659 
665  void update_data_structure_A2B(const node cur_node);
666 
672  void update_data_structure_B2A(const node cur_node);
673 
679  void update_bucketA(const node cur_node, const int old_gain,
680  const int new_gain);
681 
687  void update_bucketB(const node cur_node, const int old_gain,
688  const int new_gain);
689 
695  void update_max_gain(const side_type side);
696 
702  inline int range_up(const int gain_value) const;
703 
709  inline int range_down(const int index) const;
710 
715  void clean_pass(const graph& G);
716 
721  void compute_cut_edges(const graph& G);
722 
727  void compute_nodesAB(const graph& G);
728 private:
729 #ifdef _DEBUG
730 
734  void print_bucketA();
735 
740  void print_bucketB();
741 #endif // _DEBUG
742 };
743 
744 
746 
747 #endif // GTL_FM_PARTITION_H
748 
749 //--------------------------------------------------------------------------
750 // end of file
751 //--------------------------------------------------------------------------