//---------------------------------------------------------------------------// // Copyright (c) 2013-2014 Kyle Lutz // // Distributed under 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 // // See http://boostorg.github.com/compute for more information. //---------------------------------------------------------------------------// #define BOOST_TEST_MODULE TestNormalDistribution #include #include #include #include #include #include #include #include #include #include #include #include #include "context_setup.hpp" template boost::accumulators::accumulator_set accumulate_statistics(const boost::compute::vector& vector, boost::compute::command_queue& queue) { // copy vector to the host std::vector host_vector(vector.size()); boost::compute::copy( vector.begin(), vector.end(), host_vector.begin(), queue ); // compute desired statistics and return accumulator object return std::for_each( host_vector.begin(), host_vector.end(), boost::accumulators::accumulator_set() ); } BOOST_AUTO_TEST_CASE(normal_distribution_doctest) { using boost::compute::lambda::_1; boost::compute::vector vec(10, context); //! [generate] // initialize the default random engine boost::compute::default_random_engine engine(queue); // setup the normal distribution to produce floats centered at 5 boost::compute::normal_distribution distribution(5.0f, 1.0f); // generate the random values and store them to 'vec' distribution.generate(vec.begin(), vec.end(), engine, queue); //! [generate] } BOOST_AUTO_TEST_CASE(normal_distribution_statistics) { // generate normally distributed random numbers const size_t n = 10000; boost::compute::vector vec(n, context); boost::compute::default_random_engine engine(queue); boost::compute::normal_distribution distribution(10.0f, 2.0f); distribution.generate(vec.begin(), vec.end(), engine, queue); // compute mean and standard deviation using namespace boost::accumulators; accumulator_set > acc = accumulate_statistics >(vec, queue); // check mean and standard deviation are what we expect BOOST_CHECK_CLOSE(mean(acc), 10.f, 0.5f); BOOST_CHECK_CLOSE(std::sqrt(variance(acc)), 2.f, 0.5f); } BOOST_AUTO_TEST_SUITE_END()