Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/math/concepts/distributions.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/math/concepts/distributions.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,491 @@ +// 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 +// fullfils 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 +