• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2014 Roshan <thisisroshansmail@gmail.com>
3 //
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
7 //
8 // See http://boostorg.github.com/compute for more information.
9 //---------------------------------------------------------------------------//
10 
11 #ifndef BOOST_COMPUTE_RANDOM_BERNOULLI_DISTRIBUTION_HPP
12 #define BOOST_COMPUTE_RANDOM_BERNOULLI_DISTRIBUTION_HPP
13 
14 #include <boost/assert.hpp>
15 #include <boost/type_traits.hpp>
16 
17 #include <boost/compute/command_queue.hpp>
18 #include <boost/compute/function.hpp>
19 #include <boost/compute/types/fundamental.hpp>
20 #include <boost/compute/detail/iterator_range_size.hpp>
21 #include <boost/compute/detail/literal.hpp>
22 
23 namespace boost {
24 namespace compute {
25 
26 ///
27 /// \class bernoulli_distribution
28 /// \brief Produces random boolean values according to the following
29 /// discrete probability function with parameter p :
30 /// P(true/p) = p and P(false/p) = (1 - p)
31 ///
32 /// The following example shows how to setup a bernoulli distribution to
33 /// produce random boolean values with parameter p = 0.25
34 ///
35 /// \snippet test/test_bernoulli_distribution.cpp generate
36 ///
37 template<class RealType = float>
38 class bernoulli_distribution
39 {
40 public:
41 
42     /// Creates a new bernoulli distribution
bernoulli_distribution(RealType p=0.5f)43     bernoulli_distribution(RealType p = 0.5f)
44         : m_p(p)
45     {
46     }
47 
48     /// Destroys the bernoulli_distribution object
~bernoulli_distribution()49     ~bernoulli_distribution()
50     {
51     }
52 
53     /// Returns the value of the parameter p
p() const54     RealType p() const
55     {
56         return m_p;
57     }
58 
59     /// Generates bernoulli distributed booleans and stores
60     /// them in the range [\p first, \p last).
61     template<class OutputIterator, class Generator>
generate(OutputIterator first,OutputIterator last,Generator & generator,command_queue & queue)62     void generate(OutputIterator first,
63                   OutputIterator last,
64                   Generator &generator,
65                   command_queue &queue)
66     {
67         size_t count = detail::iterator_range_size(first, last);
68 
69         vector<uint_> tmp(count, queue.get_context());
70         generator.generate(tmp.begin(), tmp.end(), queue);
71 
72         BOOST_COMPUTE_FUNCTION(bool, scale_random, (const uint_ x),
73         {
74             return (convert_RealType(x) / MAX_RANDOM) < PARAM;
75         });
76 
77         scale_random.define("PARAM", detail::make_literal(m_p));
78         scale_random.define("MAX_RANDOM", "UINT_MAX");
79         scale_random.define(
80             "convert_RealType", std::string("convert_") + type_name<RealType>()
81         );
82 
83         transform(
84             tmp.begin(), tmp.end(), first, scale_random, queue
85         );
86     }
87 
88 private:
89     RealType m_p;
90 
91     BOOST_STATIC_ASSERT_MSG(
92         boost::is_floating_point<RealType>::value,
93         "Template argument must be a floating point type"
94     );
95 };
96 
97 } // end compute namespace
98 } // end boost namespace
99 
100 #endif // BOOST_COMPUTE_RANDOM_BERNOULLI_DISTRIBUTION_HPP
101