From d06112af3e59338577515f98ec929454d608db71 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sat, 24 Oct 2009 16:14:59 +0200 Subject: [PATCH] Don't update categorical variables whose values are missing --- src/math/categoricals.c | 17 ++++++++++++----- src/math/categoricals.h | 3 ++- src/math/covariance.c | 2 +- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/math/categoricals.c b/src/math/categoricals.c index 4b517632..19b6e3f1 100644 --- a/src/math/categoricals.c +++ b/src/math/categoricals.c @@ -74,6 +74,9 @@ struct categoricals size_t n_cats_total; struct pool *pool; + + /* Missing values to be excluded */ + enum mv_class exclude; }; @@ -98,7 +101,6 @@ categoricals_dump (const struct categoricals *cat) { const struct var_params *vp = &cat->vp[v]; const struct hmap *m = &vp->map; - // size_t width = var_get_width (vp->var); struct hmap_node *node ; int x; @@ -155,7 +157,8 @@ lookup_value (const struct hmap *map, const struct variable *var, const union va struct categoricals * -categoricals_create (const struct variable **v, size_t n_vars, const struct variable *wv) +categoricals_create (const struct variable **v, size_t n_vars, + const struct variable *wv, enum mv_class exclude) { size_t i; struct categoricals *cat = xmalloc (sizeof *cat); @@ -165,6 +168,7 @@ categoricals_create (const struct variable **v, size_t n_vars, const struct vari cat->n_cats_total = 0; cat->reverse_variable_map = NULL; cat->pool = pool_create (); + cat->exclude = exclude; cat->vp = pool_calloc (cat->pool, n_vars, sizeof *cat->vp); @@ -193,10 +197,14 @@ categoricals_update (struct categoricals *cat, const struct ccase *c) const struct variable *var = cat->vp[i].var; unsigned int width = var_get_width (var); const union value *val = case_data (c, var); - size_t hash = value_hash (val, width, 0); + size_t hash; + struct value_node *node ; - struct value_node *node = lookup_value (&cat->vp[i].map, var, val); + if ( var_is_value_missing (var, val, cat->exclude)) + continue; + hash = value_hash (val, width, 0); + node = lookup_value (&cat->vp[i].map, var, val); if ( NULL == node) { @@ -309,7 +317,6 @@ categoricals_get_value_by_subscript (const struct categoricals *cat, int subscri return &vn->value; } - /* Returns unity if the value in case C at SUBSCRIPT is equal to the category for that subscript */ double diff --git a/src/math/categoricals.h b/src/math/categoricals.h index 619135a3..2cec0b45 100644 --- a/src/math/categoricals.h +++ b/src/math/categoricals.h @@ -19,6 +19,7 @@ #define _CATEGORICALS__ #include +#include struct categoricals; struct variable; @@ -27,7 +28,7 @@ struct ccase; union value ; struct categoricals *categoricals_create (const struct variable **v, size_t n_vars, - const struct variable *wv); + const struct variable *wv, enum mv_class exclude); void categoricals_destroy (struct categoricals *); diff --git a/src/math/covariance.c b/src/math/covariance.c index 7e973629..dbcf4f65 100644 --- a/src/math/covariance.c +++ b/src/math/covariance.c @@ -195,7 +195,7 @@ covariance_2pass_create (size_t n_vars, const struct variable **vars, cov->n_cm = - 1; cov->cm = NULL; - cov->categoricals = categoricals_create (catvars, n_catvars, wv); + cov->categoricals = categoricals_create (catvars, n_catvars, wv, exclude); return cov; } -- 2.30.2