Added result_class parameter to tab_double and updated all callers. Removed tab_fixed
[pspp] / src / math / covariance.c
index 9bc8eb72e7515a7ba2f3cb9042f315fe049e6877..3ec90efbba05188c68bddd54ce53bc2a8e7a5d0f 100644 (file)
@@ -113,6 +113,8 @@ struct covariance
   /* Flags indicating that the first case has been seen */
   bool pass_one_first_case_seen;
   bool pass_two_first_case_seen;
+
+  gsl_matrix *unnormalised;
 };
 
 
@@ -202,6 +204,7 @@ covariance_2pass_create (size_t n_vars, const struct variable *const *vars,
   cov->cm = NULL;
 
   cov->categoricals = cats;
+  cov->unnormalised = NULL;
 
   return cov;
 }
@@ -268,7 +271,7 @@ get_val (const struct covariance *cov, int i, const struct ccase *c)
       return val->f;
     }
 
-  return categoricals_get_binary_by_subscript (cov->categoricals, i - cov->n_vars, c);
+  return categoricals_get_effects_code_for_case (cov->categoricals, i - cov->n_vars, c);
 }
 
 #if 0
@@ -667,27 +670,31 @@ covariance_calculate_single_pass_unnormalized (struct covariance *cov)
 
 
 /* Return a pointer to gsl_matrix containing the pairwise covariances.  The
-   caller owns the returned matrix and must free it when it is no longer
-   needed.
+   returned matrix is owned by the structure, and must not be freed.
 
    Call this function only after all data have been accumulated.  */
-gsl_matrix *
+const gsl_matrix *
 covariance_calculate_unnormalized (struct covariance *cov)
 {
   if ( cov->state <= 0 )
     return NULL;
 
+  if (cov->unnormalised != NULL)
+    return cov->unnormalised;
+
   switch (cov->passes)
     {
     case 1:
-      return covariance_calculate_single_pass_unnormalized (cov);  
+      cov->unnormalised =  covariance_calculate_single_pass_unnormalized (cov);  
       break;
     case 2:
-      return covariance_calculate_double_pass_unnormalized (cov);  
+      cov->unnormalised =  covariance_calculate_double_pass_unnormalized (cov);  
       break;
     default:
       NOT_REACHED ();
     }
+
+  return cov->unnormalised;
 }
 
 /* Function to access the categoricals used by COV
@@ -711,6 +718,7 @@ covariance_destroy (struct covariance *cov)
   for (i = 0; i < n_MOMENTS; ++i)
     gsl_matrix_free (cov->moments[i]);
 
+  gsl_matrix_free (cov->unnormalised);
   free (cov->moments);
   free (cov->cm);
   free (cov);
@@ -742,7 +750,9 @@ struct tab_table *
 covariance_dump_enc_header (const struct covariance *cov, int length)
 {
   struct tab_table *t = tab_create (cov->dim,  length);
+  int n;
   int i;
+
   tab_title (t, "Covariance Encoding");
 
   tab_box (t, 
@@ -758,18 +768,19 @@ covariance_dump_enc_header (const struct covariance *cov, int length)
       tab_vline (t, TAL_1, i + 1, 0, tab_nr (t) - 1);
     }
 
-  int n = 0;
+  n = 0;
   while (i < cov->dim)
     {
       struct string str;
       int idx = i - cov->n_vars;
       const struct interaction *iact =
        categoricals_get_interaction_by_subscript (cov->categoricals, idx);
+      int df;
 
       ds_init_empty (&str);
       interaction_to_string (iact, &str);
 
-      int df = categoricals_df (cov->categoricals, n);
+      df = categoricals_df (cov->categoricals, n);
 
       tab_joint_text (t,
                      i, 0,
@@ -802,6 +813,6 @@ covariance_dump_enc (const struct covariance *cov, const struct ccase *c,
   for (i = 0 ; i < cov->dim; ++i)
     {
       double v = get_val (cov, i, c);
-      tab_double (t, i, row, 0, v, i < cov->n_vars ? NULL : &F_8_0);
+      tab_double (t, i, row, 0, v, i < cov->n_vars ? NULL : &F_8_0, RC_OTHER);
     }
 }