{-# LANGUAGE RankNTypes #-}
module Mcmc.Monitor.ParameterBatch
(
MonitorParameterBatch (..),
(@#),
monitorBatchMeanInt,
monitorBatchMeanIntF,
monitorBatchMeanRealFloat,
monitorBatchMeanRealFloatF,
monitorBatchMeanRealFloatS,
monitorBatchCustom,
)
where
import Data.Text.Lazy.Builder (Builder)
import qualified Data.Text.Lazy.Builder.RealFloat as T
import Lens.Micro
data MonitorParameterBatch a
= MonitorParameterBatch
{
mbpName :: String,
mbpFunc :: [a] -> 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 #-}
monitorBatchMeanInt ::
Integral a =>
String ->
MonitorParameterBatch a
monitorBatchMeanInt n = MonitorParameterBatch n (T.formatRealFloat T.Fixed (Just 8) . mean)
{-# SPECIALIZE monitorBatchMeanInt :: String -> MonitorParameterBatch Int #-}
monitorBatchMeanIntF ::
Integral a =>
String ->
MonitorParameterBatch a
monitorBatchMeanIntF n = MonitorParameterBatch n (T.realFloat . mean)
{-# SPECIALIZE monitorBatchMeanIntF :: String -> MonitorParameterBatch Int #-}
monitorBatchMeanRealFloat ::
RealFloat a =>
String ->
MonitorParameterBatch a
monitorBatchMeanRealFloat n = MonitorParameterBatch n (T.formatRealFloat T.Fixed (Just 8) . mean)
{-# SPECIALIZE monitorBatchMeanRealFloat :: String -> MonitorParameterBatch Double #-}
monitorBatchMeanRealFloatF ::
RealFloat a =>
String ->
MonitorParameterBatch a
monitorBatchMeanRealFloatF n = MonitorParameterBatch n (T.realFloat . mean)
{-# SPECIALIZE monitorBatchMeanRealFloatF :: String -> MonitorParameterBatch Double #-}
monitorBatchMeanRealFloatS ::
RealFloat a =>
String ->
MonitorParameterBatch a
monitorBatchMeanRealFloatS n = MonitorParameterBatch n (T.formatRealFloat T.Exponent (Just 8) . mean)
{-# SPECIALIZE monitorBatchMeanRealFloatS :: String -> MonitorParameterBatch Double #-}
monitorBatchCustom ::
String ->
([a] -> a) ->
(a -> Builder) ->
MonitorParameterBatch a
monitorBatchCustom n f b = MonitorParameterBatch n (b . f)