X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fcovariance.c;h=1b5a238558ac773fa30b7016bc83bf521b406e1c;hb=refs%2Ftags%2Ffc11-i386-build90;hp=7e9736291c4a32e81cad37b0a6fac7aa902f5b26;hpb=8f471c51c709556ebfe46eaeb716ad171feae972;p=pspp-builds.git diff --git a/src/math/covariance.c b/src/math/covariance.c index 7e973629..1b5a2385 100644 --- a/src/math/covariance.c +++ b/src/math/covariance.c @@ -157,6 +157,7 @@ covariance_1pass_create (size_t n_vars, const struct variable **vars, cov->n_cm = (n_vars * (n_vars - 1) ) / 2; cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm); + cov->categoricals = NULL; return cov; } @@ -192,10 +193,10 @@ covariance_2pass_create (size_t n_vars, const struct variable **vars, cov->exclude = exclude; - cov->n_cm = - 1; + cov->n_cm = -1; cov->cm = NULL; - cov->categoricals = categoricals_create (catvars, n_catvars, wv); + cov->categoricals = categoricals_create (catvars, n_catvars, wv, exclude); return cov; } @@ -265,7 +266,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); } -static void +void dump_matrix (const gsl_matrix *m) { size_t i, j; @@ -334,10 +335,13 @@ covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c) if (! cov->pass_two_first_case_seen) { + size_t m; assert (cov->state == 1); cov->state = 2; - cov->dim = cov->n_vars + categoricals_total (cov->categoricals); + cov->dim = cov->n_vars + + 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); @@ -350,10 +354,39 @@ covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c) categoricals_done (cov->categoricals); + /* Populate the moments matrices with the categorical value elements */ + for (i = cov->n_vars; i < cov->dim; ++i) + { + for (j = 0 ; j < cov->dim ; ++j) /* FIXME: This is WRONG !!! */ + { + double w = categoricals_get_weight_by_subscript (cov->categoricals, i - cov->n_vars); + + gsl_matrix_set (cov->moments[MOMENT_NONE], i, j, w); + + w = categoricals_get_sum_by_subscript (cov->categoricals, i - cov->n_vars); + + gsl_matrix_set (cov->moments[MOMENT_MEAN], i, j, w); + } + } + + /* FIXME: This is WRONG!! It must be fixed to properly handle missing values. For + now it assumes there are none */ + for (m = 0 ; m < n_MOMENTS; ++m) + { + for (i = 0 ; i < cov->dim ; ++i) + { + double x = gsl_matrix_get (cov->moments[m], i, cov->n_vars -1); + for (j = cov->n_vars; j < cov->dim; ++j) + { + gsl_matrix_set (cov->moments[m], i, j, x); + } + } + } + /* Divide the means by the number of samples */ - for (i = 0; i < cov->n_vars; ++i) + for (i = 0; i < cov->dim; ++i) { - for (j = 0; j < cov->n_vars; ++j) + for (j = 0; j < cov->dim; ++j) { double *x = gsl_matrix_ptr (cov->moments[MOMENT_MEAN], i, j); *x /= gsl_matrix_get (cov->moments[MOMENT_NONE], i, j); @@ -396,7 +429,6 @@ covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c) { cov->cm [idx] += ss; } - } }