vSMC  v3.0.0
Scalable Monte Carlo
student_t_distribution.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/rng/student_t_distribution.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013-2016, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_RNG_STUDENT_T_DISTRIBUTION_HPP
33 #define VSMC_RNG_STUDENT_T_DISTRIBUTION_HPP
34 
38 
39 namespace vsmc
40 {
41 
42 namespace internal
43 {
44 
45 template <typename RealType>
46 inline bool student_t_distribution_check_param(RealType n)
47 {
48  return n > 0;
49 }
50 
51 } // namespace vsmc::internal
52 
55 template <typename RealType>
57 {
58  VSMC_DEFINE_RNG_DISTRIBUTION_1(StudentT, student_t, n, 1)
60  chi_squared_, NormalDistribution<RealType>, normal_)
61 
62  public:
63  result_type min() const
64  {
65  return std::numeric_limits<result_type>::lowest();
66  }
67 
68  result_type max() const { return std::numeric_limits<result_type>::max(); }
69 
70  void reset()
71  {
72  chi_squared_ = ChiSquaredDistribution<RealType>(n());
73  normal_ = NormalDistribution<RealType>(0, 1);
74  }
75 
76  private:
77  template <typename RNGType>
78  result_type generate(RNGType &rng, const param_type &param)
79  {
80  result_type z = normal_(rng);
81  result_type u = std::numeric_limits<result_type>::infinity();
82  if (internal::is_equal(param.n(), param_.n())) {
83  while (!std::isfinite(u))
84  u = n() / chi_squared_(rng);
85  } else {
86  ChiSquaredDistribution<RealType> chi_squared(param.n());
87  while (!std::isfinite(u))
88  u = param.n() / chi_squared(rng);
89  }
90 
91  return z * std::sqrt(u);
92  }
93 }; // class StudentTDistribution
94 
95 namespace internal
96 {
97 
98 template <std::size_t K, typename RealType, typename RNGType>
100  RNGType &rng, std::size_t n, RealType *r, RealType df)
101 {
103  chi_squared_distribution(rng, n, r, df);
104  mul(n, 1 / df, r, r);
105  sqrt(n, r, r);
107  rng, n, s.data(), static_cast<RealType>(0), static_cast<RealType>(1));
108  div(n, s.data(), r, r);
109 
111  for (std::size_t i = 0; i != n; ++i)
112  if (!std::isfinite(r[i]))
113  r[i] = dist(rng);
114 }
115 
116 } // namespace vsmc::internal
117 
121 VSMC_DEFINE_RNG_DISTRIBUTION_RAND_1(StudentT, student_t, n)
122 
123 } // namespace vsmc
124 
125 #endif // VSMC_RNG_STUDENT_T_DISTRIBUTION_HPP
Definition: monitor.hpp:48
#define VSMC_DEFINE_RNG_DISTRIBUTION_IMPL_1(name, p1)
void mul(std::size_t n, const float *a, const float *b, float *y)
Definition: vmath.hpp:77
void sqrt(std::size_t n, const float *a, float *y)
Definition: vmath.hpp:96
#define VSMC_DEFINE_RNG_DISTRIBUTION_MEMBER_2(T1, m1, T2, m2)
Student-t distribution.
void normal_distribution(RNGType &, std::size_t, RealType *, RealType, RealType)
Generating Normal random variates.
void student_t_distribution_impl(RNGType &rng, std::size_t n, RealType *r, RealType df)
bool is_equal(const T &a, const T &b, std::true_type)
Definition: basic.hpp:83
void div(std::size_t n, const float *a, const float *b, float *y)
Definition: vmath.hpp:95
void chi_squared_distribution(RNGType &rng, std::size_t n, RealType *r, RealType df)
Generating random variates.
std::array with proper alignment
bool student_t_distribution_check_param(RealType n)
#define VSMC_DEFINE_RNG_DISTRIBUTION_RAND_1(Name, name, p1)
#define VSMC_DEFINE_RNG_DISTRIBUTION_1(Name, name, p1, v1)