Move interaction subset predicates out of glm.c into interaction.c
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 23 Sep 2011 13:56:45 +0000 (15:56 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 27 Sep 2011 04:29:06 +0000 (06:29 +0200)
Renamed function:   is_subset --> interaction_is_proper_subset
                    drop_from_submodel --> interaction_is_subset
and moved them into interaction.c  This seems to me to be easier
to understand, and more efficient.

src/language/stats/glm.c
src/math/interaction.c
src/math/interaction.h

index dddf39144fc13656e48ccc609275ae500baf2651..b23832ff06816d7de068ff6a194c4bab09a45399 100644 (file)
@@ -347,59 +347,6 @@ not_dropped (size_t j, const size_t *dropped, size_t n_dropped)
   return true;
 }
 
-/*
-  Do the variables in X->VARS constitute a proper
-  subset of the variables in Y->VARS?
- */
-static bool
-is_subset (const struct interaction *x, const struct interaction *y)
-{
-  size_t i;
-  size_t j;
-  size_t n = 0;
-
-  if (x->n_vars < y->n_vars)
-    {
-      for (i = 0; i < x->n_vars; i++)
-       {
-         for (j = 0; j < y->n_vars; j++)
-           {
-             if (x->vars [i] == y->vars [j])
-               {
-                 n++;
-               }
-           }
-       }
-    }
-  if (n >= x->n_vars)
-    return true;
-  return false;
-}
-
-static bool
-drop_from_submodel (const struct interaction *x, const struct interaction *y)
-{
-  size_t i;
-  size_t j;
-  size_t n = 0;
-
-  if (is_subset (x, y))
-    return true;
-
-  for (i = 0; i < x->n_vars; i++)
-    for (j = 0; j < y->n_vars; j++)
-      {
-       if (x->vars [i] == y->vars [j])
-         n++;
-      }
-  if (n == x->n_vars)
-    {
-      return true;
-    }
-
-  return false;
-}
-
 static void
 fill_submatrix (gsl_matrix * cov, gsl_matrix * submatrix, size_t * dropped,
                size_t n_dropped)
@@ -448,12 +395,12 @@ get_ssq (struct covariance *cov, gsl_vector *ssq, const struct glm_spec *cmd)
        {
          const struct interaction * x = 
            categoricals_get_interaction_by_subscript (cats, i - cmd->n_dep_vars);
-         if (is_subset (cmd->interactions [k], x))
+         if (interaction_is_proper_subset (cmd->interactions [k], x))
            {
              assert (n_dropped_model < covariance_dim (cov));
              model_dropped[n_dropped_model++] = i;
            }
-         if (drop_from_submodel (cmd->interactions [k], x))
+         if (interaction_is_subset (cmd->interactions [k], x))
            {
              assert (n_dropped_submodel < covariance_dim (cov));
              submodel_dropped[n_dropped_submodel++] = i;
index d24166d4379b18bf7e7b84c976b6cd4ad2aa4ad8..d81eba5095b613231c5deef69d9e68f90c97ff27 100644 (file)
@@ -72,6 +72,56 @@ interaction_add_variable (struct interaction *i, const struct variable *v)
 }
 
 
+/*
+  Do the variables in X->VARS constitute a proper
+  subset of the variables in Y->VARS?
+ */
+bool
+interaction_is_proper_subset (const struct interaction *x, const struct interaction *y)
+{
+  if (x->n_vars >= y->n_vars)
+    return false;
+
+  return interaction_is_subset (x, y);
+}
+
+/*
+  Do the variables in X->VARS constitute a 
+  subset (proper or otherwise) of the variables in Y->VARS?
+ */
+bool
+interaction_is_subset (const struct interaction *x, const struct interaction *y)
+{
+  size_t i;
+  size_t j;
+  size_t n = 0;
+
+  /* By definition, a subset cannot have more members than its superset */
+  if (x->n_vars > y->n_vars)
+    return false;
+
+  /* Count the number of values which are members of both sets */
+  for (i = 0; i < x->n_vars; i++)
+    {
+      for (j = 0; j < y->n_vars; j++)
+       {
+         if (x->vars [i] == y->vars [j])
+           {
+             n++;
+           }
+       }
+    }
+
+  /* If ALL the members of X were also found in Y, then this must be a subset */    
+  if (n >= x->n_vars)
+    return true;
+
+  return false;
+}
+
+
+
+
 void
 interaction_dump (const struct interaction *i)
 {
index cd38ae226ea81b6e288c80c6a4aa30aa03e8e066..0fb1f2622298c2b9b741ac6554aa45051644c4c6 100644 (file)
@@ -37,6 +37,8 @@ void interaction_destroy (struct interaction *);
 void interaction_add_variable (struct interaction *, const struct variable *);
 void interaction_dump (const struct interaction *);
 void interaction_to_string (const struct interaction *iact, struct string *str);
+bool interaction_is_proper_subset (const struct interaction *x, const struct interaction *y);
+bool interaction_is_subset (const struct interaction *x, const struct interaction *y);
 
 
 struct ccase;