doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / TopoCentLB.h
1 #ifndef _TOPOCENTLB_H_
2 #define _TOPOCENTLB_H_
3
4 #include "CentralLB.h"
5 #include "topology.h"
6
7
8 extern "C" void METIS_PartGraphRecursive (int*, int*, int*, int*, int*, int*,
9                                           int*, int*, int*, int*, int*);
10
11 extern "C" void METIS_PartGraphKway (int*, int*, int*, int*, int*, int*,
12                                      int*, int*, int*, int*, int*);
13
14 extern "C" void METIS_PartGraphVKway (int*, int*, int*, int*, int*, int*,
15                                       int*, int*, int*, int*, int*);
16
17 extern "C" void METIS_WPartGraphRecursive (int*, int*, int*, int*,
18                                            int*, int*, int*, int*,
19                                            float*, int*, int*, int*);
20
21 extern "C" void METIS_WPartGraphKway (int*, int*, int*, int*,
22                                       int*, int*, int*, int*,
23                                       float*, int*, int*, int*);
24
25 extern "C" void METIS_mCPartGraphRecursive (int*, int*, int*, int*,
26                                             int*, int*, int*, int*,
27                                             int*, int*, int*, int*);
28
29 extern "C" void METIS_mCPartGraphKway (int*, int*, int*, int*, int*,
30                                        int*, int*, int*, int*, int*,
31                                        int*, int*, int*);
32
33
34
35 void CreateTopoCentLB ();
36
37 class TopoCentLB : public CentralLB
38 {
39   public:
40     TopoCentLB (const CkLBOptions &opt);
41     TopoCentLB (CkMigrateMessage *m) : CentralLB (m) { };
42     ~TopoCentLB();
43     
44     void work (LDStats *stats);
45
46     void pup (PUP::er &p) { CentralLB::pup(p); }
47
48     struct HeapNode {
49       double key;
50       int node;
51     };
52
53     class PartGraph {
54     public:
55       typedef struct{
56         int degree;
57         int *obj_list;
58         int num_objs;
59         double comm;  //Amount of communication done by this partition -- num of bytes
60       } Node;
61       
62       typedef double Edge;
63
64       PartGraph(int num_parts,int init_num_objs){
65         int i;
66         n_nodes = num_parts;
67         nodes = new Node[num_parts];
68         for(i=0;i<num_parts;i++)
69         {
70           nodes[i].obj_list = new int[init_num_objs];
71           nodes[i].num_objs=0;
72           nodes[i].degree=0;
73           nodes[i].comm=0;
74         }
75         
76         n_edges = num_parts*num_parts;
77         edges = new Edge*[num_parts];
78         for(i=0;i<num_parts;i++)
79         {
80           edges[i] = new Edge[num_parts];
81           for(int j=0;j<num_parts;j++)
82             edges[i][j] = 0;
83         }
84       }
85
86       PartGraph(PartGraph *pg,int init_num_objs){
87         int i;
88         n_nodes = pg->n_nodes;
89         n_edges = pg->n_edges;
90         nodes = new Node[n_nodes];
91         for(i=0;i<n_nodes;i++){
92           nodes[i].obj_list=new int[init_num_objs];
93           nodes[i].num_objs = pg->nodes[i].num_objs;
94           nodes[i].degree = pg->nodes[i].degree;
95           nodes[i].comm = pg->nodes[i].comm;
96           for(int j=0;j<pg->nodes[i].num_objs;j++)
97             nodes[i].obj_list[j] = pg->nodes[i].obj_list[j];
98         }
99         
100         edges = new Edge*[n_nodes];
101         for(i=0;i<n_nodes;i++){
102           edges[i] = new Edge[n_nodes];
103           for(int j=0;j<n_nodes;j++)
104             edges[i][j] = pg->edges[i][j];
105         }
106       }
107
108       ~PartGraph(){
109         for(int i=0;i<n_nodes;i++)
110           delete[] nodes[i].obj_list;
111         delete[] nodes;
112         
113         for(int i=0;i<n_nodes;i++)
114           delete[] edges[i];
115         delete[] edges;
116       }
117     //private:
118       Node *nodes;
119       Edge **edges;
120       int n_nodes;
121       int n_edges;
122     };
123     
124     PartGraph *partgraph;
125     LBTopology      *topo;
126     double **hopCount;
127     int *heapMapping;
128     //int **topoGraph;
129     //int *topoDegree;
130     
131     void calculateMST(PartGraph *partgraph,LBTopology *topo,int *proc_mapping,int max_comm_part);
132     void increaseKey(HeapNode *heap,int i,double wt);
133     HeapNode extractMax(HeapNode *heap,int *heapSize);
134     void BuildHeap(HeapNode *heap,int heapSize);
135     void Heapify(HeapNode *heap, int node, int heapSize);
136     int findMaxObjs(int *map,int totalobjs,int count);
137     void computePartitions(CentralLB::LDStats *stats,int count,int *newmap);
138     //static int compare(const void *p,const void *q);
139   private:
140     
141     CmiBool QueryBalanceNow (int step);
142 };
143
144 #endif /* _TOPOCENTLB_H_ */