annotate DEPENDENCIES/generic/include/boost/math/concepts/distributions.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +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 // distributions.hpp provides definitions of the concept of a distribution
Chris@16 7 // and non-member accessor functions that must be implemented by all distributions.
Chris@16 8 // This is used to verify that
Chris@16 9 // all the features of a distributions have been fully implemented.
Chris@16 10
Chris@16 11 #ifndef BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
Chris@16 12 #define BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
Chris@16 13
Chris@16 14 #include <boost/math/distributions/complement.hpp>
Chris@16 15 #include <boost/math/distributions/fwd.hpp>
Chris@16 16 #ifdef BOOST_MSVC
Chris@16 17 #pragma warning(push)
Chris@16 18 #pragma warning(disable: 4100)
Chris@16 19 #pragma warning(disable: 4510)
Chris@16 20 #pragma warning(disable: 4610)
Chris@16 21 #pragma warning(disable: 4189) // local variable is initialized but not referenced.
Chris@16 22 #endif
Chris@16 23 #include <boost/concept_check.hpp>
Chris@16 24 #ifdef BOOST_MSVC
Chris@16 25 #pragma warning(pop)
Chris@16 26 #endif
Chris@16 27 #include <utility>
Chris@16 28
Chris@16 29 namespace boost{
Chris@16 30 namespace math{
Chris@16 31
Chris@16 32 namespace concepts
Chris@16 33 {
Chris@16 34 // Begin by defining a concept archetype
Chris@16 35 // for a distribution class:
Chris@16 36 //
Chris@16 37 template <class RealType>
Chris@16 38 class distribution_archetype
Chris@16 39 {
Chris@16 40 public:
Chris@16 41 typedef RealType value_type;
Chris@16 42
Chris@16 43 distribution_archetype(const distribution_archetype&); // Copy constructible.
Chris@16 44 distribution_archetype& operator=(const distribution_archetype&); // Assignable.
Chris@16 45
Chris@16 46 // There is no default constructor,
Chris@16 47 // but we need a way to instantiate the archetype:
Chris@16 48 static distribution_archetype& get_object()
Chris@16 49 {
Chris@16 50 // will never get caled:
Chris@16 51 return *reinterpret_cast<distribution_archetype*>(0);
Chris@16 52 }
Chris@16 53 }; // template <class RealType>class distribution_archetype
Chris@16 54
Chris@16 55 // Non-member accessor functions:
Chris@16 56 // (This list defines the functions that must be implemented by all distributions).
Chris@16 57
Chris@16 58 template <class RealType>
Chris@16 59 RealType pdf(const distribution_archetype<RealType>& dist, const RealType& x);
Chris@16 60
Chris@16 61 template <class RealType>
Chris@16 62 RealType cdf(const distribution_archetype<RealType>& dist, const RealType& x);
Chris@16 63
Chris@16 64 template <class RealType>
Chris@16 65 RealType quantile(const distribution_archetype<RealType>& dist, const RealType& p);
Chris@16 66
Chris@16 67 template <class RealType>
Chris@16 68 RealType cdf(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
Chris@16 69
Chris@16 70 template <class RealType>
Chris@16 71 RealType quantile(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
Chris@16 72
Chris@16 73 template <class RealType>
Chris@16 74 RealType mean(const distribution_archetype<RealType>& dist);
Chris@16 75
Chris@16 76 template <class RealType>
Chris@16 77 RealType standard_deviation(const distribution_archetype<RealType>& dist);
Chris@16 78
Chris@16 79 template <class RealType>
Chris@16 80 RealType variance(const distribution_archetype<RealType>& dist);
Chris@16 81
Chris@16 82 template <class RealType>
Chris@16 83 RealType hazard(const distribution_archetype<RealType>& dist);
Chris@16 84
Chris@16 85 template <class RealType>
Chris@16 86 RealType chf(const distribution_archetype<RealType>& dist);
Chris@16 87 // http://en.wikipedia.org/wiki/Characteristic_function_%28probability_theory%29
Chris@16 88
Chris@16 89 template <class RealType>
Chris@16 90 RealType coefficient_of_variation(const distribution_archetype<RealType>& dist);
Chris@16 91
Chris@16 92 template <class RealType>
Chris@16 93 RealType mode(const distribution_archetype<RealType>& dist);
Chris@16 94
Chris@16 95 template <class RealType>
Chris@16 96 RealType skewness(const distribution_archetype<RealType>& dist);
Chris@16 97
Chris@16 98 template <class RealType>
Chris@16 99 RealType kurtosis_excess(const distribution_archetype<RealType>& dist);
Chris@16 100
Chris@16 101 template <class RealType>
Chris@16 102 RealType kurtosis(const distribution_archetype<RealType>& dist);
Chris@16 103
Chris@16 104 template <class RealType>
Chris@16 105 RealType median(const distribution_archetype<RealType>& dist);
Chris@16 106
Chris@16 107 template <class RealType>
Chris@16 108 std::pair<RealType, RealType> range(const distribution_archetype<RealType>& dist);
Chris@16 109
Chris@16 110 template <class RealType>
Chris@16 111 std::pair<RealType, RealType> support(const distribution_archetype<RealType>& dist);
Chris@16 112
Chris@16 113 //
Chris@16 114 // Next comes the concept checks for verifying that a class
Chris@16 115 // fullfils the requirements of a Distribution:
Chris@16 116 //
Chris@16 117 template <class Distribution>
Chris@16 118 struct DistributionConcept
Chris@16 119 {
Chris@16 120 typedef typename Distribution::value_type value_type;
Chris@16 121
Chris@16 122 void constraints()
Chris@16 123 {
Chris@16 124 function_requires<CopyConstructibleConcept<Distribution> >();
Chris@16 125 function_requires<AssignableConcept<Distribution> >();
Chris@16 126
Chris@16 127 const Distribution& dist = DistributionConcept<Distribution>::get_object();
Chris@16 128
Chris@16 129 value_type x = 0;
Chris@16 130 // The result values are ignored in all these checks.
Chris@16 131 value_type v = cdf(dist, x);
Chris@16 132 v = cdf(complement(dist, x));
Chris@16 133 suppress_unused_variable_warning(v);
Chris@16 134 v = pdf(dist, x);
Chris@16 135 suppress_unused_variable_warning(v);
Chris@16 136 v = quantile(dist, x);
Chris@16 137 suppress_unused_variable_warning(v);
Chris@16 138 v = quantile(complement(dist, x));
Chris@16 139 suppress_unused_variable_warning(v);
Chris@16 140 v = mean(dist);
Chris@16 141 suppress_unused_variable_warning(v);
Chris@16 142 v = mode(dist);
Chris@16 143 suppress_unused_variable_warning(v);
Chris@16 144 v = standard_deviation(dist);
Chris@16 145 suppress_unused_variable_warning(v);
Chris@16 146 v = variance(dist);
Chris@16 147 suppress_unused_variable_warning(v);
Chris@16 148 v = hazard(dist, x);
Chris@16 149 suppress_unused_variable_warning(v);
Chris@16 150 v = chf(dist, x);
Chris@16 151 suppress_unused_variable_warning(v);
Chris@16 152 v = coefficient_of_variation(dist);
Chris@16 153 suppress_unused_variable_warning(v);
Chris@16 154 v = skewness(dist);
Chris@16 155 suppress_unused_variable_warning(v);
Chris@16 156 v = kurtosis(dist);
Chris@16 157 suppress_unused_variable_warning(v);
Chris@16 158 v = kurtosis_excess(dist);
Chris@16 159 suppress_unused_variable_warning(v);
Chris@16 160 v = median(dist);
Chris@16 161 suppress_unused_variable_warning(v);
Chris@16 162 std::pair<value_type, value_type> pv;
Chris@16 163 pv = range(dist);
Chris@16 164 suppress_unused_variable_warning(pv);
Chris@16 165 pv = support(dist);
Chris@16 166 suppress_unused_variable_warning(pv);
Chris@16 167
Chris@16 168 float f = 1;
Chris@16 169 v = cdf(dist, f);
Chris@16 170 suppress_unused_variable_warning(v);
Chris@16 171 v = cdf(complement(dist, f));
Chris@16 172 suppress_unused_variable_warning(v);
Chris@16 173 v = pdf(dist, f);
Chris@16 174 suppress_unused_variable_warning(v);
Chris@16 175 v = quantile(dist, f);
Chris@16 176 suppress_unused_variable_warning(v);
Chris@16 177 v = quantile(complement(dist, f));
Chris@16 178 suppress_unused_variable_warning(v);
Chris@16 179 v = hazard(dist, f);
Chris@16 180 suppress_unused_variable_warning(v);
Chris@16 181 v = chf(dist, f);
Chris@16 182 suppress_unused_variable_warning(v);
Chris@16 183 double d = 1;
Chris@16 184 v = cdf(dist, d);
Chris@16 185 suppress_unused_variable_warning(v);
Chris@16 186 v = cdf(complement(dist, d));
Chris@16 187 suppress_unused_variable_warning(v);
Chris@16 188 v = pdf(dist, d);
Chris@16 189 suppress_unused_variable_warning(v);
Chris@16 190 v = quantile(dist, d);
Chris@16 191 suppress_unused_variable_warning(v);
Chris@16 192 v = quantile(complement(dist, d));
Chris@16 193 suppress_unused_variable_warning(v);
Chris@16 194 v = hazard(dist, d);
Chris@16 195 suppress_unused_variable_warning(v);
Chris@16 196 v = chf(dist, d);
Chris@16 197 suppress_unused_variable_warning(v);
Chris@16 198 #ifndef TEST_MPFR
Chris@16 199 long double ld = 1;
Chris@16 200 v = cdf(dist, ld);
Chris@16 201 suppress_unused_variable_warning(v);
Chris@16 202 v = cdf(complement(dist, ld));
Chris@16 203 suppress_unused_variable_warning(v);
Chris@16 204 v = pdf(dist, ld);
Chris@16 205 suppress_unused_variable_warning(v);
Chris@16 206 v = quantile(dist, ld);
Chris@16 207 suppress_unused_variable_warning(v);
Chris@16 208 v = quantile(complement(dist, ld));
Chris@16 209 suppress_unused_variable_warning(v);
Chris@16 210 v = hazard(dist, ld);
Chris@16 211 suppress_unused_variable_warning(v);
Chris@16 212 v = chf(dist, ld);
Chris@16 213 suppress_unused_variable_warning(v);
Chris@16 214 #endif
Chris@16 215 int i = 1;
Chris@16 216 v = cdf(dist, i);
Chris@16 217 suppress_unused_variable_warning(v);
Chris@16 218 v = cdf(complement(dist, i));
Chris@16 219 suppress_unused_variable_warning(v);
Chris@16 220 v = pdf(dist, i);
Chris@16 221 suppress_unused_variable_warning(v);
Chris@16 222 v = quantile(dist, i);
Chris@16 223 suppress_unused_variable_warning(v);
Chris@16 224 v = quantile(complement(dist, i));
Chris@16 225 suppress_unused_variable_warning(v);
Chris@16 226 v = hazard(dist, i);
Chris@16 227 suppress_unused_variable_warning(v);
Chris@16 228 v = chf(dist, i);
Chris@16 229 suppress_unused_variable_warning(v);
Chris@16 230 unsigned long li = 1;
Chris@16 231 v = cdf(dist, li);
Chris@16 232 suppress_unused_variable_warning(v);
Chris@16 233 v = cdf(complement(dist, li));
Chris@16 234 suppress_unused_variable_warning(v);
Chris@16 235 v = pdf(dist, li);
Chris@16 236 suppress_unused_variable_warning(v);
Chris@16 237 v = quantile(dist, li);
Chris@16 238 suppress_unused_variable_warning(v);
Chris@16 239 v = quantile(complement(dist, li));
Chris@16 240 suppress_unused_variable_warning(v);
Chris@16 241 v = hazard(dist, li);
Chris@16 242 suppress_unused_variable_warning(v);
Chris@16 243 v = chf(dist, li);
Chris@16 244 suppress_unused_variable_warning(v);
Chris@16 245 test_extra_members(dist);
Chris@16 246 }
Chris@16 247 template <class D>
Chris@16 248 static void test_extra_members(const D&)
Chris@16 249 {}
Chris@16 250 template <class R, class P>
Chris@16 251 static void test_extra_members(const boost::math::bernoulli_distribution<R, P>& d)
Chris@16 252 {
Chris@16 253 value_type r = d.success_fraction();
Chris@16 254 (void)r; // warning suppression
Chris@16 255 }
Chris@16 256 template <class R, class P>
Chris@16 257 static void test_extra_members(const boost::math::beta_distribution<R, P>& d)
Chris@16 258 {
Chris@16 259 value_type r1 = d.alpha();
Chris@16 260 value_type r2 = d.beta();
Chris@16 261 r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2);
Chris@16 262 suppress_unused_variable_warning(r1);
Chris@16 263 r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2);
Chris@16 264 suppress_unused_variable_warning(r1);
Chris@16 265 r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2, r1);
Chris@16 266 suppress_unused_variable_warning(r1);
Chris@16 267 r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2, r1);
Chris@16 268 suppress_unused_variable_warning(r1);
Chris@16 269 }
Chris@16 270 template <class R, class P>
Chris@16 271 static void test_extra_members(const boost::math::binomial_distribution<R, P>& d)
Chris@16 272 {
Chris@16 273 value_type r = d.success_fraction();
Chris@16 274 r = d.trials();
Chris@16 275 r = Distribution::find_lower_bound_on_p(r, r, r);
Chris@16 276 r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
Chris@16 277 r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
Chris@16 278 r = Distribution::find_upper_bound_on_p(r, r, r);
Chris@16 279 r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
Chris@16 280 r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
Chris@16 281 r = Distribution::find_minimum_number_of_trials(r, r, r);
Chris@16 282 r = Distribution::find_maximum_number_of_trials(r, r, r);
Chris@16 283 suppress_unused_variable_warning(r);
Chris@16 284 }
Chris@16 285 template <class R, class P>
Chris@16 286 static void test_extra_members(const boost::math::cauchy_distribution<R, P>& d)
Chris@16 287 {
Chris@16 288 value_type r = d.location();
Chris@16 289 r = d.scale();
Chris@16 290 suppress_unused_variable_warning(r);
Chris@16 291 }
Chris@16 292 template <class R, class P>
Chris@16 293 static void test_extra_members(const boost::math::chi_squared_distribution<R, P>& d)
Chris@16 294 {
Chris@16 295 value_type r = d.degrees_of_freedom();
Chris@16 296 r = Distribution::find_degrees_of_freedom(r, r, r, r);
Chris@16 297 r = Distribution::find_degrees_of_freedom(r, r, r, r, r);
Chris@16 298 suppress_unused_variable_warning(r);
Chris@16 299 }
Chris@16 300 template <class R, class P>
Chris@16 301 static void test_extra_members(const boost::math::exponential_distribution<R, P>& d)
Chris@16 302 {
Chris@16 303 value_type r = d.lambda();
Chris@16 304 suppress_unused_variable_warning(r);
Chris@16 305 }
Chris@16 306 template <class R, class P>
Chris@16 307 static void test_extra_members(const boost::math::extreme_value_distribution<R, P>& d)
Chris@16 308 {
Chris@16 309 value_type r = d.scale();
Chris@16 310 r = d.location();
Chris@16 311 suppress_unused_variable_warning(r);
Chris@16 312 }
Chris@16 313 template <class R, class P>
Chris@16 314 static void test_extra_members(const boost::math::fisher_f_distribution<R, P>& d)
Chris@16 315 {
Chris@16 316 value_type r = d.degrees_of_freedom1();
Chris@16 317 r = d.degrees_of_freedom2();
Chris@16 318 suppress_unused_variable_warning(r);
Chris@16 319 }
Chris@16 320 template <class R, class P>
Chris@16 321 static void test_extra_members(const boost::math::gamma_distribution<R, P>& d)
Chris@16 322 {
Chris@16 323 value_type r = d.scale();
Chris@16 324 r = d.shape();
Chris@16 325 suppress_unused_variable_warning(r);
Chris@16 326 }
Chris@16 327 template <class R, class P>
Chris@16 328 static void test_extra_members(const boost::math::inverse_chi_squared_distribution<R, P>& d)
Chris@16 329 {
Chris@16 330 value_type r = d.scale();
Chris@16 331 r = d.degrees_of_freedom();
Chris@16 332 suppress_unused_variable_warning(r);
Chris@16 333 }
Chris@16 334 template <class R, class P>
Chris@16 335 static void test_extra_members(const boost::math::inverse_gamma_distribution<R, P>& d)
Chris@16 336 {
Chris@16 337 value_type r = d.scale();
Chris@16 338 r = d.shape();
Chris@16 339 suppress_unused_variable_warning(r);
Chris@16 340 }
Chris@16 341 template <class R, class P>
Chris@16 342 static void test_extra_members(const boost::math::hypergeometric_distribution<R, P>& d)
Chris@16 343 {
Chris@16 344 unsigned u = d.defective();
Chris@16 345 u = d.sample_count();
Chris@16 346 u = d.total();
Chris@16 347 suppress_unused_variable_warning(u);
Chris@16 348 }
Chris@16 349 template <class R, class P>
Chris@16 350 static void test_extra_members(const boost::math::laplace_distribution<R, P>& d)
Chris@16 351 {
Chris@16 352 value_type r = d.scale();
Chris@16 353 r = d.location();
Chris@16 354 suppress_unused_variable_warning(r);
Chris@16 355 }
Chris@16 356 template <class R, class P>
Chris@16 357 static void test_extra_members(const boost::math::logistic_distribution<R, P>& d)
Chris@16 358 {
Chris@16 359 value_type r = d.scale();
Chris@16 360 r = d.location();
Chris@16 361 suppress_unused_variable_warning(r);
Chris@16 362 }
Chris@16 363 template <class R, class P>
Chris@16 364 static void test_extra_members(const boost::math::lognormal_distribution<R, P>& d)
Chris@16 365 {
Chris@16 366 value_type r = d.scale();
Chris@16 367 r = d.location();
Chris@16 368 suppress_unused_variable_warning(r);
Chris@16 369 }
Chris@16 370 template <class R, class P>
Chris@16 371 static void test_extra_members(const boost::math::negative_binomial_distribution<R, P>& d)
Chris@16 372 {
Chris@16 373 value_type r = d.success_fraction();
Chris@16 374 r = d.successes();
Chris@16 375 r = Distribution::find_lower_bound_on_p(r, r, r);
Chris@16 376 r = Distribution::find_upper_bound_on_p(r, r, r);
Chris@16 377 r = Distribution::find_minimum_number_of_trials(r, r, r);
Chris@16 378 r = Distribution::find_maximum_number_of_trials(r, r, r);
Chris@16 379 suppress_unused_variable_warning(r);
Chris@16 380 }
Chris@16 381 template <class R, class P>
Chris@16 382 static void test_extra_members(const boost::math::non_central_beta_distribution<R, P>& d)
Chris@16 383 {
Chris@16 384 value_type r1 = d.alpha();
Chris@16 385 value_type r2 = d.beta();
Chris@16 386 r1 = d.non_centrality();
Chris@16 387 (void)r1; // warning suppression
Chris@16 388 (void)r2; // warning suppression
Chris@16 389 }
Chris@16 390 template <class R, class P>
Chris@16 391 static void test_extra_members(const boost::math::non_central_chi_squared_distribution<R, P>& d)
Chris@16 392 {
Chris@16 393 value_type r = d.degrees_of_freedom();
Chris@16 394 r = d.non_centrality();
Chris@16 395 r = Distribution::find_degrees_of_freedom(r, r, r);
Chris@16 396 r = Distribution::find_degrees_of_freedom(boost::math::complement(r, r, r));
Chris@16 397 r = Distribution::find_non_centrality(r, r, r);
Chris@16 398 r = Distribution::find_non_centrality(boost::math::complement(r, r, r));
Chris@16 399 (void)r; // warning suppression
Chris@16 400 }
Chris@16 401 template <class R, class P>
Chris@16 402 static void test_extra_members(const boost::math::non_central_f_distribution<R, P>& d)
Chris@16 403 {
Chris@16 404 value_type r = d.degrees_of_freedom1();
Chris@16 405 r = d.degrees_of_freedom2();
Chris@16 406 r = d.non_centrality();
Chris@16 407 (void)r; // warning suppression
Chris@16 408 }
Chris@16 409 template <class R, class P>
Chris@16 410 static void test_extra_members(const boost::math::non_central_t_distribution<R, P>& d)
Chris@16 411 {
Chris@16 412 value_type r = d.degrees_of_freedom();
Chris@16 413 r = d.non_centrality();
Chris@16 414 (void)r; // warning suppression
Chris@16 415 }
Chris@16 416 template <class R, class P>
Chris@16 417 static void test_extra_members(const boost::math::normal_distribution<R, P>& d)
Chris@16 418 {
Chris@16 419 value_type r = d.scale();
Chris@16 420 r = d.location();
Chris@16 421 r = d.mean();
Chris@16 422 r = d.standard_deviation();
Chris@16 423 (void)r; // warning suppression
Chris@16 424 }
Chris@16 425 template <class R, class P>
Chris@16 426 static void test_extra_members(const boost::math::pareto_distribution<R, P>& d)
Chris@16 427 {
Chris@16 428 value_type r = d.scale();
Chris@16 429 r = d.shape();
Chris@16 430 (void)r; // warning suppression
Chris@16 431 }
Chris@16 432 template <class R, class P>
Chris@16 433 static void test_extra_members(const boost::math::poisson_distribution<R, P>& d)
Chris@16 434 {
Chris@16 435 value_type r = d.mean();
Chris@16 436 (void)r; // warning suppression
Chris@16 437 }
Chris@16 438 template <class R, class P>
Chris@16 439 static void test_extra_members(const boost::math::rayleigh_distribution<R, P>& d)
Chris@16 440 {
Chris@16 441 value_type r = d.sigma();
Chris@16 442 (void)r; // warning suppression
Chris@16 443 }
Chris@16 444 template <class R, class P>
Chris@16 445 static void test_extra_members(const boost::math::students_t_distribution<R, P>& d)
Chris@16 446 {
Chris@16 447 value_type r = d.degrees_of_freedom();
Chris@16 448 r = d.find_degrees_of_freedom(r, r, r, r);
Chris@16 449 r = d.find_degrees_of_freedom(r, r, r, r, r);
Chris@16 450 (void)r; // warning suppression
Chris@16 451 }
Chris@16 452 template <class R, class P>
Chris@16 453 static void test_extra_members(const boost::math::triangular_distribution<R, P>& d)
Chris@16 454 {
Chris@16 455 value_type r = d.lower();
Chris@16 456 r = d.mode();
Chris@16 457 r = d.upper();
Chris@16 458 (void)r; // warning suppression
Chris@16 459 }
Chris@16 460 template <class R, class P>
Chris@16 461 static void test_extra_members(const boost::math::weibull_distribution<R, P>& d)
Chris@16 462 {
Chris@16 463 value_type r = d.scale();
Chris@16 464 r = d.shape();
Chris@16 465 (void)r; // warning suppression
Chris@16 466 }
Chris@16 467 template <class R, class P>
Chris@16 468 static void test_extra_members(const boost::math::uniform_distribution<R, P>& d)
Chris@16 469 {
Chris@16 470 value_type r = d.lower();
Chris@16 471 r = d.upper();
Chris@16 472 (void)r; // warning suppression
Chris@16 473 }
Chris@16 474 private:
Chris@16 475 static Distribution* pd;
Chris@16 476 static Distribution& get_object()
Chris@16 477 {
Chris@16 478 // In reality this will never get called:
Chris@16 479 return *pd;
Chris@16 480 }
Chris@16 481 }; // struct DistributionConcept
Chris@16 482
Chris@16 483 template <class Distribution>
Chris@16 484 Distribution* DistributionConcept<Distribution>::pd = 0;
Chris@16 485
Chris@16 486 } // namespace concepts
Chris@16 487 } // namespace math
Chris@16 488 } // namespace boost
Chris@16 489
Chris@16 490 #endif // BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
Chris@16 491