89854285a0f0cde4fc9b7ad801a7db58e9970249
[pspp-builds.git] / tests / stats / moments.sh
1 #! /bin/sh
2
3 # Tests calculation of moments.
4
5 TEMPDIR=/tmp/pspp-tst-$$
6
7 # ensure that top_builddir  are absolute
8 if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
9 if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
10 top_builddir=`cd $top_builddir; pwd`
11 PSPP=$top_builddir/src/ui/terminal/pspp
12
13 # ensure that top_srcdir is absolute
14 top_srcdir=`cd $top_srcdir; pwd`
15
16 STAT_CONFIG_PATH=$top_srcdir/config
17 export STAT_CONFIG_PATH
18
19
20 cleanup()
21 {
22      if [ x"$PSPP_TEST_NO_CLEANUP" != x ] ; then 
23         echo "NOT cleaning $TEMPDIR" 
24         return ; 
25      fi
26      cd /
27      rm -rf $TEMPDIR
28 }
29
30
31 fail()
32 {
33     echo $activity
34     echo FAILED
35     cleanup;
36     exit 1;
37 }
38
39
40 no_result()
41 {
42     echo $activity
43     echo NO RESULT;
44     cleanup;
45     exit 2;
46 }
47
48 pass()
49 {
50     cleanup;
51     exit 0;
52 }
53
54 mkdir -p $TEMPDIR
55
56 cd $TEMPDIR
57 activity="create one-pass moments list"
58 sed -ne 's/#.*//;/^[    ]*$/!p' > $TEMPDIR/moments-list-1p <<'EOF'
59 # Both the one-pass and two-pass algorithms should be 
60 # able to cope properly with these.
61 1 2 3 4 => W=4.000 M1=2.500 M2=1.667 M3=0.000 M4=-1.200
62 1*5 2*5 3*5 4*5 => W=20.000 M1=2.500 M2=1.316 M3=0.000 M4=-1.401
63 1*1 2*2 3*3 4*4 => W=10.000 M1=3.000 M2=1.111 M3=-0.712 M4=-0.450
64 1*0 => W=0.000 M1=sysmis M2=sysmis M3=sysmis M4=sysmis
65 1*1 => W=1.000 M1=1.000 M2=sysmis M3=sysmis M4=sysmis
66 1*2 => W=2.000 M1=1.000 M2=0.000 M3=sysmis M4=sysmis
67 1*3 => W=3.000 M1=1.000 M2=0.000 M3=sysmis M4=sysmis
68 1*2 3 => W=3.000 M1=1.667 M2=1.333 M3=1.732 M4=sysmis
69 1 1.00000001 => W=2.000 M1=1.000 M2=0.000 M3=sysmis M4=sysmis
70 1000001 1000002 1000003 1000004 => W=4.000 M1=1000002.500 M2=1.667 M3=0.000 M4=-1.200
71 EOF
72 if [ $? -ne 0 ] ; then no_result ; fi
73
74 cp $TEMPDIR/moments-list-1p $TEMPDIR/moments-list-2p
75 sed -ne 's/#.*//;/^[    ]*$/!p' >> $TEMPDIR/moments-list-2p <<'EOF'
76 # We used to have an example for which only the two-pass algorithm
77 # produced reasonable results, but the provisional means algorithm
78 # does better, so there aren't any extra tests here.
79 EOF
80
81 activity="create two-pass input file"
82 sed < $TEMPDIR/moments-list-2p >> $TEMPDIR/moments-2p.stat \
83         -e 's#^\(.*\) => \(.*\)$#DEBUG MOMENTS/\1.#'
84 if [ $? -ne 0 ] ; then no_result ; fi
85
86 activity="run two-pass program"
87 $SUPERVISOR $PSPP --testing-mode \
88          $TEMPDIR/moments-2p.stat >$TEMPDIR/moments-2p.err 2> $TEMPDIR/moments-2p.out
89
90 activity="compare two-pass output"
91 perl -pi -e 's/^\s*$//g' $TEMPDIR/moments-list-2p $TEMPDIR/moments-2p.out
92 diff -b $TEMPDIR/moments-list-2p $TEMPDIR/moments-2p.out
93 if [ $? -ne 0 ] ; then fail ; fi
94
95 activity="create input file"
96 sed < $TEMPDIR/moments-list-1p >> $TEMPDIR/moments-1p.stat \
97         -e 's#^\(.*\) => \(.*\)$#DEBUG MOMENTS ONEPASS/\1.#'
98 if [ $? -ne 0 ] ; then no_result ; fi
99
100 activity="run one-pass program"
101 $SUPERVISOR $PSPP --testing-mode \
102          $TEMPDIR/moments-1p.stat >$TEMPDIR/moments-1p.err 2> $TEMPDIR/moments-1p.out
103
104 activity="compare one-pass output"
105 perl -pi -e 's/^\s*$//g' $TEMPDIR/moments-list-1p $TEMPDIR/moments-1p.out
106 diff -b $TEMPDIR/moments-list-1p $TEMPDIR/moments-1p.out
107 if [ $? -ne 0 ] ; then fail ; fi
108
109 pass