-- |
-- Module      :  Mcmc.Likelihood
-- Description :  Types and convenience functions for computing likelihoods
-- Copyright   :  2021 Dominik Schrempf
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Creation date: Wed Mar  3 11:39:04 2021.
module Mcmc.Likelihood
  ( Likelihood,
    LikelihoodFunction,
    LikelihoodFunctionG,
    noLikelihood,
  )
where

import Numeric.Log

-- | Likelihood values are stored in log domain.
type Likelihood = Log Double

-- | Likelihood function.
type LikelihoodFunction a = a -> Log Double

-- | Generalized likelihood function.
type LikelihoodFunctionG a b = a -> Log b

-- | Flat likelihood function. Useful for testing and debugging.
noLikelihood :: RealFloat b => LikelihoodFunctionG a b
noLikelihood :: forall b a. RealFloat b => LikelihoodFunctionG a b
noLikelihood = forall a b. a -> b -> a
const Log b
1.0
{-# SPECIALIZE noLikelihood :: LikelihoodFunction Double #-}