{-# LANGUAGE RankNTypes #-}
module Mcmc.Monitor.ParameterBatch
(
MonitorParameterBatch (..),
(@#),
monitorBatchMean,
monitorBatchMeanF,
monitorBatchMeanE,
monitorBatchCustom,
)
where
import qualified Data.ByteString.Builder as BB
import qualified Data.Double.Conversion.ByteString as BC
import Lens.Micro
data MonitorParameterBatch a
= MonitorParameterBatch
{
mbpName :: String,
mbpFunc :: [a] -> BB.Builder
}
(@#) :: Lens' b a -> MonitorParameterBatch a -> MonitorParameterBatch b
(@#) l (MonitorParameterBatch n f) = MonitorParameterBatch n (f . map (^. l))
mean :: Real a => [a] -> Double
mean xs = realToFrac (sum xs) / fromIntegral (length xs)
{-# SPECIALIZE mean :: [Double] -> Double #-}
{-# SPECIALIZE mean :: [Int] -> Double #-}
monitorBatchMean ::
Real a =>
String ->
MonitorParameterBatch a
monitorBatchMean n = MonitorParameterBatch n (BB.byteString . BC.toFixed 8 . mean)
{-# SPECIALIZE monitorBatchMean :: String -> MonitorParameterBatch Int #-}
{-# SPECIALIZE monitorBatchMean :: String -> MonitorParameterBatch Double #-}
monitorBatchMeanF ::
Real a =>
String ->
MonitorParameterBatch a
monitorBatchMeanF n = MonitorParameterBatch n (BB.byteString . BC.toShortest . mean)
{-# SPECIALIZE monitorBatchMeanF :: String -> MonitorParameterBatch Int #-}
{-# SPECIALIZE monitorBatchMeanF :: String -> MonitorParameterBatch Double #-}
monitorBatchMeanE ::
Real a =>
String ->
MonitorParameterBatch a
monitorBatchMeanE n = MonitorParameterBatch n (BB.byteString . BC.toExponential 8 . mean)
{-# SPECIALIZE monitorBatchMeanE :: String -> MonitorParameterBatch Int #-}
{-# SPECIALIZE monitorBatchMeanE :: String -> MonitorParameterBatch Double #-}
monitorBatchCustom ::
String ->
([a] -> a) ->
(a -> BB.Builder) ->
MonitorParameterBatch a
monitorBatchCustom n f b = MonitorParameterBatch n (b . f)