32 #ifndef SHARK_RNG_GAMMA_H 33 #define SHARK_RNG_GAMMA_H 37 #include <boost/random/uniform_01.hpp> 40 #ifndef BOOST_RANDOM_NO_STREAM_OPERATORS 46 template<
class RealType =
double>
50 typedef RealType input_type;
51 typedef RealType result_type;
54 :k_(k),theta_(theta) {}
67 template<
class Engine>
71 unsigned n = unsigned(k_);
72 RealType delta = k_ - RealType(n);
74 RealType v0 = M_E / (M_E + delta);
78 for(i=0; i<n; i++) Gn1 += -log(draw(eng));
86 xi = pow(V_1, 1./delta);
87 eta = V * pow(xi, delta-1.);
94 }
while(eta > (pow(xi, delta-1.) * exp(-xi)));
96 return theta_ * (xi + Gn1);
99 #ifndef BOOST_RANDOM_NO_STREAM_OPERATORS 100 template<
class CharT,
class Traits>
101 friend std::basic_ostream<CharT,Traits>&
109 template<
class CharT,
class Traits>
110 friend std::basic_istream<CharT,Traits>&
119 template<
class Engine>
120 double draw(Engine& eng)
125 res=boost::uniform_01<RealType>()(eng);
135 template<
typename RngType = shark::DefaultRngType>
136 class Gamma:
public boost::variate_generator<RngType*,Gamma_distribution<> >
139 typedef boost::variate_generator<RngType*,Gamma_distribution<> > Base;
146 using Base::operator();
151 return dist(Base::engine());
156 return Base::distribution().k();
160 return Base::distribution().theta();
171 double p(
double x)
const