• 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  #define BOOST_TEST_MODULE TestDiscreteDistribution
12  #include <boost/test/unit_test.hpp>
13  
14  #include <vector>
15  
16  #include <boost/compute/system.hpp>
17  #include <boost/compute/command_queue.hpp>
18  #include <boost/compute/algorithm/count_if.hpp>
19  #include <boost/compute/container/vector.hpp>
20  #include <boost/compute/random/default_random_engine.hpp>
21  #include <boost/compute/random/discrete_distribution.hpp>
22  #include <boost/compute/lambda.hpp>
23  
24  #include "context_setup.hpp"
25  
BOOST_AUTO_TEST_CASE(discrete_distribution_doctest)26  BOOST_AUTO_TEST_CASE(discrete_distribution_doctest)
27  {
28      using boost::compute::uint_;
29      using boost::compute::lambda::_1;
30  
31      boost::compute::vector<uint_> vec(100, context);
32  
33  //! [generate]
34  // initialize the default random engine
35  boost::compute::default_random_engine engine(queue);
36  
37  // initialize weights
38  int weights[] = {2, 2};
39  
40  // setup the discrete distribution to produce integers 0 and 1
41  // with equal weights
42  boost::compute::discrete_distribution<uint_> distribution(weights, weights+2);
43  
44  // generate the random values and store them to 'vec'
45  distribution.generate(vec.begin(), vec.end(), engine, queue);
46  // ! [generate]
47  
48      BOOST_CHECK_EQUAL(
49          boost::compute::count_if(
50              vec.begin(), vec.end(), _1 > 1, queue
51          ),
52          size_t(0)
53      );
54  }
55  
BOOST_AUTO_TEST_CASE(discrete_distribution)56  BOOST_AUTO_TEST_CASE(discrete_distribution)
57  {
58      using boost::compute::uint_;
59      using boost::compute::lambda::_1;
60  
61      size_t size = 100;
62      boost::compute::vector<uint_> vec(size, context);
63  
64      // initialize the default random engine
65      boost::compute::default_random_engine engine(queue);
66  
67      // initialize weights
68      int weights[] = {10, 40, 40, 10};
69  
70      // setup the discrete distribution
71      boost::compute::discrete_distribution<uint_> distribution(
72          weights, weights + 4
73      );
74  
75      std::vector<double> p = distribution.probabilities();
76      BOOST_CHECK_CLOSE(p[0], double(0.1), 0.001);
77      BOOST_CHECK_CLOSE(p[1], double(0.4), 0.001);
78      BOOST_CHECK_CLOSE(p[2], double(0.4), 0.001);
79      BOOST_CHECK_CLOSE(p[3], double(0.1), 0.001);
80  
81      BOOST_CHECK_EQUAL((distribution.min)(), uint_(0));
82      BOOST_CHECK_EQUAL((distribution.max)(), uint_(3));
83  
84      // generate the random values and store them to 'vec'
85      distribution.generate(vec.begin(), vec.end(), engine, queue);
86  
87      BOOST_CHECK_EQUAL(
88          boost::compute::count_if(
89              vec.begin(), vec.end(), _1 < 4, queue
90          ),
91          size
92      );
93  }
94  
BOOST_AUTO_TEST_CASE(discrete_distribution_default_ctor)95  BOOST_AUTO_TEST_CASE(discrete_distribution_default_ctor)
96  {
97      using boost::compute::uint_;
98      using boost::compute::lambda::_1;
99  
100      size_t size = 100;
101      boost::compute::vector<uint_> vec(size, context);
102  
103      // initialize the default random engine
104      boost::compute::default_random_engine engine(queue);
105  
106      // call default constructor
107      boost::compute::discrete_distribution<uint_> distribution;
108  
109      std::vector<double> p = distribution.probabilities();
110      BOOST_CHECK_CLOSE(p[0], double(1), 0.001);
111  
112      // generate the random values and store them to 'vec'
113      distribution.generate(vec.begin(), vec.end(), engine, queue);
114  
115      BOOST_CHECK_EQUAL(
116          boost::compute::count_if(
117              vec.begin(), vec.end(), _1 == 0, queue
118          ),
119          size
120      );
121  }
122  
BOOST_AUTO_TEST_CASE(discrete_distribution_one_weight)123  BOOST_AUTO_TEST_CASE(discrete_distribution_one_weight)
124  {
125      using boost::compute::uint_;
126      using boost::compute::lambda::_1;
127  
128      size_t size = 100;
129      boost::compute::vector<uint_> vec(size, context);
130  
131      // initialize the default random engine
132      boost::compute::default_random_engine engine(queue);
133  
134      std::vector<int> weights(1, 1);
135      // call default constructor
136      boost::compute::discrete_distribution<uint_> distribution(
137          weights.begin(), weights.end()
138      );
139  
140      std::vector<double> p = distribution.probabilities();
141      BOOST_CHECK_CLOSE(p[0], double(1), 0.001);
142  
143      BOOST_CHECK_EQUAL((distribution.min)(), uint_(0));
144      BOOST_CHECK_EQUAL((distribution.max)(), uint_(0));
145  
146      // generate the random values and store them to 'vec'
147      distribution.generate(vec.begin(), vec.end(), engine, queue);
148  
149      BOOST_CHECK_EQUAL(
150          boost::compute::count_if(
151              vec.begin(), vec.end(), _1 == 0, queue
152          ),
153          size
154      );
155  }
156  
BOOST_AUTO_TEST_CASE(discrete_distribution_empty_weights)157  BOOST_AUTO_TEST_CASE(discrete_distribution_empty_weights)
158  {
159      using boost::compute::uint_;
160      using boost::compute::lambda::_1;
161  
162      size_t size = 100;
163      boost::compute::vector<uint_> vec(size, context);
164  
165      // initialize the default random engine
166      boost::compute::default_random_engine engine(queue);
167  
168      std::vector<int> weights;
169      // weights.begin() == weights.end()
170      boost::compute::discrete_distribution<uint_> distribution(
171          weights.begin(), weights.end()
172      );
173  
174      std::vector<double> p = distribution.probabilities();
175      BOOST_CHECK_CLOSE(p[0], double(1), 0.001);
176  
177      BOOST_CHECK_EQUAL((distribution.min)(), uint_(0));
178      BOOST_CHECK_EQUAL((distribution.max)(), uint_(0));
179  
180      // generate the random values and store them to 'vec'
181      distribution.generate(vec.begin(), vec.end(), engine, queue);
182  
183      BOOST_CHECK_EQUAL(
184          boost::compute::count_if(
185              vec.begin(), vec.end(), _1 == 0, queue
186          ),
187          size
188      );
189  }
190  
BOOST_AUTO_TEST_CASE(discrete_distribution_uchar)191  BOOST_AUTO_TEST_CASE(discrete_distribution_uchar)
192  {
193      using boost::compute::uchar_;
194      using boost::compute::uint_;
195      using boost::compute::lambda::_1;
196  
197      size_t size = 100;
198      boost::compute::vector<uchar_> uchar_vec(size, context);
199      boost::compute::vector<uint_> uint_vec(size, context);
200  
201      // initialize the default random engine
202      boost::compute::default_random_engine engine(queue);
203  
204      // initialize weights
205      std::vector<int> weights(258, 0);
206      weights[257] = 1;
207  
208      // setup the discrete distribution
209      boost::compute::discrete_distribution<uchar_> distribution(
210          weights.begin(), weights.end()
211      );
212  
213      BOOST_CHECK_EQUAL((distribution.min)(), uchar_(0));
214      BOOST_CHECK_EQUAL((distribution.max)(), uchar_(255));
215  
216      // generate the random uchar_ values to the uchar_ vector
217      distribution.generate(uchar_vec.begin(), uchar_vec.end(), engine, queue);
218  
219      BOOST_CHECK_EQUAL(
220          boost::compute::count_if(
221              uchar_vec.begin(), uchar_vec.end(), _1 == uchar_(1), queue
222          ),
223          size
224      );
225  
226      // generate the random uchar_ values to the uint_ vector
227      distribution.generate(uint_vec.begin(), uint_vec.end(), engine, queue);
228  
229      BOOST_CHECK_EQUAL(
230          boost::compute::count_if(
231              uint_vec.begin(), uint_vec.end(), _1 == uint_(1), queue
232          ),
233          size
234      );
235  }
236  
237  BOOST_AUTO_TEST_SUITE_END()
238