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