//---------------------------------------------------------------------------// // 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 TestUniformRealDistribution #include #include #include #include #include #include #include #include #include #include #include #include "context_setup.hpp" BOOST_AUTO_TEST_CASE(uniform_real_distribution_doctest) { using boost::compute::lambda::_1; boost::compute::vector vec(128, context); //! [generate] // initialize the default random engine boost::compute::default_random_engine engine(queue); // setup the uniform distribution to produce floats between 1 and 100 boost::compute::uniform_real_distribution distribution(1.0f, 100.0f); // generate the random values and store them to 'vec' distribution.generate(vec.begin(), vec.end(), engine, queue); //! [generate] BOOST_CHECK_EQUAL( boost::compute::count_if( vec.begin(), vec.end(), _1 < 1.0f || _1 >= 100.0f, queue ), size_t(0) ); } template class range_test_engine { public: explicit range_test_engine(boost::compute::command_queue &queue) { (void) queue; } template void generate(OutputIterator first, OutputIterator last, Function op, boost::compute::command_queue &queue) { boost::compute::vector tmp(std::distance(first, last), queue.get_context()); BOOST_COMPUTE_FUNCTION(T, max_random, (const T x), { if(get_global_id(0) < 1) return (ValueType) MAX_RANDOM; else return (ValueType) 0; }); max_random.define("MAX_RANDOM", "UINT_MAX"); max_random.define("ValueType", boost::compute::type_name()); boost::compute::transform(tmp.begin(), tmp.end(), tmp.begin(), max_random, queue); boost::compute::transform(tmp.begin(), tmp.end(), first, op, queue); } }; // For checking if result is in the correct range [low, hi) BOOST_AUTO_TEST_CASE(uniform_real_distribution_range) { using boost::compute::lambda::_1; boost::compute::vector vec(32, context); // initialize the range_test_engine range_test_engine engine(queue); // setup the uniform distribution to produce floats between 0.9 and 1.0 boost::compute::uniform_real_distribution distribution(0.9f, 1.0f); // generate the random values and store them to 'vec' distribution.generate(vec.begin(), vec.end(), engine, queue); BOOST_CHECK_EQUAL( boost::compute::count_if( vec.begin(), vec.end(), _1 < 0.9f || _1 >= 1.0f, queue ), size_t(0) ); } BOOST_AUTO_TEST_SUITE_END()