123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491 |
- // Copyright John Maddock 2006.
- // 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)
- // distributions.hpp provides definitions of the concept of a distribution
- // and non-member accessor functions that must be implemented by all distributions.
- // This is used to verify that
- // all the features of a distributions have been fully implemented.
- #ifndef BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
- #define BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
- #include <boost/math/distributions/complement.hpp>
- #include <boost/math/distributions/fwd.hpp>
- #ifdef BOOST_MSVC
- #pragma warning(push)
- #pragma warning(disable: 4100)
- #pragma warning(disable: 4510)
- #pragma warning(disable: 4610)
- #pragma warning(disable: 4189) // local variable is initialized but not referenced.
- #endif
- #include <boost/concept_check.hpp>
- #ifdef BOOST_MSVC
- #pragma warning(pop)
- #endif
- #include <utility>
- namespace boost{
- namespace math{
- namespace concepts
- {
- // Begin by defining a concept archetype
- // for a distribution class:
- //
- template <class RealType>
- class distribution_archetype
- {
- public:
- typedef RealType value_type;
- distribution_archetype(const distribution_archetype&); // Copy constructible.
- distribution_archetype& operator=(const distribution_archetype&); // Assignable.
- // There is no default constructor,
- // but we need a way to instantiate the archetype:
- static distribution_archetype& get_object()
- {
- // will never get caled:
- return *reinterpret_cast<distribution_archetype*>(0);
- }
- }; // template <class RealType>class distribution_archetype
- // Non-member accessor functions:
- // (This list defines the functions that must be implemented by all distributions).
- template <class RealType>
- RealType pdf(const distribution_archetype<RealType>& dist, const RealType& x);
- template <class RealType>
- RealType cdf(const distribution_archetype<RealType>& dist, const RealType& x);
- template <class RealType>
- RealType quantile(const distribution_archetype<RealType>& dist, const RealType& p);
- template <class RealType>
- RealType cdf(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
- template <class RealType>
- RealType quantile(const complemented2_type<distribution_archetype<RealType>, RealType>& c);
- template <class RealType>
- RealType mean(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType standard_deviation(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType variance(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType hazard(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType chf(const distribution_archetype<RealType>& dist);
- // http://en.wikipedia.org/wiki/Characteristic_function_%28probability_theory%29
- template <class RealType>
- RealType coefficient_of_variation(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType mode(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType skewness(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType kurtosis_excess(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType kurtosis(const distribution_archetype<RealType>& dist);
- template <class RealType>
- RealType median(const distribution_archetype<RealType>& dist);
- template <class RealType>
- std::pair<RealType, RealType> range(const distribution_archetype<RealType>& dist);
- template <class RealType>
- std::pair<RealType, RealType> support(const distribution_archetype<RealType>& dist);
- //
- // Next comes the concept checks for verifying that a class
- // fulfils the requirements of a Distribution:
- //
- template <class Distribution>
- struct DistributionConcept
- {
- typedef typename Distribution::value_type value_type;
- void constraints()
- {
- function_requires<CopyConstructibleConcept<Distribution> >();
- function_requires<AssignableConcept<Distribution> >();
- const Distribution& dist = DistributionConcept<Distribution>::get_object();
- value_type x = 0;
- // The result values are ignored in all these checks.
- value_type v = cdf(dist, x);
- v = cdf(complement(dist, x));
- suppress_unused_variable_warning(v);
- v = pdf(dist, x);
- suppress_unused_variable_warning(v);
- v = quantile(dist, x);
- suppress_unused_variable_warning(v);
- v = quantile(complement(dist, x));
- suppress_unused_variable_warning(v);
- v = mean(dist);
- suppress_unused_variable_warning(v);
- v = mode(dist);
- suppress_unused_variable_warning(v);
- v = standard_deviation(dist);
- suppress_unused_variable_warning(v);
- v = variance(dist);
- suppress_unused_variable_warning(v);
- v = hazard(dist, x);
- suppress_unused_variable_warning(v);
- v = chf(dist, x);
- suppress_unused_variable_warning(v);
- v = coefficient_of_variation(dist);
- suppress_unused_variable_warning(v);
- v = skewness(dist);
- suppress_unused_variable_warning(v);
- v = kurtosis(dist);
- suppress_unused_variable_warning(v);
- v = kurtosis_excess(dist);
- suppress_unused_variable_warning(v);
- v = median(dist);
- suppress_unused_variable_warning(v);
- std::pair<value_type, value_type> pv;
- pv = range(dist);
- suppress_unused_variable_warning(pv);
- pv = support(dist);
- suppress_unused_variable_warning(pv);
- float f = 1;
- v = cdf(dist, f);
- suppress_unused_variable_warning(v);
- v = cdf(complement(dist, f));
- suppress_unused_variable_warning(v);
- v = pdf(dist, f);
- suppress_unused_variable_warning(v);
- v = quantile(dist, f);
- suppress_unused_variable_warning(v);
- v = quantile(complement(dist, f));
- suppress_unused_variable_warning(v);
- v = hazard(dist, f);
- suppress_unused_variable_warning(v);
- v = chf(dist, f);
- suppress_unused_variable_warning(v);
- double d = 1;
- v = cdf(dist, d);
- suppress_unused_variable_warning(v);
- v = cdf(complement(dist, d));
- suppress_unused_variable_warning(v);
- v = pdf(dist, d);
- suppress_unused_variable_warning(v);
- v = quantile(dist, d);
- suppress_unused_variable_warning(v);
- v = quantile(complement(dist, d));
- suppress_unused_variable_warning(v);
- v = hazard(dist, d);
- suppress_unused_variable_warning(v);
- v = chf(dist, d);
- suppress_unused_variable_warning(v);
- #ifndef TEST_MPFR
- long double ld = 1;
- v = cdf(dist, ld);
- suppress_unused_variable_warning(v);
- v = cdf(complement(dist, ld));
- suppress_unused_variable_warning(v);
- v = pdf(dist, ld);
- suppress_unused_variable_warning(v);
- v = quantile(dist, ld);
- suppress_unused_variable_warning(v);
- v = quantile(complement(dist, ld));
- suppress_unused_variable_warning(v);
- v = hazard(dist, ld);
- suppress_unused_variable_warning(v);
- v = chf(dist, ld);
- suppress_unused_variable_warning(v);
- #endif
- int i = 1;
- v = cdf(dist, i);
- suppress_unused_variable_warning(v);
- v = cdf(complement(dist, i));
- suppress_unused_variable_warning(v);
- v = pdf(dist, i);
- suppress_unused_variable_warning(v);
- v = quantile(dist, i);
- suppress_unused_variable_warning(v);
- v = quantile(complement(dist, i));
- suppress_unused_variable_warning(v);
- v = hazard(dist, i);
- suppress_unused_variable_warning(v);
- v = chf(dist, i);
- suppress_unused_variable_warning(v);
- unsigned long li = 1;
- v = cdf(dist, li);
- suppress_unused_variable_warning(v);
- v = cdf(complement(dist, li));
- suppress_unused_variable_warning(v);
- v = pdf(dist, li);
- suppress_unused_variable_warning(v);
- v = quantile(dist, li);
- suppress_unused_variable_warning(v);
- v = quantile(complement(dist, li));
- suppress_unused_variable_warning(v);
- v = hazard(dist, li);
- suppress_unused_variable_warning(v);
- v = chf(dist, li);
- suppress_unused_variable_warning(v);
- test_extra_members(dist);
- }
- template <class D>
- static void test_extra_members(const D&)
- {}
- template <class R, class P>
- static void test_extra_members(const boost::math::bernoulli_distribution<R, P>& d)
- {
- value_type r = d.success_fraction();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::beta_distribution<R, P>& d)
- {
- value_type r1 = d.alpha();
- value_type r2 = d.beta();
- r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2);
- suppress_unused_variable_warning(r1);
- r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2);
- suppress_unused_variable_warning(r1);
- r1 = boost::math::beta_distribution<R, P>::find_alpha(r1, r2, r1);
- suppress_unused_variable_warning(r1);
- r1 = boost::math::beta_distribution<R, P>::find_beta(r1, r2, r1);
- suppress_unused_variable_warning(r1);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::binomial_distribution<R, P>& d)
- {
- value_type r = d.success_fraction();
- r = d.trials();
- r = Distribution::find_lower_bound_on_p(r, r, r);
- r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
- r = Distribution::find_lower_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
- r = Distribution::find_upper_bound_on_p(r, r, r);
- r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::clopper_pearson_exact_interval);
- r = Distribution::find_upper_bound_on_p(r, r, r, Distribution::jeffreys_prior_interval);
- r = Distribution::find_minimum_number_of_trials(r, r, r);
- r = Distribution::find_maximum_number_of_trials(r, r, r);
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::cauchy_distribution<R, P>& d)
- {
- value_type r = d.location();
- r = d.scale();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::chi_squared_distribution<R, P>& d)
- {
- value_type r = d.degrees_of_freedom();
- r = Distribution::find_degrees_of_freedom(r, r, r, r);
- r = Distribution::find_degrees_of_freedom(r, r, r, r, r);
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::exponential_distribution<R, P>& d)
- {
- value_type r = d.lambda();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::extreme_value_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.location();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::fisher_f_distribution<R, P>& d)
- {
- value_type r = d.degrees_of_freedom1();
- r = d.degrees_of_freedom2();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::gamma_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.shape();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::inverse_chi_squared_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.degrees_of_freedom();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::inverse_gamma_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.shape();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::hypergeometric_distribution<R, P>& d)
- {
- unsigned u = d.defective();
- u = d.sample_count();
- u = d.total();
- suppress_unused_variable_warning(u);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::laplace_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.location();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::logistic_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.location();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::lognormal_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.location();
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::negative_binomial_distribution<R, P>& d)
- {
- value_type r = d.success_fraction();
- r = d.successes();
- r = Distribution::find_lower_bound_on_p(r, r, r);
- r = Distribution::find_upper_bound_on_p(r, r, r);
- r = Distribution::find_minimum_number_of_trials(r, r, r);
- r = Distribution::find_maximum_number_of_trials(r, r, r);
- suppress_unused_variable_warning(r);
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::non_central_beta_distribution<R, P>& d)
- {
- value_type r1 = d.alpha();
- value_type r2 = d.beta();
- r1 = d.non_centrality();
- (void)r1; // warning suppression
- (void)r2; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::non_central_chi_squared_distribution<R, P>& d)
- {
- value_type r = d.degrees_of_freedom();
- r = d.non_centrality();
- r = Distribution::find_degrees_of_freedom(r, r, r);
- r = Distribution::find_degrees_of_freedom(boost::math::complement(r, r, r));
- r = Distribution::find_non_centrality(r, r, r);
- r = Distribution::find_non_centrality(boost::math::complement(r, r, r));
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::non_central_f_distribution<R, P>& d)
- {
- value_type r = d.degrees_of_freedom1();
- r = d.degrees_of_freedom2();
- r = d.non_centrality();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::non_central_t_distribution<R, P>& d)
- {
- value_type r = d.degrees_of_freedom();
- r = d.non_centrality();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::normal_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.location();
- r = d.mean();
- r = d.standard_deviation();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::pareto_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.shape();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::poisson_distribution<R, P>& d)
- {
- value_type r = d.mean();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::rayleigh_distribution<R, P>& d)
- {
- value_type r = d.sigma();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::students_t_distribution<R, P>& d)
- {
- value_type r = d.degrees_of_freedom();
- r = d.find_degrees_of_freedom(r, r, r, r);
- r = d.find_degrees_of_freedom(r, r, r, r, r);
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::triangular_distribution<R, P>& d)
- {
- value_type r = d.lower();
- r = d.mode();
- r = d.upper();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::weibull_distribution<R, P>& d)
- {
- value_type r = d.scale();
- r = d.shape();
- (void)r; // warning suppression
- }
- template <class R, class P>
- static void test_extra_members(const boost::math::uniform_distribution<R, P>& d)
- {
- value_type r = d.lower();
- r = d.upper();
- (void)r; // warning suppression
- }
- private:
- static Distribution* pd;
- static Distribution& get_object()
- {
- // In reality this will never get called:
- return *pd;
- }
- }; // struct DistributionConcept
- template <class Distribution>
- Distribution* DistributionConcept<Distribution>::pd = 0;
- } // namespace concepts
- } // namespace math
- } // namespace boost
- #endif // BOOST_MATH_DISTRIBUTION_CONCEPT_HPP
|