{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} -- | -- Module : Test.Array.IArray -- Copyright : [2017..2020] The Accelerate Team -- License : BSD3 -- -- Maintainer : Trevor L. McDonell -- Stability : experimental -- Portability : non-portable (GHC extensions) -- module Test.Array.IArray where import Test.Util import Test.Tasty import Test.Tasty.Hedgehog import Data.Array.Accelerate ( Shape, Elt ) import Data.Array.Accelerate.Sugar.Elt ( EltR ) import Data.Array.Accelerate.IO.Data.Array.IArray as A import qualified Data.Array.Accelerate as A import Data.Array.IArray hiding ( array, indices, elems ) import qualified Data.Array.IArray as I import Hedgehog import qualified Hedgehog.Gen as Gen import qualified Hedgehog.Range as Range import Data.Proxy import Prelude iarray :: (Ix ix, IArray a e) => Gen (ix,ix) -> Gen e -> Gen (a ix e) iarray ix e = do (lo,hi) <- ix let n = rangeSize (lo,hi) indices = range (lo,hi) -- elems <- Gen.list (Range.singleton n) e return $ I.array (lo,hi) (zip indices elems) test_i2a :: forall ix sh a e. (Ix ix, IArray a e, Elt ix, Show sh, Shape sh, Show e, Elt e, Eq e, Show (a ix e), Eq (a ix e), IxShapeRepr (EltR ix) ~ EltR sh) => Proxy a -> Gen sh -> Gen (ix,ix) -> Gen e -> Property test_i2a _ _ ix e = property $ do ia <- forAll (iarray ix e :: Gen (a ix e)) let (lo,_) = bounds ia acc = fromIArray ia :: A.Array sh e ia' = toIArray (Just lo) acc -- I.elems ia === A.toList acc -- elements convert correctly ia === ia' -- indices round-trip correctly test_a2i :: forall ix sh a e. (Ix ix, IArray a e, Elt ix, Show sh, Shape sh, Show e, Elt e, Eq e, Show (a ix e), Eq sh, Eq e, IxShapeRepr (EltR ix) ~ EltR sh) => Proxy a -> Gen sh -> Gen (ix,ix) -> Gen e -> Property test_a2i _ dim _ e = property $ do sh <- forAll dim acc <- forAll (array sh e) -- A.toList acc === I.elems (toIArray Nothing acc :: a ix e) test_array_iarray :: TestTree test_array_iarray = testGroup "Data.Array.IArray" [ testGroup "iarray->accelerate" [ testGroup "DIM1" [ testProperty "Int" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 int , testProperty "Int8" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 i8 , testProperty "Int16" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 i16 , testProperty "Int32" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 i32 , testProperty "Int64" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 i64 , testProperty "Word" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 word , testProperty "Word8" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 w8 , testProperty "Word16" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 w16 , testProperty "Word32" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 w32 , testProperty "Word64" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 w64 , testProperty "Float" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 f32 , testProperty "Double" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 f64 , testProperty "Complex Float" $ test_i2a (Proxy::Proxy I.Array) dim1 ix1 (complex f32) ] , testGroup "DIM2" [ testProperty "Int" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 int , testProperty "Int8" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 i8 , testProperty "Int16" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 i16 , testProperty "Int32" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 i32 , testProperty "Int64" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 i64 , testProperty "Word" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 word , testProperty "Word8" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 w8 , testProperty "Word16" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 w16 , testProperty "Word32" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 w32 , testProperty "Word64" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 w64 , testProperty "Float" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 f32 , testProperty "Double" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 f64 , testProperty "Complex Float" $ test_i2a (Proxy::Proxy I.Array) dim2 ix2 (complex f32) ] ] , testGroup "accelerate->iarray" [ testGroup "DIM1" [ testProperty "Int" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 int , testProperty "Int8" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 i8 , testProperty "Int16" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 i16 , testProperty "Int32" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 i32 , testProperty "Int64" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 i64 , testProperty "Word" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 word , testProperty "Word8" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 w8 , testProperty "Word16" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 w16 , testProperty "Word32" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 w32 , testProperty "Word64" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 w64 , testProperty "Float" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 f32 , testProperty "Double" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 f64 , testProperty "Complex Float" $ test_a2i (Proxy::Proxy I.Array) dim1 ix1 (complex f32) ] , testGroup "DIM2" [ testProperty "Int" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 int , testProperty "Int8" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 i8 , testProperty "Int16" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 i16 , testProperty "Int32" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 i32 , testProperty "Int64" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 i64 , testProperty "Word" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 word , testProperty "Word8" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 w8 , testProperty "Word16" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 w16 , testProperty "Word32" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 w32 , testProperty "Word64" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 w64 , testProperty "Float" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 f32 , testProperty "Double" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 f64 , testProperty "Complex Float" $ test_a2i (Proxy::Proxy I.Array) dim2 ix2 (complex f32) ] ] ]