Add ability for reverse iteration to tower code, and corresponding
[pspp] / src / math / linreg / linreg.c
index e496150e71ca27140bcaefc7538e5822aa4c7696..558f6646fe33dde8e2ed19bcac22fd2614e76bb1 100644 (file)
@@ -18,6 +18,7 @@
   Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
  */
 
+#include <config.h>
 #include <gsl/gsl_fit.h>
 #include <gsl/gsl_multifit.h>
 
@@ -94,10 +95,10 @@ linreg_mean_std (gsl_vector_const_view v, double *mp, double *sp, double *ssp)
   The return value is the number of distinct variables found.
  */
 int
-pspp_linreg_get_vars (const void *c_, struct variable **v)
+pspp_linreg_get_vars (const void *c_, const struct variable **v)
 {
   const pspp_linreg_cache *c = c_;
-  struct pspp_linreg_coeff *coef = NULL;
+  struct pspp_coeff *coef = NULL;
   const struct variable *tmp;
   int i;
   int result = 0;
@@ -113,23 +114,23 @@ pspp_linreg_get_vars (const void *c_, struct variable **v)
   /*
      Start at c->coeff[1] to avoid the intercept.
    */
-  v[result] = (struct variable *) pspp_linreg_coeff_get_var (c->coeff[1], 0);
+  v[result] =  pspp_coeff_get_var (c->coeff[1], 0);
   result = (v[result] == NULL) ? 0 : 1;
 
   for (coef = c->coeff[2]; coef < c->coeff[c->n_coeffs]; coef++)
     {
-      tmp = pspp_linreg_coeff_get_var (coef, 0);
+      tmp = pspp_coeff_get_var (coef, 0);
       assert (tmp != NULL);
       /* Repeated variables are likely to bunch together, at the end
          of the array. */
       i = result - 1;
-      while (i >= 0 && (v[i]->index != tmp->index))
+      while (i >= 0 && v[i] != tmp)
        {
          i--;
        }
       if (i < 0 && result < c->n_coeffs)
        {
-         v[result] = (struct variable *) tmp;
+         v[result] = tmp;
          result++;
        }
     }
@@ -181,15 +182,18 @@ pspp_linreg_cache_free (void *m)
   int i;
 
   pspp_linreg_cache *c = m;
-  gsl_vector_free (c->indep_means);
-  gsl_vector_free (c->indep_std);
-  gsl_vector_free (c->ss_indeps);
-  gsl_matrix_free (c->cov);
-  for (i = 0; i < c->n_coeffs; i++)
+  if (c != NULL)
     {
-      pspp_linreg_coeff_free (c->coeff[i]);
+      gsl_vector_free (c->indep_means);
+      gsl_vector_free (c->indep_std);
+      gsl_vector_free (c->ss_indeps);
+      gsl_matrix_free (c->cov);
+      for (i = 0; i < c->n_coeffs; i++)
+       {
+         pspp_coeff_free (c->coeff[i]);
+       }
+      free (c);
     }
-  free (c);
   return true;
 }