diff options
Diffstat (limited to 'src/boost/libs/random/test/test_bernoulli.cpp')
-rw-r--r-- | src/boost/libs/random/test/test_bernoulli.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/boost/libs/random/test/test_bernoulli.cpp b/src/boost/libs/random/test/test_bernoulli.cpp new file mode 100644 index 000000000..cab0c1c3e --- /dev/null +++ b/src/boost/libs/random/test/test_bernoulli.cpp @@ -0,0 +1,108 @@ +/* test_bernoulli.cpp + * + * Copyright Steven Watanabe 2011 + * 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) + * + * $Id$ + * + */ + +#include <boost/random/bernoulli_distribution.hpp> +#include <boost/random/uniform_int.hpp> +#include <boost/random/uniform_01.hpp> +#include <boost/random/mersenne_twister.hpp> +#include <boost/math/distributions/binomial.hpp> +#include <boost/lexical_cast.hpp> +#include <boost/exception/diagnostic_information.hpp> +#include <vector> +#include <iostream> +#include <numeric> + +#include "chi_squared_test.hpp" + +bool do_test(double p, long long max) { + std::cout << "running bernoulli(" << p << ")" << " " << max << " times: " << std::flush; + + boost::math::binomial expected(static_cast<double>(max), p); + + boost::random::bernoulli_distribution<> dist(p); + boost::mt19937 gen; + long long count = 0; + for(long long i = 0; i < max; ++i) { + if(dist(gen)) ++count; + } + + double prob = cdf(expected, count); + + bool result = prob < 0.99 && prob > 0.01; + const char* err = result? "" : "*"; + std::cout << std::setprecision(17) << prob << err << std::endl; + + std::cout << std::setprecision(6); + + return result; +} + +bool do_tests(int repeat, long long trials) { + boost::mt19937 gen; + boost::uniform_01<> rdist; + int errors = 0; + for(int i = 0; i < repeat; ++i) { + if(!do_test(rdist(gen), trials)) { + ++errors; + } + } + if(errors != 0) { + std::cout << "*** " << errors << " errors detected ***" << std::endl; + } + return errors == 0; +} + +int usage() { + std::cerr << "Usage: test_bernoulli_distribution -r <repeat> -t <trials>" << std::endl; + return 2; +} + +template<class T> +bool handle_option(int& argc, char**& argv, char opt, T& value) { + if(argv[0][1] == opt && argc > 1) { + --argc; + ++argv; + value = boost::lexical_cast<T>(argv[0]); + return true; + } else { + return false; + } +} + +int main(int argc, char** argv) { + int repeat = 10; + long long trials = 1000000ll; + + if(argc > 0) { + --argc; + ++argv; + } + while(argc > 0) { + if(argv[0][0] != '-') return usage(); + else if(!handle_option(argc, argv, 'r', repeat) + && !handle_option(argc, argv, 't', trials)) { + return usage(); + } + --argc; + ++argv; + } + + try { + if(do_tests(repeat, trials)) { + return 0; + } else { + return EXIT_FAILURE; + } + } catch(...) { + std::cerr << boost::current_exception_diagnostic_information() << std::endl; + return EXIT_FAILURE; + } +} |