...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
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 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.
It is easy 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.
The Statistical Distribution Explorer utility for Windows is a usage example.
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.
Higher-level tests roughly corresponding to the 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.
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);