To visi_GridCellHisto class: added deleted flag, SumValue
[dyninst.git] / visi / h / datagrid.h
1 #ifndef _datagrid_h
2 #define _datagrid_h
3 /*
4  * Copyright (c) 1993, 1994 Barton P. Miller, Jeff Hollingsworth,
5  *     Bruce Irvin, Jon Cargille, Krishna Kunchithapadam, Karen
6  *     Karavanic, Tia Newhall, Mark Callaghan.  All rights reserved.
7  * 
8  * This software is furnished under the condition that it may not be
9  * provided or otherwise made available to, or used by, any other
10  * person, except as provided for by the terms of applicable license
11  * agreements.  No title to or ownership of the software is hereby
12  * transferred.  The name of the principals may not be used in any
13  * advertising or publicity related to this software without specific,
14  * written prior authorization.  Any use of this software must include
15  * the above copyright notice.
16  *
17  */
18
19 /* $Log: datagrid.h,v $
20 /* Revision 1.7  1994/05/23 20:55:16  newhall
21 /* To visi_GridCellHisto class: added deleted flag, SumValue
22 /* method function, and fixed AggregateValue method function
23 /*
24  * Revision 1.6  1994/05/11  17:11:03  newhall
25  * changed data values from double to float
26  *
27  * Revision 1.5  1994/04/13  21:22:51  newhall
28  * *** empty log message ***
29  *
30  * Revision 1.4  1994/03/26  04:17:44  newhall
31  * change all floats to double
32  *
33  * Revision 1.3  1994/03/17  05:17:25  newhall
34  * added lastBucketFilled data member to class visi_GridCellHisto:  value of
35  * the largest bucket number for which new data values have been added
36  *
37  * Revision 1.2  1994/03/15  02:03:19  newhall
38  * added public member "userdata" to class visi_GridCellHisto
39  * to allow visi writer to add info to grid cells
40  *
41  * Revision 1.1  1994/03/14  20:27:26  newhall
42  * changed visi subdirectory structure
43  *  */ 
44 /////////////////////////////////
45 //  Data Grid Class definitions
46 /////////////////////////////////
47
48 #include <string.h>
49 #include  <math.h>
50 #include <values.h>
51 #include "visiTypes.h"
52
53 #define SUM     0
54 #define AVE     1
55
56 class Metric{
57      char       *units;    // how units are measured  i.e. "ms" 
58      char       *name;     // for y-axis labeling  
59      int         Id;       // unique metric Id
60      int         aggregate; //either SUM or AVE, for fold operation 
61   public:
62      Metric(){units = NULL; name = NULL; Id = NOVALUE; aggregate=SUM;}
63      Metric(char* ,char*,int,int); 
64      ~Metric(){delete[] units;delete[] name;} 
65      char       *Units(){return(units);}
66      char       *Name(){return(name);}
67      int         Identifier(){return(Id);}
68      int         Aggregate(){return(aggregate);}
69 };
70
71
72 class Resource{
73      char    *name;     // obj. name for graph labeling
74      int      Id;       // unique resource id
75    public:
76      Resource(){name = NULL; Id = -1;}
77      Resource(char*,int);
78      ~Resource(){ delete[] name;} 
79      char     *Name(){return(name);}
80      int       Identifier(){return(Id);}
81 };
82
83
84 ///////////////////////////////////////////////
85 // visi_GridCellHisto:  A grid cell element 
86 // (histogram) is an instance of this class
87 // valid: indicates that the cell contains a histogram
88 // deleted: indicates that the cell cannot accept new data values
89 // size: number of buckets
90 // lastBucketFilled: number of full buckets 
91 ////////////////////////////////////////////
92
93 class visi_GridCellHisto {
94   private:
95      int   valid;
96      int   size;
97      int   lastBucketFilled;  // bucket number of last data value added   
98      int   deleted;   // set on delete cell element, cleared on add new cell elem 
99      sampleType *value;
100   public: 
101      void *userdata;  // to allow visi writer to add info to grid cells
102      visi_GridCellHisto(){value = NULL; valid = 0; size = 0; 
103                           userdata = NULL; lastBucketFilled = -1; deleted = 0;}
104      visi_GridCellHisto(int);
105      ~visi_GridCellHisto(){delete[] value;}
106      int    LastBucketFilled(){return(lastBucketFilled);}
107      sampleType  *Value(){ return(value);}
108
109      sampleType  Value(int i) { 
110             if((i < 0) || (i > size)){
111              return(ERROR);
112             }
113             return(value[i]);
114      }
115
116      int    Size(){return(size);}
117      int    Valid(){return(valid);}
118      int    Deleted(){return(deleted);}
119      void   SetDeleted(){deleted = 1;}
120      void   ClearDeleted(){deleted = 0;}
121      void   Invalidate(){delete[] value; value = NULL; size = 0; 
122                          valid = 0; lastBucketFilled = -1;}
123
124      void   Fold(int method){
125        int i,j;
126        if(valid){
127          for(i=0,j=0;(i< (lastBucketFilled+1)/2) // new bucket counter
128              && (j< (lastBucketFilled+1)); // old bucket counter
129              i++,j+=2){
130            if((value[j] != ERROR) && (value[j+1] != ERROR))
131              value[i] = value[j] + value[j+1];
132            else
133              value[i] = ERROR;
134            if((value[i] != ERROR))
135              value[i] = value[i]/2; 
136          }
137          for(i=(lastBucketFilled+1)/2; i < size; i++){
138            value[i] = ERROR;
139          }
140          lastBucketFilled = ((lastBucketFilled+1)/2)-1;
141        }
142      }
143
144      sampleType  SumValue(timeType width){
145        int i;
146        sampleType sum;
147
148         if(value != NULL){
149            for(sum=0.0,i=0; i< size; i++){
150              if(!isnan(value[i])){
151                sum += value[i]; 
152              }
153            }
154            return(sum*width);
155         }
156         else{
157           return(ERROR);
158         }
159      }
160
161      sampleType  AggregateValue(int method){
162         int i,num;
163         sampleType sum;
164
165         if(value != NULL){
166            for(sum=0.0,num=i=0; i< size; i++){
167              if(!isnan(value[i])){
168                sum += value[i]; 
169                num++;
170              }
171            }
172
173            if(num != 0){
174              return(sum/(1.0*num));
175            }
176            else{
177              return(ERROR);
178            }
179         }
180         else{
181           visi_ErrorHandler(ERROR_AGGREGATE,"values == NULL");
182           return(ERROR_AGGREGATE);
183         }
184      }
185
186      int    AddValue(sampleType x,
187                      int i,
188                      int numElements){
189         
190        int j;
191
192        if (deleted){  // if deleted is set, don't add values
193          return(OK);
194        }
195        if (!valid){ // if this is the first value create a histo cell array 
196          if(value == NULL)
197            value = new sampleType[numElements];
198          size = numElements;
199          valid = 1;
200          deleted = 0;
201          for(j=0;j<size;j++){
202            value[j] = ERROR;
203          }
204        }
205        if((i < 0) || (i >= size))
206          return(ERROR_SUBSCRIPT);
207        value[i] = x;
208        if(i > lastBucketFilled)
209         lastBucketFilled = i;
210        return(OK);
211      }
212
213      sampleType  operator[](int i){
214        if((i >= size) || (i < 0)){
215          visi_ErrorHandler(ERROR_SUBSCRIPT,
216                            "error in [] operator in histogridcell");
217          return(ERROR);
218        }
219        return(value[i]);
220      }
221 };
222
223
224 class  visi_GridHistoArray {
225    private:
226       visi_GridCellHisto *values;
227       int size;
228    public:
229       visi_GridHistoArray(){values = NULL; size = 0;}
230       visi_GridHistoArray(int);
231       ~visi_GridHistoArray();
232
233       int LastBucketFilled(int resource){
234          if((resource < 0) || (resource >= size))
235            return(ERROR_SUBSCRIPT);
236          else
237            return(values[resource].LastBucketFilled());
238       }
239
240       int AddValue(sampleType x,
241                    int resource,
242                    int bucketNum,
243                    int numBuckets){
244
245          if((resource < 0) || (resource >= size))
246            return(ERROR_SUBSCRIPT);
247          return(values[resource].AddValue(x,bucketNum,numBuckets));
248       }
249
250       visi_GridCellHisto *Value(){return(values);}
251       int    Valid(int);
252       int    Invalidate(int);
253       int    AddNewResources(int,int);
254
255       void   Fold(int method){
256         int i;
257         for(i=0; i< size; i++)
258           values[i].Fold(method);
259       } 
260
261       sampleType  AggregateValue(int i,
262                              int method){
263         if((i>=0)&&(i<size))
264           return(values[i].AggregateValue(method));
265         else
266           return(ERROR);
267       }
268       sampleType  SumValue(int i,timeType width){
269         if((i>=0)&&(i<size))
270           return(values[i].SumValue(width));
271         else
272           return(ERROR);
273       }
274
275       visi_GridCellHisto&   operator[](int i){
276         if ((i>= 0) && (i < size)){
277           return(values[i]);
278         }
279         else{
280           visi_ErrorHandler(ERROR_SUBSCRIPT,
281                             "error in [] operator GridHistoArray");
282           return(values[0]);
283         }
284       }
285 };
286
287
288 class visi_DataGrid {
289  protected:
290      Metric     *metrics;
291      Resource   *resources;
292      int         numMetrics;
293      int         numResources;
294      int         numBins;
295      timeType    binWidth;
296      visi_GridHistoArray  *data_values;
297   public:
298      visi_DataGrid(){
299          metrics=NULL; 
300          resources=NULL; 
301          numMetrics=numResources=0;
302          data_values=NULL; 
303          numBins= 0; 
304          binWidth=0.0;
305      }
306
307      visi_DataGrid(int,int,Metric *,Resource *,int,timeType);
308      visi_DataGrid(int,int,visi_metricType *,visi_resourceType *,int,timeType);
309      virtual ~visi_DataGrid();
310      char      *MetricName(int i);
311      char      *MetricUnits(int i);
312      char      *ResourceName(int j);
313      int        NumMetrics(){return(numMetrics);}
314      int        FoldMethod(int);
315      int        NumResources(){return(numResources);}
316      int        MetricId(int); // returns metric Id
317      int        ResourceId(int); // returns Resource Id
318      int        NumBins(){return(numBins);}
319      timeType   BinWidth(){return(binWidth);}
320      int        Valid(int,int);
321      int        Invalidate(int,int);
322
323      sampleType AggregateValue(int i,int j){
324        if((i>=0)&&(i<numMetrics))
325          return(data_values[i].AggregateValue(j,metrics[i].Aggregate())); 
326        else
327          return(ERROR);
328      }
329
330      sampleType  SumValue(int i,int j){
331        if((i>=0)&&(i<numMetrics))
332          return(data_values[i].SumValue(j,binWidth)); 
333        else
334          return(ERROR);
335      }
336
337      void  Fold(timeType width){
338        int i;
339        for(i=0; i < numMetrics; i++)
340          data_values[i].Fold(metrics[i].Aggregate());
341        binWidth = width;
342      }
343
344      int AddValue(int metric, 
345                   int resource, 
346                   int bucket,
347                   sampleType value){
348         if((metric < 0) || (metric >= numMetrics))
349            return(ERROR_SUBSCRIPT);
350         return(data_values[metric].AddValue(value,resource,bucket,numBins));
351      }
352
353      visi_GridHistoArray&  operator[](int i){
354         if((i < 0) || (i >= numMetrics)){
355            visi_ErrorHandler(ERROR_SUBSCRIPT,
356                            "error in [] operator DATAGRID");
357            return(data_values[0]);
358         }
359         return(data_values[i]);
360      }
361
362      int LastBucketFilled(int metric,int resource){
363         if((metric < 0) || (metric >= numMetrics))
364           return(ERROR_SUBSCRIPT);
365         return(data_values[metric].LastBucketFilled(resource));
366      }
367
368 };
369 #endif