size_t
categoricals_n_total (const struct categoricals *cat)
{
- assert (cat->reverse_variable_map_long);
+ if (!categoricals_is_complete (cat))
+ return 0;
return cat->n_cats_total;
}
return cat->df_sum;
}
+bool
+categoricals_is_complete (const struct categoricals *cat)
+{
+ return (NULL != cat->reverse_variable_map_short);
+}
+
+
/* This function must be called *before* any call to categoricals_get_*_by subscript and
*after* all calls to categoricals_update */
-void
+bool
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->iap[i].df_prod[v] = df * (hmap_count (&vn->valmap) - 1);
df = cat->iap[i].df_prod[v];
struct interaction_value *iv = iap->reverse_interaction_value_map[y];
for (x = iap->base_subscript_short; x < iap->base_subscript_short + df ;++x)
{
- const double bin = categoricals_get_binary_by_subscript (cat, x, iv->ccase); \
+ const double bin = categoricals_get_code_for_case (cat, x, iv->ccase); \
iap->enc_sum [x - iap->base_subscript_short] += bin * iv->cc;
}
}
}
+
+ return true;
}
return cat->iap[index].iact;
}
-/* Return the case corresponding to SUBSCRIPT */
-static const struct ccase *
-categoricals_get_case_by_subscript (const struct categoricals *cat, int subscript)
-{
- int vindex = reverse_variable_lookup_short (cat, subscript);
- const struct interact_params *vp = &cat->iap[vindex];
- const struct interaction_value *vn = vp->reverse_interaction_value_map [subscript - vp->base_subscript_short];
-
- if ( vn == NULL)
- return NULL;
-
- return vn->ccase;
-}
-
-
double
categoricals_get_weight_by_subscript (const struct categoricals *cat, int subscript)
{
/* Returns unity if the value in case C at SUBSCRIPT is equal to the category
for that subscript */
double
-categoricals_get_binary_by_subscript (const struct categoricals *cat,
- int subscript,
+categoricals_get_code_for_case (const struct categoricals *cat, int subscript,
const struct ccase *c)
{
const struct interaction *iact = categoricals_get_interaction_by_subscript (cat, subscript);