---------------------------------------------------------------------------
-- | Module    : Math.Statistics.Dirichlet.Util
-- Copyright   : (c) 2009-2012 Felipe Lessa
-- License     : BSD3
--
-- Maintainer  : felipe.lessa@gmail.com
-- Stability   : experimental
-- Portability : portable
--
--------------------------------------------------------------------------

module Math.Statistics.Dirichlet.Util
    ( infinity
    , logBeta
    )
    where

import qualified Data.Vector.Unboxed as U
import Numeric.GSL.Special.Gamma (lngamma, lnbeta)



-- | Logarithm of the beta function applied to a vector.
logBeta :: U.Vector Double -> Double
logBeta xs | U.length xs == 2 = lnbeta (U.head xs) (U.last xs)
           | otherwise        = U.sum (U.map lngamma xs) - lngamma (U.sum xs)

-- | Infinity, currently defined as @1e100@.  Used mainly as the
-- initial cost.
infinity :: Double
infinity = 1e100
{-# INLINE infinity #-}