X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fcategoricals.c;h=ba88227864c5fc363a02b921125f44a3d7c2243e;hb=3e81b17836ef4f026b2321a6a79418c7f0cb9121;hp=5aeb7e213c6d564f95f424321e42a9ace4b91112;hpb=665a2cafacdb038478c614b040958b5f81cb7548;p=pspp diff --git a/src/math/categoricals.c b/src/math/categoricals.c index 5aeb7e213c..ba88227864 100644 --- a/src/math/categoricals.c +++ b/src/math/categoricals.c @@ -165,12 +165,17 @@ struct categoricals struct pool *pool; - /* Missing values to be excluded */ - enum mv_class exclude; + /* Missing values in the dependent varirable to be excluded */ + enum mv_class dep_excl; + + /* Missing values in the factor variables to be excluded */ + enum mv_class fctr_excl; const void *aux1; void *aux2; + bool sane; + const struct payload *payload; }; @@ -258,6 +263,7 @@ categoricals_destroy (struct categoricals *cat) free (cat->iap[i].enc_sum); free (cat->iap[i].df_prod); hmap_destroy (&cat->iap[i].ivmap); + interaction_destroy (cat->iap[i].iact); } /* Interate over each variable and delete its value map */ @@ -292,10 +298,15 @@ lookup_case (const struct hmap *map, const struct interaction *iact, const struc return iv; } +bool +categoricals_sane (const struct categoricals *cat) +{ + return cat->sane; +} struct categoricals * categoricals_create (struct interaction *const*inter, size_t n_inter, - const struct variable *wv, enum mv_class exclude) + const struct variable *wv, enum mv_class dep_excl, enum mv_class fctr_excl) { size_t i; struct categoricals *cat = xmalloc (sizeof *cat); @@ -307,9 +318,11 @@ categoricals_create (struct interaction *const*inter, size_t n_inter, cat->reverse_variable_map_short = NULL; cat->reverse_variable_map_long = NULL; cat->pool = pool_create (); - cat->exclude = exclude; + cat->dep_excl = dep_excl; + cat->fctr_excl = fctr_excl; cat->payload = NULL; cat->aux2 = NULL; + cat->sane = false; cat->iap = pool_calloc (cat->pool, cat->n_iap, sizeof *cat->iap); @@ -378,7 +391,7 @@ categoricals_update (struct categoricals *cat, const struct ccase *c) size_t hash; struct interaction_value *node; - if ( interaction_case_is_missing (iact, c, cat->exclude)) + if ( interaction_case_is_missing (iact, c, cat->fctr_excl)) continue; hash = interaction_case_hash (iact, c, 0); @@ -454,7 +467,7 @@ categoricals_is_complete (const struct categoricals *cat) /* This function must be called *before* any call to categoricals_get_*_by subscript and *after* all calls to categoricals_update */ -bool +void categoricals_done (const struct categoricals *cat_) { /* Implementation Note: Whilst this function is O(n) in cat->n_cats_total, in most @@ -488,7 +501,10 @@ categoricals_done (const struct categoricals *cat_) struct variable_node *vn = lookup_variable (&cat->varmap, var, hash_pointer (var, 0)); if (hmap_count (&vn->valmap) == 0) - return false; + { + cat->sane = false; + return; + } cat->iap[i].df_prod[v] = df * (hmap_count (&vn->valmap) - 1); df = cat->iap[i].df_prod[v]; @@ -580,7 +596,7 @@ categoricals_done (const struct categoricals *cat_) } } - return true; + cat->sane = true; } @@ -697,8 +713,14 @@ categoricals_get_n_variables (const struct categoricals *cat) const struct ccase * categoricals_get_case_by_category_real (const struct categoricals *cat, int iact, int n) { + const struct interaction_value *vn; + const struct interact_params *vp = &cat->iap[iact]; - const struct interaction_value *vn = vp->reverse_interaction_value_map [n]; + + if ( n >= hmap_count (&vp->ivmap)) + return NULL; + + vn = vp->reverse_interaction_value_map [n]; return vn->ccase; } @@ -708,7 +730,12 @@ 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]; + const struct interaction_value *iv ; + + if ( n >= hmap_count (&vp->ivmap)) + return NULL; + + iv = vp->reverse_interaction_value_map [n]; return iv->user_data; }