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