packages feed

accelerate-blas-0.1.0.0: test/Level3.hs

{-# LANGUAGE BangPatterns      #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes        #-}
{-# LANGUAGE TemplateHaskell   #-}

module Level3 ( tests ) where

import Backend
import Similar

import Data.Array.Accelerate                                        as A
import Data.Array.Accelerate.Data.Complex                           as A
import Data.Array.Accelerate.Numeric.LinearAlgebra.BLAS.Level3

import Hedgehog
import Hedgehog.Gen.Array
import qualified Hedgehog.Gen                                       as Gen
import qualified Hedgehog.Range                                     as Range

import Data.String
import Text.Printf
import Prelude                                                      as P


tests :: Backend -> IO Bool
tests backend
  = checkParallel
  $ Group (fromString $ printf "Tests.Level3.%s" (show backend))
  [ ("gemm.float32",   test_gemm backend r f32)
  , ("gemm.float64",   test_gemm backend r f64)
  , ("gemm.complex32", test_gemm backend r c32)
  , ("gemm.complex64", test_gemm backend r c64)
  ]
  where
    r   = Range.linearFrom 0 1 64
    f32 = Gen.float  (Range.linearFracFrom 0 (-1) 1)
    f64 = Gen.double (Range.linearFracFrom 0 (-1) 1)
    c32 = (:+) <$> f32 <*> f32
    c64 = (:+) <$> f64 <*> f64

test_gemm
    :: (Numeric e, Similar e)
    => Backend
    -> Range Int
    -> Gen e
    -> Property
test_gemm backend r g =
  property $ do
    alpha <- forAll g
    m     <- forAll (Gen.int r)
    n     <- forAll (Gen.int r)
    k     <- forAll (Gen.int r)
    opA   <- forAll (Gen.element [N,T,H])
    opB   <- forAll (Gen.element [N,T,H])
    matA  <- forAll $ case opA of
                        N -> genArray (Z :. m :. k) g
                        _ -> genArray (Z :. k :. m) g
    matB  <- forAll $ case opB of
                        N -> genArray (Z :. k :. n) g
                        _ -> genArray (Z :. n :. k) g
    --
    let t = gemm (constant alpha) opA (use matA) opB (use matB)
    --
    run Interpreter t ~~~ run backend t