[section:dist_ref Statistical Distributions Reference]

[include distributions/non_members.qbk]

[section:dists Distributions]

[include distributions/bernoulli.qbk]
[include distributions/beta.qbk]
[include distributions/binomial.qbk]
[include distributions/cauchy.qbk]
[include distributions/chi_squared.qbk]
[include distributions/exponential.qbk]
[include distributions/extreme_value.qbk]
[include distributions/fisher.qbk]
[include distributions/gamma.qbk]
[include distributions/inverse_chi_squared.qbk]
[include distributions/inverse_gamma.qbk]
[include distributions/hypergeometric.qbk]
[include distributions/laplace.qbk]
[include distributions/logistic.qbk]
[include distributions/lognormal.qbk]
[include distributions/negative_binomial.qbk]
[include distributions/nc_beta.qbk]
[include distributions/nc_chi_squared.qbk]
[include distributions/nc_f.qbk]
[include distributions/nc_t.qbk]
[include distributions/normal.qbk]
[include distributions/pareto.qbk]
[include distributions/poisson.qbk]
[include distributions/rayleigh.qbk]
[include distributions/students_t.qbk]
[include distributions/triangular.qbk]
[include distributions/weibull.qbk]
[include distributions/uniform.qbk]

[endsect][/section:dists Distributions]

[include dist_algorithms.qbk]

[endsect][/section:dist_ref Statistical Distributions and Functions Reference]


[section:future Extras/Future Directions]

[h4 Adding Additional Location and Scale Parameters] 

In some modelling applications we require a distribution with a specific 
location and scale:
often this equates to a specific mean and standard deviation, although for many
distributions the relationship between these properties and the location and 
scale parameters are non-trivial.  
See [@http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htm http://www.itl.nist.gov/div898/handbook/eda/section3/eda364.htm] for more
information.

The obvious way to handle this is via an adapter template:

  template <class Dist>
  class scaled_distribution
  {
     scaled_distribution(
       const Dist dist, 
       typename Dist::value_type location,
       typename Dist::value_type scale = 0);
  };

Which would then have its own set of overloads for the non-member accessor functions.

[h4 An "any_distribution" class]

It would be fairly trivial to add a distribution object that virtualises
the actual type of the distribution, and can therefore hold "any" object
that conforms to the conceptual requirements of a distribution:

   template <class RealType>
   class any_distribution
   {
   public:
      template <class Distribution>
      any_distribution(const Distribution& d);
   };
   
   // Get the cdf of the underlying distribution:
   template <class RealType>
   RealType cdf(const any_distribution<RealType>& d, RealType x);
   // etc....
   
Such a class would facilitate the writing of non-template code that can 
function with any distribution type.  It's not clear yet whether there is a
compelling use case though.  Possibly tests for goodness of fit might 
provide such a use case: this needs more investigation.

[h4 Higher Level Hypothesis Tests]

Higher-level tests roughly corresponding to the
[@http://documents.wolfram.com/mathematica/Add-onsLinks/StandardPackages/Statistics/HypothesisTests.html Mathematica Hypothesis Tests]
package could be added reasonably easily, for example:

  template <class InputIterator>
  typename std::iterator_traits<InputIterator>::value_type
     test_equal_mean(
       InputIterator a,
       InputIterator b,
       typename std::iterator_traits<InputIterator>::value_type expected_mean);

Returns the probability that the data in the sequence [a,b) has the mean
/expected_mean/.

[h4 Integration With Statistical Accumulators]

[@http://boost-sandbox.sourceforge.net/libs/accumulators/doc/html/index.html
Eric Niebler's accumulator framework] - also work in progress - provides the means
to calculate various statistical properties from experimental data.  There is an
opportunity to integrate the statistical tests with this framework at some later date:

  // Define an accumulator, all required statistics to calculate the test
  // are calculated automatically:
  accumulator_set<double, features<tag::test_expected_mean> > acc(expected_mean=4);
  // Pass our data to the accumulator:
  acc = std::for_each(mydata.begin(), mydata.end(), acc);
  // Extract the result:
  double p = probability(acc);

[endsect][/section:future Extras Future Directions]

[/ dist_reference.qbk
  Copyright 2006, 2010 John Maddock and Paul A. Bristow.
  Distributed under 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).
]







