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