packages feed

accelerate-arithmetic-0.0: test/Test/Data/Array/Accelerate/Arithmetic/LinearAlgebra.hs

module Test.Data.Array.Accelerate.Arithmetic.LinearAlgebra where

import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as LinAlg
import qualified Data.Array.Accelerate as A

import Data.Array.Accelerate.Arithmetic.LinearAlgebra (Matrix, numCols, )
import Data.Array.Accelerate (Z(Z), (:.)((:.)),)

import Test.Data.Array.Accelerate.Arithmetic.Utility (arbitraryArray, (=!=), )

import qualified Test.QuickCheck as QC

import Data.Word (Word32, )


newtype ArbMatrix a = ArbMatrix (Matrix Z a)

instance (QC.Arbitrary a, A.Elt a) => QC.Arbitrary (ArbMatrix a) where
   arbitrary = do
      nc <- QC.choose (1,100)
      nr <- QC.choose (1,100)
      fmap (ArbMatrix . A.use) $
         arbitraryArray (Z :. nr :. nc) QC.arbitrary


flattenMatrix :: ArbMatrix Word32 -> Bool
flattenMatrix (ArbMatrix m) =
   LinAlg.flattenMatrixReshape m
   =!=
   LinAlg.flattenMatrixBackPermute m

restoreMatrix :: ArbMatrix Word32 -> Bool
restoreMatrix (ArbMatrix m) =
   let v = LinAlg.flattenMatrix m
   in  LinAlg.restoreMatrixReshape (numCols m) v
       =!=
       LinAlg.restoreMatrixBackPermute (numCols m) v

flattenRestoreMatrix :: ArbMatrix Word32 -> Bool
flattenRestoreMatrix (ArbMatrix m) =
   m =!= LinAlg.restoreMatrix (numCols m) (LinAlg.flattenMatrix m)