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)
{
const void *aux1;
void *aux2;
+ bool sane;
+
const struct payload *payload;
};
return iv;
}
+bool
+categoricals_sane (const struct categoricals *cat)
+{
+ return cat->sane;
+}
struct categoricals *
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);
/* 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
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];
}
}
- return true;
+ cat->sane = true;
}
*/
size_t categoricals_get_n_variables (const struct categoricals *cat);
-
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);
/*