181 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			181 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /* boost random/student_t_distribution.hpp header file | ||
|  |  * | ||
|  |  * 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) | ||
|  |  * | ||
|  |  * See http://www.boost.org for most recent version including documentation. | ||
|  |  * | ||
|  |  * $Id$ | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef BOOST_RANDOM_STUDENT_T_DISTRIBUTION_HPP | ||
|  | #define BOOST_RANDOM_STUDENT_T_DISTRIBUTION_HPP | ||
|  | 
 | ||
|  | #include <boost/config/no_tr1/cmath.hpp> | ||
|  | #include <iosfwd> | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/limits.hpp> | ||
|  | #include <boost/random/detail/operators.hpp> | ||
|  | #include <boost/random/chi_squared_distribution.hpp> | ||
|  | #include <boost/random/normal_distribution.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace random { | ||
|  | 
 | ||
|  | /** | ||
|  |  * The Student t distribution is a real valued distribution with one | ||
|  |  * parameter n, the number of degrees of freedom. | ||
|  |  * | ||
|  |  * It has \f$\displaystyle p(x) = | ||
|  |  *   \frac{1}{\sqrt{n\pi}} | ||
|  |  *   \frac{\Gamma((n+1)/2)}{\Gamma(n/2)} | ||
|  |  *   \left(1+\frac{x^2}{n}\right)^{-(n+1)/2} | ||
|  |  * \f$. | ||
|  |  */ | ||
|  | template<class RealType = double> | ||
|  | class student_t_distribution { | ||
|  | public: | ||
|  |     typedef RealType result_type; | ||
|  |     typedef RealType input_type; | ||
|  | 
 | ||
|  |     class param_type { | ||
|  |     public: | ||
|  |         typedef student_t_distribution distribution_type; | ||
|  | 
 | ||
|  |         /** | ||
|  |          * Constructs a @c param_type with "n" degrees of freedom. | ||
|  |          * | ||
|  |          * Requires: n > 0 | ||
|  |          */ | ||
|  |         explicit param_type(RealType n_arg = RealType(1.0)) | ||
|  |           : _n(n_arg) | ||
|  |         {} | ||
|  | 
 | ||
|  |         /** Returns the number of degrees of freedom of the distribution. */ | ||
|  |         RealType n() const { return _n; } | ||
|  | 
 | ||
|  |         /** Writes a @c param_type to a @c std::ostream. */ | ||
|  |         BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, param_type, parm) | ||
|  |         { os << parm._n; return os; } | ||
|  | 
 | ||
|  |         /** Reads a @c param_type from a @c std::istream. */ | ||
|  |         BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, param_type, parm) | ||
|  |         { is >> parm._n; return is; } | ||
|  | 
 | ||
|  |         /** Returns true if the two sets of parameters are the same. */ | ||
|  |         BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(param_type, lhs, rhs) | ||
|  |         { return lhs._n == rhs._n; } | ||
|  |          | ||
|  |         /** Returns true if the two sets of parameters are the different. */ | ||
|  |         BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(param_type) | ||
|  | 
 | ||
|  |     private: | ||
|  |         RealType _n; | ||
|  |     }; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Constructs an @c student_t_distribution with "n" degrees of freedom. | ||
|  |      * | ||
|  |      * Requires: n > 0 | ||
|  |      */ | ||
|  |     explicit student_t_distribution(RealType n_arg = RealType(1.0)) | ||
|  |       : _normal(), _chi_squared(n_arg) | ||
|  |     {} | ||
|  |     /** Constructs an @c student_t_distribution from its parameters. */ | ||
|  |     explicit student_t_distribution(const param_type& parm) | ||
|  |       : _normal(), _chi_squared(parm.n()) | ||
|  |     {} | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns a random variate distributed according to the | ||
|  |      * Student t distribution. | ||
|  |      */ | ||
|  |     template<class URNG> | ||
|  |     RealType operator()(URNG& urng) | ||
|  |     { | ||
|  |         using std::sqrt; | ||
|  |         return _normal(urng) / sqrt(_chi_squared(urng) / n()); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns a random variate distributed accordint to the Student | ||
|  |      * t distribution with parameters specified by @c param. | ||
|  |      */ | ||
|  |     template<class URNG> | ||
|  |     RealType operator()(URNG& urng, const param_type& parm) const | ||
|  |     { | ||
|  |         return student_t_distribution(parm)(urng); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** Returns the number of degrees of freedom. */ | ||
|  |     RealType n() const { return _chi_squared.n(); } | ||
|  | 
 | ||
|  |     /** Returns the smallest value that the distribution can produce. */ | ||
|  |     RealType min BOOST_PREVENT_MACRO_SUBSTITUTION () const | ||
|  |     { return -std::numeric_limits<RealType>::infinity(); } | ||
|  |     /** Returns the largest value that the distribution can produce. */ | ||
|  |     RealType max BOOST_PREVENT_MACRO_SUBSTITUTION () const | ||
|  |     { return std::numeric_limits<RealType>::infinity(); } | ||
|  | 
 | ||
|  |     /** Returns the parameters of the distribution. */ | ||
|  |     param_type param() const { return param_type(n()); } | ||
|  |     /** Sets the parameters of the distribution. */ | ||
|  |     void param(const param_type& parm) | ||
|  |     { | ||
|  |         typedef chi_squared_distribution<RealType> chi_squared_type; | ||
|  |         typename chi_squared_type::param_type chi_squared_param(parm.n()); | ||
|  |         _chi_squared.param(chi_squared_param); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Effects: Subsequent uses of the distribution do not depend | ||
|  |      * on values produced by any engine prior to invoking reset. | ||
|  |      */ | ||
|  |     void reset() | ||
|  |     { | ||
|  |         _normal.reset(); | ||
|  |         _chi_squared.reset(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** Writes a @c student_t_distribution to a @c std::ostream. */ | ||
|  |     BOOST_RANDOM_DETAIL_OSTREAM_OPERATOR(os, student_t_distribution, td) | ||
|  |     { | ||
|  |         os << td.param(); | ||
|  |         return os; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** Reads a @c student_t_distribution from a @c std::istream. */ | ||
|  |     BOOST_RANDOM_DETAIL_ISTREAM_OPERATOR(is, student_t_distribution, td) | ||
|  |     { | ||
|  |         param_type parm; | ||
|  |         if(is >> parm) { | ||
|  |             td.param(parm); | ||
|  |         } | ||
|  |         return is; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Returns true if the two instances of @c student_t_distribution will | ||
|  |      * return identical sequences of values given equal generators. | ||
|  |      */ | ||
|  |     BOOST_RANDOM_DETAIL_EQUALITY_OPERATOR(student_t_distribution, lhs, rhs) | ||
|  |     { return lhs._normal == rhs._normal && lhs._chi_squared == rhs._chi_squared; } | ||
|  |      | ||
|  |     /** | ||
|  |      * Returns true if the two instances of @c student_t_distribution will | ||
|  |      * return different sequences of values given equal generators. | ||
|  |      */ | ||
|  |     BOOST_RANDOM_DETAIL_INEQUALITY_OPERATOR(student_t_distribution) | ||
|  | 
 | ||
|  | private: | ||
|  |     normal_distribution<RealType> _normal; | ||
|  |     chi_squared_distribution<RealType> _chi_squared; | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace random | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_RANDOM_STUDENT_T_DISTRIBUTION_HPP |