{-# 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 Data.Functor.Contravariant
data MonitorParameterBatch a = MonitorParameterBatch
{
MonitorParameterBatch a -> String
mbpName :: String,
MonitorParameterBatch a -> [a] -> Builder
mbpFunc :: [a] -> BB.Builder
}
instance Contravariant (MonitorParameterBatch) where
contramap :: (a -> b) -> MonitorParameterBatch b -> MonitorParameterBatch a
contramap a -> b
f (MonitorParameterBatch String
n [b] -> Builder
m) = String -> ([a] -> Builder) -> MonitorParameterBatch a
forall a. String -> ([a] -> Builder) -> MonitorParameterBatch a
MonitorParameterBatch String
n ([b] -> Builder
m ([b] -> Builder) -> ([a] -> [b]) -> [a] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map a -> b
f)
(@#) :: (b -> a) -> MonitorParameterBatch a -> MonitorParameterBatch b
@# :: (b -> a) -> MonitorParameterBatch a -> MonitorParameterBatch b
(@#) b -> a
f (MonitorParameterBatch String
n [a] -> Builder
m) = String -> ([b] -> Builder) -> MonitorParameterBatch b
forall a. String -> ([a] -> Builder) -> MonitorParameterBatch a
MonitorParameterBatch String
n ([a] -> Builder
m ([a] -> Builder) -> ([b] -> [a]) -> [b] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (b -> a) -> [b] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map b -> a
f)
{-# DEPRECATED (@#) "Superseded by the contravariant instance, use '(>$<)'." #-}
mean :: Real a => [a] -> Double
mean :: [a] -> Double
mean [a]
xs = a -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac ([a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [a]
xs) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
xs)
{-# SPECIALIZE mean :: [Double] -> Double #-}
{-# SPECIALIZE mean :: [Int] -> Double #-}
monitorBatchMean ::
Real a =>
String ->
MonitorParameterBatch a
monitorBatchMean :: String -> MonitorParameterBatch a
monitorBatchMean String
n = String -> ([a] -> Builder) -> MonitorParameterBatch a
forall a. String -> ([a] -> Builder) -> MonitorParameterBatch a
MonitorParameterBatch String
n (ByteString -> Builder
BB.byteString (ByteString -> Builder) -> ([a] -> ByteString) -> [a] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Double -> ByteString
BC.toFixed Int
8 (Double -> ByteString) -> ([a] -> Double) -> [a] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Double
forall a. Real a => [a] -> Double
mean)
{-# SPECIALIZE monitorBatchMean :: String -> MonitorParameterBatch Int #-}
{-# SPECIALIZE monitorBatchMean :: String -> MonitorParameterBatch Double #-}
monitorBatchMeanF ::
Real a =>
String ->
MonitorParameterBatch a
monitorBatchMeanF :: String -> MonitorParameterBatch a
monitorBatchMeanF String
n = String -> ([a] -> Builder) -> MonitorParameterBatch a
forall a. String -> ([a] -> Builder) -> MonitorParameterBatch a
MonitorParameterBatch String
n (ByteString -> Builder
BB.byteString (ByteString -> Builder) -> ([a] -> ByteString) -> [a] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> ByteString
BC.toShortest (Double -> ByteString) -> ([a] -> Double) -> [a] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Double
forall a. Real a => [a] -> Double
mean)
{-# SPECIALIZE monitorBatchMeanF :: String -> MonitorParameterBatch Int #-}
{-# SPECIALIZE monitorBatchMeanF :: String -> MonitorParameterBatch Double #-}
monitorBatchMeanE ::
Real a =>
String ->
MonitorParameterBatch a
monitorBatchMeanE :: String -> MonitorParameterBatch a
monitorBatchMeanE String
n = String -> ([a] -> Builder) -> MonitorParameterBatch a
forall a. String -> ([a] -> Builder) -> MonitorParameterBatch a
MonitorParameterBatch String
n (ByteString -> Builder
BB.byteString (ByteString -> Builder) -> ([a] -> ByteString) -> [a] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Double -> ByteString
BC.toExponential Int
8 (Double -> ByteString) -> ([a] -> Double) -> [a] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> Double
forall a. Real a => [a] -> Double
mean)
{-# SPECIALIZE monitorBatchMeanE :: String -> MonitorParameterBatch Int #-}
{-# SPECIALIZE monitorBatchMeanE :: String -> MonitorParameterBatch Double #-}
monitorBatchCustom ::
String ->
([a] -> a) ->
(a -> BB.Builder) ->
MonitorParameterBatch a
monitorBatchCustom :: String -> ([a] -> a) -> (a -> Builder) -> MonitorParameterBatch a
monitorBatchCustom String
n [a] -> a
f a -> Builder
b = String -> ([a] -> Builder) -> MonitorParameterBatch a
forall a. String -> ([a] -> Builder) -> MonitorParameterBatch a
MonitorParameterBatch String
n (a -> Builder
b (a -> Builder) -> ([a] -> a) -> [a] -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [a] -> a
f)