App-RecordStream

 view release on metacpan or  search on metacpan

src/fast-recs-collate/aggregators.c  view on Meta::CPAN

}

static void min_init(void *_c, void *_d)
{
    struct min_data *d = _d;
    d->min = INFINITY;
}

static void min_add(void *_c, void *_d, char *ch_data[], double num_data[])
{
    struct min_data *d = _d;
    if(!isnan(num_data[0]) && num_data[0] < d->min)
        d->min = num_data[0];
}

static void min_dump(void *_c, void *_d)
{
    struct min_data *d = _d;
    printf("%g", d->min);
}

/*
 * Sum
 */

struct sum_data
{
    double sum;
};

static bool sum_parse_args(void **config_data, char *config_str, int *num_fields, char **fields)
{
    return use_one_field(config_str, num_fields, fields);
}

static void sum_init(void *_c, void *_d)
{
    struct sum_data *d = _d;
    d->sum = 0;
}

static void sum_add(void *_c, void *_d, char *ch_data[], double num_data[])
{
    struct sum_data *d = _d;
    if(!isnan(num_data[0]))
        d->sum += num_data[0];
}

static void sum_dump(void *_c, void *_d)
{
    struct sum_data *d = _d;
    printf("%g", d->sum);
}

/*
 * Perc
 */

struct perc_config_data
{
    double percentile;
};

struct perc_data
{
    int values_len;
    int values_size;
    double *values;
};

static bool perc_parse_args(void **config_data, char *config_str, int *num_fields, char **fields)
{
    if(*config_str)
    {
        char *comma = strchr(config_str, ',');
        if(!comma) return false;
        *comma++ = '\0';

        struct perc_config_data *c = *config_data = malloc(sizeof(struct perc_config_data));
        char *endp;
        c->percentile = strtod(config_str, &endp);
        if(endp == config_str) return false;  /* failed to parse into number */

        fields[0] = comma;
        *num_fields = 1;

        return true;
    }
    else
    {
        return false;
    }
}

static void perc_init(void *_c, void *_d)
{
    struct perc_data *d = _d;
    d->values_len = 0;
    d->values_size = 64;
    d->values = malloc(sizeof(*d->values) * d->values_size);
}

static void perc_add(void *_c, void *_d, char *ch_data[], double num_data[])
{
    struct perc_data *d = _d;
    if(!isnan(num_data[0]))
    {
        RESIZE_ARRAY_IF_NECESSARY(d->values, d->values_size, d->values_len+1);
        d->values[d->values_len++] = num_data[0];
    }
}

static int cmp_dbl(const void *s1, const void *s2)
{
    double d1 = *(double*)s1;
    double d2 = *(double*)s2;
    if(d1 < d2) return -1;
    else if(d1 > d2) return 1;
    else return 0;
}

static void perc_dump(void *_c, void *_d)
{
    struct perc_config_data *c = _c;
    struct perc_data *d = _d;
    qsort(d->values, d->values_len, sizeof(*d->values), cmp_dbl);
    double perc = d->values[(int)floor((c->percentile / 100) * d->values_len)];
    printf("%g", perc);
}

static void perc_free(void *_c, void *_d)
{
    struct concat_data *d = _d;
    free(d->concat_buf);
}

/*
 * Mode
 */

static hash_val_t str_hash_func(const void *_k)
{
    char *k = (char*)_k;
    return hashlittle(k, strlen(k), 0);
}

struct table_entry
{
    double count;
};

struct mode_data
{
    hash_t *hash_table;

    /* this is just a pool of nodes */
    int nodes_len, nodes_size;
    hnode_t *nodes;

    /* this is just a pool of table_entry objs */
    int entries_len, entries_size;
    struct table_entry *entries;
};

static bool mode_parse_args(void **config_data, char *config_str, int *num_fields, char **fields)
{
    return use_one_field(config_str, num_fields, fields);
}

static void mode_init(void *_c, void *_d)
{
    struct mode_data *d = _d;
    d->hash_table = hash_create(HASHCOUNT_T_MAX, NULL, str_hash_func);
    d->nodes_size = d->entries_size = 32;
    d->nodes_len = d->entries_len = 0;
    d->nodes = malloc(sizeof(*d->nodes) * d->nodes_size);
    d->entries = malloc(sizeof(*d->entries) * d->entries_size);
}

static void mode_add(void *_c, void *_d, char *ch_data[], double num_data[])
{
    struct mode_data *d = _d;
    hnode_t *node = hash_lookup(d->hash_table, ch_data[0]);
    if(node == NULL)
    {
        RESIZE_ARRAY_IF_NECESSARY(d->nodes, d->nodes_size, d->nodes_len+1);
        RESIZE_ARRAY_IF_NECESSARY(d->entries, d->entries_size, d->entries_len+1);

src/fast-recs-collate/aggregators.c  view on Meta::CPAN


/*
 * Correlation
 */

struct corr_data
{
    struct cov_data cov_data;
    struct var_data var_data1;
    struct var_data var_data2;
};

static bool corr_parse_args(void **config_data, char *config_str, int *num_fields, char **fields)
{
    return use_two_fields(config_str, num_fields, fields);
}

static void corr_init(void *_c, void *_d)
{
    struct corr_data *d = _d;
    cov_init(_c, &d->cov_data);
    var_init(_c, &d->var_data1);
    var_init(_c, &d->var_data2);
}

static void corr_add(void *_c, void *_d, char *ch_data[], double num_data[])
{
    struct corr_data *d = _d;
    cov_add(NULL, &d->cov_data, ch_data, num_data);
    var_add(NULL, &d->var_data1, ch_data, num_data);
    var_add(NULL, &d->var_data2, ch_data+1, num_data+1);
}

static void corr_dump(void *_c, void *_d)
{
    struct corr_data *d = _d;
    double cov = cov_val(&d->cov_data);
    double var1 = var_val(&d->var_data1);
    double var2 = var_val(&d->var_data2);
    double corr = cov / sqrt(var1 * var2);
    printf("%g", corr);
}

struct aggregator aggregators[] = {
    {"average", "avg", sizeof(struct avg_data),
      avg_parse_args, avg_init, avg_add, avg_dump, NULL},
    {"concatenate", "concat", sizeof(struct concat_data),
      concat_parse_args, concat_init, concat_add, concat_dump, concat_free},
    {"count", "ct", sizeof(struct count_data),
      count_parse_args, count_init, count_add, count_dump, NULL},
    {"correlation", "corr", sizeof(struct corr_data),
      corr_parse_args, corr_init, corr_add, corr_dump, NULL},
    {"covariance", "cov", sizeof(struct cov_data),
      cov_parse_args, cov_init, cov_add, cov_dump, NULL},
    {"maximum", "max", sizeof(struct max_data),
      max_parse_args, max_init, max_add, max_dump, NULL},
    {"minimum", "min", sizeof(struct min_data),
      min_parse_args, min_init, min_add, min_dump, NULL},
    {"mode", "mode", sizeof(struct mode_data),
      mode_parse_args, mode_init, mode_add, mode_dump, mode_free},
    {"percentile", "perc", sizeof(struct perc_data),
      perc_parse_args, perc_init, perc_add, perc_dump, perc_free},
    {"sum", "sum", sizeof(struct sum_data),
      sum_parse_args, sum_init, sum_add, sum_dump, NULL},
    {"variance", "var", sizeof(struct var_data),
      var_parse_args, var_init, var_add, var_dump, NULL},
    {NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL}
};



( run in 3.093 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )