/* PSPP - a program for statistical analysis.
- Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
struct covariance *cov;
ws.cats = categoricals_create (cmd->interactions, cmd->n_interactions,
- cmd->wv, cmd->exclude,
- NULL, NULL, NULL, NULL);
+ cmd->wv, cmd->exclude);
cov = covariance_2pass_create (cmd->n_dep_vars, cmd->dep_vars,
ws.cats, cmd->wv, cmd->exclude);
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
static void *
-makeit (void *aux1, void *aux2 UNUSED)
+makeit (const void *aux1, void *aux2 UNUSED)
{
const struct variable *var = aux1;
}
static void
-updateit (void *user_data,
- enum mv_class exclude,
- const struct variable *wv,
- const struct variable *catvar UNUSED,
- const struct ccase *c,
- void *aux1, void *aux2)
+updateit (const void *aux1, void *aux2, void *user_data,
+ const struct ccase *c, enum mv_class exclude,
+ const struct variable *wv)
{
struct descriptive_data *dd = user_data;
for (v = 0; v < cmd->n_vars; ++v)
{
struct interaction *inter = interaction_create (cmd->indep_var);
+
+ struct payload payload;
+ payload.create = makeit;
+ payload.update = updateit;
+
ws.vws[v].cat = categoricals_create (&inter, 1, cmd->wv,
- cmd->exclude, makeit, updateit,
- CONST_CAST (struct variable *, cmd->vars[v]),
- ws.dd_total[v]);
+ cmd->exclude);
+
+ categoricals_set_payload (ws.vws[v].cat, &payload,
+ CONST_CAST (struct variable *, cmd->vars[v]),
+ ws.dd_total[v]);
+
ws.vws[v].cov = covariance_2pass_create (1, &cmd->vars[v],
ws.vws[v].cat,
/* PSPP - a program for statistical analysis.
- Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/* Missing values to be excluded */
enum mv_class exclude;
- /* Function to be called on each update */
- update_func *update;
-
- /* Function specified by the caller to create user_data */
- user_data_create_func *user_data_create;
-
- /* Auxilliary data to be passed to update and user_data_create_func*/
- void *aux1;
+ const void *aux1;
void *aux2;
+
+ const struct payload *payload;
};
#if 0
/* Interate over each interaction value, and unref any cases that we reffed */
HMAP_FOR_EACH (iv, struct interaction_value, node, &cat->iap[i].ivmap)
{
+#if 0
+ if (cat->payload)
+ cat->payload->destroy (cat->aux1, iv->user_data);
+#endif
case_unref (iv->ccase);
}
struct categoricals *
categoricals_create (struct interaction *const*inter, size_t n_inter,
- const struct variable *wv, enum mv_class exclude,
- user_data_create_func *udf,
- update_func *update, void *aux1, void *aux2
- )
+ const struct variable *wv, enum mv_class exclude)
{
size_t i;
struct categoricals *cat = xmalloc (sizeof *cat);
cat->reverse_variable_map_long = NULL;
cat->pool = pool_create ();
cat->exclude = exclude;
- cat->update = update;
- cat->user_data_create = udf;
-
- cat->aux1 = aux1;
- cat->aux2 = aux2;
+ cat->payload = NULL;
+ cat->aux2 = NULL;
cat->iap = pool_calloc (cat->pool, cat->n_iap, sizeof *cat->iap);
{
const struct interaction *iact = cat->iap[i].iact;
- // if ( interaction_case_is_missing (iact, c, cat->exclude))
- // continue;
+ size_t hash;
+ struct interaction_value *node;
+
+ if ( interaction_case_is_missing (iact, c, cat->exclude))
+ continue;
- size_t hash = interaction_case_hash (iact, c, 0);
- struct interaction_value *node = lookup_case (&cat->iap[i].ivmap, iact, c);
+ hash = interaction_case_hash (iact, c, 0);
+ node = lookup_case (&cat->iap[i].ivmap, iact, c);
if ( NULL == node)
{
hmap_insert (&cat->iap[i].ivmap, &node->node, hash);
- if (cat->user_data_create)
- node->user_data = cat->user_data_create (cat->aux1, cat->aux2);
+ if (cat->payload)
+ {
+ node->user_data = cat->payload->create (cat->aux1, cat->aux2);
+ }
}
else
{
}
cat->iap[i].cc += weight;
- if (cat->update)
- cat->update (node->user_data, cat->exclude, cat->wv, NULL, c, cat->aux1, cat->aux2);
+ if (cat->payload)
+ cat->payload->update (cat->aux1, cat->aux2, node->user_data, c, cat->exclude, cat->wv);
+
}
}
return cat->n_vars;
}
+
+/* Return a case containing the set of values corresponding to
+ the Nth Category of the IACTth interaction */
+const struct ccase *
+categoricals_get_case_by_category_real (const struct categoricals *cat, int iact, int n)
+{
+ const struct interact_params *vp = &cat->iap[iact];
+ const struct interaction_value *vn = vp->reverse_interaction_value_map [n];
+
+ return vn->ccase;
+}
+
+/* Return a the user data corresponding to the Nth Category of the IACTth interaction. */
+void *
+categoricals_get_user_data_by_category_real (const struct categoricals *cat, int iact, int n)
+{
+ const struct interact_params *vp = &cat->iap[iact];
+ const struct interaction_value *iv = vp->reverse_interaction_value_map [n];
+
+ return iv->user_data;
+}
+
+
+
/* Return a case containing the set of values corresponding to SUBSCRIPT */
const struct ccase *
categoricals_get_case_by_category (const struct categoricals *cat, int subscript)
}
+\f
-
+void
+categoricals_set_payload (struct categoricals *cat, const struct payload *p,
+ const void *aux1, void *aux2)
+{
+ cat->payload = p;
+ cat->aux1 = aux1;
+ cat->aux2 = aux2;
+}
/* PSPP - a program for statistical analysis.
- Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
union value ;
-typedef void update_func (void *user_data,
- enum mv_class exclude,
- const struct variable *wv,
- const struct variable *catvar,
- const struct ccase *c,
- void *aux1, void *aux2);
-
-typedef void *user_data_create_func (void *aux1, void *aux2);
-
struct categoricals *categoricals_create (struct interaction *const *, size_t n_int,
- const struct variable *wv, enum mv_class exclude,
- user_data_create_func *udf,
- update_func *update, void *aux1, void *aux2);
+ const struct variable *wv, enum mv_class exclude);
void categoricals_destroy (struct categoricals *);
/* Return the value corresponding to the N'th category */
const union value * categoricals_get_value_by_category (const struct categoricals *cat, int n);
+const struct ccase *
+categoricals_get_case_by_category_real (const struct categoricals *cat, int iact, int n);
+
+void *
+categoricals_get_user_data_by_category_real (const struct categoricals *cat, int iact, int n);
+
+
void * categoricals_get_user_data_by_category (const struct categoricals *cat, int category);
const struct ccase * categoricals_get_case_by_category (const struct categoricals *cat, int subscript);
+struct payload
+{
+ void* (*create) (const void *aux1, void *aux2);
+ void (*update) (const void *aux1, void *aux2, void *user_data,
+ const struct ccase *, enum mv_class, const struct variable *wv);
+ void (*destroy) (const void *aux1, void *aux2, void *user_data);
+};
+
+
+void categoricals_set_payload (struct categoricals *cats, const struct payload *p, const void *aux1, void *aux2);
+
+
#endif
/* PSPP - a program for statistical analysis.
- Copyright (C) 2011 Free Software Foundation, Inc.
+ Copyright (C) 2011, 2012 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
interaction_to_string (const struct interaction *iact, struct string *str)
{
int v = 0;
+ if ( iact->n_vars == 0)
+ return;
ds_put_cstr (str, var_to_string (iact->vars[v]));
for (v = 1; v < iact->n_vars; ++v)
{