#define CATEGORICALS_DEBUG 0
-#define EFFECTS_CODING 1
-
struct value_node
{
struct hmap_node node; /* Node in hash map. */
struct interact_params
{
- /* A map indexed by a interaction_value */
+ /* A map of cases indexed by a interaction_value */
struct hmap ivmap;
- const struct interaction *iact;
+ struct interaction *iact;
int base_subscript_short;
int base_subscript_long;
/* Interate over each interaction value, and unref any cases that we reffed */
HMAP_FOR_EACH (iv, struct interaction_value, node, &cat->iap[i].ivmap)
{
-#if 0
- if (cat->payload)
- cat->payload->destroy (cat->aux1, iv->user_data);
-#endif
+ if (cat->payload && cat->payload->destroy)
+ cat->payload->destroy (cat->aux1, cat->aux2, iv->user_data);
case_unref (iv->ccase);
}
{
int i;
struct variable_node *vn = NULL;
- const double weight = cat->wv ? case_data (c, cat->wv)->f : 1.0;
+ double weight;
+
+ if (NULL == cat)
+ return;
+
+ weight = cat->wv ? case_data (c, cat->wv)->f : 1.0;
assert (NULL == cat->reverse_variable_map_short);
assert (NULL == cat->reverse_variable_map_long);
size_t
categoricals_df_total (const struct categoricals *cat)
{
+ if (NULL == cat)
+ return 0;
+
return cat->df_sum;
}
int i;
int idx_short = 0;
int idx_long = 0;
+
+ if (NULL == cat)
+ return;
+
cat->df_sum = 0;
cat->n_cats_total = 0;
HMAP_FOR_EACH (ivn, struct interaction_value, node, &iap->ivmap)
{
iap->reverse_interaction_value_map[x++] = ivn;
-
}
assert (x <= iap->n_cats);
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_code_for_case (cat, x, iv->ccase); \
+ const double bin = categoricals_get_effects_code_for_case (cat, x, iv->ccase);
iap->enc_sum [x - iap->base_subscript_short] += bin * iv->cc;
}
- if (cat->payload && cat->payload->destroy)
- cat->payload->destroy (cat->aux1, cat->aux2, iv->user_data);
+ if (cat->payload && cat->payload->calculate)
+ cat->payload->calculate (cat->aux1, cat->aux2, iv->user_data);
}
}
return vp->enc_sum[subscript - vp->base_subscript_short];
}
+
/* Returns unity if the value in case C at SUBSCRIPT is equal to the category
for that subscript */
-double
+static double
categoricals_get_code_for_case (const struct categoricals *cat, int subscript,
- const struct ccase *c)
+ const struct ccase *c,
+ bool effects_coding)
{
const struct interaction *iact = categoricals_get_interaction_by_subscript (cat, subscript);
const int index = ((subscript - base_index) % iap->df_prod[v] ) / dfp;
dfp = iap->df_prod [v];
-#if EFFECTS_CODING
- if ( valn->index == df )
+ if (effects_coding && valn->index == df )
bin = -1.0;
- else
-#endif
- if ( valn->index != index )
- bin = 0;
+ else if ( valn->index != index )
+ bin = 0;
result *= bin;
}
}
+/* Returns unity if the value in case C at SUBSCRIPT is equal to the category
+ for that subscript */
+double
+categoricals_get_dummy_code_for_case (const struct categoricals *cat, int subscript,
+ const struct ccase *c)
+{
+ return categoricals_get_code_for_case (cat, subscript, c, false);
+}
+
+/* Returns unity if the value in case C at SUBSCRIPT is equal to the category
+ for that subscript.
+ Else if it is the last category, return -1.
+ Otherwise return 0.
+ */
+double
+categoricals_get_effects_code_for_case (const struct categoricals *cat, int subscript,
+ const struct ccase *c)
+{
+ return categoricals_get_code_for_case (cat, subscript, c, true);
+}
+
+
size_t
categoricals_get_n_variables (const struct categoricals *cat)
{