X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Flinreg.c;h=47d21cf8f5fdfed7f357f96f45038493374b6aab;hb=613619667f835ee621a23c130f4aab28dcfe42d7;hp=e74646b97145b44720a2419b3bf5ff0a1f64cc1d;hpb=5f68c60b8283f6a410de20f927e9b12792ea58b3;p=pspp diff --git a/src/math/linreg.c b/src/math/linreg.c index e74646b971..47d21cf8f5 100644 --- a/src/math/linreg.c +++ b/src/math/linreg.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2010, 2011 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 @@ -15,17 +15,21 @@ along with this program. If not, see . */ #include + +#include "math/linreg.h" + #include #include #include #include #include #include -#include -#include -#include -#include -#include + +#include "data/value.h" +#include "data/variable.h" +#include "linreg/sweep.h" + +#include "gl/xalloc.h" /* Find the least-squares estimate of b for the linear model: @@ -74,6 +78,7 @@ linreg_alloc (const struct variable *depvar, const struct variable **indep_vars, c = xmalloc (sizeof (*c)); c->depvar = depvar; c->indep_vars = xnmalloc (p, sizeof (*indep_vars)); + c->dependent_column = p; for (i = 0; i < p; i++) { c->indep_vars[i] = indep_vars[i]; @@ -102,23 +107,29 @@ linreg_alloc (const struct variable *depvar, const struct variable **indep_vars, c->pred = NULL; c->resid = NULL; + c->refcnt = 1; return c; } -bool -linreg_free (void *m) +void +linreg_ref (linreg *c) +{ + c->refcnt++; +} + +void +linreg_unref (linreg *c) { - linreg *c = m; - if (c != NULL) + if (c && --c->refcnt == 0) { gsl_vector_free (c->indep_means); gsl_vector_free (c->indep_std); + gsl_vector_free (c->ss_indeps); gsl_matrix_free (c->cov); free (c->indep_vars); free (c->coeff); free (c); } - return true; } static void @@ -375,7 +386,7 @@ linreg_fit (const gsl_matrix *cov, linreg *l) gsl_matrix *params; params = gsl_matrix_calloc (cov->size1, cov->size2); gsl_matrix_memcpy (params, cov); - reg_sweep (params); + reg_sweep (params, l->dependent_column); post_sweep_computations (l, params); gsl_matrix_free (params); }