packages feed

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)