accelerate-examples-1.0.0.0: examples/nofib/Test/Prelude/Filter.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
module Test.Prelude.Filter (
test_filter
) where
import Prelude as P
import Data.Label
import Data.Maybe
import Data.Typeable
import Test.QuickCheck
import Test.Framework
import Test.Framework.Providers.QuickCheck2
import Config
import Test.Base
import QuickCheck.Arbitrary.Array ()
import Data.Array.Accelerate as A hiding ( size )
import Data.Array.Accelerate.Examples.Internal as A
import Data.Array.Accelerate.Array.Sugar as Sugar
--
-- Filter ----------------------------------------------------------------------
--
test_filter :: Backend -> Config -> Test
test_filter backend opt = testGroup "filter" $ catMaybes
[ testIntegralElt configInt8 (undefined :: Int8)
, testIntegralElt configInt16 (undefined :: Int16)
, testIntegralElt configInt32 (undefined :: Int32)
, testIntegralElt configInt64 (undefined :: Int64)
, testIntegralElt configWord8 (undefined :: Word8)
, testIntegralElt configWord16 (undefined :: Word16)
, testIntegralElt configWord32 (undefined :: Word32)
, testIntegralElt configWord64 (undefined :: Word64)
, testFloatingElt configFloat (undefined :: Float)
, testFloatingElt configDouble (undefined :: Double)
]
where
testIntegralElt :: forall e. (P.Integral e, A.Integral e, Arbitrary e, Similar e) => (Config :-> Bool) -> e -> Maybe Test
testIntegralElt ok _
| P.not (get ok opt) = Nothing
| otherwise = Just $ testGroup (show (typeOf (undefined::e)))
[ testDim dim1
, testDim dim2
]
where
testDim :: forall sh. (Shape sh, Slice sh, P.Eq sh, Arbitrary (Array (sh:.Int) e)) => (sh:.Int) -> Test
testDim sh = testGroup ("DIM" P.++ show (rank sh))
[ testProperty "even" (run_filter A.even P.even :: Array (sh:.Int) e -> Property)
]
testFloatingElt :: forall e. (P.RealFrac e, A.RealFrac e, Arbitrary e, Similar e) => (Config :-> Bool) -> e -> Maybe Test
testFloatingElt ok _
| P.not (get ok opt) = Nothing
| otherwise = Just $ testGroup (show (typeOf (undefined::e)))
[ testDim dim1
, testDim dim2
]
where
testDim :: forall sh. (Shape sh, Slice sh, P.Eq sh, Arbitrary (Array (sh:.Int) e)) => (sh:.Int) -> Test
testDim sh = testGroup ("DIM" P.++ show (rank sh))
[ testProperty "positive" (run_filter (A.> 0) (P.> 0) :: Array (sh:.Int) e -> Property)
]
run_filter f g xs
= run1 backend (A.filter f) xs ~?= filterRef g xs
filterRef
:: (Shape sh, Elt e)
=> (e -> Bool)
-> Array (sh:.Int) e
-> (Vector e, Array sh Int)
filterRef f arr = (fromList (Z:.total) (concat result), fromList sh len)
where
sh :. n = arrayShape arr
result = P.take (size sh) [ P.filter f sub | sub <- splitEvery n (toList arr) ]
len = P.map P.length result
total = P.sum len