195 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			195 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Copyright John Maddock 2006, 2007. | ||
|  | // Copyright Paul A. Bristow 2006, 2007, 2012. | ||
|  | 
 | ||
|  | // Use, modification and distribution are subject to 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) | ||
|  | 
 | ||
|  | #ifndef BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP | ||
|  | #define BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP | ||
|  | 
 | ||
|  | #include <boost/math/policies/error_handling.hpp> | ||
|  | #include <boost/math/special_functions/fpclassify.hpp> | ||
|  | // using boost::math::isfinite; | ||
|  | // using boost::math::isnan; | ||
|  | 
 | ||
|  | namespace boost{ namespace math{ namespace detail | ||
|  | { | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_probability(const char* function, RealType const& prob, RealType* result, const Policy& pol) | ||
|  | { | ||
|  |    if((prob < 0) || (prob > 1) || !(boost::math::isfinite)(prob)) | ||
|  |    { | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Probability argument is %1%, but must be >= 0 and <= 1 !", prob, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_df(const char* function, RealType const& df, RealType* result, const Policy& pol) | ||
|  | { //  df > 0 but NOT +infinity allowed. | ||
|  |    if((df <= 0) || !(boost::math::isfinite)(df)) | ||
|  |    { | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Degrees of freedom argument is %1%, but must be > 0 !", df, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_df_gt0_to_inf(const char* function, RealType const& df, RealType* result, const Policy& pol) | ||
|  | {  // df > 0 or +infinity are allowed. | ||
|  |    if( (df <= 0) || (boost::math::isnan)(df) ) | ||
|  |    { // is bad df <= 0 or NaN or -infinity. | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Degrees of freedom argument is %1%, but must be > 0 !", df, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } // check_df_gt0_to_inf | ||
|  | 
 | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_scale( | ||
|  |       const char* function, | ||
|  |       RealType scale, | ||
|  |       RealType* result, | ||
|  |       const Policy& pol) | ||
|  | { | ||
|  |    if((scale <= 0) || !(boost::math::isfinite)(scale)) | ||
|  |    { // Assume scale == 0 is NOT valid for any distribution. | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Scale parameter is %1%, but must be > 0 !", scale, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_location( | ||
|  |       const char* function, | ||
|  |       RealType location, | ||
|  |       RealType* result, | ||
|  |       const Policy& pol) | ||
|  | { | ||
|  |    if(!(boost::math::isfinite)(location)) | ||
|  |    { | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Location parameter is %1%, but must be finite!", location, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_x( | ||
|  |       const char* function, | ||
|  |       RealType x, | ||
|  |       RealType* result, | ||
|  |       const Policy& pol) | ||
|  | { | ||
|  |    // Note that this test catches both infinity and NaN. | ||
|  |    // Some distributions permit x to be infinite, so these must be tested 1st and return, | ||
|  |    // leaving this test to catch any NaNs. | ||
|  |    // See Normal, Logistic, Laplace and Cauchy for example. | ||
|  |    if(!(boost::math::isfinite)(x)) | ||
|  |    { | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Random variate x is %1%, but must be finite!", x, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } // bool check_x | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_x_gt0( | ||
|  |       const char* function, | ||
|  |       RealType x, | ||
|  |       RealType* result, | ||
|  |       const Policy& pol) | ||
|  | { | ||
|  |    if(x <= 0) | ||
|  |    { | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Random variate x is %1%, but must be > 0!", x, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  | 
 | ||
|  |    return true; | ||
|  |    // Note that this test catches both infinity and NaN. | ||
|  |    // Some special cases permit x to be infinite, so these must be tested 1st, | ||
|  |    // leaving this test to catch any NaNs.  See Normal and cauchy for example. | ||
|  | } // bool check_x_gt0 | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_positive_x( | ||
|  |       const char* function, | ||
|  |       RealType x, | ||
|  |       RealType* result, | ||
|  |       const Policy& pol) | ||
|  | { | ||
|  |    if(!(boost::math::isfinite)(x) || (x < 0)) | ||
|  |    { | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Random variate x is %1%, but must be finite and >= 0!", x, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  |    // Note that this test catches both infinity and NaN. | ||
|  |    // Some special cases permit x to be infinite, so these must be tested 1st, | ||
|  |    // leaving this test to catch any NaNs.  see Normal and cauchy for example. | ||
|  | } | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_non_centrality( | ||
|  |       const char* function, | ||
|  |       RealType ncp, | ||
|  |       RealType* result, | ||
|  |       const Policy& pol) | ||
|  | { | ||
|  |    if((ncp < 0) || !(boost::math::isfinite)(ncp)) | ||
|  |    { // Assume scale == 0 is NOT valid for any distribution. | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Non centrality parameter is %1%, but must be > 0 !", ncp, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } | ||
|  | 
 | ||
|  | template <class RealType, class Policy> | ||
|  | inline bool check_finite( | ||
|  |       const char* function, | ||
|  |       RealType x, | ||
|  |       RealType* result, | ||
|  |       const Policy& pol) | ||
|  | { | ||
|  |    if(!(boost::math::isfinite)(x)) | ||
|  |    { // Assume scale == 0 is NOT valid for any distribution. | ||
|  |       *result = policies::raise_domain_error<RealType>( | ||
|  |          function, | ||
|  |          "Parameter is %1%, but must be finite !", x, pol); | ||
|  |       return false; | ||
|  |    } | ||
|  |    return true; | ||
|  | } | ||
|  | 
 | ||
|  | } // namespace detail | ||
|  | } // namespace math | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP |