{-# 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
}
mapL :: Lens' a b -> [a] -> [b]
mapL l = 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 b =>
String ->
Lens' a b ->
MonitorParameterBatch a
monitorBatchMeanInt n l =
MonitorParameterBatch
n
(T.formatRealFloat T.Fixed (Just 8) . mean . mapL l)
{-# SPECIALIZE monitorBatchMeanInt :: String -> Lens' a Int -> MonitorParameterBatch a #-}
monitorBatchMeanIntF ::
Integral b =>
String ->
Lens' a b ->
MonitorParameterBatch a
monitorBatchMeanIntF n l =
MonitorParameterBatch n (T.realFloat . mean . mapL l)
{-# SPECIALIZE monitorBatchMeanIntF :: String -> Lens' a Int -> MonitorParameterBatch a #-}
monitorBatchMeanRealFloat ::
RealFloat b =>
String ->
Lens' a b ->
MonitorParameterBatch a
monitorBatchMeanRealFloat n l =
MonitorParameterBatch
n
(T.formatRealFloat T.Fixed (Just 8) . mean . mapL l)
{-# SPECIALIZE monitorBatchMeanRealFloat :: String -> Lens' a Double -> MonitorParameterBatch a #-}
monitorBatchMeanRealFloatF ::
RealFloat b =>
String ->
Lens' a b ->
MonitorParameterBatch a
monitorBatchMeanRealFloatF n l =
MonitorParameterBatch n (T.realFloat . mean . mapL l)
{-# SPECIALIZE monitorBatchMeanRealFloatF :: String -> Lens' a Double -> MonitorParameterBatch a #-}
monitorBatchMeanRealFloatS ::
RealFloat b =>
String ->
Lens' a b ->
MonitorParameterBatch a
monitorBatchMeanRealFloatS n l =
MonitorParameterBatch
n
(T.formatRealFloat T.Exponent (Just 8) . mean . mapL l)
{-# SPECIALIZE monitorBatchMeanRealFloatS :: String -> Lens' a Double -> MonitorParameterBatch a #-}
monitorBatchCustom ::
String ->
Lens' a b ->
([b] -> b) ->
(b -> Builder) ->
MonitorParameterBatch a
monitorBatchCustom n l f b =
MonitorParameterBatch n (b . f . mapL l)