accelerate-arithmetic-0.0: test/Test/Data/Array/Accelerate/Arithmetic/Sparse.hs
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE TypeOperators #-}
module Test.Data.Array.Accelerate.Arithmetic.Sparse where
import Test.Data.Array.Accelerate.Arithmetic.Utility (arbitraryArray, (=!=), )
import qualified Data.Array.Accelerate.Arithmetic.Sparse as Sparse
import qualified Data.Array.Accelerate.Arithmetic.LinearAlgebra as LinAlg
import qualified Data.Array.Accelerate as A
import Data.Array.Accelerate (Z(Z), (:.)((:.)))
import qualified Test.QuickCheck as QC
import Control.Monad (liftM2, )
import Data.Word (Word32, )
data
CRVTriple a =
CRVTriple
(Sparse.ColumnMatrix Z a)
(Sparse.RowMatrix Z a)
(LinAlg.Vector Z a)
instance (QC.Arbitrary a, A.Elt a) => QC.Arbitrary (CRVTriple a) where
arbitrary = do
k <- QC.choose (1,200)
nc <- QC.choose (1,100)
nr <- QC.choose (1,100)
cc <- QC.choose (1,10)
cr <- QC.choose (1,10)
mc <-
arbitraryArray (Z :. cc :. k) $
liftM2 (,) (QC.choose (0,nc-1)) QC.arbitrary
mr <-
arbitraryArray (Z :. k :. cr) $
liftM2 (,) (QC.choose (0,nr-1)) QC.arbitrary
v <- arbitraryArray (Z :. nr) QC.arbitrary
return $
CRVTriple
(Sparse.ColumnMatrix (A.lift nc) (A.use mc))
(Sparse.RowMatrix (A.lift nr) (A.use mr))
(A.use v)
multiplication :: CRVTriple Word32 -> Bool
multiplication (CRVTriple mc mr v) =
LinAlg.multiplyMatrixVector (Sparse.multiplyMatrixMatrix mc mr) v
=!=
Sparse.multiplyColumnMatrixVector mc (Sparse.multiplyRowMatrixVector mr v)