Moved is_origin and get_exact_subscript to design-matrix.[ch]
[pspp-builds.git] / src / math / design-matrix.c
index b81859aa5a539099f6e7a437ab053f31ce5fa202..030efd7a2d3316ac23989b0a5ab5de38473cc4d2 100644 (file)
@@ -281,3 +281,44 @@ design_matrix_set_element (const struct design_matrix *d, size_t row, size_t col
 {
   gsl_matrix_set (d->m, row, col, x);
 }
+/*
+  If VAR is categorical with d categories, its first category should
+  correspond to the origin in d-dimensional Euclidean space.
+ */
+static bool
+is_origin (const struct variable *var, const union value *val)
+{
+  if (var_is_numeric (var))
+    {
+      return false;
+    }
+  if (cat_value_find (var, val) == 0)
+    {
+      return true;
+    }
+  return false;
+}
+
+/*
+  Return the subscript of the column of the design matrix
+  corresponding to VAL. If VAR is categorical with d categories, its
+  first category should correspond to the origin in d-dimensional
+  Euclidean space, so there is no subscript for this value.
+ */
+size_t
+dm_get_exact_subscript (const struct design_matrix *dm, const struct variable *var,
+                    const union value *val)
+{
+  size_t result;
+
+  result = design_matrix_var_to_column (dm, var);
+  if (var_is_alpha (var))
+    {
+      if (is_origin (var, val))
+       {
+         return -1u;
+       }
+      result += cat_value_find (var, val) - 1;
+    }
+  return result;
+}