Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ratio_cut_partition.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file ratio_cut_partition.h
1 /* This software is distributed under the GNU Lesser General Public License */
2 //==========================================================================
3 //
4 // ratio_cut_partition.h
5 //
6 //==========================================================================
7 // $Id: ratio_cut_partition.h,v 1.8 2003/01/31 08:15:04 chris Exp $
8 
9 #ifndef GTL_RATIO_CUT_PARTITION_H
10 #define GTL_RATIO_CUT_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 
33 {
34 public:
41  typedef int side_type;
42 
48  const static side_type A;
49 
55  const static side_type B;
56 
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 
94 
100  virtual ~ratio_cut_partition();
101 
113  void set_vars(const graph& G, const node_map<int>& node_weight,
114  const edge_map<int>& edge_weight);
115 
129  void set_vars(const graph& G, const node_map<int>& node_weight,
130  const edge_map<int>& edge_weight, const node source_node,
131  const node target_node);
132 
151  void set_vars(const graph& G, const node_map<int>& node_weight,
152  const edge_map<int>& edge_weight, const node source_node,
153  const node target_node, const node_map<side_type>& init_side);
154 
173  void set_vars(const graph& G, const node_map<int>& node_weight,
174  const edge_map<int>& edge_weight, const node source_node,
175  const node target_node, const node_map<fix_type>& fixed);
176 
200  void set_vars(const graph& G, const node_map<int>& node_weight,
201  const edge_map<int>& edge_weight, const node source_node,
202  const node target_node, const node_map<side_type>& init_side,
203  const node_map<fix_type>& fixed);
204 
214  void store_cut_edges(const bool set);
215 
227  void store_nodesAB(const bool set);
228 
253  virtual int check(graph& G);
254 
265  int run(graph& G);
266 
272  int get_cutsize();
273 
280  double get_cutratio();
281 
290  side_type get_side_of_node(const node& n) const;
291 
301  side_type operator [](const node& n) const;
302 
310  int get_weight_on_sideA(const graph& G) const;
311 
319  int get_weight_on_sideB(const graph& G) const;
320 
324  typedef list<edge>::const_iterator cut_edges_iterator;
325 
334  cut_edges_iterator cut_edges_begin() const;
335 
344  cut_edges_iterator cut_edges_end() const;
345 
349  typedef list<node>::const_iterator nodes_of_one_side_iterator;
350 
358  nodes_of_one_side_iterator nodes_of_sideA_begin() const;
359 
368  nodes_of_one_side_iterator nodes_of_sideA_end() const;
369 
377  nodes_of_one_side_iterator nodes_of_sideB_begin() const;
378 
387  nodes_of_one_side_iterator nodes_of_sideB_end() const;
388 
395  virtual void reset();
396 protected:
400  enum direction_type {LEFT_SHIFT = 2, RIGHT_SHIFT = 3};
401 
408 
413  list<edge> cut_edges;
414 
421 
426  list<node> nodesA;
427 
432  list<node> nodesB;
433 
439 
445 
453 
460 
468 
475 
481 
488 
495 
502 
509 
516 
523 
529 
535 
541 
547 
553 
559 
565 
572 
579 
585 
591 
597 
604 
611 
618  vector<list<node> > bucketA;
619 
626  vector<list<node> > bucketB;
627 
634 
639  double cur_cutratio;
640 
646  void divide_up(const graph& G);
647 
654  void make_connected(graph& G, list<edge>& artificial_edges);
655 
661  void restore(graph& G, list<edge>& artificial_edges);
662 
667  void initialization(const graph& G);
668 
673  void init_data_structure(const graph& G);
674 
680  void init_filling_buckets(const graph& G);
681 
687  int inital_gain_of_node_on_sideA(const node cur_node);
688 
694  int inital_gain_of_node_on_sideB(const node cur_node);
695 
700  void init_variables(const graph& G);
701 
706  void compute_max_vertex_degree(const graph& G);
707 
712  void determine_source_node(const graph& G);
713 
718  void compute_target_node(const graph& G);
719 
725  void right_shift_op(const graph& G);
726 
732  void left_shift_op(const graph& G);
733 
741  bool move_vertex_A2B(const graph& G, node& moved_node);
742 
749  bool move_vertex_B2A(const graph& G, node& moved_node);
750 
755  node compute_highest_ratio_node(list<node> node_list);
756 
764  double cutratio();
765 
772  double ratio_of_node_A2B(const node cur_node);
773 
780  double ratio_of_node_B2A(const node cur_node);
781 
787  inline int range_up(const int gain_value) const;
788 
794  inline int range_down(const int index) const;
795 
801  void update_data_structure_A2B(const node cur_node,
802  const bool init_mode);
803 
809  void update_data_structure_B2A(const node cur_node,
810  const bool init_mode);
811 
817  void update_bucketA(const node cur_node, const int old_gain,
818  const int new_gain, const bool init_mode);
819 
825  void update_bucketB(const node cur_node, const int old_gain,
826  const int new_gain, const bool init_mode);
827 
833  void update_max_gain(const side_type side);
834 
839  void clean_step(const graph& G);
840 
845  void copy_side_node_map(const graph& G, node_map<side_type>& dest,
846  const node_map<side_type> source) const;
847 
852  void iterative_shifting(const graph& G);
853 
858  void group_swapping(const graph& G);
859 
866  bool move_manager(const graph& G);
867 
874  bool move_vertex(const graph& G, node& moved_node);
875 
880  void compute_cut_edges(const graph& G);
881 
886  void compute_nodesAB(const graph& G);
887 private:
888 #ifdef _DEBUG
889 
893  void print_bucketA();
894 
899  void print_bucketB();
900 #endif // _DEBUG
901 };
902 
904 
905 #endif // GTL_RATIO_CUT_PARTITION_H
906 
907 //--------------------------------------------------------------------------
908 // end of file
909 //--------------------------------------------------------------------------