module BioInf.RNAdesign.LogMultinomial where import qualified Data.Vector.Unboxed as VU logMultinomial :: Int -> VU.Vector Double -> VU.Vector Int -> Double logMultinomial n' ps xs' | VU.length ps /= VU.length xs' = error "logMultinomial: P-vector and count-vector of unequal length" | otherwise = n - x + p where n = logSum1k n' x = VU.sum $ VU.map logSum1k xs' p = VU.sum $ VU.zipWith (*) (VU.map log ps) (VU.map fromIntegral xs') logSum1k k = VU.sum . VU.map (log . fromIntegral) $ VU.enumFromTo 1 k