packages feed

accelerate-blas-0.1.0.0: test/Level2.hs

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

module Level2 ( 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.Level2

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.Level2.%s" (show backend))
  [ ("gemv.float32",   test_gemv backend r f32)
  , ("gemv.float64",   test_gemv backend r f64)
  , ("gemv.complex32", test_gemv backend r c32)
  , ("gemv.complex64", test_gemv backend r c64)
  ]
  where
    r   = Range.linearFrom 0 1 128
    f32 = Gen.float  (Range.linearFracFrom 0 (-1) 1)
    f64 = Gen.double (Range.linearFracFrom 0 (-1) 1)
    c32 = (:+) <$> f32 <*> f32
    c64 = (:+) <$> f64 <*> f64

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