annotate DEPENDENCIES/generic/include/boost/math/distributions/weibull.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 // Copyright John Maddock 2006.
Chris@16 2 // Use, modification and distribution are subject to the
Chris@16 3 // Boost Software License, Version 1.0. (See accompanying file
Chris@16 4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5
Chris@16 6 #ifndef BOOST_STATS_WEIBULL_HPP
Chris@16 7 #define BOOST_STATS_WEIBULL_HPP
Chris@16 8
Chris@16 9 // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3668.htm
Chris@16 10 // http://mathworld.wolfram.com/WeibullDistribution.html
Chris@16 11
Chris@16 12 #include <boost/math/distributions/fwd.hpp>
Chris@16 13 #include <boost/math/special_functions/gamma.hpp>
Chris@16 14 #include <boost/math/special_functions/log1p.hpp>
Chris@16 15 #include <boost/math/special_functions/expm1.hpp>
Chris@16 16 #include <boost/math/distributions/detail/common_error_handling.hpp>
Chris@16 17 #include <boost/math/distributions/complement.hpp>
Chris@16 18
Chris@16 19 #include <utility>
Chris@16 20
Chris@16 21 namespace boost{ namespace math
Chris@16 22 {
Chris@16 23 namespace detail{
Chris@16 24
Chris@16 25 template <class RealType, class Policy>
Chris@16 26 inline bool check_weibull_shape(
Chris@16 27 const char* function,
Chris@16 28 RealType shape,
Chris@16 29 RealType* result, const Policy& pol)
Chris@16 30 {
Chris@16 31 if((shape <= 0) || !(boost::math::isfinite)(shape))
Chris@16 32 {
Chris@16 33 *result = policies::raise_domain_error<RealType>(
Chris@16 34 function,
Chris@16 35 "Shape parameter is %1%, but must be > 0 !", shape, pol);
Chris@16 36 return false;
Chris@16 37 }
Chris@16 38 return true;
Chris@16 39 }
Chris@16 40
Chris@16 41 template <class RealType, class Policy>
Chris@16 42 inline bool check_weibull_x(
Chris@16 43 const char* function,
Chris@16 44 RealType const& x,
Chris@16 45 RealType* result, const Policy& pol)
Chris@16 46 {
Chris@16 47 if((x < 0) || !(boost::math::isfinite)(x))
Chris@16 48 {
Chris@16 49 *result = policies::raise_domain_error<RealType>(
Chris@16 50 function,
Chris@16 51 "Random variate is %1% but must be >= 0 !", x, pol);
Chris@16 52 return false;
Chris@16 53 }
Chris@16 54 return true;
Chris@16 55 }
Chris@16 56
Chris@16 57 template <class RealType, class Policy>
Chris@16 58 inline bool check_weibull(
Chris@16 59 const char* function,
Chris@16 60 RealType scale,
Chris@16 61 RealType shape,
Chris@16 62 RealType* result, const Policy& pol)
Chris@16 63 {
Chris@16 64 return check_scale(function, scale, result, pol) && check_weibull_shape(function, shape, result, pol);
Chris@16 65 }
Chris@16 66
Chris@16 67 } // namespace detail
Chris@16 68
Chris@16 69 template <class RealType = double, class Policy = policies::policy<> >
Chris@16 70 class weibull_distribution
Chris@16 71 {
Chris@16 72 public:
Chris@16 73 typedef RealType value_type;
Chris@16 74 typedef Policy policy_type;
Chris@16 75
Chris@16 76 weibull_distribution(RealType l_shape, RealType l_scale = 1)
Chris@16 77 : m_shape(l_shape), m_scale(l_scale)
Chris@16 78 {
Chris@16 79 RealType result;
Chris@16 80 detail::check_weibull("boost::math::weibull_distribution<%1%>::weibull_distribution", l_scale, l_shape, &result, Policy());
Chris@16 81 }
Chris@16 82
Chris@16 83 RealType shape()const
Chris@16 84 {
Chris@16 85 return m_shape;
Chris@16 86 }
Chris@16 87
Chris@16 88 RealType scale()const
Chris@16 89 {
Chris@16 90 return m_scale;
Chris@16 91 }
Chris@16 92 private:
Chris@16 93 //
Chris@16 94 // Data members:
Chris@16 95 //
Chris@16 96 RealType m_shape; // distribution shape
Chris@16 97 RealType m_scale; // distribution scale
Chris@16 98 };
Chris@16 99
Chris@16 100 typedef weibull_distribution<double> weibull;
Chris@16 101
Chris@16 102 template <class RealType, class Policy>
Chris@16 103 inline const std::pair<RealType, RealType> range(const weibull_distribution<RealType, Policy>& /*dist*/)
Chris@16 104 { // Range of permissible values for random variable x.
Chris@16 105 using boost::math::tools::max_value;
Chris@16 106 return std::pair<RealType, RealType>(static_cast<RealType>(0), max_value<RealType>());
Chris@16 107 }
Chris@16 108
Chris@16 109 template <class RealType, class Policy>
Chris@16 110 inline const std::pair<RealType, RealType> support(const weibull_distribution<RealType, Policy>& /*dist*/)
Chris@16 111 { // Range of supported values for random variable x.
Chris@16 112 // This is range where cdf rises from 0 to 1, and outside it, the pdf is zero.
Chris@16 113 using boost::math::tools::max_value;
Chris@16 114 using boost::math::tools::min_value;
Chris@16 115 return std::pair<RealType, RealType>(min_value<RealType>(), max_value<RealType>());
Chris@16 116 // A discontinuity at x == 0, so only support down to min_value.
Chris@16 117 }
Chris@16 118
Chris@16 119 template <class RealType, class Policy>
Chris@16 120 inline RealType pdf(const weibull_distribution<RealType, Policy>& dist, const RealType& x)
Chris@16 121 {
Chris@16 122 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 123
Chris@16 124 static const char* function = "boost::math::pdf(const weibull_distribution<%1%>, %1%)";
Chris@16 125
Chris@16 126 RealType shape = dist.shape();
Chris@16 127 RealType scale = dist.scale();
Chris@16 128
Chris@16 129 RealType result = 0;
Chris@16 130 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 131 return result;
Chris@16 132 if(false == detail::check_weibull_x(function, x, &result, Policy()))
Chris@16 133 return result;
Chris@16 134
Chris@16 135 if(x == 0)
Chris@16 136 {
Chris@16 137 if(shape == 1)
Chris@16 138 {
Chris@16 139 return 1 / scale;
Chris@16 140 }
Chris@16 141 if(shape > 1)
Chris@16 142 {
Chris@16 143 return 0;
Chris@16 144 }
Chris@16 145 return policies::raise_overflow_error<RealType>(function, 0, Policy());
Chris@16 146 }
Chris@16 147 result = exp(-pow(x / scale, shape));
Chris@16 148 result *= pow(x / scale, shape - 1) * shape / scale;
Chris@16 149
Chris@16 150 return result;
Chris@16 151 }
Chris@16 152
Chris@16 153 template <class RealType, class Policy>
Chris@16 154 inline RealType cdf(const weibull_distribution<RealType, Policy>& dist, const RealType& x)
Chris@16 155 {
Chris@16 156 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 157
Chris@16 158 static const char* function = "boost::math::cdf(const weibull_distribution<%1%>, %1%)";
Chris@16 159
Chris@16 160 RealType shape = dist.shape();
Chris@16 161 RealType scale = dist.scale();
Chris@16 162
Chris@16 163 RealType result = 0;
Chris@16 164 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 165 return result;
Chris@16 166 if(false == detail::check_weibull_x(function, x, &result, Policy()))
Chris@16 167 return result;
Chris@16 168
Chris@16 169 result = -boost::math::expm1(-pow(x / scale, shape), Policy());
Chris@16 170
Chris@16 171 return result;
Chris@16 172 }
Chris@16 173
Chris@16 174 template <class RealType, class Policy>
Chris@16 175 inline RealType quantile(const weibull_distribution<RealType, Policy>& dist, const RealType& p)
Chris@16 176 {
Chris@16 177 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 178
Chris@16 179 static const char* function = "boost::math::quantile(const weibull_distribution<%1%>, %1%)";
Chris@16 180
Chris@16 181 RealType shape = dist.shape();
Chris@16 182 RealType scale = dist.scale();
Chris@16 183
Chris@16 184 RealType result = 0;
Chris@16 185 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 186 return result;
Chris@16 187 if(false == detail::check_probability(function, p, &result, Policy()))
Chris@16 188 return result;
Chris@16 189
Chris@16 190 if(p == 1)
Chris@16 191 return policies::raise_overflow_error<RealType>(function, 0, Policy());
Chris@16 192
Chris@16 193 result = scale * pow(-boost::math::log1p(-p, Policy()), 1 / shape);
Chris@16 194
Chris@16 195 return result;
Chris@16 196 }
Chris@16 197
Chris@16 198 template <class RealType, class Policy>
Chris@16 199 inline RealType cdf(const complemented2_type<weibull_distribution<RealType, Policy>, RealType>& c)
Chris@16 200 {
Chris@16 201 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 202
Chris@16 203 static const char* function = "boost::math::cdf(const weibull_distribution<%1%>, %1%)";
Chris@16 204
Chris@16 205 RealType shape = c.dist.shape();
Chris@16 206 RealType scale = c.dist.scale();
Chris@16 207
Chris@16 208 RealType result = 0;
Chris@16 209 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 210 return result;
Chris@16 211 if(false == detail::check_weibull_x(function, c.param, &result, Policy()))
Chris@16 212 return result;
Chris@16 213
Chris@16 214 result = exp(-pow(c.param / scale, shape));
Chris@16 215
Chris@16 216 return result;
Chris@16 217 }
Chris@16 218
Chris@16 219 template <class RealType, class Policy>
Chris@16 220 inline RealType quantile(const complemented2_type<weibull_distribution<RealType, Policy>, RealType>& c)
Chris@16 221 {
Chris@16 222 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 223
Chris@16 224 static const char* function = "boost::math::quantile(const weibull_distribution<%1%>, %1%)";
Chris@16 225
Chris@16 226 RealType shape = c.dist.shape();
Chris@16 227 RealType scale = c.dist.scale();
Chris@16 228 RealType q = c.param;
Chris@16 229
Chris@16 230 RealType result = 0;
Chris@16 231 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 232 return result;
Chris@16 233 if(false == detail::check_probability(function, q, &result, Policy()))
Chris@16 234 return result;
Chris@16 235
Chris@16 236 if(q == 0)
Chris@16 237 return policies::raise_overflow_error<RealType>(function, 0, Policy());
Chris@16 238
Chris@16 239 result = scale * pow(-log(q), 1 / shape);
Chris@16 240
Chris@16 241 return result;
Chris@16 242 }
Chris@16 243
Chris@16 244 template <class RealType, class Policy>
Chris@16 245 inline RealType mean(const weibull_distribution<RealType, Policy>& dist)
Chris@16 246 {
Chris@16 247 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 248
Chris@16 249 static const char* function = "boost::math::mean(const weibull_distribution<%1%>)";
Chris@16 250
Chris@16 251 RealType shape = dist.shape();
Chris@16 252 RealType scale = dist.scale();
Chris@16 253
Chris@16 254 RealType result = 0;
Chris@16 255 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 256 return result;
Chris@16 257
Chris@16 258 result = scale * boost::math::tgamma(1 + 1 / shape, Policy());
Chris@16 259 return result;
Chris@16 260 }
Chris@16 261
Chris@16 262 template <class RealType, class Policy>
Chris@16 263 inline RealType variance(const weibull_distribution<RealType, Policy>& dist)
Chris@16 264 {
Chris@16 265 RealType shape = dist.shape();
Chris@16 266 RealType scale = dist.scale();
Chris@16 267
Chris@16 268 static const char* function = "boost::math::variance(const weibull_distribution<%1%>)";
Chris@16 269
Chris@16 270 RealType result = 0;
Chris@16 271 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 272 {
Chris@16 273 return result;
Chris@16 274 }
Chris@16 275 result = boost::math::tgamma(1 + 1 / shape, Policy());
Chris@16 276 result *= -result;
Chris@16 277 result += boost::math::tgamma(1 + 2 / shape, Policy());
Chris@16 278 result *= scale * scale;
Chris@16 279 return result;
Chris@16 280 }
Chris@16 281
Chris@16 282 template <class RealType, class Policy>
Chris@16 283 inline RealType mode(const weibull_distribution<RealType, Policy>& dist)
Chris@16 284 {
Chris@16 285 BOOST_MATH_STD_USING // for ADL of std function pow.
Chris@16 286
Chris@16 287 static const char* function = "boost::math::mode(const weibull_distribution<%1%>)";
Chris@16 288
Chris@16 289 RealType shape = dist.shape();
Chris@16 290 RealType scale = dist.scale();
Chris@16 291
Chris@16 292 RealType result = 0;
Chris@16 293 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 294 {
Chris@16 295 return result;
Chris@16 296 }
Chris@16 297 if(shape <= 1)
Chris@16 298 return 0;
Chris@16 299 result = scale * pow((shape - 1) / shape, 1 / shape);
Chris@16 300 return result;
Chris@16 301 }
Chris@16 302
Chris@16 303 template <class RealType, class Policy>
Chris@16 304 inline RealType median(const weibull_distribution<RealType, Policy>& dist)
Chris@16 305 {
Chris@16 306 BOOST_MATH_STD_USING // for ADL of std function pow.
Chris@16 307
Chris@16 308 static const char* function = "boost::math::median(const weibull_distribution<%1%>)";
Chris@16 309
Chris@16 310 RealType shape = dist.shape(); // Wikipedia k
Chris@16 311 RealType scale = dist.scale(); // Wikipedia lambda
Chris@16 312
Chris@16 313 RealType result = 0;
Chris@16 314 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 315 {
Chris@16 316 return result;
Chris@16 317 }
Chris@16 318 using boost::math::constants::ln_two;
Chris@16 319 result = scale * pow(ln_two<RealType>(), 1 / shape);
Chris@16 320 return result;
Chris@16 321 }
Chris@16 322
Chris@16 323 template <class RealType, class Policy>
Chris@16 324 inline RealType skewness(const weibull_distribution<RealType, Policy>& dist)
Chris@16 325 {
Chris@16 326 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 327
Chris@16 328 static const char* function = "boost::math::skewness(const weibull_distribution<%1%>)";
Chris@16 329
Chris@16 330 RealType shape = dist.shape();
Chris@16 331 RealType scale = dist.scale();
Chris@16 332
Chris@16 333 RealType result = 0;
Chris@16 334 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 335 {
Chris@16 336 return result;
Chris@16 337 }
Chris@16 338 RealType g1, g2, g3, d;
Chris@16 339
Chris@16 340 g1 = boost::math::tgamma(1 + 1 / shape, Policy());
Chris@16 341 g2 = boost::math::tgamma(1 + 2 / shape, Policy());
Chris@16 342 g3 = boost::math::tgamma(1 + 3 / shape, Policy());
Chris@16 343 d = pow(g2 - g1 * g1, RealType(1.5));
Chris@16 344
Chris@16 345 result = (2 * g1 * g1 * g1 - 3 * g1 * g2 + g3) / d;
Chris@16 346 return result;
Chris@16 347 }
Chris@16 348
Chris@16 349 template <class RealType, class Policy>
Chris@16 350 inline RealType kurtosis_excess(const weibull_distribution<RealType, Policy>& dist)
Chris@16 351 {
Chris@16 352 BOOST_MATH_STD_USING // for ADL of std functions
Chris@16 353
Chris@16 354 static const char* function = "boost::math::kurtosis_excess(const weibull_distribution<%1%>)";
Chris@16 355
Chris@16 356 RealType shape = dist.shape();
Chris@16 357 RealType scale = dist.scale();
Chris@16 358
Chris@16 359 RealType result = 0;
Chris@16 360 if(false == detail::check_weibull(function, scale, shape, &result, Policy()))
Chris@16 361 return result;
Chris@16 362
Chris@16 363 RealType g1, g2, g3, g4, d, g1_2, g1_4;
Chris@16 364
Chris@16 365 g1 = boost::math::tgamma(1 + 1 / shape, Policy());
Chris@16 366 g2 = boost::math::tgamma(1 + 2 / shape, Policy());
Chris@16 367 g3 = boost::math::tgamma(1 + 3 / shape, Policy());
Chris@16 368 g4 = boost::math::tgamma(1 + 4 / shape, Policy());
Chris@16 369 g1_2 = g1 * g1;
Chris@16 370 g1_4 = g1_2 * g1_2;
Chris@16 371 d = g2 - g1_2;
Chris@16 372 d *= d;
Chris@16 373
Chris@16 374 result = -6 * g1_4 + 12 * g1_2 * g2 - 3 * g2 * g2 - 4 * g1 * g3 + g4;
Chris@16 375 result /= d;
Chris@16 376 return result;
Chris@16 377 }
Chris@16 378
Chris@16 379 template <class RealType, class Policy>
Chris@16 380 inline RealType kurtosis(const weibull_distribution<RealType, Policy>& dist)
Chris@16 381 {
Chris@16 382 return kurtosis_excess(dist) + 3;
Chris@16 383 }
Chris@16 384
Chris@16 385 } // namespace math
Chris@16 386 } // namespace boost
Chris@16 387
Chris@16 388 // This include must be at the end, *after* the accessors
Chris@16 389 // for this distribution have been defined, in order to
Chris@16 390 // keep compilers that support two-phase lookup happy.
Chris@16 391 #include <boost/math/distributions/detail/derived_accessors.hpp>
Chris@16 392
Chris@16 393 #endif // BOOST_STATS_WEIBULL_HPP
Chris@16 394
Chris@16 395