To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
The primary repository for this project is hosted at https://github.com/sonic-visualiser/sv-dependency-builds .
This repository is a read-only copy which is updated automatically every hour.
root / any / include / boost / math / distributions / detail / common_error_handling.hpp @ 160:cff480c41f97
History | View | Annotate | Download (6.6 KB)
| 1 |
// Copyright John Maddock 2006, 2007.
|
|---|---|
| 2 |
// Copyright Paul A. Bristow 2006, 2007, 2012.
|
| 3 |
|
| 4 |
// Use, modification and distribution are subject to the
|
| 5 |
// Boost Software License, Version 1.0.
|
| 6 |
// (See accompanying file LICENSE_1_0.txt
|
| 7 |
// or copy at http://www.boost.org/LICENSE_1_0.txt)
|
| 8 |
|
| 9 |
#ifndef BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP
|
| 10 |
#define BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP
|
| 11 |
|
| 12 |
#include <boost/math/policies/error_handling.hpp> |
| 13 |
#include <boost/math/special_functions/fpclassify.hpp> |
| 14 |
// using boost::math::isfinite;
|
| 15 |
// using boost::math::isnan;
|
| 16 |
|
| 17 |
#ifdef BOOST_MSVC
|
| 18 |
# pragma warning(push)
|
| 19 |
# pragma warning(disable: 4702) // unreachable code (return after domain_error throw). |
| 20 |
#endif
|
| 21 |
|
| 22 |
namespace boost{ namespace math{ namespace detail |
| 23 |
{
|
| 24 |
|
| 25 |
template <class RealType, class Policy> |
| 26 |
inline bool check_probability(const char* function, RealType const& prob, RealType* result, const Policy& pol) |
| 27 |
{
|
| 28 |
if((prob < 0) || (prob > 1) || !(boost::math::isfinite)(prob)) |
| 29 |
{
|
| 30 |
*result = policies::raise_domain_error<RealType>( |
| 31 |
function, |
| 32 |
"Probability argument is %1%, but must be >= 0 and <= 1 !", prob, pol);
|
| 33 |
return false; |
| 34 |
} |
| 35 |
return true; |
| 36 |
} |
| 37 |
|
| 38 |
template <class RealType, class Policy> |
| 39 |
inline bool check_df(const char* function, RealType const& df, RealType* result, const Policy& pol) |
| 40 |
{ // df > 0 but NOT +infinity allowed.
|
| 41 |
if((df <= 0) || !(boost::math::isfinite)(df)) |
| 42 |
{
|
| 43 |
*result = policies::raise_domain_error<RealType>( |
| 44 |
function, |
| 45 |
"Degrees of freedom argument is %1%, but must be > 0 !", df, pol);
|
| 46 |
return false; |
| 47 |
} |
| 48 |
return true; |
| 49 |
} |
| 50 |
|
| 51 |
template <class RealType, class Policy> |
| 52 |
inline bool check_df_gt0_to_inf(const char* function, RealType const& df, RealType* result, const Policy& pol) |
| 53 |
{ // df > 0 or +infinity are allowed.
|
| 54 |
if( (df <= 0) || (boost::math::isnan)(df) ) |
| 55 |
{ // is bad df <= 0 or NaN or -infinity.
|
| 56 |
*result = policies::raise_domain_error<RealType>( |
| 57 |
function, |
| 58 |
"Degrees of freedom argument is %1%, but must be > 0 !", df, pol);
|
| 59 |
return false; |
| 60 |
} |
| 61 |
return true; |
| 62 |
} // check_df_gt0_to_inf
|
| 63 |
|
| 64 |
|
| 65 |
template <class RealType, class Policy> |
| 66 |
inline bool check_scale( |
| 67 |
const char* function, |
| 68 |
RealType scale, |
| 69 |
RealType* result, |
| 70 |
const Policy& pol)
|
| 71 |
{
|
| 72 |
if((scale <= 0) || !(boost::math::isfinite)(scale)) |
| 73 |
{ // Assume scale == 0 is NOT valid for any distribution.
|
| 74 |
*result = policies::raise_domain_error<RealType>( |
| 75 |
function, |
| 76 |
"Scale parameter is %1%, but must be > 0 !", scale, pol);
|
| 77 |
return false; |
| 78 |
} |
| 79 |
return true; |
| 80 |
} |
| 81 |
|
| 82 |
template <class RealType, class Policy> |
| 83 |
inline bool check_location( |
| 84 |
const char* function, |
| 85 |
RealType location, |
| 86 |
RealType* result, |
| 87 |
const Policy& pol)
|
| 88 |
{
|
| 89 |
if(!(boost::math::isfinite)(location))
|
| 90 |
{
|
| 91 |
*result = policies::raise_domain_error<RealType>( |
| 92 |
function, |
| 93 |
"Location parameter is %1%, but must be finite!", location, pol);
|
| 94 |
return false; |
| 95 |
} |
| 96 |
return true; |
| 97 |
} |
| 98 |
|
| 99 |
template <class RealType, class Policy> |
| 100 |
inline bool check_x( |
| 101 |
const char* function, |
| 102 |
RealType x, |
| 103 |
RealType* result, |
| 104 |
const Policy& pol)
|
| 105 |
{
|
| 106 |
// Note that this test catches both infinity and NaN.
|
| 107 |
// Some distributions permit x to be infinite, so these must be tested 1st and return,
|
| 108 |
// leaving this test to catch any NaNs.
|
| 109 |
// See Normal, Logistic, Laplace and Cauchy for example.
|
| 110 |
if(!(boost::math::isfinite)(x))
|
| 111 |
{
|
| 112 |
*result = policies::raise_domain_error<RealType>( |
| 113 |
function, |
| 114 |
"Random variate x is %1%, but must be finite!", x, pol);
|
| 115 |
return false; |
| 116 |
} |
| 117 |
return true; |
| 118 |
} // bool check_x
|
| 119 |
|
| 120 |
template <class RealType, class Policy> |
| 121 |
inline bool check_x_not_NaN( |
| 122 |
const char* function, |
| 123 |
RealType x, |
| 124 |
RealType* result, |
| 125 |
const Policy& pol)
|
| 126 |
{
|
| 127 |
// Note that this test catches only NaN.
|
| 128 |
// Some distributions permit x to be infinite, leaving this test to catch any NaNs.
|
| 129 |
// See Normal, Logistic, Laplace and Cauchy for example.
|
| 130 |
if ((boost::math::isnan)(x))
|
| 131 |
{
|
| 132 |
*result = policies::raise_domain_error<RealType>( |
| 133 |
function, |
| 134 |
"Random variate x is %1%, but must be finite or + or - infinity!", x, pol);
|
| 135 |
return false; |
| 136 |
} |
| 137 |
return true; |
| 138 |
} // bool check_x_not_NaN
|
| 139 |
|
| 140 |
template <class RealType, class Policy> |
| 141 |
inline bool check_x_gt0( |
| 142 |
const char* function, |
| 143 |
RealType x, |
| 144 |
RealType* result, |
| 145 |
const Policy& pol)
|
| 146 |
{
|
| 147 |
if(x <= 0) |
| 148 |
{
|
| 149 |
*result = policies::raise_domain_error<RealType>( |
| 150 |
function, |
| 151 |
"Random variate x is %1%, but must be > 0!", x, pol);
|
| 152 |
return false; |
| 153 |
} |
| 154 |
|
| 155 |
return true; |
| 156 |
// Note that this test catches both infinity and NaN.
|
| 157 |
// Some special cases permit x to be infinite, so these must be tested 1st,
|
| 158 |
// leaving this test to catch any NaNs. See Normal and cauchy for example.
|
| 159 |
} // bool check_x_gt0
|
| 160 |
|
| 161 |
template <class RealType, class Policy> |
| 162 |
inline bool check_positive_x( |
| 163 |
const char* function, |
| 164 |
RealType x, |
| 165 |
RealType* result, |
| 166 |
const Policy& pol)
|
| 167 |
{
|
| 168 |
if(!(boost::math::isfinite)(x) || (x < 0)) |
| 169 |
{
|
| 170 |
*result = policies::raise_domain_error<RealType>( |
| 171 |
function, |
| 172 |
"Random variate x is %1%, but must be finite and >= 0!", x, pol);
|
| 173 |
return false; |
| 174 |
} |
| 175 |
return true; |
| 176 |
// Note that this test catches both infinity and NaN.
|
| 177 |
// Some special cases permit x to be infinite, so these must be tested 1st,
|
| 178 |
// leaving this test to catch any NaNs. see Normal and cauchy for example.
|
| 179 |
} |
| 180 |
|
| 181 |
template <class RealType, class Policy> |
| 182 |
inline bool check_non_centrality( |
| 183 |
const char* function, |
| 184 |
RealType ncp, |
| 185 |
RealType* result, |
| 186 |
const Policy& pol)
|
| 187 |
{
|
| 188 |
if((ncp < 0) || !(boost::math::isfinite)(ncp)) |
| 189 |
{ // Assume scale == 0 is NOT valid for any distribution.
|
| 190 |
*result = policies::raise_domain_error<RealType>( |
| 191 |
function, |
| 192 |
"Non centrality parameter is %1%, but must be > 0 !", ncp, pol);
|
| 193 |
return false; |
| 194 |
} |
| 195 |
return true; |
| 196 |
} |
| 197 |
|
| 198 |
template <class RealType, class Policy> |
| 199 |
inline bool check_finite( |
| 200 |
const char* function, |
| 201 |
RealType x, |
| 202 |
RealType* result, |
| 203 |
const Policy& pol)
|
| 204 |
{
|
| 205 |
if(!(boost::math::isfinite)(x))
|
| 206 |
{ // Assume scale == 0 is NOT valid for any distribution.
|
| 207 |
*result = policies::raise_domain_error<RealType>( |
| 208 |
function, |
| 209 |
"Parameter is %1%, but must be finite !", x, pol);
|
| 210 |
return false; |
| 211 |
} |
| 212 |
return true; |
| 213 |
} |
| 214 |
|
| 215 |
} // namespace detail
|
| 216 |
} // namespace math
|
| 217 |
} // namespace boost
|
| 218 |
|
| 219 |
#ifdef BOOST_MSVC
|
| 220 |
# pragma warning(pop)
|
| 221 |
#endif
|
| 222 |
|
| 223 |
#endif // BOOST_MATH_DISTRIBUTIONS_COMMON_ERROR_HANDLING_HPP |