packages feed

accelerate-examples-0.15.0.0: examples/nofib/Test/Issues/Issue114.hs

module Test.Issues.Issue114 (test_issue114)
  where

import Config
import ParseArgs
import Test.Base
import Test.Framework
import Test.Framework.Providers.HUnit

import Prelude                                  as P
import Data.Array.Accelerate                    as A
import Data.Label


test_issue114 :: Config -> Test
test_issue114 conf = testGroup "114"
  [ testCase "A" (assertEqual ref1 $ run backend test1)
  , testCase "B" (assertEqual ref2 $ run backend test2)
  ]
  where
    backend     = get configBackend conf


type EFloat = (Float, Float) -- Represents a real number with a value and error

fromFloat :: Float -> EFloat
fromFloat x = (x, 0)

-- toFloat :: EFloat -> Float
-- toFloat (val, err) = val + err

add :: Exp EFloat -> Exp EFloat -> Exp EFloat
add = lift2 f
    where
        f :: (Exp Float, Exp Float) -> (Exp Float, Exp Float) -> (Exp Float, Exp Float)
        f (aval, aerr) (bval, berr) = (val, err)
            where
                val = aval + bval
                err = aval - (val - det) + (bval - det) + aerr + berr
                det = val - aval

esum :: Acc (Vector EFloat) -> Acc (Scalar EFloat)
esum  x = A.fold1  add x

epsum :: Acc (Vector EFloat) -> Acc (Vector EFloat)
epsum x = A.scanl1 add x

xs :: Acc (Vector EFloat)
xs = use $ fromFunction (Z :. 100) (\_ -> fromFloat 1.01)


ref1 :: Scalar EFloat
ref1 = fromList Z [(101,0)]

test1 :: Acc (Scalar EFloat)
test1 = esum xs


ref2 :: Vector EFloat
ref2 = fromList (Z :. 100) [ (1.01 * i, 0) | i <- [1..]]

test2 :: Acc (Vector EFloat)
test2 = epsum xs