ref count the linreg structure so as to avoid double free problems
[pspp] / src / math / linreg.h
index 17fe3c733c990e45df1b3a4012baf6b84a3d9608..e53a02956e2077e91f58ede8268ed68ab71fd60d 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2005 Free Software Foundation, Inc. Written by Jason H. Stover.
+   Copyright (C) 2005, 2011 Free Software Foundation, Inc. Written by Jason H. Stover.
 
    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
 
 #ifndef LINREG_H
 #define LINREG_H
-#include <stdbool.h>
+
 #include <gsl/gsl_math.h>
-#include <gsl/gsl_vector.h>
 #include <gsl/gsl_matrix.h>
+#include <gsl/gsl_vector.h>
+#include <stdbool.h>
 
 enum
 {
@@ -89,6 +90,7 @@ typedef struct pspp_linreg_opts_struct pspp_linreg_opts;
 
 struct linreg_struct
 {
+  int refcnt;
   double n_obs;                        /* Number of observations. */
   int n_indeps;                        /* Number of independent variables. */
   int n_coeffs;                 /* The intercept is not considered a
@@ -129,11 +131,6 @@ struct linreg_struct
                                   dfe, but since it is the best unbiased
                                   estimate of the population variance, it
                                   has its own entry here. */
-  gsl_vector *ssx;             /* Centered sums of squares for independent
-                                  variables, i.e. \sum (x[i] - mean(x))^2. */
-  double ssy;                  /* Centered sums of squares for dependent
-                                  variable.
-                                */
   /*
      Covariance matrix of the parameter estimates.
    */
@@ -145,14 +142,9 @@ struct linreg_struct
   double dfe;
   double dfm;
 
-  /*
-     'Hat' or Hessian matrix, i.e. (X'X)^{-1}, where X is our
-     design matrix.
-   */
-  gsl_matrix *hat;
-
   struct variable *pred;
   struct variable *resid;
+  int dependent_column; /* Column containing the dependent variable. Defaults to last column. */
 };
 
 typedef struct linreg_struct linreg;
@@ -162,7 +154,8 @@ typedef struct linreg_struct linreg;
 linreg *linreg_alloc (const struct variable *, const struct variable **, 
                      double, size_t);
 
-bool linreg_free (void *);
+void linreg_unref (linreg *);
+void linreg_ref (linreg *c);
 
 /*
   Fit the linear model via least squares. All pointers passed to pspp_linreg
@@ -197,9 +190,11 @@ gsl_matrix * linreg_cov (const linreg *);
 double linreg_coeff (const linreg *, size_t);
 const struct variable * linreg_indep_var (const linreg *, size_t);
 size_t linreg_n_coeffs (const linreg *);
-size_t linreg_n_obs (const linreg *);
+double linreg_n_obs (const linreg *);
 double linreg_sse (const linreg *);
 double linreg_ssreg (const linreg *);
 double linreg_dfmodel (const linreg *);
 double linreg_sst (const linreg *);
+void linreg_set_depvar_mean (linreg *, double);
+double linreg_get_depvar_mean (linreg *);
 #endif