packages feed

hbayesian-0.1.0.0: test/Test/HHLO/RNG.hs

{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

module Test.HHLO.RNG (tests) where

import           Data.Text           (Text)
import qualified Data.Text           as T
import           Test.Tasty
import           Test.Tasty.HUnit

import           HHLO.Core.Types
import           HHLO.EDSL.Ops
import           HHLO.IR.AST         (FuncArg(..), TensorType(..))
import           HHLO.IR.Builder
import           HHLO.IR.Pretty      (render)
import           HBayesian.HHLO.Ops
import           HBayesian.HHLO.RNG

render1 :: forall s d. (KnownShape s, KnownDType d)
        => [FuncArg] -> Builder (Tensor s d) -> Text
render1 args b = render $ moduleFromBuilder @s @d "main" args b

render2 :: forall s1 d1 s2 d2. (KnownShape s1, KnownDType d1, KnownShape s2, KnownDType d2)
        => [FuncArg] -> Builder (Tuple2 s1 d1 s2 d2) -> Text
render2 args b = render $ moduleFromBuilder2 @s1 @d1 @s2 @d2 "main" args b

tests :: TestTree
tests = testGroup "HHLO.RNG"
  [ testCase "splitKey renders two rng_bit_generator ops" $ do
      let mlir = render2 @'[2] @'UI64 @'[2] @'UI64
                   [ FuncArg "key" (TensorType [2] UI64) ] $ do
            k <- arg @'[2] @'UI64
            (k1, k2) <- splitKey (Key k)
            returnTuple2 (unKey k1) (unKey k2)
      -- We just check that the expected ops appear
      assertBool "contains rng_bit_generator" (T.isInfixOf "stablehlo.rng_bit_generator" mlir)
      assertBool "contains THREE_FRY" (T.isInfixOf "THREE_FRY" mlir)

  , testCase "rngUniformF32 renders" $ do
      let mlir = render1 @'[3] @'F32
                   [ FuncArg "key" (TensorType [2] UI64) ] $ do
            k <- arg @'[2] @'UI64
            rngUniformF32 (Key k)
      assertBool "contains rng_bit_generator" (T.isInfixOf "stablehlo.rng_bit_generator" mlir)
      assertBool "contains convert" (T.isInfixOf "stablehlo.convert" mlir)
      assertBool "contains divide" (T.isInfixOf "stablehlo.divide" mlir)

  , testCase "rngNormalF32 renders" $ do
      let mlir = render1 @'[3] @'F32
                   [ FuncArg "key" (TensorType [2] UI64) ] $ do
            k <- arg @'[2] @'UI64
            rngNormalF32 (Key k)
      assertBool "contains rng_bit_generator" (T.isInfixOf "stablehlo.rng_bit_generator" mlir)
      assertBool "contains log" (T.isInfixOf "stablehlo.log" mlir)
      assertBool "contains sqrt" (T.isInfixOf "stablehlo.sqrt" mlir)
      assertBool "contains cosine" (T.isInfixOf "stablehlo.cosine" mlir)
  ]