packages feed

hirt-0.0.1.0: Likelihood.hs

{-# LANGUAGE CPP #-}
module Likelihood
where

import Types
import Numeric.Extras (log1p)

--    result     x         c         fx     df/dx   df/dc
lp3 :: Bool -> Double -> Double -> (Double, Double, Double)
lp3 True  x c = let e = exp x
                    t1 = (c-1)/(e+1)
                    t2 = e/(1+c*e)
                in (-log1p ((1-c)*e/(1+c*e)), t1*t2, t2)
lp3 False x c = let e = exp (-x)
                in (-log1p (e*(1+c/e)/(1-c)), e/(e+1), 1/(c-1))

logL3 :: Bool -> ABC -> Theta -> (Double, (Double, Double, Double), Double)
logL3 r (a,b,c) t = let (p, (pda, pdb), pdt) = pos (a,b) t
                        (lh, dlh, dc) = lp3 r p c
                    in (lh, (dlh*pda, dlh*pdb, dc), dlh*pdt)

--     a,b     t         f      df/da   df/db    df/dt
pos :: AB -> Theta -> (Double, (Double, Double), Double)
pos (a,b) t = (a*(b-t), (b-t, a), -a)

--    result     x         fx     df/dx
lp2 :: Bool -> Double -> (Double, Double)
lp2 False x = let (f, df) = lp2 True (-x) in (f,-df)
lp2 True x = let e = exp x in
             (negate . log1p $ e, -e/(e+1))

logL2 :: Bool -> AB -> Theta -> (Double, (Double, Double), Double)
logL2 r (a,b) t = let (p, (pda, pdb), pdt) = pos (a,b) t
                      (lh, dlh) = lp2 r p in
                  (lh, (dlh*pda, dlh*pdb), dlh*pdt)

logL :: Points -> TaskParam -> Theta -> (Double, TaskParam, Double)
#if(PL3)
logL r d t = logL3 r (a,b,c) t
#else
logL r d t = let (lh, (da,db,_), dt) = logL3 r (a,b,c) t in (lh, (da,db), dt)
#endif
  where
    a = paramA d
    b = paramB d
    c = paramC d

logLikelihood :: Points -> TaskParam -> Theta -> Double
logLikelihood r d t = let (lh, _, _) = logL r d t in lh

logLikelihood't :: Points -> TaskParam -> Theta -> Double
logLikelihood't r d t = let (_, _, dt) = logL r d t in dt

logLikelihood'ab :: Points -> TaskParam -> Theta -> TaskParam
logLikelihood'ab r d t = let (_, ds, _) = logL r d t in ds