packages feed

accelerate-io-1.2.0.0: test/Test/Array/Unboxed.hs

{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies        #-}
-- |
-- Module      : Test.Array.Unboxed
-- Copyright   : [2017] Trevor L. McDonell
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Test.Array.Unboxed
  where

import Test.Array.IArray

import Test.Util
import Test.Tasty
import Test.Tasty.Hedgehog

import Data.Array.Accelerate                                        ( Shape, Elt )
import Data.Array.Accelerate.Array.Sugar                            ( EltRepr )
import Data.Array.Accelerate.IO.Data.Array.Unboxed                  as A
import qualified Data.Array.Accelerate                              as A

import Data.Array.Unboxed                                           as U hiding ( array )

import Hedgehog


test_u2a
    :: forall ix sh e. (Ix ix, IArray UArray e, Elt ix, Shape sh, Elt e, Eq e, Show (UArray ix e), Eq (UArray ix e), IxShapeRepr (EltRepr ix) ~ EltRepr sh)
    => Gen sh
    -> Gen (ix,ix)
    -> Gen e
    -> Property
test_u2a _ ix e =
  property $ do
    ua <- forAll (iarray ix e :: Gen (UArray ix e))
    let
        (lo,_)  = bounds ua
        acc     = fromUArray ua :: A.Array sh e
        ua'     = toUArray (Just lo) acc
    --
    U.elems ua === A.toList acc   -- elements convert correctly
    ua         === ua'            -- indices round-trip correctly

test_a2u
    :: forall ix sh e. (Ix ix, IArray UArray e, Elt ix, Shape sh, Elt e, Show (UArray ix e), Eq (UArray ix e), Eq sh, Eq e, IxShapeRepr (EltRepr ix) ~ EltRepr sh)
    => Gen sh
    -> Gen (ix,ix)
    -> Gen e
    -> Property
test_a2u dim _ e =
  property $ do
    sh      <- forAll dim
    arr     <- forAll (array sh e)
    --
    A.toList arr === U.elems (toUArray Nothing arr :: UArray ix e)


test_array_unboxed :: TestTree
test_array_unboxed =
  testGroup "Data.Array.Unboxed"
    [ testGroup "uarray->accelerate"
      [ testGroup "DIM1"
        [ testProperty "Int"    $ test_u2a dim1 ix1 int
        , testProperty "Int8"   $ test_u2a dim1 ix1 i8
        , testProperty "Int16"  $ test_u2a dim1 ix1 i16
        , testProperty "Int32"  $ test_u2a dim1 ix1 i32
        , testProperty "Int64"  $ test_u2a dim1 ix1 i64
        , testProperty "Word"   $ test_u2a dim1 ix1 word
        , testProperty "Word8"  $ test_u2a dim1 ix1 w8
        , testProperty "Word16" $ test_u2a dim1 ix1 w16
        , testProperty "Word32" $ test_u2a dim1 ix1 w32
        , testProperty "Word64" $ test_u2a dim1 ix1 w64
        , testProperty "Float"  $ test_u2a dim1 ix1 f32
        , testProperty "Double" $ test_u2a dim1 ix1 f64
        ]
      , testGroup "DIM2"
        [ testProperty "Int"    $ test_u2a dim2 ix2 int
        , testProperty "Int8"   $ test_u2a dim2 ix2 i8
        , testProperty "Int16"  $ test_u2a dim2 ix2 i16
        , testProperty "Int32"  $ test_u2a dim2 ix2 i32
        , testProperty "Int64"  $ test_u2a dim2 ix2 i64
        , testProperty "Word"   $ test_u2a dim2 ix2 word
        , testProperty "Word8"  $ test_u2a dim2 ix2 w8
        , testProperty "Word16" $ test_u2a dim2 ix2 w16
        , testProperty "Word32" $ test_u2a dim2 ix2 w32
        , testProperty "Word64" $ test_u2a dim2 ix2 w64
        , testProperty "Float"  $ test_u2a dim2 ix2 f32
        , testProperty "Double" $ test_u2a dim2 ix2 f64
        ]
      ]
    , testGroup "accelerate->uarray"
      [ testGroup "DIM1"
        [ testProperty "Int"    $ test_a2u dim1 ix1 int
        , testProperty "Int8"   $ test_a2u dim1 ix1 i8
        , testProperty "Int16"  $ test_a2u dim1 ix1 i16
        , testProperty "Int32"  $ test_a2u dim1 ix1 i32
        , testProperty "Int64"  $ test_a2u dim1 ix1 i64
        , testProperty "Word"   $ test_a2u dim1 ix1 word
        , testProperty "Word8"  $ test_a2u dim1 ix1 w8
        , testProperty "Word16" $ test_a2u dim1 ix1 w16
        , testProperty "Word32" $ test_a2u dim1 ix1 w32
        , testProperty "Word64" $ test_a2u dim1 ix1 w64
        , testProperty "Float"  $ test_a2u dim1 ix1 f32
        , testProperty "Double" $ test_a2u dim1 ix1 f64
        ]
      , testGroup "DIM2"
        [ testProperty "Int"    $ test_a2u dim2 ix2 int
        , testProperty "Int8"   $ test_a2u dim2 ix2 i8
        , testProperty "Int16"  $ test_a2u dim2 ix2 i16
        , testProperty "Int32"  $ test_a2u dim2 ix2 i32
        , testProperty "Int64"  $ test_a2u dim2 ix2 i64
        , testProperty "Word"   $ test_a2u dim2 ix2 word
        , testProperty "Word8"  $ test_a2u dim2 ix2 w8
        , testProperty "Word16" $ test_a2u dim2 ix2 w16
        , testProperty "Word32" $ test_a2u dim2 ix2 w32
        , testProperty "Word64" $ test_a2u dim2 ix2 w64
        , testProperty "Float"  $ test_a2u dim2 ix2 f32
        , testProperty "Double" $ test_a2u dim2 ix2 f64
        ]
      ]
    ]