5 #include "hfta_udaf.h"
\r
7 #define QUANT_LFTA1_SIZE 729
\r
8 #define QUANT_LFTA2_SIZE 181
\r
9 #define QUANT_LFTA3_SIZE 100
\r
11 #define QUANT_EPS 0.01
\r
12 #define SKIPDIR_SIZE 100
\r
13 #define SKIPDIR_HEIGHT_MAX 7
\r
14 #define max(a,b) ((a) > (b) ? (a) : (b))
\r
17 /****************************************************************/
\r
18 /* Data Structures */
\r
19 /****************************************************************/
\r
20 typedef struct tuple_t {
\r
27 typedef struct supertuple_t {
\r
31 struct supertuple_t *next;
\r
34 /****************************************************************/
\r
35 typedef gs_uint32_t val_type;
\r
37 typedef struct skipnode {
\r
43 typedef struct skipdir {
\r
44 gs_uint32_t height; // height of tree
\r
45 gs_uint32_t freeptr; // cursor space stack
\r
46 gs_uint32_t headptr[SKIPDIR_HEIGHT_MAX]; // ptrs to levels
\r
47 skipnode_t list[SKIPDIR_SIZE+1];
\r
50 /****************************************************************/
\r
52 typedef struct quant_udaf_hfta0_struct_t {
\r
53 gs_uint32_t nelts; // 4 bytes
\r
54 supertuple_t *t; // 8 bytes
\r
55 } quant_udaf_hfta0_struct_t;
\r
57 typedef struct quant_udaf_lfta1_struct_t {
\r
59 gs_uint32_t samples[QUANT_LFTA1_SIZE];
\r
60 } quant_udaf_lfta1_struct_t;
\r
62 typedef struct quant_udaf_hfta1_struct_t {
\r
63 gs_uint32_t nelts; // 4 bytes
\r
64 supertuple_t *t; // 8 bytes
\r
65 } quant_udaf_hfta1_struct_t;
\r
67 typedef struct quant_udaf_lfta2_struct_t {
\r
69 gs_uint32_t freeptr;
\r
70 gs_uint32_t usedptr;
\r
71 tuple_t t[QUANT_LFTA2_SIZE+1];
\r
72 } quant_udaf_lfta2_struct_t;
\r
74 typedef struct quant_udaf_hfta2_struct_t {
\r
75 gs_uint32_t nelts; // 4 bytes
\r
76 supertuple_t *t; // 8 bytes
\r
77 } quant_udaf_hfta2_struct_t;
\r
79 typedef struct quant_udaf_lfta3_struct_t {
\r
81 gs_uint32_t freeptr;
\r
82 gs_uint32_t usedptr;
\r
83 gs_uint32_t circptr;
\r
85 tuple_t t[QUANT_LFTA3_SIZE+1];
\r
87 } quant_udaf_lfta3_struct_t;
\r
89 typedef struct quant_udaf_hfta3_struct_t {
\r
90 gs_uint32_t nelts; // 4 bytes
\r
91 supertuple_t *t; // 8 bytes
\r
92 } quant_udaf_hfta3_struct_t;
\r
96 /*************************** Version 0 **************************/
\r
97 /* Version 0: HFTA-only */
\r
98 /****************************************************************/
\r
99 void quant_udaf_hfta0_print(quant_udaf_hfta0_struct_t *s)
\r
103 gslog(LOG_DEBUG,"hfta nelts = %u\n",s->nelts);
\r
104 gslog(LOG_DEBUG,"HFTA tuples:\n");
\r
105 for (t=s->t; t != NULL; t=t->next) {
\r
106 gslog(LOG_DEBUG,"(%u, %u, %u)\n",t->val,t->gap,t->del);
\r
110 void quant_udaf_hfta0_compress(quant_udaf_hfta0_struct_t *s)
\r
112 supertuple_t *t=s->t, *d;
\r
113 gs_uint32_t threshold;
\r
115 threshold = (gs_uint32_t)ceil((2.0 * QUANT_EPS) * (float)(s->nelts));
\r
116 if ((t == NULL) || (t->next == NULL)) return;
\r
118 while ((d != NULL) && (d->next != NULL)) {
\r
119 if (d->gap+d->next->gap+d->next->del < threshold) {
\r
120 d->next->gap += d->gap;
\r
129 /****************************************************************/
\r
130 /* HFTA0 functions */
\r
131 /****************************************************************/
\r
132 void quant_udaf_hfta0_HFTA_AGGR_INIT_(gs_sp_t b)
\r
134 quant_udaf_hfta0_struct_t *s = (quant_udaf_hfta0_struct_t *)b;
\r
139 void quant_udaf_hfta0_HFTA_AGGR_UPDATE_(gs_sp_t b, gs_uint32_t v)
\r
141 quant_udaf_hfta0_struct_t *s = (quant_udaf_hfta0_struct_t *)b;
\r
142 supertuple_t *t=s->t;
\r
143 supertuple_t *newptr;
\r
144 gs_uint32_t threshold;
\r
145 gs_uint32_t val, gap;
\r
149 // left boundary case
\r
150 if ((!t) || (v <= t->val)) {
\r
151 newptr = (supertuple_t *)malloc(sizeof(supertuple_t));
\r
153 gslog(LOG_ALERT, "Out of space.\n");
\r
159 newptr->next = s->t;
\r
164 // locate position that sandwiches v
\r
165 while ((t->next) && (t->next->val < v))
\r
168 // right boundary case
\r
170 // create newptr node
\r
171 newptr = (supertuple_t *)malloc(sizeof(supertuple_t));
\r
175 newptr->next = NULL;
\r
178 // non-boundary case
\r
180 obj = t->gap+t->next->gap+t->next->del;
\r
181 threshold = (gs_uint32_t)ceil(2.0 * QUANT_EPS * (float)s->nelts);
\r
182 if (obj <= threshold) {
\r
183 // insert into existing bucket
\r
187 newptr = (supertuple_t *)malloc(sizeof(supertuple_t));
\r
190 newptr->del = t->next->gap+t->next->del-1;
\r
191 newptr->next = t->next;
\r
195 quant_udaf_hfta0_compress(s);
\r
198 void quant_udaf_hfta0_HFTA_AGGR_OUTPUT_(vstring *r, gs_sp_t b)
\r
200 r->length = sizeof(quant_udaf_hfta0_struct_t);
\r
201 r->offset = (gs_p_t )b;
\r
202 r->reserved = SHALLOW_COPY;
\r
205 void quant_udaf_hfta0_HFTA_AGGR_DESTROY_(gs_sp_t b)
\r
207 quant_udaf_hfta0_struct_t *s = (quant_udaf_hfta0_struct_t *)b;
\r
208 supertuple_t *t=s->t, *n;
\r
219 /****************************************************************/
\r
220 /* HFTA0 Extraction functions */
\r
221 /****************************************************************/
\r
222 gs_uint32_t extr_quant_hfta0_fcn(vstring *v, gs_float_t phi)
\r
224 //printf("In extr_quant_hfta0_fcn offset=%llx length=%d\n",v->offset, v->length);
\r
225 quant_udaf_hfta0_struct_t *vs = (quant_udaf_hfta0_struct_t *)(v->offset);
\r
226 //printf("nelts=%d t=%llx\n",vs->nelts, (unsigned long long int)(vs->t));
\r
227 supertuple_t *t, *p;
\r
228 gs_uint32_t nelts=0;
\r
229 gs_uint32_t rmin=0, rmax, rank, ropt=UINT_MAX;
\r
230 gs_uint32_t count=0;
\r
232 for (t=vs->t; t != NULL; t=t->next) {
\r
233 //printf("in loop.\n");
\r
234 //printf("gap is %d\n",t->gap);
\r
238 rank = (gs_uint32_t) (phi*(float)nelts);
\r
240 for (t=vs->t; t != NULL; t=t->next) {
\r
242 rmax = rmin+t->del;
\r
243 if (max(abs(rmin-rank), abs(rmax-rank)) < ropt) {
\r
245 ropt = max(abs(rmin-rank), abs(rmax-rank));
\r
251 gs_uint32_t extr_med_hfta0_fcn(vstring *v)
\r
253 return extr_quant_hfta0_fcn(v, 0.5);
\r
256 gs_uint32_t extr_quant_hfta0_space(vstring *v)
\r
258 quant_udaf_hfta0_struct_t *vs = (quant_udaf_hfta0_struct_t *)(v->offset);
\r
260 gs_uint32_t count=0;
\r
262 for (t=vs->t; t != NULL; t=t->next)
\r
268 /*************************** Version 3 **************************/
\r
269 /* Version 3: LFTA-medium */
\r
270 /****************************************************************/
\r
271 void quant_hfta3_print(quant_udaf_hfta3_struct_t *s)
\r
275 //printf("In quant_hfta3_print, s=%llx, t=%llx\n",(unsigned long long int)s,(unsigned long long int)(s->t));
\r
276 gslog(LOG_DEBUG,"HFTA tuples:\n");
\r
277 for (t=s->t; t != NULL; t=t->next) {
\r
278 gslog(LOG_DEBUG,"(%u, %u, %u)\n",t->val,t->gap,t->del);
\r
282 void quant_hfta3_compress(quant_udaf_hfta3_struct_t *s)
\r
284 supertuple_t *t=s->t, *d;
\r
285 gs_uint32_t threshold;
\r
287 threshold = (gs_uint32_t)ceil((2.0 * QUANT_EPS) * (float)(s->nelts));
\r
288 if ((t == NULL) || (t->next == NULL)) return;
\r
290 while ((d != NULL) && (d->next != NULL)) {
\r
291 if (d->gap+d->next->gap+d->next->del < threshold) {
\r
292 d->next->gap += d->gap;
\r
302 /****************************************************************/
\r
303 /* HFTA3 functions */
\r
304 /****************************************************************/
\r
305 void quant_udaf_hfta3_HFTA_AGGR_INIT_(gs_sp_t b)
\r
307 quant_udaf_hfta3_struct_t *s = (quant_udaf_hfta3_struct_t *)b;
\r
312 void quant_udaf_hfta3_HFTA_AGGR_UPDATE_(gs_sp_t b, vstring *v)
\r
314 quant_udaf_hfta3_struct_t *s = (quant_udaf_hfta3_struct_t *)b;
\r
315 quant_udaf_lfta3_struct_t *vs = (quant_udaf_lfta3_struct_t *)(v->offset);
\r
316 supertuple_t *t=s->t, *tprev=NULL;
\r
318 supertuple_t *newptr;
\r
319 gs_uint32_t uptr = vs->usedptr;
\r
320 gs_uint32_t threshold;
\r
322 if (uptr == 0) return;
\r
323 //if (v->length != sizeof(quant_udaf_lfta3_struct_t)) return;
\r
325 threshold = (gs_uint32_t)ceil((2.0 * QUANT_EPS) * (float)(vs->nelts));
\r
326 while (uptr != 0) {
\r
327 if ((u[uptr].next != 0) && (u[uptr].gap+u[u[uptr].next].gap+u[u[uptr].next].del < threshold)) {
\r
328 u[u[uptr].next].gap += u[uptr].gap;
\r
331 // find position in superstructure
\r
332 while ((t != NULL) && (t->val <= u[uptr].val)) {
\r
333 if (t->val == u[uptr].val) {
\r
334 t->gap += u[uptr].gap;
\r
335 t->del += u[uptr].del;
\r
336 uptr = u[uptr].next;
\r
340 t->del += u[uptr].gap+u[uptr].del-1;
\r
346 // create newptr node
\r
347 newptr = (supertuple_t *)malloc(sizeof(supertuple_t));
\r
348 newptr->val = u[uptr].val;
\r
349 newptr->gap = u[uptr].gap;
\r
350 newptr->del = u[uptr].del;
\r
352 newptr->del += t->gap + t->del - 1;
\r
353 // merge into superstructure
\r
358 tprev->next = newptr;
\r
360 s->nelts += u[uptr].gap;
\r
362 uptr = u[uptr].next;
\r
364 quant_hfta3_compress(s);
\r
365 //quant_hfta3_print(s);
\r
366 //printf("exiting quant_udaf_hfta3_HFTA_AGGR_UPDATE_, s=%llx, t=%llx\n",(unsigned long long int)s,(unsigned long long int)(s->t));
\r
369 void quant_udaf_hfta3_HFTA_AGGR_OUTPUT_(vstring *r, gs_sp_t b)
\r
371 r->length = sizeof(quant_udaf_hfta3_struct_t);
\r
372 r->offset = (gs_p_t )b;
\r
373 r->reserved = SHALLOW_COPY;
\r
375 quant_udaf_hfta3_struct_t *s = (quant_udaf_hfta3_struct_t *)b;
\r
376 //printf("In quant_udaf_hfta3_HFTA_AGGR_OUTPUT_, s=%llx, t=%llx\n\n",(unsigned long long int)s,(unsigned long long int)(s->t));
\r
379 void quant_udaf_hfta3_HFTA_AGGR_DESTROY_(gs_sp_t b)
\r
384 /****************************************************************/
\r
385 /* HFTA3 Extraction functions */
\r
386 /****************************************************************/
\r
387 gs_uint32_t extr_quant_hfta3_fcn(vstring *v, gs_float_t phi)
\r
389 quant_udaf_hfta3_struct_t *vs = (quant_udaf_hfta3_struct_t *)(v->offset);
\r
390 supertuple_t *t, *p;
\r
391 gs_uint32_t nelts=0;
\r
392 gs_uint32_t rmin=0, rmax, rank, ropt=UINT_MAX;
\r
393 gs_uint32_t count=0;
\r
395 for (t=vs->t; t != NULL; t=t->next) {
\r
399 rank = (gs_uint32_t) (phi*(float)nelts);
\r
401 for (t=vs->t; t != NULL; t=t->next) {
\r
403 rmax = rmin+t->del;
\r
404 if (max(abs(rmin-rank), abs(rmax-rank)) < ropt) {
\r
406 ropt = max(abs(rmin-rank), abs(rmax-rank));
\r
412 gs_uint32_t extr_med_hfta3_fcn(vstring *v)
\r
414 return extr_quant_hfta3_fcn(v, 0.5);
\r
417 gs_uint32_t extr_quant_hfta3_space(vstring *v)
\r
419 quant_udaf_hfta3_struct_t *vs = (quant_udaf_hfta3_struct_t *)(v->offset);
\r
421 gs_uint32_t count=0;
\r
423 for (t=vs->t; t != NULL; t=t->next)
\r