-----------------------------------------------------------------------------
-- |
-- Module     : LAoP.Dist
-- Copyright  : (c) Armando Santos 2019-2020
-- Maintainer : armandoifsantos@gmail.com
-- Stability  : experimental
--
-- __LAoP__ is a library for algebraic (inductive) construction and manipulation of matrices
-- in Haskell. See <https://github.com/bolt12/master-thesis my Msc Thesis> for the
-- motivation behind the library, the underlying theory, and implementation details.
--
-- This module exports a type synonym 'Dist'
-- that represents a stochastic distribution 
-- matrix and several distribution construction
-- functions.
--
-----------------------------------------------------------------------------

module LAoP.Dist
  ( -- | If the sum of the rows of a column matrix 
    -- is equal to 1 then this stochastic matrix
    -- can be seen as a probability distribution.
    --
    --
    -- This module is still experimental but it's
    -- already possible to model probabilistic programming
    -- problems with it. Import 'Matrix.Nat' or 'Matrix.Type'
    -- to access LAoP matrix combinators and then all you have
    -- to do is to define your sample space, either by creating a new data
    -- type or by abstracting it out via 'Natural'.
    --
    -- Write manipulation functions and promote them to matrices via
    -- 'fromF' or 'fromF'' and you're good to go!

    -- * 'Dist' and 'Prob' type synonyms
    Dist (..),
    Prob,

    -- * Constraint type synonyms
    Countable,
    CountableN,
    CountableDimsN,
    FLN,
    Liftable,
    TrivialP,

    -- * Functor instance equivalent functions
    fmapD,

    -- * Applicative equivalent functions
    unitD,
    multD,

    -- * Selective equivalent functions
    selectD,
    branchD,
    ifD,

    -- * Monad equivalent functions
    returnD,
    bindD,

    -- * Distribution construction functions
    choose,
    shape,
    linear,
    uniform,
    negExp,
    normal,

    -- * Converto to list of pairs
    toValues,
    -- * Pretty print distribution
    prettyDist,
    prettyPrintDist
  )
where

import LAoP.Dist.Internal