X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fkruskal-wallis.c;h=ae388068cf9877c055219bc7d51505781c2b2955;hb=81579d9e9f994fb2908f50af41c3eb033d216e58;hp=420b1a038d89f33cac8c6ce8fb5ca9a1aab7dcf7;hpb=c8b02c29026c095ce912faf5fdba7e29b42cb135;p=pspp-builds.git diff --git a/src/language/stats/kruskal-wallis.c b/src/language/stats/kruskal-wallis.c index 420b1a03..ae388068 100644 --- a/src/language/stats/kruskal-wallis.c +++ b/src/language/stats/kruskal-wallis.c @@ -1,5 +1,5 @@ /* Pspp - a program for statistical analysis. - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 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 @@ -22,25 +22,25 @@ #include #include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - - -#include "minmax.h" -#include "xalloc.h" - - +#include "data/casereader.h" +#include "data/casewriter.h" +#include "data/dictionary.h" +#include "data/format.h" +#include "data/procedure.h" +#include "data/subcase.h" +#include "data/variable.h" +#include "libpspp/assertion.h" +#include "libpspp/hmap.h" +#include "libpspp/message.h" +#include "libpspp/misc.h" +#include "math/sort.h" +#include "output/tab.h" + +#include "gl/minmax.h" +#include "gl/xalloc.h" + + +/* Returns true iff the independent variable lies in the range [nst->val1, nst->val2] */ static bool include_func (const struct ccase *c, void *aux) { @@ -65,6 +65,7 @@ struct rank_entry double n; }; +/* Return the entry with the key GROUP or null if there is no such entry */ static struct rank_entry * find_rank_entry (const struct hmap *map, const union value *group, size_t width) { @@ -80,6 +81,7 @@ find_rank_entry (const struct hmap *map, const union value *group, size_t width) return re; } +/* Calculates the adjustment necessary for tie compensation */ static void distinct_callback (double v UNUSED, casenumber t, double w UNUSED, void *aux) { @@ -127,7 +129,8 @@ kruskal_wallis_execute (const struct dataset *ds, input = casereader_create_filter_weight (input, dict, &warn, NULL); /* Remove all those cases which are outside the range (val1, val2) */ - input = casereader_create_filter_func (input, include_func, NULL, nst, NULL); + input = casereader_create_filter_func (input, include_func, NULL, + CONST_CAST (struct n_sample_test *, nst), NULL); proto = casereader_get_proto (input); rank_idx = caseproto_get_n_widths (proto); @@ -180,6 +183,7 @@ kruskal_wallis_execute (const struct dataset *ds, casereader_destroy (rr); + /* Calculate the value of h */ { struct rank_entry *mre; double n = 0.0; @@ -203,11 +207,22 @@ kruskal_wallis_execute (const struct dataset *ds, show_ranks_box (nst, kw, total_n_groups); show_sig_box (nst, kw); + /* Cleanup allocated memory */ + for (i = 0 ; i < nst->n_vars; ++i) + { + struct rank_entry *mre, *next; + HMAP_FOR_EACH_SAFE (mre, next, struct rank_entry, node, &kw[i].map) + { + hmap_delete (&kw[i].map, &mre->node); + free (mre); + } + hmap_destroy (&kw[i].map); + } + free (kw); } -#include #include "gettext.h" #define _(msgid) gettext (msgid) @@ -215,6 +230,7 @@ kruskal_wallis_execute (const struct dataset *ds, static void show_ranks_box (const struct n_sample_test *nst, const struct kw *kw, int n_groups) { + int row; int i; const int row_headers = 2; const int column_headers = 1; @@ -244,16 +260,16 @@ show_ranks_box (const struct n_sample_test *nst, const struct kw *kw, int n_grou tab_vline (table, TAL_2, row_headers, 0, tab_nr (table) - 1); - int x = column_headers; + row = column_headers; for (i = 0 ; i < nst->n_vars ; ++i) { int tot = 0; const struct rank_entry *re; if (i > 0) - tab_hline (table, TAL_1, 0, tab_nc (table) -1, x); + tab_hline (table, TAL_1, 0, tab_nc (table) -1, row); - tab_text (table, 0, x, + tab_text (table, 0, row, TAT_TITLE, var_to_string (nst->vars[i])); HMAP_FOR_EACH (re, const struct rank_entry, node, &kw[i].map) @@ -263,17 +279,17 @@ show_ranks_box (const struct n_sample_test *nst, const struct kw *kw, int n_grou var_append_value_name (nst->indep_var, &re->group, &str); - tab_text (table, 1, x, TAB_LEFT, ds_cstr (&str)); - tab_double (table, 2, x, TAB_LEFT, re->n, &F_8_0); - tab_double (table, 3, x, TAB_LEFT, re->sum_of_ranks / re->n, 0); + tab_text (table, 1, row, TAB_LEFT, ds_cstr (&str)); + tab_double (table, 2, row, TAB_LEFT, re->n, &F_8_0); + tab_double (table, 3, row, TAB_LEFT, re->sum_of_ranks / re->n, 0); tot += re->n; - x++; + row++; ds_destroy (&str); } - tab_double (table, 2, x, TAB_LEFT, + tab_double (table, 2, row, TAB_LEFT, tot, &F_8_0); - tab_text (table, 1, x++, TAB_LEFT, _("Total")); + tab_text (table, 1, row++, TAB_LEFT, _("Total")); } tab_submit (table);