]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/include/boost/random/poisson_distribution.hpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
bbf18a355297fd0812f8e3d387d8cf5d16a0afcd
[canny.git] / stc / exp / ml_stc_linux_make_v1.0 / include / boost / random / poisson_distribution.hpp
1 /* boost random/poisson_distribution.hpp header file\r
2  *\r
3  * Copyright Jens Maurer 2002\r
4  * Distributed under the Boost Software License, Version 1.0. (See\r
5  * accompanying file LICENSE_1_0.txt or copy at\r
6  * http://www.boost.org/LICENSE_1_0.txt)\r
7  *\r
8  * See http://www.boost.org for most recent version including documentation.\r
9  *\r
10  * $Id: poisson_distribution.hpp 52492 2009-04-19 14:55:57Z steven_watanabe $\r
11  *\r
12  */\r
13 \r
14 #ifndef BOOST_RANDOM_POISSON_DISTRIBUTION_HPP\r
15 #define BOOST_RANDOM_POISSON_DISTRIBUTION_HPP\r
16 \r
17 #include <boost/config/no_tr1/cmath.hpp>\r
18 #include <cassert>\r
19 #include <iostream>\r
20 #include <boost/limits.hpp>\r
21 #include <boost/static_assert.hpp>\r
22 #include <boost/random/detail/config.hpp>\r
23 \r
24 namespace boost {\r
25 \r
26 // Knuth\r
27 template<class IntType = int, class RealType = double>\r
28 class poisson_distribution\r
29 {\r
30 public:\r
31   typedef RealType input_type;\r
32   typedef IntType result_type;\r
33 \r
34   explicit poisson_distribution(const RealType& mean_arg = RealType(1))\r
35     : _mean(mean_arg)\r
36   {\r
37 #ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS\r
38     // MSVC fails BOOST_STATIC_ASSERT with std::numeric_limits at class scope\r
39     BOOST_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer);\r
40     BOOST_STATIC_ASSERT(!std::numeric_limits<RealType>::is_integer);\r
41 #endif\r
42 \r
43     assert(_mean > RealType(0));\r
44     init();\r
45   }\r
46 \r
47   // compiler-generated copy ctor and assignment operator are fine\r
48 \r
49   RealType mean() const { return _mean; }\r
50   void reset() { }\r
51 \r
52   template<class Engine>\r
53   result_type operator()(Engine& eng)\r
54   {\r
55     // TODO: This is O(_mean), but it should be O(log(_mean)) for large _mean\r
56     RealType product = RealType(1);\r
57     for(result_type m = 0; ; ++m) {\r
58       product *= eng();\r
59       if(product <= _exp_mean)\r
60         return m;\r
61     }\r
62   }\r
63 \r
64 #ifndef BOOST_RANDOM_NO_STREAM_OPERATORS\r
65   template<class CharT, class Traits>\r
66   friend std::basic_ostream<CharT,Traits>&\r
67   operator<<(std::basic_ostream<CharT,Traits>& os, const poisson_distribution& pd)\r
68   {\r
69     os << pd._mean;\r
70     return os;\r
71   }\r
72 \r
73   template<class CharT, class Traits>\r
74   friend std::basic_istream<CharT,Traits>&\r
75   operator>>(std::basic_istream<CharT,Traits>& is, poisson_distribution& pd)\r
76   {\r
77     is >> std::ws >> pd._mean;\r
78     pd.init();\r
79     return is;\r
80   }\r
81 #endif\r
82 \r
83 private:\r
84   void init()\r
85   {\r
86 #ifndef BOOST_NO_STDC_NAMESPACE\r
87     // allow for Koenig lookup\r
88     using std::exp;\r
89 #endif\r
90     _exp_mean = exp(-_mean);\r
91   }\r
92 \r
93   RealType _mean;\r
94   // some precomputed data from the parameters\r
95   RealType _exp_mean;\r
96 };\r
97 \r
98 } // namespace boost\r
99 \r
100 #endif // BOOST_RANDOM_POISSON_DISTRIBUTION_HPP\r