static void test_summary() { int int_zero = 0, int_minus_one = -1; double real_plus_one = 1.0, real_zero = 0.0, real_minus_decimal = -0.99; long long long_minus_one = -1, long_zero = 0; char *names[] = {"employees", "min_age", "max_age", "avg_age", "add_age", "min_salary", "max_salary", "avg_salary", "add_salary", "min_birth", "max_birth", "avg_birth", "add_birth"}; Type types[] = {Int, Int, Int, Real, Int, Real, Real, Real, Real, Long, Long, Real, Long}; Rel *r = load("summary_emp"); int pos1, pos2, pos3; Type tp1, tp2, tp3; head_attr(r->head, "age", &pos1, &tp1); head_attr(r->head, "salary", &pos2, &tp2); head_attr(r->head, "birth", &pos3, &tp3); Sum *sums[] = {sum_cnt(), /* age calcs */ sum_min(pos1, tp1, val_new_int(&int_minus_one)), sum_max(pos1, tp1, val_new_int(&int_minus_one)), sum_avg(pos1, tp1, val_new_real(&real_plus_one)), sum_add(pos1, tp1, val_new_int(&int_minus_one)), /* salary calcs */ sum_min(pos2, tp2, val_new_real(&real_zero)), sum_max(pos2, tp2, val_new_real(&real_zero)), sum_avg(pos2, tp2, val_new_real(&real_zero)), sum_add(pos2, tp2, val_new_real(&real_zero)), /* birth calcs */ sum_min(pos3, tp3, val_new_long(&long_minus_one)), sum_max(pos3, tp3, val_new_long(&long_zero)), sum_avg(pos3, tp3, val_new_real(&real_minus_decimal)), sum_add(pos3, tp3, val_new_long(&long_zero)) }; Rel *sum = rel_sum(r, load("summary_dep"), names, types, sums, 13); if (!equal(sum, "summary_res_1")) fail(); char *unary_names[] = {"min_age", "max_age", "min_salary", "max_salary", "count", "add_salary"}; Type unary_types[] = {Int, Int, Real, Real, Int, Real}; r = load("summary_emp"); Sum *unary_sums[] = {sum_min(pos1, tp1, val_new_int(&int_zero)), sum_max(pos1, tp1, val_new_int(&int_zero)), sum_min(pos2, tp2, val_new_real(&real_zero)), sum_max(pos2, tp2, val_new_real(&real_zero)), sum_cnt(), sum_add(pos2, tp2, val_new_real(&real_zero))}; sum = rel_sum_unary(r, unary_names, unary_types, unary_sums, 6); if (!equal(sum, "summary_res_2")) fail(); }
static double read_fermion(unsigned int seed, const int pos[5], int c, int d, int re_im) { int i; unsigned int v = sum_init(seed); v = sum_add(v, c); v = sum_add(v, d); v = sum_add(v, re_im); for (i = 0; i < 5; i++) v = sum_add(v, pos[i]); v = sum_add(v, seed); return sum_fini(v); }
static void test_add(Tuple *tuples[]) { Sum *s_int = sum_add(0, Int, val_new_int(&res.defi)); Sum *s_real = sum_add(1, Real, val_new_real(&res.defd)); Sum *s_long = sum_add(2, Long, val_new_long(&res.defl)); calc(tuples, s_int, s_real, s_long); if (res.add_int != val_int(sum_value(s_int))) fail(); if (res.add_real != val_real(sum_value(s_real))) fail(); if (res.add_long != val_long(sum_value(s_long))) fail(); test_defs(s_int, s_real, s_long); mem_free(s_int); mem_free(s_real); mem_free(s_long); }
double read_gauge(int dir, const int pos[4], int a, int b, int re_im, void *env) { int i; unsigned int v = sum_init(seed_u); v = sum_add(v, re_im); v = sum_add(v, a); v = sum_add(v, b); for (i = 0; i < 4; i++) { v = sum_add(v, pos[i]); v = sum_add(v, dir); } v = sum_add(v, seed_u); return sum_fini(v); }