categoricals.c: Rename function to more accurately reflect its purpose
[pspp-builds.git] / src / math / categoricals.c
index fbc23ab0f6191c4fcde9895220341a41e30d69d4..2ec1dc19100a5caa7219ecdfe4e333e4536e9c00 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "gl/xalloc.h"
 
-#define EFFECTS_CODING 0
+#define EFFECTS_CODING 1
 
 struct value_node
 {
@@ -264,6 +264,9 @@ categoricals_destroy (struct categoricals *cat)
        {
          case_unref (iv->ccase);
        }
+
+      free (cat->iap[i].enc_sum);
+      free (cat->iap[i].df_prod);
       hmap_destroy (&cat->iap[i].ivmap);
     }
 
@@ -558,7 +561,7 @@ categoricals_done (const struct categoricals *cat_)
          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;
            }
        }
@@ -596,21 +599,6 @@ categoricals_get_interaction_by_subscript (const struct categoricals *cat, int s
   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)
 {
@@ -632,8 +620,7 @@ categoricals_get_sum_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);
@@ -647,6 +634,7 @@ categoricals_get_binary_by_subscript (const struct categoricals *cat,
 
   const struct interact_params *iap = &cat->iap[i];
 
+  double dfp = 1.0;
   for (v = 0; v < iact->n_vars; ++v)
   {
     const struct variable *var = iact->vars[v];
@@ -660,13 +648,14 @@ categoricals_get_binary_by_subscript (const struct categoricals *cat,
 
     double bin = 1.0;
 
+    const double df = iap->df_prod[v] / dfp;
+
     /* Translate the subscript into an index for the individual variable */
-    int index = (subscript - base_index) % iap->df_prod[v];
-    if ( v > 0)
-      index /= iap->df_prod[v - 1];
+    const int index = ((subscript - base_index) % iap->df_prod[v] ) / dfp;
+    dfp = iap->df_prod [v];
 
 #if EFFECTS_CODING
-    if ( valn->index == 0)
+    if ( valn->index == df )
       bin = -1.0;
     else 
 #endif