// The following text is included in the main documentation page by doxygen
/*! \mainpage vpdl : Probability Distribution Library
* 
* This library contains data structures to represent univariate and multivariate 
* probability distributions and provides algorithms to operate on them.  This
* includes estimating a distribution from data points and sampling from a
* distribution.  vpdl is built on top of vnl and vnl_algo.
*
* vpdl is comprised of two programming paradigms: generic programming and 
* polymorphic inheritance.  The generic programming part is its own sub-library
* called \c vpdt.  \c vpdt is a template library (like STL).  There is no compiled
* library, only a collection of header files in \c vpdl/vpdt. \c vpdt works
* with vnl types, but in many cases can generalize to other types.
* The goal of vpdt is to provide generic implementations that are both time
* and memory efficient when types are known at compile time.
*
* The rest of vpdl uses a polymorphic design as provides greater run time 
* flexibility and easy of use.  It is limited to distributions over scalar, 
* vnl_vector, and vnl_vector_fixed types.
*
* \section history History
*
* vpdl is the merger of two different design patterns for probability distributions.
* It was formed from the merger of three contrib libraries: mul/vpdfl, mul/pdf1d, 
* and brl/bbas/bsta.  
* 
* Created by Manchester, vpdfl provided a polymorphic hierarchy 
* (using virtual functions) for multivariate distributions based on \c vnl_vector and 
* \c vnl_matrix types.  For univariate distributions, pdf1d mirrored the design of
* vpdfl, but used scalar types (i.e. double).  These libraries were very flexible
* at run time.  Both distribution type and, in the case of vpdfl, dimension could
* be selected at run time.
* 
* Create by Brown, bsta provided a generic programming hierarchy (using templates)
* for both univariate and multivariate distributions.  Template parameters
* specified scalar type (float or double) and dimension.  Templates allowed
* the same code base to used scalars in the univariate case and 
* \c vnl_vector_fixed and \c vnl_matrix_fixed in the multivariate case.  
* The goal of bsta was to be very efficient.  Many optimizations are possible 
* by assuming types and dimension are known at compile time.
*
* vpdl was designed as a core library to meet the need of both original designs.
* It uses templates to select type and dimension at compile time, but for
* each selection of template parameters there is a polymorphic hierarchy.
* In addition, the default dimension is 0 which has the special meaning of
* "dimension determined at run time".
*
* \section distributions Distributions
*
* Each distribution is derived (directly or indirectly) from a common templated
* base class called <tt> vpdl_distribution <T,n></tt>.  Template parameter T specifies
* the numeric type (float or double) and n specifies the dimension.
* <tt> vpdl_distribution <T,n></tt> is derived from <tt> vpdl_base_traits <T,n></tt> which is a 
* partially specialized class that defines the key data types for representation 
* of vectors and matrices in each dimension.  In particular:
* - \c n==0 uses <tt> vnl_vector <T></tt> and <tt> vnl_matrix <T></tt> (dimension specified at run time)
* - \c n==1 uses \c T and \c T (scalar computations)
* - \c n>1  uses <tt> vnl_vector_fixed <T,n></tt> and <tt> vnl_matrix_fixed <T,n,n></tt> (fixed dimension of n)
* 
* <tt> vpdl_base_traits <T,n></tt> also defines various functions to operate on these
* different types with a consistent API.  These included functions to get/set
* dimension, access a vector or matrix element, resize a vector or matrix, etc.
* For some template parameters these functions may do nothing, but their 
* existence allows a single implementation of many functions on distributions 
* without need for further template specialization.
*
* The following distributions are in vpdl:
* - <tt> vpdl_gaussian <T,n></tt> : A general Gaussian (aka Normal) distribution
* - <tt> vpdl_gaussian_indep <T,n></tt> : A Gaussian with axis independent covariance
* - <tt> vpdl_gaussian_sphere <T,n></tt> : A hyper-spherical Gaussian with a scalar variance  
* - <tt> vpdl_mixture <T,n></tt> : A polymorphic weighted mixture of distributions 
* - <tt> vpdl_mixture_of <dist_t></tt> : A weighted mixture of distributions of fixed type \c dist_t 
* - <tt> vpdl_kernel_gaussian_sfbw <T,n></tt> : a kernel distribution with fixed 
*      bandwidth using a spherically symmetric Gaussian kernel 
*
* \section Lead Developer
* Matt Leotta is responsible for co-ordinating significant changes to vpdl.
* http://sourceforge.net/sendmessage.php?touser=857661
*/
