covariance: Fix const-ness of covariance_calculate[_unnormalized] retval.
authorBen Pfaff <blp@cs.stanford.edu>
Sun, 12 Dec 2010 05:29:55 +0000 (21:29 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sun, 12 Dec 2010 06:10:45 +0000 (22:10 -0800)
The covariance_calculate() and covariance_calculate_unnormalized()
functions documented that their return values were owned by the covariance
object itself and thus should not be freed by the caller.  However, this
documentation was incorrect, because in fact the covariance object did not
retain the pointer at all.  This commit fixes the comments, updates
the return values to be non-"const", and changes the callers to free the
returned "gsl_matrix" objects.

src/language/stats/correlations.c
src/language/stats/factor.c
src/language/stats/glm.c
src/language/stats/oneway.c
src/language/stats/regression.q
src/math/covariance.c
src/math/covariance.h

index d8f13488f9b9b445aa096ccb510b01b2b4f2f57c..4f476433b3f73c3612261a51fb987a06bc0255ea 100644 (file)
@@ -278,7 +278,7 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
 {
   struct ccase *c;
   const gsl_matrix *var_matrix,  *samples_matrix, *mean_matrix;
-  const gsl_matrix *cov_matrix;
+  gsl_matrix *cov_matrix;
   gsl_matrix *corr_matrix;
   struct covariance *cov = covariance_2pass_create (corr->n_vars_total, corr->vars,
                                                    NULL,
@@ -315,6 +315,7 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
 
   covariance_destroy (cov);
   gsl_matrix_free (corr_matrix);
+  gsl_matrix_free (cov_matrix);
 }
 
 int
index e09eaae8b01a6d8d00df277791ccd4adcf2a0eba..eae6840f3b2f66716a61582e8863ee9746c673bb 100644 (file)
@@ -175,7 +175,7 @@ struct idata
   /* Intermediate values used in calculation */
 
   const gsl_matrix *corr ;  /* The correlation matrix */
-  const gsl_matrix *cov ;   /* The covariance matrix */
+  gsl_matrix *cov ;         /* The covariance matrix */
   const gsl_matrix *n ;     /* Matrix of number of samples */
 
   gsl_vector *eval ;  /* The eigenvalues */
@@ -206,6 +206,8 @@ idata_free (struct idata *id)
   gsl_vector_free (id->msr);
   gsl_vector_free (id->eval);
   gsl_matrix_free (id->evec);
+  if (id->cov != NULL)
+    gsl_matrix_free (id->cov);
 
   free (id);
 }
index 678ecce78dad8c82ce15f71ada57630cf22004c9..862f49cea24300a7f4f158e72933cf8e613b0165 100644 (file)
@@ -263,6 +263,8 @@ run_glm (const struct glm_spec *cmd, struct casereader *input, const struct data
     reg_sweep (cm, 0);
 
     dump_matrix (cm);
+
+    gsl_matrix_free (cm);
   }
 
   if (!taint_has_tainted_successor (taint))
index f390a3c8aa5a3a420bb9c0cf0c207013f70f6e12..12170bb47e73aeb721ed9a97aad2e319232a9755 100644 (file)
@@ -495,6 +495,8 @@ run_oneway (const struct oneway_spec *cmd,
       pvw->n_groups = categoricals_total (cats);
 
       pvw->mse = (pvw->sst - pvw->ssa) / (n - pvw->n_groups);
+
+      gsl_matrix_free (cm);
     }
 
   for (v = 0; v < cmd->n_vars; ++v)
index e5b86ea2bc84a024a9f2503796b16a3654c8a2d1..b6ee6aaada8cb551f95a436fba119621076b620e 100644 (file)
@@ -810,7 +810,7 @@ fill_covariance (gsl_matrix *cov, struct covariance *all_cov,
   size_t dep_subscript;
   size_t *rows;
   const gsl_matrix *ssizes;
-  const gsl_matrix *cm;
+  gsl_matrix *cm;
   const gsl_matrix *mean_matrix;
   const gsl_matrix *ssize_matrix;
   double result = 0.0;
index aa7f41771c1ac9f3d55ff90d5a418010e5e032a8..b0b0b466676a58eb67311067dbba8f4aab2de413 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -529,7 +529,7 @@ cm_to_gsl (struct covariance *cov)
 }
 
 
-static const gsl_matrix *
+static gsl_matrix *
 covariance_calculate_double_pass (struct covariance *cov)
 {
   size_t i, j;
@@ -553,7 +553,7 @@ covariance_calculate_double_pass (struct covariance *cov)
   return  cm_to_gsl (cov);
 }
 
-static const gsl_matrix *
+static gsl_matrix *
 covariance_calculate_single_pass (struct covariance *cov)
 {
   size_t i, j;
@@ -598,12 +598,12 @@ covariance_calculate_single_pass (struct covariance *cov)
 }
 
 
-/* 
-   Return a pointer to gsl_matrix containing the pairwise covariances.
-   The matrix remains owned by the COV object, and must not be freed.
-   Call this function only after all data have been accumulated.
-*/
-const gsl_matrix *
+/* 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.
+
+   Call this function only after all data have been accumulated.  */
+gsl_matrix *
 covariance_calculate (struct covariance *cov)
 {
   if ( cov->state <= 0 )
@@ -625,7 +625,7 @@ covariance_calculate (struct covariance *cov)
 /*
   Covariance computed without dividing by the sample size.
  */
-static const gsl_matrix *
+static gsl_matrix *
 covariance_calculate_double_pass_unnormalized (struct covariance *cov)
 {
   size_t i, j;
@@ -647,7 +647,7 @@ covariance_calculate_double_pass_unnormalized (struct covariance *cov)
   return  cm_to_gsl (cov);
 }
 
-static const gsl_matrix *
+static gsl_matrix *
 covariance_calculate_single_pass_unnormalized (struct covariance *cov)
 {
   size_t i, j;
@@ -679,12 +679,12 @@ covariance_calculate_single_pass_unnormalized (struct covariance *cov)
 }
 
 
-/* 
-   Return a pointer to gsl_matrix containing the pairwise covariances.
-   The matrix remains owned by the COV object, and must not be freed.
-   Call this function only after all data have been accumulated.
-*/
-const gsl_matrix *
+/* 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.
+
+   Call this function only after all data have been accumulated.  */
+gsl_matrix *
 covariance_calculate_unnormalized (struct covariance *cov)
 {
   if ( cov->state <= 0 )
index cb83e151409224d1bf1d982a259179b9e79f5f49..f12e994d52fd6f89d33cbdcb9e5f46e4689d117c 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -40,8 +40,8 @@ void covariance_accumulate (struct covariance *, const struct ccase *);
 void covariance_accumulate_pass1 (struct covariance *, const struct ccase *);
 void covariance_accumulate_pass2 (struct covariance *, const struct ccase *);
 
-const gsl_matrix * covariance_calculate (struct covariance *cov);
-const gsl_matrix * covariance_calculate_unnormalized (struct covariance *);
+gsl_matrix * covariance_calculate (struct covariance *);
+gsl_matrix * covariance_calculate_unnormalized (struct covariance *);
 
 void covariance_destroy (struct covariance *cov);