4 /* Data structures for functions */
5 typedef struct n_info {
9 /* Sum of the all cells in combination */
10 double OuttableSum(FuncAction action, FuncData data, struct record *record,
12 { struct n_info *info=(struct n_info *)data;
19 if (record->classes[index]!=fileinfo[index]->offsite) {
20 info->value+=record->classes[index]*record->count;
21 info->count+=record->count;
25 return zUnit*info->value+zOffset*info->count;
31 /* Count of the non-offsite cells for given file in combination */
32 double OuttableCount(FuncAction action, FuncData data, struct record *record,
34 { int *sum=(int *)data;
40 if (record->classes[index]!=fileinfo[index]->offsite)
49 /* Average of the all cells in combination */
54 double OuttableAvg(FuncAction action, FuncData data, struct record *record,
56 { struct avg_info *info=(struct avg_info *)data;
63 if (record->classes[index]!=fileinfo[index]->offsite) {
64 info->sum+=record->classes[index]*record->count;
65 info->count+=record->count;
70 return (zUnit*info->sum/info->count)+zOffset;
76 /* Minimal cell value in combination */
77 double OuttableMin(FuncAction action, FuncData data, struct record *record,
79 { int *min=(int *)data;
85 if (record->classes[index]!=fileinfo[index]->offsite &&
86 record->classes[index]<*min)
87 *min=record->classes[index];
90 return *min*zUnit+zOffset;
96 /* Count of cell with minimal value in combination */
97 double OuttableNMin(FuncAction action, FuncData data, struct record *record,
99 { struct n_info *info=(n_info *)data;
106 if (record->classes[index]!=fileinfo[index]->offsite &&
107 record->classes[index]<info->value) {
108 info->value=record->classes[index];
109 info->count=record->count;
113 return info->count*cellArea;
119 /* Maximal cell value in combination */
120 double OuttableMax(FuncAction action, FuncData data, struct record *record,
122 { int *max=(int *)data;
128 if (record->classes[index]!=fileinfo[index]->offsite &&
129 record->classes[index]>*max)
130 *max=record->classes[index];
133 return *max*zUnit+zOffset;
139 /* Count of cell with maximal value in combination */
140 double OuttableNMax(FuncAction action, FuncData data, struct record *record,
142 { struct n_info *info=(n_info *)data;
149 if (record->classes[index]!=fileinfo[index]->offsite &&
150 record->classes[index]>info->value) {
151 info->value=record->classes[index];
152 info->count=record->count;
156 return info->count*cellArea;
161 /* Count of cells with most frequent value in combination */
162 double OuttableNMode(FuncAction action, FuncData data, struct record *record,
164 { int *max=(int *)data;
170 if (record->classes[index]!=fileinfo[index]->offsite &&
175 return *max*cellArea;
181 /* Most frequent cell value in combination */
182 double OuttableMode(FuncAction action, FuncData data, struct record *record,
184 { struct n_info *info=(n_info *)data;
191 if (record->classes[index]!=fileinfo[index]->offsite &&
192 record->count>info->count) {
193 info->value=record->classes[index];
194 info->count=record->count;
198 return info->value*zUnit+zOffset;
203 /* Count of cells with rarest value in combination */
204 double OuttableNFewest(FuncAction action, FuncData data, struct record *record,
206 { int *min=(int *)data;
212 if (record->classes[index]!=fileinfo[index]->offsite &&
217 return *min*cellArea;
223 /* Rarest cell value in combination */
224 double OuttableFewest(FuncAction action, FuncData data, struct record *record,
226 { struct n_info *info=(n_info *)data;
233 if (record->classes[index]!=fileinfo[index]->offsite &&
234 record->count<info->count) {
235 info->value=record->classes[index];
236 info->count=record->count;
240 return info->value*zUnit+zOffset;
245 /* Range of classes in cell */
246 typedef struct r_info {
249 double OuttableRange(FuncAction action, FuncData data, struct record *record,
251 { struct r_info *info=(r_info *)data;
258 if (record->classes[index]!=fileinfo[index]->offsite) {
259 if (record->classes[index]<info->min)
260 info->min=record->classes[index];
261 if (record->classes[index]>info->max)
262 info->max=record->classes[index];
266 return (info->max-info->min)*zUnit;
272 /* count of distinct classes. Note that function can be called more than once
273 for each distinct class (if there are more functions), so we need to
274 keep track on found classes in bit table */
275 #define BIT_TABLE_LENGTH (8192/sizeof(int))
278 int bittable[BIT_TABLE_LENGTH];
280 double OuttableClasses(FuncAction action, FuncData data, struct record *record,
282 { struct c_info *info=(struct c_info*) data;
287 for (i=0;i<BIT_TABLE_LENGTH;i++) info->bittable[i]=0;
290 if (record->classes[index]!=fileinfo[index]->offsite) {
291 i=record->classes[index]/(sizeof(int)*8);
292 mask=1<<record->classes[index]%(sizeof(int)*8);
293 if (!(info->bittable[i]&mask)) {
295 info->bittable[i]|=mask;
305 /* Bitwise OR of all values. Why Pete Olson was so proud of this
306 function adding it in EPPL ver 2.1? */
307 double OuttableOr(FuncAction action, FuncData data, struct record *record,
309 { int *res=(int *)data;
315 if (record->classes[index]!=fileinfo[index]->offsite)
316 *res|=record->classes[index];
325 /* Bitwise And of all values in combination */
326 double OuttableAnd(FuncAction action, FuncData data, struct record *record,
328 { int *res=(int *)data;
334 if (record->classes[index]!=fileinfo[index]->offsite)
335 *res&=record->classes[index];
344 /* Standard deviation of all values in combination, biased */
350 double OuttableStd(FuncAction action, FuncData data, struct record *record,
352 { struct var_info *info=(struct var_info *)data;
360 if (record->classes[index]!=fileinfo[index]->offsite) {
361 info->count +=record->count;
362 info->sum +=record->count*record->classes[index];
363 info->sumsq +=record->count*record->classes[index]*record->
368 if (info->count<2) return 0;
369 return sqrt((info->sumsq-(info->sum*info->sum/info->count))/
370 (info->count))*zUnit;
375 /*Variance of cell values, biased*/
376 double OuttableVar(FuncAction action, FuncData data, struct record *record,
378 { struct var_info *info=(struct var_info *)data;
386 if (record->classes[index]!=fileinfo[index]->offsite) {
387 info->count +=record->count;
388 info->sum +=record->count*record->classes[index];
389 info->sumsq +=record->count*record->classes[index]*record->
394 if (info->count<2) return 0;
395 return ((info->sumsq-(info->sum*info->sum/info->count))/
396 (info->count-1))*zUnit*zUnit;
402 /* correlation of cell values in files index and index+1, multiplied by 100 */
403 typedef struct cov_info {
411 double OuttableCorr(FuncAction action, FuncData data, struct record *record,
413 { struct cov_info *info=(struct cov_info *)data;
424 if (record->classes[index]!=fileinfo[index]->offsite&&
425 record->classes[index+1]!=fileinfo[index+1]->offsite) {
426 info->count +=record->count;
427 info->sumx +=record->count*record->classes[index];
428 info->sumxsq +=record->count*record->classes[index]*record->
430 info->sumy +=record->count*record->classes[index+1];
431 info->sumysq +=record->count*record->classes[index+1]*record->
433 info->sumxy +=record->count*record->classes[index]*
434 record->classes[index+1];
438 if (info->count<2) return 0;
439 return (info->sumxy-(info->sumx*info->sumy/info->count))/
440 sqrt((info->sumxsq-(info->sumx*info->sumx/info->count))*
441 (info->sumysq-(info->sumy*info->sumy/info->count)));
447 struct FuncInfo funcTable[]={
448 {"sum",OuttableSum,1,sizeof(int)},
449 {"cnt",OuttableCount,1,sizeof(int)},
450 {"avg",OuttableAvg,1,sizeof(struct avg_info)},
451 {"min",OuttableMin,1,sizeof(int)},
452 {"nmin",OuttableNMin,1,sizeof(struct n_info)},
453 {"max",OuttableMax,1,sizeof(int)},
454 {"nmax",OuttableNMax,1,sizeof(struct n_info)},
455 {"mode",OuttableMode,1,sizeof(struct n_info)},
456 {"nmode",OuttableNMode,1,sizeof(int)},
457 {"fewest",OuttableFewest,1,sizeof(struct n_info)},
458 {"nfewest",OuttableNFewest,1,sizeof(int)},
459 {"range",OuttableRange,1,sizeof(struct r_info)},
460 {"classes",OuttableClasses,1,sizeof(struct c_info)},
461 {"or",OuttableOr,1,sizeof(int)},
462 {"and",OuttableAnd,1,sizeof(int)},
463 {"std",OuttableStd,1,sizeof(struct var_info)},
464 {"var",OuttableVar,1,sizeof(struct var_info)},
465 {"corr",OuttableCorr,2,sizeof(struct cov_info)},