• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //  (C) Copyright 2006 Eric Niebler, Olivier Gygi.
2  //  Use, modification and distribution are subject to the
3  //  Boost Software License, Version 1.0. (See accompanying file
4  //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5  
6  // Test case for kurtosis.hpp
7  
8  #include <boost/random.hpp>
9  #include <boost/test/unit_test.hpp>
10  #include <boost/test/floating_point_comparison.hpp>
11  #include <boost/accumulators/numeric/functional/vector.hpp>
12  #include <boost/accumulators/numeric/functional/complex.hpp>
13  #include <boost/accumulators/numeric/functional/valarray.hpp>
14  #include <boost/accumulators/accumulators.hpp>
15  #include <boost/accumulators/statistics/stats.hpp>
16  #include <boost/accumulators/statistics/kurtosis.hpp>
17  #include <sstream>
18  #include <boost/archive/text_oarchive.hpp>
19  #include <boost/archive/text_iarchive.hpp>
20  
21  using namespace boost;
22  using namespace unit_test;
23  using namespace boost::accumulators;
24  
25  ///////////////////////////////////////////////////////////////////////////////
26  // test_stat
27  //
test_stat()28  void test_stat()
29  {
30      // tolerance in %
31      // double epsilon = 1;
32  
33      accumulator_set<double, stats<tag::kurtosis > > acc1;
34      accumulator_set<int, stats<tag::kurtosis > > acc2;
35  
36      // two random number generators
37      boost::lagged_fibonacci607 rng;
38      boost::normal_distribution<> mean_sigma(0,1);
39      boost::variate_generator<boost::lagged_fibonacci607&, boost::normal_distribution<> > normal(rng, mean_sigma);
40  
41      for (std::size_t i=0; i<100000; ++i)
42      {
43          acc1(normal());
44      }
45  
46      // This check fails because epsilon is relative and not absolute
47      // BOOST_CHECK_CLOSE( kurtosis(acc1), 0., epsilon );
48  
49      acc2(2);
50      acc2(7);
51      acc2(4);
52      acc2(9);
53      acc2(3);
54  
55      BOOST_CHECK_EQUAL( mean(acc2), 5 );
56      BOOST_CHECK_EQUAL( accumulators::moment<2>(acc2), 159./5. );
57      BOOST_CHECK_EQUAL( accumulators::moment<3>(acc2), 1171./5. );
58      BOOST_CHECK_EQUAL( accumulators::moment<4>(acc2), 1863 );
59      BOOST_CHECK_CLOSE( kurtosis(acc2), -1.39965397924, 1e-6 );
60  }
61  
62  ///////////////////////////////////////////////////////////////////////////////
63  // test_persistency
64  //
test_persistency()65  void test_persistency()
66  {
67      // "persistent" storage
68      std::stringstream ss;
69      // tolerance
70      double epsilon = 1e-6;
71      double kurtosis_value = -1.39965397924;
72      {
73          accumulator_set<int, stats<tag::kurtosis > > acc;
74          acc(2);
75          acc(7);
76          acc(4);
77          acc(9);
78          acc(3);
79          BOOST_CHECK_CLOSE( kurtosis(acc), kurtosis_value, epsilon);
80          boost::archive::text_oarchive oa(ss);
81          acc.serialize(oa, 0);
82      }
83  
84      accumulator_set<double, stats<tag::kurtosis > > acc;
85      boost::archive::text_iarchive ia(ss);
86      acc.serialize(ia, 0);
87      BOOST_CHECK_CLOSE( kurtosis(acc), kurtosis_value, epsilon);
88  
89  }
90  ///////////////////////////////////////////////////////////////////////////////
91  // init_unit_test_suite
92  //
init_unit_test_suite(int argc,char * argv[])93  test_suite* init_unit_test_suite( int argc, char* argv[] )
94  {
95      test_suite *test = BOOST_TEST_SUITE("kurtosis test");
96  
97      test->add(BOOST_TEST_CASE(&test_stat));
98      test->add(BOOST_TEST_CASE(&test_persistency));
99  
100      return test;
101  }
102  
103