From: John Darrington Date: Sat, 4 Aug 2012 04:48:30 +0000 (+0200) Subject: ONEWAY: call categoricals_done only once X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3e81b17836ef4f026b2321a6a79418c7f0cb9121;p=pspp ONEWAY: call categoricals_done only once --- diff --git a/src/language/stats/oneway.c b/src/language/stats/oneway.c index dba2d35bb2..4fd027e299 100644 --- a/src/language/stats/oneway.c +++ b/src/language/stats/oneway.c @@ -800,7 +800,7 @@ run_oneway (const struct oneway_spec *cmd, gsl_matrix *cm; struct per_var_ws *pvw = &ws.vws[v]; const struct categoricals *cats = covariance_get_categoricals (pvw->cov); - const bool ok = categoricals_done (cats); + const bool ok = categoricals_sane (cats); if ( ! ok) { diff --git a/src/math/categoricals.c b/src/math/categoricals.c index 586037b585..ba88227864 100644 --- a/src/math/categoricals.c +++ b/src/math/categoricals.c @@ -174,6 +174,8 @@ struct categoricals const void *aux1; void *aux2; + bool sane; + const struct payload *payload; }; @@ -296,6 +298,11 @@ 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, @@ -315,6 +322,7 @@ categoricals_create (struct interaction *const*inter, size_t n_inter, 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); @@ -459,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 @@ -493,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]; @@ -585,7 +596,7 @@ categoricals_done (const struct categoricals *cat_) } } - return true; + cat->sane = true; } diff --git a/src/math/categoricals.h b/src/math/categoricals.h index b2f6b649b1..28e0f5f1df 100644 --- a/src/math/categoricals.h +++ b/src/math/categoricals.h @@ -57,7 +57,6 @@ size_t categoricals_df_total (const struct categoricals *cat); */ size_t categoricals_get_n_variables (const struct categoricals *cat); - bool categoricals_is_complete (const struct categoricals *cat); @@ -67,7 +66,9 @@ bool categoricals_is_complete (const struct categoricals *cat); If this function returns false, then no calls to _by_subscript or *_by_category are allowed. */ -bool categoricals_done (const struct categoricals *cat); +void categoricals_done (const struct categoricals *cat); + +bool categoricals_sane (const struct categoricals *cat); /*