annotate DEPENDENCIES/generic/include/boost/math/distributions/beta.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // boost\math\distributions\beta.hpp
Chris@16 2
Chris@16 3 // Copyright John Maddock 2006.
Chris@16 4 // Copyright Paul A. Bristow 2006.
Chris@16 5
Chris@16 6 // Use, modification and distribution are subject to the
Chris@16 7 // Boost Software License, Version 1.0.
Chris@16 8 // (See accompanying file LICENSE_1_0.txt
Chris@16 9 // or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11 // http://en.wikipedia.org/wiki/Beta_distribution
Chris@16 12 // http://www.itl.nist.gov/div898/handbook/eda/section3/eda366h.htm
Chris@16 13 // http://mathworld.wolfram.com/BetaDistribution.html
Chris@16 14
Chris@16 15 // The Beta Distribution is a continuous probability distribution.
Chris@16 16 // The beta distribution is used to model events which are constrained to take place
Chris@16 17 // within an interval defined by maxima and minima,
Chris@16 18 // so is used extensively in PERT and other project management systems
Chris@16 19 // to describe the time to completion.
Chris@16 20 // The cdf of the beta distribution is used as a convenient way
Chris@16 21 // of obtaining the sum over a set of binomial outcomes.
Chris@16 22 // The beta distribution is also used in Bayesian statistics.
Chris@16 23
Chris@16 24 #ifndef BOOST_MATH_DIST_BETA_HPP
Chris@16 25 #define BOOST_MATH_DIST_BETA_HPP
Chris@16 26
Chris@16 27 #include <boost/math/distributions/fwd.hpp>
Chris@16 28 #include <boost/math/special_functions/beta.hpp> // for beta.
Chris@16 29 #include <boost/math/distributions/complement.hpp> // complements.
Chris@16 30 #include <boost/math/distributions/detail/common_error_handling.hpp> // error checks
Chris@16 31 #include <boost/math/special_functions/fpclassify.hpp> // isnan.
Chris@16 32 #include <boost/math/tools/roots.hpp> // for root finding.
Chris@16 33
Chris@16 34 #if defined (BOOST_MSVC)
Chris@16 35 # pragma warning(push)
Chris@16 36 # pragma warning(disable: 4702) // unreachable code
Chris@16 37 // in domain_error_imp in error_handling
Chris@16 38 #endif
Chris@16 39
Chris@16 40 #include <utility>
Chris@16 41
Chris@16 42 namespace boost
Chris@16 43 {
Chris@16 44 namespace math
Chris@16 45 {
Chris@16 46 namespace beta_detail
Chris@16 47 {
Chris@16 48 // Common error checking routines for beta distribution functions:
Chris@16 49 template <class RealType, class Policy>
Chris@16 50 inline bool check_alpha(const char* function, const RealType& alpha, RealType* result, const Policy& pol)
Chris@16 51 {
Chris@16 52 if(!(boost::math::isfinite)(alpha) || (alpha <= 0))
Chris@16 53 {
Chris@16 54 *result = policies::raise_domain_error<RealType>(
Chris@16 55 function,
Chris@16 56 "Alpha argument is %1%, but must be > 0 !", alpha, pol);
Chris@16 57 return false;
Chris@16 58 }
Chris@16 59 return true;
Chris@16 60 } // bool check_alpha
Chris@16 61
Chris@16 62 template <class RealType, class Policy>
Chris@16 63 inline bool check_beta(const char* function, const RealType& beta, RealType* result, const Policy& pol)
Chris@16 64 {
Chris@16 65 if(!(boost::math::isfinite)(beta) || (beta <= 0))
Chris@16 66 {
Chris@16 67 *result = policies::raise_domain_error<RealType>(
Chris@16 68 function,
Chris@16 69 "Beta argument is %1%, but must be > 0 !", beta, pol);
Chris@16 70 return false;
Chris@16 71 }
Chris@16 72 return true;
Chris@16 73 } // bool check_beta
Chris@16 74
Chris@16 75 template <class RealType, class Policy>
Chris@16 76 inline bool check_prob(const char* function, const RealType& p, RealType* result, const Policy& pol)
Chris@16 77 {
Chris@16 78 if((p < 0) || (p > 1) || !(boost::math::isfinite)(p))
Chris@16 79 {
Chris@16 80 *result = policies::raise_domain_error<RealType>(
Chris@16 81 function,
Chris@16 82 "Probability argument is %1%, but must be >= 0 and <= 1 !", p, pol);
Chris@16 83 return false;
Chris@16 84 }
Chris@16 85 return true;
Chris@16 86 } // bool check_prob
Chris@16 87
Chris@16 88 template <class RealType, class Policy>
Chris@16 89 inline bool check_x(const char* function, const RealType& x, RealType* result, const Policy& pol)
Chris@16 90 {
Chris@16 91 if(!(boost::math::isfinite)(x) || (x < 0) || (x > 1))
Chris@16 92 {
Chris@16 93 *result = policies::raise_domain_error<RealType>(
Chris@16 94 function,
Chris@16 95 "x argument is %1%, but must be >= 0 and <= 1 !", x, pol);
Chris@16 96 return false;
Chris@16 97 }
Chris@16 98 return true;
Chris@16 99 } // bool check_x
Chris@16 100
Chris@16 101 template <class RealType, class Policy>
Chris@16 102 inline bool check_dist(const char* function, const RealType& alpha, const RealType& beta, RealType* result, const Policy& pol)
Chris@16 103 { // Check both alpha and beta.
Chris@16 104 return check_alpha(function, alpha, result, pol)
Chris@16 105 && check_beta(function, beta, result, pol);
Chris@16 106 } // bool check_dist
Chris@16 107
Chris@16 108 template <class RealType, class Policy>
Chris@16 109 inline bool check_dist_and_x(const char* function, const RealType& alpha, const RealType& beta, RealType x, RealType* result, const Policy& pol)
Chris@16 110 {
Chris@16 111 return check_dist(function, alpha, beta, result, pol)
Chris@16 112 && beta_detail::check_x(function, x, result, pol);
Chris@16 113 } // bool check_dist_and_x
Chris@16 114
Chris@16 115 template <class RealType, class Policy>
Chris@16 116 inline bool check_dist_and_prob(const char* function, const RealType& alpha, const RealType& beta, RealType p, RealType* result, const Policy& pol)
Chris@16 117 {
Chris@16 118 return check_dist(function, alpha, beta, result, pol)
Chris@16 119 && check_prob(function, p, result, pol);
Chris@16 120 } // bool check_dist_and_prob
Chris@16 121
Chris@16 122 template <class RealType, class Policy>
Chris@16 123 inline bool check_mean(const char* function, const RealType& mean, RealType* result, const Policy& pol)
Chris@16 124 {
Chris@16 125 if(!(boost::math::isfinite)(mean) || (mean <= 0))
Chris@16 126 {
Chris@16 127 *result = policies::raise_domain_error<RealType>(
Chris@16 128 function,
Chris@16 129 "mean argument is %1%, but must be > 0 !", mean, pol);
Chris@16 130 return false;
Chris@16 131 }
Chris@16 132 return true;
Chris@16 133 } // bool check_mean
Chris@16 134 template <class RealType, class Policy>
Chris@16 135 inline bool check_variance(const char* function, const RealType& variance, RealType* result, const Policy& pol)
Chris@16 136 {
Chris@16 137 if(!(boost::math::isfinite)(variance) || (variance <= 0))
Chris@16 138 {
Chris@16 139 *result = policies::raise_domain_error<RealType>(
Chris@16 140 function,
Chris@16 141 "variance argument is %1%, but must be > 0 !", variance, pol);
Chris@16 142 return false;
Chris@16 143 }
Chris@16 144 return true;
Chris@16 145 } // bool check_variance
Chris@16 146 } // namespace beta_detail
Chris@16 147
Chris@16 148 // typedef beta_distribution<double> beta;
Chris@16 149 // is deliberately NOT included to avoid a name clash with the beta function.
Chris@16 150 // Use beta_distribution<> mybeta(...) to construct type double.
Chris@16 151
Chris@16 152 template <class RealType = double, class Policy = policies::policy<> >
Chris@16 153 class beta_distribution
Chris@16 154 {
Chris@16 155 public:
Chris@16 156 typedef RealType value_type;
Chris@16 157 typedef Policy policy_type;
Chris@16 158
Chris@16 159 beta_distribution(RealType l_alpha = 1, RealType l_beta = 1) : m_alpha(l_alpha), m_beta(l_beta)
Chris@16 160 {
Chris@16 161 RealType result;
Chris@16 162 beta_detail::check_dist(
Chris@16 163 "boost::math::beta_distribution<%1%>::beta_distribution",
Chris@16 164 m_alpha,
Chris@16 165 m_beta,
Chris@16 166 &result, Policy());
Chris@16 167 } // beta_distribution constructor.
Chris@16 168 // Accessor functions:
Chris@16 169 RealType alpha() const
Chris@16 170 {
Chris@16 171 return m_alpha;
Chris@16 172 }
Chris@16 173 RealType beta() const
Chris@16 174 { // .
Chris@16 175 return m_beta;
Chris@16 176 }
Chris@16 177
Chris@16 178 // Estimation of the alpha & beta parameters.
Chris@16 179 // http://en.wikipedia.org/wiki/Beta_distribution
Chris@16 180 // gives formulae in section on parameter estimation.
Chris@16 181 // Also NIST EDA page 3 & 4 give the same.
Chris@16 182 // http://www.itl.nist.gov/div898/handbook/eda/section3/eda366h.htm
Chris@16 183 // http://www.epi.ucdavis.edu/diagnostictests/betabuster.html
Chris@16 184
Chris@16 185 static RealType find_alpha(
Chris@16 186 RealType mean, // Expected value of mean.
Chris@16 187 RealType variance) // Expected value of variance.
Chris@16 188 {
Chris@16 189 static const char* function = "boost::math::beta_distribution<%1%>::find_alpha";
Chris@16 190 RealType result = 0; // of error checks.
Chris@16 191 if(false ==
Chris@16 192 (
Chris@16 193 beta_detail::check_mean(function, mean, &result, Policy())
Chris@16 194 && beta_detail::check_variance(function, variance, &result, Policy())
Chris@16 195 )
Chris@16 196 )
Chris@16 197 {
Chris@16 198 return result;
Chris@16 199 }
Chris@16 200 return mean * (( (mean * (1 - mean)) / variance)- 1);
Chris@16 201 } // RealType find_alpha
Chris@16 202
Chris@16 203 static RealType find_beta(
Chris@16 204 RealType mean, // Expected value of mean.
Chris@16 205 RealType variance) // Expected value of variance.
Chris@16 206 {
Chris@16 207 static const char* function = "boost::math::beta_distribution<%1%>::find_beta";
Chris@16 208 RealType result = 0; // of error checks.
Chris@16 209 if(false ==
Chris@16 210 (
Chris@16 211 beta_detail::check_mean(function, mean, &result, Policy())
Chris@16 212 &&
Chris@16 213 beta_detail::check_variance(function, variance, &result, Policy())
Chris@16 214 )
Chris@16 215 )
Chris@16 216 {
Chris@16 217 return result;
Chris@16 218 }
Chris@16 219 return (1 - mean) * (((mean * (1 - mean)) /variance)-1);
Chris@16 220 } // RealType find_beta
Chris@16 221
Chris@16 222 // Estimate alpha & beta from either alpha or beta, and x and probability.
Chris@16 223 // Uses for these parameter estimators are unclear.
Chris@16 224
Chris@16 225 static RealType find_alpha(
Chris@16 226 RealType beta, // from beta.
Chris@16 227 RealType x, // x.
Chris@16 228 RealType probability) // cdf
Chris@16 229 {
Chris@16 230 static const char* function = "boost::math::beta_distribution<%1%>::find_alpha";
Chris@16 231 RealType result = 0; // of error checks.
Chris@16 232 if(false ==
Chris@16 233 (
Chris@16 234 beta_detail::check_prob(function, probability, &result, Policy())
Chris@16 235 &&
Chris@16 236 beta_detail::check_beta(function, beta, &result, Policy())
Chris@16 237 &&
Chris@16 238 beta_detail::check_x(function, x, &result, Policy())
Chris@16 239 )
Chris@16 240 )
Chris@16 241 {
Chris@16 242 return result;
Chris@16 243 }
Chris@16 244 return ibeta_inva(beta, x, probability, Policy());
Chris@16 245 } // RealType find_alpha(beta, a, probability)
Chris@16 246
Chris@16 247 static RealType find_beta(
Chris@16 248 // ibeta_invb(T b, T x, T p); (alpha, x, cdf,)
Chris@16 249 RealType alpha, // alpha.
Chris@16 250 RealType x, // probability x.
Chris@16 251 RealType probability) // probability cdf.
Chris@16 252 {
Chris@16 253 static const char* function = "boost::math::beta_distribution<%1%>::find_beta";
Chris@16 254 RealType result = 0; // of error checks.
Chris@16 255 if(false ==
Chris@16 256 (
Chris@16 257 beta_detail::check_prob(function, probability, &result, Policy())
Chris@16 258 &&
Chris@16 259 beta_detail::check_alpha(function, alpha, &result, Policy())
Chris@16 260 &&
Chris@16 261 beta_detail::check_x(function, x, &result, Policy())
Chris@16 262 )
Chris@16 263 )
Chris@16 264 {
Chris@16 265 return result;
Chris@16 266 }
Chris@16 267 return ibeta_invb(alpha, x, probability, Policy());
Chris@16 268 } // RealType find_beta(alpha, x, probability)
Chris@16 269
Chris@16 270 private:
Chris@16 271 RealType m_alpha; // Two parameters of the beta distribution.
Chris@16 272 RealType m_beta;
Chris@16 273 }; // template <class RealType, class Policy> class beta_distribution
Chris@16 274
Chris@16 275 template <class RealType, class Policy>
Chris@16 276 inline const std::pair<RealType, RealType> range(const beta_distribution<RealType, Policy>& /* dist */)
Chris@16 277 { // Range of permissible values for random variable x.
Chris@16 278 using boost::math::tools::max_value;
Chris@16 279 return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
Chris@16 280 }
Chris@16 281
Chris@16 282 template <class RealType, class Policy>
Chris@16 283 inline const std::pair<RealType, RealType> support(const beta_distribution<RealType, Policy>& /* dist */)
Chris@16 284 { // Range of supported values for random variable x.
Chris@16 285 // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
Chris@16 286 return std::pair<RealType, RealType>(static_cast<RealType>(0), static_cast<RealType>(1));
Chris@16 287 }
Chris@16 288
Chris@16 289 template <class RealType, class Policy>
Chris@16 290 inline RealType mean(const beta_distribution<RealType, Policy>& dist)
Chris@16 291 { // Mean of beta distribution = np.
Chris@16 292 return dist.alpha() / (dist.alpha() + dist.beta());
Chris@16 293 } // mean
Chris@16 294
Chris@16 295 template <class RealType, class Policy>
Chris@16 296 inline RealType variance(const beta_distribution<RealType, Policy>& dist)
Chris@16 297 { // Variance of beta distribution = np(1-p).
Chris@16 298 RealType a = dist.alpha();
Chris@16 299 RealType b = dist.beta();
Chris@16 300 return (a * b) / ((a + b ) * (a + b) * (a + b + 1));
Chris@16 301 } // variance
Chris@16 302
Chris@16 303 template <class RealType, class Policy>
Chris@16 304 inline RealType mode(const beta_distribution<RealType, Policy>& dist)
Chris@16 305 {
Chris@16 306 static const char* function = "boost::math::mode(beta_distribution<%1%> const&)";
Chris@16 307
Chris@16 308 RealType result;
Chris@16 309 if ((dist.alpha() <= 1))
Chris@16 310 {
Chris@16 311 result = policies::raise_domain_error<RealType>(
Chris@16 312 function,
Chris@16 313 "mode undefined for alpha = %1%, must be > 1!", dist.alpha(), Policy());
Chris@16 314 return result;
Chris@16 315 }
Chris@16 316
Chris@16 317 if ((dist.beta() <= 1))
Chris@16 318 {
Chris@16 319 result = policies::raise_domain_error<RealType>(
Chris@16 320 function,
Chris@16 321 "mode undefined for beta = %1%, must be > 1!", dist.beta(), Policy());
Chris@16 322 return result;
Chris@16 323 }
Chris@16 324 RealType a = dist.alpha();
Chris@16 325 RealType b = dist.beta();
Chris@16 326 return (a-1) / (a + b - 2);
Chris@16 327 } // mode
Chris@16 328
Chris@16 329 //template <class RealType, class Policy>
Chris@16 330 //inline RealType median(const beta_distribution<RealType, Policy>& dist)
Chris@16 331 //{ // Median of beta distribution is not defined.
Chris@16 332 // return tools::domain_error<RealType>(function, "Median is not implemented, result is %1%!", std::numeric_limits<RealType>::quiet_NaN());
Chris@16 333 //} // median
Chris@16 334
Chris@16 335 //But WILL be provided by the derived accessor as quantile(0.5).
Chris@16 336
Chris@16 337 template <class RealType, class Policy>
Chris@16 338 inline RealType skewness(const beta_distribution<RealType, Policy>& dist)
Chris@16 339 {
Chris@16 340 BOOST_MATH_STD_USING // ADL of std functions.
Chris@16 341 RealType a = dist.alpha();
Chris@16 342 RealType b = dist.beta();
Chris@16 343 return (2 * (b-a) * sqrt(a + b + 1)) / ((a + b + 2) * sqrt(a * b));
Chris@16 344 } // skewness
Chris@16 345
Chris@16 346 template <class RealType, class Policy>
Chris@16 347 inline RealType kurtosis_excess(const beta_distribution<RealType, Policy>& dist)
Chris@16 348 {
Chris@16 349 RealType a = dist.alpha();
Chris@16 350 RealType b = dist.beta();
Chris@16 351 RealType a_2 = a * a;
Chris@16 352 RealType n = 6 * (a_2 * a - a_2 * (2 * b - 1) + b * b * (b + 1) - 2 * a * b * (b + 2));
Chris@16 353 RealType d = a * b * (a + b + 2) * (a + b + 3);
Chris@16 354 return n / d;
Chris@16 355 } // kurtosis_excess
Chris@16 356
Chris@16 357 template <class RealType, class Policy>
Chris@16 358 inline RealType kurtosis(const beta_distribution<RealType, Policy>& dist)
Chris@16 359 {
Chris@16 360 return 3 + kurtosis_excess(dist);
Chris@16 361 } // kurtosis
Chris@16 362
Chris@16 363 template <class RealType, class Policy>
Chris@16 364 inline RealType pdf(const beta_distribution<RealType, Policy>& dist, const RealType& x)
Chris@16 365 { // Probability Density/Mass Function.
Chris@16 366 BOOST_FPU_EXCEPTION_GUARD
Chris@16 367
Chris@16 368 static const char* function = "boost::math::pdf(beta_distribution<%1%> const&, %1%)";
Chris@16 369
Chris@16 370 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 371
Chris@16 372 RealType a = dist.alpha();
Chris@16 373 RealType b = dist.beta();
Chris@16 374
Chris@16 375 // Argument checks:
Chris@16 376 RealType result = 0;
Chris@16 377 if(false == beta_detail::check_dist_and_x(
Chris@16 378 function,
Chris@16 379 a, b, x,
Chris@16 380 &result, Policy()))
Chris@16 381 {
Chris@16 382 return result;
Chris@16 383 }
Chris@16 384 using boost::math::beta;
Chris@16 385 return ibeta_derivative(a, b, x, Policy());
Chris@16 386 } // pdf
Chris@16 387
Chris@16 388 template <class RealType, class Policy>
Chris@16 389 inline RealType cdf(const beta_distribution<RealType, Policy>& dist, const RealType& x)
Chris@16 390 { // Cumulative Distribution Function beta.
Chris@16 391 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 392
Chris@16 393 static const char* function = "boost::math::cdf(beta_distribution<%1%> const&, %1%)";
Chris@16 394
Chris@16 395 RealType a = dist.alpha();
Chris@16 396 RealType b = dist.beta();
Chris@16 397
Chris@16 398 // Argument checks:
Chris@16 399 RealType result = 0;
Chris@16 400 if(false == beta_detail::check_dist_and_x(
Chris@16 401 function,
Chris@16 402 a, b, x,
Chris@16 403 &result, Policy()))
Chris@16 404 {
Chris@16 405 return result;
Chris@16 406 }
Chris@16 407 // Special cases:
Chris@16 408 if (x == 0)
Chris@16 409 {
Chris@16 410 return 0;
Chris@16 411 }
Chris@16 412 else if (x == 1)
Chris@16 413 {
Chris@16 414 return 1;
Chris@16 415 }
Chris@16 416 return ibeta(a, b, x, Policy());
Chris@16 417 } // beta cdf
Chris@16 418
Chris@16 419 template <class RealType, class Policy>
Chris@16 420 inline RealType cdf(const complemented2_type<beta_distribution<RealType, Policy>, RealType>& c)
Chris@16 421 { // Complemented Cumulative Distribution Function beta.
Chris@16 422
Chris@16 423 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 424
Chris@16 425 static const char* function = "boost::math::cdf(beta_distribution<%1%> const&, %1%)";
Chris@16 426
Chris@16 427 RealType const& x = c.param;
Chris@16 428 beta_distribution<RealType, Policy> const& dist = c.dist;
Chris@16 429 RealType a = dist.alpha();
Chris@16 430 RealType b = dist.beta();
Chris@16 431
Chris@16 432 // Argument checks:
Chris@16 433 RealType result = 0;
Chris@16 434 if(false == beta_detail::check_dist_and_x(
Chris@16 435 function,
Chris@16 436 a, b, x,
Chris@16 437 &result, Policy()))
Chris@16 438 {
Chris@16 439 return result;
Chris@16 440 }
Chris@16 441 if (x == 0)
Chris@16 442 {
Chris@16 443 return 1;
Chris@16 444 }
Chris@16 445 else if (x == 1)
Chris@16 446 {
Chris@16 447 return 0;
Chris@16 448 }
Chris@16 449 // Calculate cdf beta using the incomplete beta function.
Chris@16 450 // Use of ibeta here prevents cancellation errors in calculating
Chris@16 451 // 1 - x if x is very small, perhaps smaller than machine epsilon.
Chris@16 452 return ibetac(a, b, x, Policy());
Chris@16 453 } // beta cdf
Chris@16 454
Chris@16 455 template <class RealType, class Policy>
Chris@16 456 inline RealType quantile(const beta_distribution<RealType, Policy>& dist, const RealType& p)
Chris@16 457 { // Quantile or Percent Point beta function or
Chris@16 458 // Inverse Cumulative probability distribution function CDF.
Chris@16 459 // Return x (0 <= x <= 1),
Chris@16 460 // for a given probability p (0 <= p <= 1).
Chris@16 461 // These functions take a probability as an argument
Chris@16 462 // and return a value such that the probability that a random variable x
Chris@16 463 // will be less than or equal to that value
Chris@16 464 // is whatever probability you supplied as an argument.
Chris@16 465
Chris@16 466 static const char* function = "boost::math::quantile(beta_distribution<%1%> const&, %1%)";
Chris@16 467
Chris@16 468 RealType result = 0; // of argument checks:
Chris@16 469 RealType a = dist.alpha();
Chris@16 470 RealType b = dist.beta();
Chris@16 471 if(false == beta_detail::check_dist_and_prob(
Chris@16 472 function,
Chris@16 473 a, b, p,
Chris@16 474 &result, Policy()))
Chris@16 475 {
Chris@16 476 return result;
Chris@16 477 }
Chris@16 478 // Special cases:
Chris@16 479 if (p == 0)
Chris@16 480 {
Chris@16 481 return 0;
Chris@16 482 }
Chris@16 483 if (p == 1)
Chris@16 484 {
Chris@16 485 return 1;
Chris@16 486 }
Chris@16 487 return ibeta_inv(a, b, p, static_cast<RealType*>(0), Policy());
Chris@16 488 } // quantile
Chris@16 489
Chris@16 490 template <class RealType, class Policy>
Chris@16 491 inline RealType quantile(const complemented2_type<beta_distribution<RealType, Policy>, RealType>& c)
Chris@16 492 { // Complement Quantile or Percent Point beta function .
Chris@16 493 // Return the number of expected x for a given
Chris@16 494 // complement of the probability q.
Chris@16 495
Chris@16 496 static const char* function = "boost::math::quantile(beta_distribution<%1%> const&, %1%)";
Chris@16 497
Chris@16 498 //
Chris@16 499 // Error checks:
Chris@16 500 RealType q = c.param;
Chris@16 501 const beta_distribution<RealType, Policy>& dist = c.dist;
Chris@16 502 RealType result = 0;
Chris@16 503 RealType a = dist.alpha();
Chris@16 504 RealType b = dist.beta();
Chris@16 505 if(false == beta_detail::check_dist_and_prob(
Chris@16 506 function,
Chris@16 507 a,
Chris@16 508 b,
Chris@16 509 q,
Chris@16 510 &result, Policy()))
Chris@16 511 {
Chris@16 512 return result;
Chris@16 513 }
Chris@16 514 // Special cases:
Chris@16 515 if(q == 1)
Chris@16 516 {
Chris@16 517 return 0;
Chris@16 518 }
Chris@16 519 if(q == 0)
Chris@16 520 {
Chris@16 521 return 1;
Chris@16 522 }
Chris@16 523
Chris@16 524 return ibetac_inv(a, b, q, static_cast<RealType*>(0), Policy());
Chris@16 525 } // Quantile Complement
Chris@16 526
Chris@16 527 } // namespace math
Chris@16 528 } // namespace boost
Chris@16 529
Chris@16 530 // This include must be at the end, *after* the accessors
Chris@16 531 // for this distribution have been defined, in order to
Chris@16 532 // keep compilers that support two-phase lookup happy.
Chris@16 533 #include <boost/math/distributions/detail/derived_accessors.hpp>
Chris@16 534
Chris@16 535 #if defined (BOOST_MSVC)
Chris@16 536 # pragma warning(pop)
Chris@16 537 #endif
Chris@16 538
Chris@16 539 #endif // BOOST_MATH_DIST_BETA_HPP
Chris@16 540
Chris@16 541