summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/accumulators/test/sum_kahan.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/accumulators/test/sum_kahan.cpp')
-rw-r--r--src/boost/libs/accumulators/test/sum_kahan.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/boost/libs/accumulators/test/sum_kahan.cpp b/src/boost/libs/accumulators/test/sum_kahan.cpp
new file mode 100644
index 00000000..85edb116
--- /dev/null
+++ b/src/boost/libs/accumulators/test/sum_kahan.cpp
@@ -0,0 +1,120 @@
+// (C) Copyright Gaetano Mendola 2010, Simon West 2011.
+// Use, modification and distribution are subject to the
+// Boost Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/test/unit_test.hpp>
+#include <boost/accumulators/accumulators.hpp>
+#include <boost/accumulators/statistics/stats.hpp>
+#include <boost/accumulators/statistics/sum_kahan.hpp>
+#include <boost/accumulators/statistics/variates/covariate.hpp>
+#include <sstream>
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
+
+using namespace boost;
+using namespace unit_test;
+using namespace accumulators;
+
+///////////////////////////////////////////////////////////////////////////////
+// test_sum_kahan
+//
+void test_sum_kahan()
+{
+ accumulator_set<float, stats<tag::sum_kahan> > acc;
+
+ BOOST_CHECK_EQUAL(0.0f, sum_kahan(acc));
+
+ for (size_t i = 0; i < 1e6; ++i) {
+ acc(1e-6f);
+ }
+
+ BOOST_CHECK_EQUAL(1.0f, sum_kahan(acc));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// test_sum_of_weights_kahan
+//
+void test_sum_of_weights_kahan()
+{
+ accumulator_set<float, stats<tag::sum_of_weights_kahan>, float > acc;
+
+ BOOST_CHECK_EQUAL(0.0f, sum_of_weights_kahan(acc));
+
+ for (size_t i = 0; i < 1e6; ++i) {
+ acc(0, weight = 1e-6f);
+ }
+
+ BOOST_CHECK_EQUAL(1.0f, sum_of_weights_kahan(acc));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// test_sum_of_variates_kahan
+//
+void test_sum_of_variates_kahan()
+{
+ accumulator_set<
+ float,
+ stats<tag::sum_of_variates_kahan<float, tag::covariate1> >,
+ float
+ >
+ acc;
+
+ BOOST_CHECK_EQUAL(0.0f, sum_of_variates_kahan(acc));
+
+ for (size_t i = 0; i < 1e6; ++i) {
+ acc(0, covariate1 = 1e-6f);
+ }
+
+ BOOST_CHECK_EQUAL(1.0f, sum_of_variates_kahan(acc));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// test_persistency
+//
+void test_persistency()
+{
+ std::stringstream ss;
+ {
+ accumulator_set<
+ float,
+ stats<tag::sum_of_variates_kahan<float, tag::covariate1> >,
+ float
+ >
+ acc;
+
+ BOOST_CHECK_EQUAL(0.0f, sum_of_variates_kahan(acc));
+
+ for (size_t i = 0; i < 1e6; ++i) {
+ acc(0, covariate1 = 1e-6f);
+ }
+
+ BOOST_CHECK_EQUAL(1.0f, sum_of_variates_kahan(acc));
+ boost::archive::text_oarchive oa(ss);
+ acc.serialize(oa, 0);
+ }
+ accumulator_set<
+ float,
+ stats<tag::sum_of_variates_kahan<float, tag::covariate1> >,
+ float
+ >
+ acc;
+ boost::archive::text_iarchive ia(ss);
+ acc.serialize(ia, 0);
+ BOOST_CHECK_EQUAL(1.0f, sum_of_variates_kahan(acc));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// init_unit_test_suite
+//
+test_suite* init_unit_test_suite( int argc, char* argv[] )
+{
+ test_suite *test = BOOST_TEST_SUITE("sum kahan tests");
+
+ test->add(BOOST_TEST_CASE(&test_sum_kahan));
+ test->add(BOOST_TEST_CASE(&test_sum_of_weights_kahan));
+ test->add(BOOST_TEST_CASE(&test_sum_of_variates_kahan));
+ test->add(BOOST_TEST_CASE(&test_persistency));
+
+ return test;
+}