packages feed

accelerate-kullback-liebler-0.1.0.0: test/Spec.cpphs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedLists  #-}

module Main ( main ) where

import           Control.Composition                   ((.$))
import qualified Data.Array.Accelerate                 as A
import           Data.Array.Accelerate.KullbackLiebler (kullbackLiebler)
import qualified Data.Array.Accelerate.LLVM.Native     as CPU
#ifdef ACCELERATE_GPU
import qualified Data.Array.Accelerate.LLVM.PTX        as GPU
#endif
import           Data.Array.Accelerate.Test            (randDist, the)
import           Test.Tasty
import           Test.Tasty.HUnit

main :: IO ()
main = defaultMain accTests

accTests :: TestTree
accTests = testGroup "Unit tests"
    [
#ifdef ACCELERATE_GPU
      testCase "Setup (GPU)" $
        assertBool "simple unit test" =<< selfGPU
    , testCase "Setup (CPU)" $
#else
      testCase "Setup (CPU)" $
#endif
        assertBool "simple unit test" =<< selfCPU
    ]

--TODO: random gen/normalization?
commonData :: IO (A.Acc (A.Scalar Double))
commonData = do
    datums <- randDist (A.Z A.:. 1000000)
    pure $ kullbackLiebler .$ datums

#ifdef ACCELERATE_GPU
selfGPU :: IO Bool
selfGPU = do
    datums <- commonData
    let res = the $ GPU.run datums
    pure $ res == 0
#endif

selfCPU :: IO Bool
selfCPU = do
    datums <- commonData
    let res = the $ CPU.run datums
    pure $ res == 0