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
|