doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / ObjGraph.C
1 /**
2  *                 !!!!!!!!!!!!!!!!! DEFUNCT !!!!!!!!!!!!!!!!!!!
3  *
4  *  This file is not compiled anymore and its uses should be replaced by the
5  *  class of the same name (ObjGraph) in ckgraph.h
6  *
7  *                 !!!!!!!!!!!!!!!!! DEFUNCT !!!!!!!!!!!!!!!!!!!
8  */
9
10
11 /**
12  * \addtogroup CkLdb
13 */
14 /*@{*/
15
16 #include "ObjGraph.h"
17
18 static const double alpha = 30.e-6;
19 static const double beta = 3.e-9;
20
21 ObjGraph::ObjGraph(int count, BaseLB::LDStats* _stats)
22 {
23   stats = _stats;
24   // First, we need to make a linked list of objects.
25   // Also, we'll construct a little hash table to improve
26   // efficiency in finding the objects to build the edge lists
27
28   // Initialize the linked list
29   for(int i=0; i < hash_max; i++)
30     node_table[i] = 0;
31   
32   nodelist = 0;
33   // Count up the edges and the nodes, and allocate storage for
34   // them all at once.
35   n_objs = stats->n_objs;
36   n_edges = 0;
37     // initialize node array
38   int index;
39   for(index = 0; index < stats->n_comm; index++) {
40       const LDCommData newedgedata = stats->commData[index];
41
42       // If this isn't an object-to-object message, ignore it
43       if (!newedgedata.from_proc() && newedgedata.recv_type() == LD_OBJ_MSG)
44         n_edges++;
45     }
46   nodelist = new Node[n_objs];
47   edgelist = new Edge[n_edges];
48
49   // Now initialize the node and the edge arrays
50   int cur_node = 0;
51   int cur_edge = 0;
52   // initialize node array
53   for(index = 0; index < stats->n_objs; index++) {
54       LDObjData &odata = stats->objData[index];
55       if(cur_node >= n_objs)
56         CkPrintf("Error %d %d\n",cur_node,n_objs);
57       Node* thisnode = nodelist + cur_node;
58       thisnode->node_index = cur_node;
59       thisnode->proc = stats->from_proc[index];
60       thisnode->index = index;
61       thisnode->n_out = 0;
62       thisnode->outEdge = 0;
63       thisnode->n_in = 0;
64       thisnode->inEdge = 0;
65       cur_node++;
66       const int hashval = calc_hashval(odata.omID(),
67                                        odata.objID());
68       thisnode->nxt_hash = node_table[hashval];
69       node_table[hashval] = thisnode;
70   }
71
72     // initialize edge array
73     for(index=0; index < stats->n_comm; index++) {
74       LDCommData &newedgedata = stats->commData[index];
75
76       // If this isn't an object-to-object message, ignore it
77       if (newedgedata.from_proc() || newedgedata.recv_type()!=LD_OBJ_MSG)
78         continue;
79
80       if(cur_edge >= n_edges)
81         CkPrintf("Error %d %d\n",cur_edge,n_edges);
82
83       Edge* thisedge = edgelist + cur_edge;
84       thisedge->edge_index = cur_edge;
85       thisedge->index = index;
86       thisedge->from_node = -1;
87       thisedge->to_node = -1;
88       thisedge->nxt_out = 0;
89       thisedge->nxt_in = 0;
90       cur_edge++;
91   }
92   if(cur_node != n_objs)
93       CkPrintf("did not fill table %d %d\n",cur_node,n_objs);
94
95   if(cur_edge != n_edges)
96     CkPrintf("did not fill edge table %d %d\n",cur_edge,n_edges);
97
98   // Now go through the comm lists
99   for(cur_edge = 0; cur_edge < n_edges; cur_edge++) {
100     Edge* newedge = edgelist + cur_edge;
101     int index = newedge->index;
102     const LDCommData newedgedata = stats->commData[index];
103
104     Node* from_node = find_node(newedgedata.sender);
105     if (from_node == 0) {
106       if (!_lb_args.ignoreBgLoad() && _stats->complete_flag) 
107         CkPrintf("ObjGraph::find_node: Didn't locate from node match!\n");
108       continue;
109     }
110
111     Node* to_node = find_node(newedgedata.receiver.get_destObj());
112     if (to_node == 0) {
113       if (!_lb_args.migObjOnly() && _stats->complete_flag) 
114         CkPrintf("ObjGraph::find_node: Didn't locate to node match!\n");
115       continue;
116     }
117
118     // Store the edge data in correct outgoing and incoming lists.
119     newedge->from_node = from_node->node_index;
120     newedge->to_node = to_node->node_index;
121     newedge->nxt_out = from_node->outEdge;
122     from_node->outEdge = newedge;
123     from_node->n_out++;
124     newedge->nxt_in = to_node->inEdge;
125     to_node->inEdge = newedge;
126     to_node->n_in++;
127   }
128 }
129
130 ObjGraph::~ObjGraph()
131 {
132   delete [] nodelist;
133   delete [] edgelist;
134 }
135
136 double ObjGraph::EdgeWeight(Edge* e) {
137   LDCommData commData = stats->commData[e->index];
138   return commData.messages * alpha + commData.bytes * beta;
139 }
140
141 int ObjGraph::calc_hashval(LDOMid omid, LDObjid id)
142 {
143   int hashval = omid.id.idx;
144   for(int i=0; i < OBJ_ID_SZ; i++)
145     hashval +=  id.id[i];
146   hashval %= hash_max;
147   return hashval;
148 }
149
150 ObjGraph::Node* ObjGraph::find_node(const LDObjKey &edge_key)
151 {
152   const LDOMid &edge_omid = edge_key.omID();
153   const LDObjid &edge_id = edge_key.objID();
154   const int from_hashval = calc_hashval(edge_omid,edge_id);
155   //  CkPrintf("From = %d\n",from_hashval);
156   Node* from_node = node_table[from_hashval];
157
158   while (from_node != 0) {
159     const LDOMid omid =
160       stats->objData[from_node->index].omID();
161     const LDObjid objid =
162       stats->objData[from_node->index].objID();
163     //    CkPrintf("Comparing %d to %d\n",objid.id[0],edge_id.id[0]);
164     if (LDOMidEqual(omid,edge_omid) && LDObjIDEqual(objid,edge_id) )
165       break;
166     from_node = from_node->nxt_hash;
167   }
168
169   return from_node;
170 }
171
172
173
174
175
176 /*@}*/