Added quantiling UDAFs
[com/gs-lite.git] / src / tools / qnode.h
1 /* ------------------------------------------------\r
2 Copyright 2014 AT&T Intellectual Property\r
3    Licensed under the Apache License, Version 2.0 (the "License");\r
4    you may not use this file except in compliance with the License.\r
5    You may obtain a copy of the License at\r
6 \r
7      http://www.apache.org/licenses/LICENSE-2.0\r
8 \r
9    Unless required by applicable law or agreed to in writing, software\r
10    distributed under the License is distributed on an "AS IS" BASIS,\r
11    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12    See the License for the specific language governing permissions and\r
13    limitations under the License.\r
14  ------------------------------------------- */\r
15 \r
16 #ifndef __QNODE_H_DEFINED_\r
17 #define __QNODE_H_DEFINED_\r
18 \r
19 #include<string>\r
20 \r
21 struct perf_struct{\r
22         int n_samples;\r
23         int init_discard;\r
24         int init_time;\r
25         int last_update;\r
26         unsigned long long int init_stime;\r
27         unsigned long long int init_utime;\r
28         unsigned long long int total_stime;\r
29         unsigned long long int total_utime;\r
30         double max_stime;\r
31         double max_utime;\r
32         double max_time;\r
33         unsigned long long int max_vm_size;\r
34         unsigned long long int max_rss;\r
35 \r
36         void init(){\r
37                 n_samples = 0;\r
38                 init_time = 0;\r
39                 init_stime = 0;\r
40                 init_utime = 0;\r
41                 total_stime = 0;\r
42                 total_utime = 0;\r
43                 max_stime = 0.0;\r
44                 max_utime = 0.0;\r
45                 max_time = 0.0;\r
46                 max_vm_size = 0;\r
47                 max_rss = 0;\r
48                 last_update = -1;\r
49         }\r
50 \r
51         perf_struct(){\r
52                 init();\r
53         }\r
54         perf_struct(int d){\r
55                 init();\r
56                 init_discard = d;\r
57         }\r
58 \r
59         bool update(int t, unsigned long long int u, unsigned long long int s,\r
60           unsigned long long int v, unsigned long long int r){\r
61                 if(init_discard>0){\r
62                         init_discard--;\r
63                         return false;;\r
64                 }\r
65 \r
66 \r
67                 if(v>max_vm_size)\r
68                         max_vm_size = v;\r
69                 if(r>max_rss)\r
70                         max_rss = r;\r
71                 if(last_update<0){\r
72                         init_time = t;\r
73                         init_stime = s;\r
74                         init_utime = u;\r
75                 }else{\r
76                         if(t<=last_update || u<total_utime || s<total_stime){\r
77                                 return true;\r
78                         }\r
79 \r
80                         double tmps,tmpu,tmpt;\r
81                         tmps = (double)((s-total_stime))/(t-last_update);\r
82                         tmpu = (double)((u-total_utime))/(t-last_update);\r
83                         tmpt = tmps+tmpu;\r
84                         if(tmps>max_stime)\r
85                                 max_stime = tmps;\r
86                         if(tmpu>max_utime)\r
87                                 max_utime = tmpu;\r
88                         if(tmpt>max_time)\r
89                                 max_time = tmpt;\r
90                 }\r
91                 total_stime = s;\r
92                 total_utime = u;\r
93                 last_update = t;\r
94 \r
95                 return false;\r
96         }\r
97 \r
98         std::string to_string(){\r
99                 char ret[1000];\r
100                 if(last_update - init_time>0){\r
101                         sprintf(ret,"stime=%lf, utime=%lf, time=%lf max_stime=%lf, max_utime=%lf, max_time=%lf, max_vmsize=%lld, max_rss = %lld",\r
102                           (double)(total_stime-init_stime)/(last_update - init_time),\r
103                           (double)(total_utime-init_utime)/(last_update - init_time),\r
104                           (double)(total_stime-init_stime)/(last_update - init_time) + (double)(total_utime-init_utime)/(last_update - init_time),\r
105                                 max_stime,max_utime,max_time,\r
106                                 max_vm_size,max_rss\r
107                         );\r
108                         return ret;\r
109                 }\r
110                 return("(no perf results)");\r
111         }\r
112 \r
113         static std::string to_csv_hdr(){\r
114                 return "avg_system_time,avg_user_time,avg_cpu_time,max_sys_time,max_user_time,max_total_time,max_vm_size,max_rss";\r
115         }\r
116 \r
117         std::string to_csv(){\r
118                 char ret[1000];\r
119                 if(last_update - init_time>0){\r
120                         sprintf(ret,"%lf,%lf,%lf,%lf,%lf,%lf,%lld,%lld",\r
121                           (double)(total_stime-init_stime)/(last_update - init_time),\r
122                           (double)(total_utime-init_utime)/(last_update - init_time),\r
123                           (double)(total_stime-init_stime)/(last_update - init_time) + (double)(total_utime-init_utime)/(last_update - init_time),\r
124                                 max_stime,max_utime,max_time,\r
125                                 max_vm_size,max_rss\r
126                         );\r
127                         return ret;\r
128                 }\r
129                 return(",,,,,,");\r
130         }\r
131 \r
132         double avg_cpu_time(){\r
133                 return ((double)((total_stime-init_stime)+(total_utime-init_utime))/(last_update - init_time))/100.0;\r
134         }\r
135 \r
136         bool is_valid(){\r
137                 return last_update > 0;\r
138         }\r
139 };\r
140 \r
141 \r
142 \r
143 \r
144 struct field_str{\r
145         std::string name;\r
146         int pos;\r
147         std::string type;\r
148         std::string mods;\r
149 \r
150         field_str(){};\r
151         field_str(std::string n, int p, std::string t, std::string m){\r
152                 name=n;\r
153                 pos=p;\r
154                 type=t;\r
155                 mods=m;\r
156         }\r
157 };\r
158 \r
159 \r
160 struct qnode{\r
161         std::string name;\r
162         std::string executable_name;\r
163         std::string qnode_type;\r
164         int aggr_tbl_size;\r
165         std::vector<field_str *> fields;\r
166         std::vector<std::string> reads_from;\r
167         std::vector<int> reads_from_idx;\r
168         std::vector<int> sources_to_idx;\r
169         std::string src_interface;\r
170         int par_index;\r
171         int start_tick, end_tick;\r
172 \r
173         unsigned long long int in_tup,out_tup,out_sz;\r
174         unsigned long long int accepted_tup,cycles,collisions,evictions;\r
175         double inferred_in_sz;\r
176         perf_struct *perf;\r
177 \r
178         qnode(int d){\r
179                 aggr_tbl_size = 0;\r
180                 in_tup = 0;\r
181                 out_tup = 0;\r
182                 accepted_tup = 0;\r
183                 cycles = 0;\r
184                 collisions = 0;\r
185                 evictions = 0;\r
186                 inferred_in_sz = 0.0;\r
187                 par_index = 0;\r
188                 start_tick = end_tick = -1;\r
189                 perf = new perf_struct(d);\r
190         };\r
191 \r
192         qnode(std::string type, std::string n,int d){\r
193                 qnode_type=type;\r
194                 name=n;\r
195                 aggr_tbl_size = 0;\r
196 \r
197                 in_tup = 0;\r
198                 out_tup = 0;\r
199                 out_sz = 0;\r
200                 accepted_tup = 0;\r
201                 cycles = 0;\r
202                 collisions = 0;\r
203                 evictions = 0;\r
204                 inferred_in_sz = 0.0;\r
205                 par_index = 0;\r
206                 start_tick = end_tick = -1;\r
207                 perf = new perf_struct(d);\r
208         }\r
209 \r
210         double output_rate(){\r
211                 if(end_tick == start_tick){\r
212                         return 0.0;\r
213                 }\r
214                 return( ((double)out_sz)/(end_tick-start_tick) );\r
215         }\r
216 \r
217         void add_field(field_str *fld){\r
218                 fields.push_back(fld);\r
219         }\r
220 \r
221         void add_source(std::string src){\r
222                 reads_from.push_back(src);\r
223         }\r
224 \r
225 };\r
226 \r
227 \r
228 \r
229 \r
230 \r
231 #endif\r