projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Update all #include directives to the currently preferred style.
[pspp-builds.git]
/
src
/
math
/
covariance.c
diff --git
a/src/math/covariance.c
b/src/math/covariance.c
index dc3166923d7ddff670d903274caef1dfe548beb4..446ee6621a1e11881c37e5dba04d8d645c1610a8 100644
(file)
--- a/
src/math/covariance.c
+++ b/
src/math/covariance.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 2009 Free Software Foundation, Inc.
+ Copyright (C) 2009
, 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
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
@@
-16,15
+16,18
@@
#include <config.h>
#include <config.h>
-#include <libpspp/assertion.h>
-#include "covariance.h"
-#include <gl/xalloc.h>
-#include "moments.h"
+#include "math/covariance.h"
+
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_matrix.h>
-#include <data/case.h>
-#include <data/variable.h>
-#include <libpspp/misc.h>
-#include "categoricals.h"
+
+#include "data/case.h"
+#include "data/variable.h"
+#include "libpspp/assertion.h"
+#include "libpspp/misc.h"
+#include "math/categoricals.h"
+#include "math/moments.h"
+
+#include "gl/xalloc.h"
#define n_MOMENTS (MOMENT_VARIANCE + 1)
#define n_MOMENTS (MOMENT_VARIANCE + 1)
@@
-68,7
+71,7
@@
struct covariance
{
/* The variables for which the covariance matrix is to be calculated. */
size_t n_vars;
{
/* The variables for which the covariance matrix is to be calculated. */
size_t n_vars;
- const struct variable **vars;
+ const struct variable *
const
*vars;
/* Categorical variables. */
struct categoricals *categoricals;
/* Categorical variables. */
struct categoricals *categoricals;
@@
-131,11
+134,11
@@
covariance_moments (const struct covariance *cov, int m)
/* Create a covariance struct.
*/
struct covariance *
/* Create a covariance struct.
*/
struct covariance *
-covariance_1pass_create (size_t n_vars, const struct variable **vars,
+covariance_1pass_create (size_t n_vars, const struct variable *
const
*vars,
const struct variable *weight, enum mv_class exclude)
{
size_t i;
const struct variable *weight, enum mv_class exclude)
{
size_t i;
- struct covariance *cov = x
m
alloc (sizeof *cov);
+ struct covariance *cov = x
z
alloc (sizeof *cov);
cov->passes = 1;
cov->state = 0;
cov->passes = 1;
cov->state = 0;
@@
-156,7
+159,8
@@
covariance_1pass_create (size_t n_vars, const struct variable **vars,
cov->n_cm = (n_vars * (n_vars - 1) ) / 2;
cov->n_cm = (n_vars * (n_vars - 1) ) / 2;
- cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm);
+ if (cov->n_cm > 0)
+ cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm);
cov->categoricals = NULL;
return cov;
cov->categoricals = NULL;
return cov;
@@
-169,8
+173,8
@@
covariance_1pass_create (size_t n_vars, const struct variable **vars,
until then.
*/
struct covariance *
until then.
*/
struct covariance *
-covariance_2pass_create (size_t n_vars, const struct variable **vars,
- s
ize_t n_catvars, const struct variable **catvars,
+covariance_2pass_create (size_t n_vars, const struct variable *
const
*vars,
+ s
truct categoricals *cats,
const struct variable *wv, enum mv_class exclude)
{
size_t i;
const struct variable *wv, enum mv_class exclude)
{
size_t i;
@@
-196,7
+200,7
@@
covariance_2pass_create (size_t n_vars, const struct variable **vars,
cov->n_cm = -1;
cov->cm = NULL;
cov->n_cm = -1;
cov->cm = NULL;
- cov->categoricals = cat
egoricals_create (catvars, n_catvars, wv, exclude)
;
+ cov->categoricals = cat
s
;
return cov;
}
return cov;
}
@@
-266,6
+270,7
@@
get_val (const struct covariance *cov, int i, const struct ccase *c)
return categoricals_get_binary_by_subscript (cov->categoricals, i - cov->n_vars, c);
}
return categoricals_get_binary_by_subscript (cov->categoricals, i - cov->n_vars, c);
}
+#if 0
void
dump_matrix (const gsl_matrix *m)
{
void
dump_matrix (const gsl_matrix *m)
{
@@
-278,6
+283,7
@@
dump_matrix (const gsl_matrix *m)
printf ("\n");
}
}
printf ("\n");
}
}
+#endif
/* Call this function for every case in the data set */
void
/* Call this function for every case in the data set */
void
@@
-293,7
+299,8
@@
covariance_accumulate_pass1 (struct covariance *cov, const struct ccase *c)
cov->state = 1;
}
cov->state = 1;
}
- categoricals_update (cov->categoricals, c);
+ if (cov->categoricals)
+ categoricals_update (cov->categoricals, c);
for (i = 0 ; i < cov->dim; ++i)
{
for (i = 0 ; i < cov->dim; ++i)
{
@@
-339,8
+346,11
@@
covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c)
assert (cov->state == 1);
cov->state = 2;
assert (cov->state == 1);
cov->state = 2;
- cov->dim = cov->n_vars +
- categoricals_total (cov->categoricals) - categoricals_get_n_variables (cov->categoricals);
+ cov->dim = cov->n_vars;
+
+ if (cov->categoricals)
+ cov->dim += categoricals_total (cov->categoricals)
+ - categoricals_get_n_variables (cov->categoricals);
cov->n_cm = (cov->dim * (cov->dim - 1) ) / 2;
cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm);
cov->n_cm = (cov->dim * (cov->dim - 1) ) / 2;
cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm);
@@
-352,7
+362,8
@@
covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c)
cov->moments[i] = resize_matrix (cov->moments[i], cov->dim);
}
cov->moments[i] = resize_matrix (cov->moments[i], cov->dim);
}
- categoricals_done (cov->categoricals);
+ if (cov->categoricals)
+ categoricals_done (cov->categoricals);
/* Populate the moments matrices with the categorical value elements */
for (i = cov->n_vars; i < cov->dim; ++i)
/* Populate the moments matrices with the categorical value elements */
for (i = cov->n_vars; i < cov->dim; ++i)
@@
-521,7
+532,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;
covariance_calculate_double_pass (struct covariance *cov)
{
size_t i, j;
@@
-545,7
+556,7
@@
covariance_calculate_double_pass (struct covariance *cov)
return cm_to_gsl (cov);
}
return cm_to_gsl (cov);
}
-static
const
gsl_matrix *
+static gsl_matrix *
covariance_calculate_single_pass (struct covariance *cov)
{
size_t i, j;
covariance_calculate_single_pass (struct covariance *cov)
{
size_t i, j;
@@
-590,15
+601,16
@@
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 fre
ed.
- 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
+
need
ed.
+
+
Call this function only after all data have been accumulated.
*/
+gsl_matrix *
covariance_calculate (struct covariance *cov)
{
covariance_calculate (struct covariance *cov)
{
- assert ( cov->state > 0 );
+ if ( cov->state <= 0 )
+ return NULL;
switch (cov->passes)
{
switch (cov->passes)
{
@@
-616,7
+628,7
@@
covariance_calculate (struct covariance *cov)
/*
Covariance computed without dividing by the sample size.
*/
/*
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;
covariance_calculate_double_pass_unnormalized (struct covariance *cov)
{
size_t i, j;
@@
-638,11
+650,10
@@
covariance_calculate_double_pass_unnormalized (struct covariance *cov)
return cm_to_gsl (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;
covariance_calculate_single_pass_unnormalized (struct covariance *cov)
{
size_t i, j;
- size_t m;
for (i = 0 ; i < cov->dim; ++i)
{
for (i = 0 ; i < cov->dim; ++i)
{
@@
-671,15
+682,16
@@
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 fre
ed.
- 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
+
need
ed.
+
+
Call this function only after all data have been accumulated.
*/
+gsl_matrix *
covariance_calculate_unnormalized (struct covariance *cov)
{
covariance_calculate_unnormalized (struct covariance *cov)
{
- assert ( cov->state > 0 );
+ if ( cov->state <= 0 )
+ return NULL;
switch (cov->passes)
{
switch (cov->passes)
{
@@
-694,6
+706,14
@@
covariance_calculate_unnormalized (struct covariance *cov)
}
}
}
}
+/* Function to access the categoricals used by COV
+ The return value is owned by the COV
+*/
+const struct categoricals *
+covariance_get_categoricals (const struct covariance *cov)
+{
+ return cov->categoricals;
+}
/* Destroy the COV object */
/* Destroy the COV object */