changed data values from double to float
[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.6  1994/05/11 17:11:03  newhall
21 /* changed data values from double to float
22 /*
23  * Revision 1.5  1994/04/13  21:22:51  newhall
24  * *** empty log message ***
25  *
26  * Revision 1.4  1994/03/26  04:17:44  newhall
27  * change all floats to double
28  *
29  * Revision 1.3  1994/03/17  05:17:25  newhall
30  * added lastBucketFilled data member to class visi_GridCellHisto:  value of
31  * the largest bucket number for which new data values have been added
32  *
33  * Revision 1.2  1994/03/15  02:03:19  newhall
34  * added public member "userdata" to class visi_GridCellHisto
35  * to allow visi writer to add info to grid cells
36  *
37  * Revision 1.1  1994/03/14  20:27:26  newhall
38  * changed visi subdirectory structure
39  *  */ 
40 /////////////////////////////////
41 //  Data Grid Class definitions
42 /////////////////////////////////
43
44 #include <string.h>
45 #include  <math.h>
46 #include <values.h>
47 #include "visiTypes.h"
48
49 #define SUM     0
50 #define AVE     1
51
52 class Metric{
53      char       *units;    // how units are measured  i.e. "ms" 
54      char       *name;     // for y-axis labeling  
55      int         Id;       // unique metric Id
56      int         aggregate; //either SUM or AVE, for fold operation 
57   public:
58      Metric(){units = NULL; name = NULL; Id = NOVALUE; aggregate=SUM;}
59      Metric(char* ,char*,int,int); 
60      ~Metric(){delete[] units;delete[] name;} 
61      char       *Units(){return(units);}
62      char       *Name(){return(name);}
63      int         Identifier(){return(Id);}
64      int         Aggregate(){return(aggregate);}
65 };
66
67
68 class Resource{
69      char    *name;     // obj. name for graph labeling
70      int      Id;       // unique resource id
71    public:
72      Resource(){name = NULL; Id = -1;}
73      Resource(char*,int);
74      ~Resource(){ delete[] name;} 
75      char     *Name(){return(name);}
76      int       Identifier(){return(Id);}
77 };
78
79
80 ///////////////////////////////////////////////
81 // visi_GridCellHisto:  A grid cell element 
82 // (histogram) is an instance of this class
83 ////////////////////////////////////////////
84 class visi_GridCellHisto {
85   private:
86      int   valid;
87      int   size;
88      int   lastBucketFilled;  // bucket number of last data value added   
89      sampleType *value;
90   public: 
91      void *userdata;  // to allow visi writer to add info to grid cells
92      visi_GridCellHisto(){value = NULL; valid = 0; size = 0; 
93                           userdata = NULL; lastBucketFilled = -1;}
94      visi_GridCellHisto(int);
95      ~visi_GridCellHisto(){delete[] value;}
96      int    LastBucketFilled(){return(lastBucketFilled);}
97      sampleType  *Value(){ return(value);}
98
99      sampleType  Value(int i) { 
100             if((i < 0) || (i > size)){
101              return(ERROR);
102             }
103             return(value[i]);
104      }
105
106      int    Size(){return(size);}
107      int    Valid(){return(valid);}
108      void   Invalidate(){delete[] value; value = NULL; size = 0; 
109                          valid = 0; lastBucketFilled = -1;}
110
111      void   Fold(int method){
112        int i,j;
113        if(valid){
114          for(i=0,j=0;(i< (lastBucketFilled+1)/2) // new bucket counter
115              && (j< (lastBucketFilled+1)); // old bucket counter
116              i++,j+=2){
117            if((value[j] != ERROR) && (value[j+1] != ERROR))
118              value[i] = value[j] + value[j+1];
119            else
120              value[i] = ERROR;
121            if((value[i] != ERROR))
122              value[i] = value[i]/2; 
123          }
124          for(i=(lastBucketFilled+1)/2; i < size; i++){
125            value[i] = ERROR;
126          }
127          lastBucketFilled = ((lastBucketFilled+1)/2)-1;
128        }
129      }
130
131      sampleType  AggregateValue(int method){
132         int i,num;
133         sampleType sum;
134         if(value != NULL){
135            for(sum=0.0,num=i=0; i< size; i++){
136              if(value[i] != ERROR){
137                sum += value[i]; 
138                num++;
139              }
140            }
141            if(method==SUM)
142              return(sum);
143            else if(num != 0){
144              return(sum/(1.0*num));
145            }
146            else{
147              visi_ErrorHandler(ERROR_AGGREGATE,"divide by zero");
148              return(ERROR_AGGREGATE);
149            }
150         }
151         else{
152           visi_ErrorHandler(ERROR_AGGREGATE,"values == NULL");
153           return(ERROR_AGGREGATE);
154         }
155      }
156
157      int    AddValue(sampleType x,
158                      int i,
159                      int numElements){
160        /* if this is the first value create a histo cell array */
161        int j;
162        if (!valid){
163          if(value == NULL)
164            value = new sampleType[numElements];
165          size = numElements;
166          valid = 1;
167          for(j=0;j<size;j++){
168            value[j] = ERROR;
169          }
170        }
171        if((i < 0) || (i >= size))
172          return(ERROR_SUBSCRIPT);
173        value[i] = x;
174        if(i > lastBucketFilled)
175         lastBucketFilled = i;
176        return(OK);
177      }
178
179      sampleType  operator[](int i){
180        if((i >= size) || (i < 0)){
181          visi_ErrorHandler(ERROR_SUBSCRIPT,
182                            "error in [] operator in histogridcell");
183          return(ERROR);
184        }
185        return(value[i]);
186      }
187 };
188
189
190 class  visi_GridHistoArray {
191    private:
192       visi_GridCellHisto *values;
193       int size;
194    public:
195       visi_GridHistoArray(){values = NULL; size = 0;}
196       visi_GridHistoArray(int);
197       ~visi_GridHistoArray();
198
199       int LastBucketFilled(int resource){
200          if((resource < 0) || (resource >= size))
201            return(ERROR_SUBSCRIPT);
202          else
203            return(values[resource].LastBucketFilled());
204       }
205
206       int AddValue(sampleType x,
207                    int resource,
208                    int bucketNum,
209                    int numBuckets){
210
211          if((resource < 0) || (resource >= size))
212            return(ERROR_SUBSCRIPT);
213          return(values[resource].AddValue(x,bucketNum,numBuckets));
214       }
215
216       visi_GridCellHisto *Value(){return(values);}
217       int    Valid(int);
218       int    Invalidate(int);
219       int    AddNewResources(int,int);
220
221       void   Fold(int method){
222         int i;
223         for(i=0; i< size; i++)
224           values[i].Fold(method);
225       } 
226
227       sampleType  AggregateValue(int i,
228                              int method){
229         if((i>=0)&&(i<size))
230           return(values[i].AggregateValue(method));
231         else
232           return(ERROR);
233       }
234
235       visi_GridCellHisto&   operator[](int i){
236         if ((i>= 0) && (i < size)){
237           return(values[i]);
238         }
239         else{
240           visi_ErrorHandler(ERROR_SUBSCRIPT,
241                             "error in [] operator GridHistoArray");
242           return(values[0]);
243         }
244       }
245 };
246
247
248 class visi_DataGrid {
249  protected:
250      Metric     *metrics;
251      Resource   *resources;
252      int         numMetrics;
253      int         numResources;
254      int         numBins;
255      timeType    binWidth;
256      visi_GridHistoArray  *data_values;
257   public:
258      visi_DataGrid(){
259          metrics=NULL; 
260          resources=NULL; 
261          numMetrics=numResources=0;
262          data_values=NULL; 
263          numBins= 0; 
264          binWidth=0.0;
265      }
266
267      visi_DataGrid(int,int,Metric *,Resource *,int,timeType);
268      visi_DataGrid(int,int,visi_metricType *,visi_resourceType *,int,timeType);
269      virtual ~visi_DataGrid();
270      char      *MetricName(int i);
271      char      *MetricUnits(int i);
272      char      *ResourceName(int j);
273      int        NumMetrics(){return(numMetrics);}
274      int        FoldMethod(int);
275      int        NumResources(){return(numResources);}
276      int        MetricId(int); // returns metric Id
277      int        ResourceId(int); // returns Resource Id
278      int        NumBins(){return(numBins);}
279      timeType   BinWidth(){return(binWidth);}
280      int        Valid(int,int);
281      int        Invalidate(int,int);
282
283      sampleType AggregateValue(int i,int j){
284        if((i>=0)&&(i<numMetrics))
285          return(data_values[i].AggregateValue(j,metrics[i].Aggregate())); 
286        else
287          return(ERROR);
288      }
289
290      void  Fold(timeType width){
291        int i;
292        for(i=0; i < numMetrics; i++)
293          data_values[i].Fold(metrics[i].Aggregate());
294        binWidth = width;
295      }
296
297      int AddValue(int metric, 
298                   int resource, 
299                   int bucket,
300                   sampleType value){
301         if((metric < 0) || (metric >= numMetrics))
302            return(ERROR_SUBSCRIPT);
303         return(data_values[metric].AddValue(value,resource,bucket,numBins));
304      }
305
306      visi_GridHistoArray&  operator[](int i){
307         if((i < 0) || (i >= numMetrics)){
308            visi_ErrorHandler(ERROR_SUBSCRIPT,
309                            "error in [] operator DATAGRID");
310            return(data_values[0]);
311         }
312         return(data_values[i]);
313      }
314
315      int LastBucketFilled(int metric,int resource){
316         if((metric < 0) || (metric >= numMetrics))
317           return(ERROR_SUBSCRIPT);
318         return(data_values[metric].LastBucketFilled(resource));
319      }
320
321 };
322 #endif