X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Foneway.c;h=f9476d5c951bc4b732c09f10613af0de3a96838c;hb=4443108e98b43b196f3f07217c6ec8bd96581367;hp=2a412a3d7e7cc14e133bbdea4970666062943e44;hpb=ab057ea64a9d4f712a537d183bbdc04d2bb24fbe;p=pspp diff --git a/src/language/stats/oneway.c b/src/language/stats/oneway.c index 2a412a3d7e..f9476d5c95 100644 --- a/src/language/stats/oneway.c +++ b/src/language/stats/oneway.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2011, 2012, 2013 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 @@ -52,6 +52,7 @@ /* Workspace variable for each dependent variable */ struct per_var_ws { + struct interaction *iact; struct categoricals *cat; struct covariance *cov; struct levene *nl; @@ -384,6 +385,22 @@ static void show_homogeneity (const struct oneway_spec *, const struct oneway_wo static void output_oneway (const struct oneway_spec *, struct oneway_workspace *ws); static void run_oneway (const struct oneway_spec *cmd, struct casereader *input, const struct dataset *ds); + +static void +destroy_coeff_list (struct contrasts_node *coeff_list) +{ + struct coeff_node *cn = NULL; + struct coeff_node *cnx = NULL; + struct ll_list *cl = &coeff_list->coefficient_list; + + ll_for_each_safe (cn, cnx, struct coeff_node, ll, cl) + { + free (cn); + } + + free (coeff_list); +} + static void oneway_cleanup (struct oneway_spec *cmd) { @@ -391,16 +408,7 @@ oneway_cleanup (struct oneway_spec *cmd) struct contrasts_node *coeff_next = NULL; ll_for_each_safe (coeff_list, coeff_next, struct contrasts_node, ll, &cmd->contrast_list) { - struct coeff_node *cn = NULL; - struct coeff_node *cnx = NULL; - struct ll_list *cl = &coeff_list->coefficient_list; - - ll_for_each_safe (cn, cnx, struct coeff_node, ll, cl) - { - free (cn); - } - - free (coeff_list); + destroy_coeff_list (coeff_list); } free (cmd->posthoc); @@ -529,6 +537,7 @@ cmd_oneway (struct lexer *lexer, struct dataset *ds) } else { + destroy_coeff_list (cl); lex_error (lexer, NULL); goto error; } @@ -629,7 +638,7 @@ makeit (const void *aux1, void *aux2 UNUSED) } static void -killit (const void *aux1 UNUSED, void *user_data) +killit (const void *aux1 UNUSED, void *aux2 UNUSED, void *user_data) { struct descriptive_data *dd = user_data; @@ -694,15 +703,14 @@ run_oneway (const struct oneway_spec *cmd, for (v = 0; v < cmd->n_vars; ++v) { - struct interaction *inter = interaction_create (cmd->indep_var); - struct payload payload; payload.create = makeit; payload.update = updateit; payload.calculate = NULL; payload.destroy = killit; - ws.vws[v].cat = categoricals_create (&inter, 1, cmd->wv, + ws.vws[v].iact = interaction_create (cmd->indep_var); + ws.vws[v].cat = categoricals_create (&ws.vws[v].iact, 1, cmd->wv, cmd->exclude, cmd->exclude); categoricals_set_payload (ws.vws[v].cat, &payload, @@ -807,6 +815,7 @@ run_oneway (const struct oneway_spec *cmd, for (v = 0; v < cmd->n_vars; ++v) { + const gsl_matrix *ucm; gsl_matrix *cm; struct per_var_ws *pvw = &ws.vws[v]; const struct categoricals *cats = covariance_get_categoricals (pvw->cov); @@ -820,7 +829,10 @@ run_oneway (const struct oneway_spec *cmd, continue; } - cm = covariance_calculate_unnormalized (pvw->cov); + ucm = covariance_calculate_unnormalized (pvw->cov); + + cm = gsl_matrix_alloc (ucm->size1, ucm->size2); + gsl_matrix_memcpy (cm, ucm); moments1_calculate (ws.dd_total[v]->mom, &pvw->n, NULL, NULL, NULL, NULL); @@ -835,8 +847,6 @@ run_oneway (const struct oneway_spec *cmd, pvw->n_groups = categoricals_n_total (cats); pvw->mse = (pvw->sst - pvw->ssa) / (pvw->n - pvw->n_groups); - - gsl_matrix_free (cm); } for (v = 0; v < cmd->n_vars; ++v) @@ -866,7 +876,9 @@ run_oneway (const struct oneway_spec *cmd, covariance_destroy (ws.vws[v].cov); levene_destroy (ws.vws[v].nl); dd_destroy (ws.dd_total[v]); + interaction_destroy (ws.vws[v].iact); } + free (ws.vws); free (ws.dd_total); } @@ -897,6 +909,7 @@ output_oneway (const struct oneway_spec *cmd, struct oneway_workspace *ws) i, ll_count (cl), ws->actual_number_of_groups); ll_remove (&coeff_list->ll); + destroy_coeff_list (coeff_list); continue; } @@ -1560,7 +1573,7 @@ show_comparisons (const struct oneway_spec *cmd, const struct oneway_workspace * tab_vline (t, TAL_2, heading_cols, 0, n_rows - 1); - tab_title (t, _("Multiple Comparisons")); + tab_title (t, _("Multiple Comparisons (%s)"), var_to_string (cmd->vars[v])); tab_text_format (t, 1, 1, TAB_LEFT | TAT_TITLE, _("(I) %s"), var_to_string (cmd->indep_var)); tab_text_format (t, 2, 1, TAB_LEFT | TAT_TITLE, _("(J) %s"), var_to_string (cmd->indep_var));