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