From: John Darrington Date: Thu, 14 Feb 2008 12:08:39 +0000 (+0000) Subject: Fixed bug #22306 X-Git-Tag: v0.6.0~115 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b8a90d7b20f0e20b3279d224f8fcd3025fd88905;p=pspp-builds.git Fixed bug #22306 --- diff --git a/src/language/stats/ChangeLog b/src/language/stats/ChangeLog index 50478b4e..ae4110d1 100644 --- a/src/language/stats/ChangeLog +++ b/src/language/stats/ChangeLog @@ -1,3 +1,8 @@ +2008-02-14 John Darrington + + * examine.q: Fixed counts of missing variables. Thanks to + Jason Stover for reporting this problem. + 2008-01-02 John Darrington * binomial.c chisquare.c examine.q frequencies.q oneway.q regression.q : updated diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q index fe762d33..4fccd83b 100644 --- a/src/language/stats/examine.q +++ b/src/language/stats/examine.q @@ -156,7 +156,7 @@ static void output_examine (void); void factor_calc (const struct ccase *c, int case_no, - double weight, int case_missing); + double weight, bool case_missing); /* Represent a factor as a string, so it can be @@ -639,7 +639,7 @@ void populate_summary (struct tab_table *t, int col, int row, /* Perform calculations for the sub factors */ void factor_calc (const struct ccase *c, int case_no, double weight, - int case_missing) + bool case_missing) { size_t v; struct factor *fctr = factors; @@ -700,7 +700,7 @@ factor_calc (const struct ccase *c, int case_no, double weight, if (case_missing || var_is_value_missing (var, val, exclude_values)) { free (val); - continue; + val = NULL; } metrics_calc ( & (*foo)->m[v], val, weight, case_no); @@ -754,7 +754,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, for (; casereader_read (input, &c); case_destroy (&c)) { - int case_missing = 0; + bool case_missing = false; const double weight = dict_get_case_weight (dict, &c, NULL); if ( cmd->miss == XMN_LISTWISE ) @@ -768,7 +768,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, ); if ( var_is_value_missing (var, val, exclude_values)) - case_missing = 1; + case_missing = true; free (val); } @@ -786,7 +786,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, || case_missing ) { free (val) ; - continue ; + val = NULL; } metrics_calc (&totals[v], val, weight, case_no); @@ -975,7 +975,6 @@ show_summary (const struct variable **dependent_var, int n_dep_var, tab_title (tbl, _ ("Case Processing Summary")); - tab_joint_text (tbl, heading_columns, 0, n_cols -1, 0, TAB_CENTER | TAT_TITLE, @@ -990,22 +989,21 @@ show_summary (const struct variable **dependent_var, int n_dep_var, for ( i = 0 ; i < 3 ; ++i ) { - tab_text (tbl, heading_columns + i*2 , 2, TAB_CENTER | TAT_TITLE, + tab_text (tbl, heading_columns + i * 2 , 2, TAB_CENTER | TAT_TITLE, _ ("N")); - tab_text (tbl, heading_columns + i*2 + 1, 2, TAB_CENTER | TAT_TITLE, + tab_text (tbl, heading_columns + i * 2 + 1, 2, TAB_CENTER | TAT_TITLE, _ ("Percent")); tab_joint_text (tbl, heading_columns + i*2 , 1, - heading_columns + i*2 + 1, 1, + heading_columns + i * 2 + 1, 1, TAB_CENTER | TAT_TITLE, subtitle[i]); tab_box (tbl, -1, -1, TAL_0, TAL_0, - heading_columns + i*2, 1, - heading_columns + i*2 + 1, 1); - + heading_columns + i * 2, 1, + heading_columns + i * 2 + 1, 1); } @@ -1020,7 +1018,6 @@ show_summary (const struct variable **dependent_var, int n_dep_var, tab_text (tbl, 2, heading_rows - 1, TAB_CENTER | TAT_TITLE, var_to_string (fctr->indep_var[1])); } - } @@ -1030,7 +1027,6 @@ show_summary (const struct variable **dependent_var, int n_dep_var, if ( fctr ) n_factors = hsh_count (fctr->fstats); - if ( i > 0 ) tab_hline (tbl, TAL_1, 0, n_cols -1 , i * n_factors + heading_rows); @@ -1040,13 +1036,10 @@ show_summary (const struct variable **dependent_var, int n_dep_var, var_to_string (dependent_var[i]) ); - if ( !fctr ) populate_summary (tbl, heading_columns, (i * n_factors) + heading_rows, &totals[i]); - - else { struct factor_statistics **fs = fctr->fs; @@ -1077,7 +1070,6 @@ show_summary (const struct variable **dependent_var, int n_dep_var, if (fctr->indep_var[1] && count > 0 ) tab_hline (tbl, TAL_1, 1, n_cols - 1, (i * n_factors ) + count + heading_rows); - } prev = (*fs)->id[0]; @@ -1088,20 +1080,20 @@ show_summary (const struct variable **dependent_var, int n_dep_var, ds_init_empty (&vstr); var_append_value_name (fctr->indep_var[1], (*fs)->id[1], &vstr); - tab_text (tbl, - 2, - (i * n_factors ) + count + - heading_rows, - TAB_LEFT | TAT_TITLE, + tab_text (tbl, + 2, + (i * n_factors ) + count + + heading_rows, + TAB_LEFT | TAT_TITLE, ds_cstr (&vstr) - ); + ); ds_destroy (&vstr); - } + } populate_summary (tbl, heading_columns, - (i * n_factors) + count - + heading_rows, - & (*fs)->m[i]); + (i * n_factors) + count + + heading_rows, + & (*fs)->m[i]); count++ ; fs++; @@ -1135,11 +1127,7 @@ populate_summary (struct tab_table *t, int col, int row, /* This seems a bit pointless !!! */ tab_text (t, col + 5, row + 0, TAB_RIGHT | TAT_PRINTF, "%2.0f%%", 100.0 * total / total ); - - } - - } diff --git a/src/math/factor-stats.c b/src/math/factor-stats.c index 582b8346..a97d7f09 100644 --- a/src/math/factor-stats.c +++ b/src/math/factor-stats.c @@ -73,11 +73,9 @@ metrics_calc (struct metrics *fs, const union value *val, moments1_add(fs->moments, x, weight); - if ( x < fs->min) fs->min = x; if ( x > fs->max) fs->max = x; - wv = (struct weighted_value **) hsh_probe (fs->ordered_data,(void *) val ); if ( *wv ) diff --git a/tests/automake.mk b/tests/automake.mk index e00fa21d..8c1bfcfc 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -105,6 +105,7 @@ dist_TESTS = \ tests/bugs/get.sh \ tests/bugs/examine-1sample.sh \ tests/bugs/examine-missing.sh \ + tests/bugs/examine-missing2.sh \ tests/bugs/freq-nolabels.sh \ tests/bugs/get-no-file.sh \ tests/bugs/html-frequency.sh \ diff --git a/tests/bugs/examine-missing2.sh b/tests/bugs/examine-missing2.sh new file mode 100755 index 00000000..ff073495 --- /dev/null +++ b/tests/bugs/examine-missing2.sh @@ -0,0 +1,117 @@ +#!/bin/sh + +# This program tests for a bug in which examine didn't +# count missing values. + +TEMPDIR=/tmp/pspp-tst-$$ +TESTFILE=$TEMPDIR/`basename $0`.sps + +# ensure that top_srcdir and top_builddir are absolute +if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi +if [ -z "$top_builddir" ] ; then top_builddir=. ; fi +top_srcdir=`cd $top_srcdir; pwd` +top_builddir=`cd $top_builddir; pwd` + +PSPP=$top_builddir/src/ui/terminal/pspp + +STAT_CONFIG_PATH=$top_srcdir/config +export STAT_CONFIG_PATH + +LANG=C +export LANG + + +cleanup() +{ + if [ x"$PSPP_TEST_NO_CLEANUP" != x ] ; then + echo "NOT cleaning $TEMPDIR" + return ; + fi + rm -rf $TEMPDIR +} + + +fail() +{ + echo $activity + echo FAILED + cleanup; + exit 1; +} + + +no_result() +{ + echo $activity + echo NO RESULT; + cleanup; + exit 2; +} + +pass() +{ + cleanup; + exit 0; +} + +mkdir -p $TEMPDIR + +cd $TEMPDIR + +activity="create program" +cat > $TESTFILE << EOF +DATA LIST LIST /x * y *. +BEGIN DATA. +1 1 +2 1 +3 1 +4 1 +5 2 +6 2 +. 2 +END DATA + +EXAMINE /x by y. +EOF +if [ $? -ne 0 ] ; then no_result ; fi + + +activity="run program" +$SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE +if [ $? -ne 0 ] ; then no_result ; fi + +activity="compare results" +perl -pi -e 's/^\s*$//g' $TEMPDIR/pspp.list +diff -b $TEMPDIR/pspp.list - <