packages feed

monad-bayes-1.2.0: test/TestEnumerator.hs

{-# LANGUAGE ImportQualifiedPost #-}

module TestEnumerator (passed1, passed2, passed3, passed4) where

import Control.Monad.Bayes.Class
  ( MonadDistribution (categorical, uniformD),
  )
import Control.Monad.Bayes.Enumerator
  ( enumerator,
    evidence,
    expectation,
  )
import Data.AEq (AEq ((~==)))
import Data.Vector qualified as V
import Numeric.Log (Log (ln))
import Sprinkler (hard, soft)

unnorm :: (MonadDistribution m) => m Int
unnorm = categorical $ V.fromList [0.5, 0.8]

passed1 :: Bool
passed1 = (exp . ln) (evidence unnorm) ~== 1

agg :: (MonadDistribution m) => m Int
agg = do
  x <- uniformD [0, 1]
  y <- uniformD [2, 1]
  return (x + y)

passed2 :: Bool
passed2 = enumerator agg ~== [(2, 0.5), (1, 0.25), (3, 0.25)]

passed3 :: Bool
passed3 = enumerator Sprinkler.hard ~== enumerator Sprinkler.soft

passed4 :: Bool
passed4 =
  expectation (^ (2 :: Int)) (fmap (fromIntegral . (+ 1)) $ categorical $ V.fromList [0.5, 0.5]) ~== 2.5