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