{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators       #-}
-- |
-- Module      : Data.Array.Accelerate.Test.NoFib.Base
-- Copyright   : [2009..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.Test.NoFib.Base
  where

import Data.Array.Accelerate.Smart
import Data.Array.Accelerate.Sugar.Array
import Data.Array.Accelerate.Sugar.Elt
import Data.Array.Accelerate.Sugar.Shape
import Data.Array.Accelerate.Trafo.Sharing
import Data.Array.Accelerate.Type
import Data.Primitive.Vec

import Control.Monad
import Data.Primitive.Types

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


type Run  = forall a. Arrays a => Acc a -> a
type RunN = forall f. Afunction f => f -> AfunctionR f

dim0 :: Gen DIM0
dim0 :: Gen DIM0
dim0 = DIM0 -> Gen DIM0
forall (m :: * -> *) a. Monad m => a -> m a
return DIM0
Z

dim1 :: Gen DIM1
dim1 :: Gen DIM1
dim1 = (DIM0
Z DIM0 -> Int -> DIM1
forall tail head. tail -> head -> tail :. head
:.) (Int -> DIM1) -> GenT Identity Int -> Gen DIM1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> GenT Identity Int
forall (m :: * -> *). MonadGen m => Range Int -> m Int
Gen.int (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
1024)

dim2 :: Gen DIM2
dim2 :: Gen DIM2
dim2 = do
  Int
x <- Range Int -> GenT Identity Int
forall (m :: * -> *). MonadGen m => Range Int -> m Int
Gen.int (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
128)
  Int
y <- Range Int -> GenT Identity Int
forall (m :: * -> *). MonadGen m => Range Int -> m Int
Gen.int (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
48)
  DIM2 -> Gen DIM2
forall (m :: * -> *) a. Monad m => a -> m a
return (DIM0
Z DIM0 -> Int -> DIM1
forall tail head. tail -> head -> tail :. head
:. Int
y DIM1 -> Int -> DIM2
forall tail head. tail -> head -> tail :. head
:. Int
x)

dim3 :: Gen DIM3
dim3 :: Gen DIM3
dim3 = do
  Int
x <- Range Int -> GenT Identity Int
forall (m :: * -> *). MonadGen m => Range Int -> m Int
Gen.int (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
64)
  Int
y <- Range Int -> GenT Identity Int
forall (m :: * -> *). MonadGen m => Range Int -> m Int
Gen.int (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
32)
  Int
z <- Range Int -> GenT Identity Int
forall (m :: * -> *). MonadGen m => Range Int -> m Int
Gen.int (Int -> Int -> Range Int
forall a. Integral a => a -> a -> Range a
Range.linear Int
0 Int
16)
  DIM3 -> Gen DIM3
forall (m :: * -> *) a. Monad m => a -> m a
return (DIM0
Z DIM0 -> Int -> DIM1
forall tail head. tail -> head -> tail :. head
:. Int
z DIM1 -> Int -> DIM2
forall tail head. tail -> head -> tail :. head
:. Int
y DIM2 -> Int -> DIM3
forall tail head. tail -> head -> tail :. head
:. Int
x)

array :: (Shape sh, Elt e) => sh -> Gen e -> Gen (Array sh e)
array :: sh -> Gen e -> Gen (Array sh e)
array sh
sh Gen e
gen = sh -> [e] -> Array sh e
forall sh e. (Shape sh, Elt e) => sh -> [e] -> Array sh e
fromList sh
sh ([e] -> Array sh e) -> GenT Identity [e] -> Gen (Array sh e)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> Gen e -> GenT Identity [e]
forall (m :: * -> *) a. MonadGen m => Range Int -> m a -> m [a]
Gen.list (Int -> Range Int
forall a. a -> Range a
Range.singleton (sh -> Int
forall sh. Shape sh => sh -> Int
size sh
sh)) Gen e
gen

int :: Gen Int
int :: GenT Identity Int
int = Range Int -> GenT Identity Int
forall (m :: * -> *). MonadGen m => Range Int -> m Int
Gen.int Range Int
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

i8 :: Gen Int8
i8 :: Gen Int8
i8 = Range Int8 -> Gen Int8
forall (m :: * -> *). MonadGen m => Range Int8 -> m Int8
Gen.int8 Range Int8
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

i16 :: Gen Int16
i16 :: Gen Int16
i16 = Range Int16 -> Gen Int16
forall (m :: * -> *). MonadGen m => Range Int16 -> m Int16
Gen.int16 Range Int16
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

i32 :: Gen Int32
i32 :: Gen Int32
i32 = Range Int32 -> Gen Int32
forall (m :: * -> *). MonadGen m => Range Int32 -> m Int32
Gen.int32 Range Int32
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

i64 :: Gen Int64
i64 :: Gen Int64
i64 = Range Int64 -> Gen Int64
forall (m :: * -> *). MonadGen m => Range Int64 -> m Int64
Gen.int64 Range Int64
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

word :: Gen Word
word :: Gen Word
word = Range Word -> Gen Word
forall (m :: * -> *). MonadGen m => Range Word -> m Word
Gen.word Range Word
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

w8 :: Gen Word8
w8 :: Gen Word8
w8 = Range Word8 -> Gen Word8
forall (m :: * -> *). MonadGen m => Range Word8 -> m Word8
Gen.word8 Range Word8
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

w16 :: Gen Word16
w16 :: Gen Word16
w16 = Range Word16 -> Gen Word16
forall (m :: * -> *). MonadGen m => Range Word16 -> m Word16
Gen.word16 Range Word16
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

w32 :: Gen Word32
w32 :: Gen Word32
w32 = Range Word32 -> Gen Word32
forall (m :: * -> *). MonadGen m => Range Word32 -> m Word32
Gen.word32 Range Word32
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

w64 :: Gen Word64
w64 :: Gen Word64
w64 = Range Word64 -> Gen Word64
forall (m :: * -> *). MonadGen m => Range Word64 -> m Word64
Gen.word64 Range Word64
forall a. (Bounded a, Integral a) => Range a
Range.linearBounded

f16 :: Gen Half
f16 :: Gen Half
f16 = Range Half -> Gen Half
forall (m :: * -> *) a. (MonadGen m, RealFloat a) => Range a -> m a
Gen.realFloat (Half -> Half -> Half -> Range Half
forall a. (Fractional a, Ord a) => a -> a -> a -> Range a
Range.linearFracFrom Half
0 (-Half
forall a. RealFloat a => a
log_flt_max) Half
forall a. RealFloat a => a
log_flt_max)

f32 :: Gen Float
f32 :: Gen Float
f32 = Range Float -> Gen Float
forall (m :: * -> *). MonadGen m => Range Float -> m Float
Gen.float (Float -> Float -> Float -> Range Float
forall a. (Fractional a, Ord a) => a -> a -> a -> Range a
Range.linearFracFrom Float
0 (-Float
forall a. RealFloat a => a
log_flt_max) Float
forall a. RealFloat a => a
log_flt_max)

f64 :: Gen Double
f64 :: Gen Double
f64 = Range Double -> Gen Double
forall (m :: * -> *). MonadGen m => Range Double -> m Double
Gen.double (Double -> Double -> Double -> Range Double
forall a. (Fractional a, Ord a) => a -> a -> a -> Range a
Range.linearFracFrom Double
0 (-Double
forall a. RealFloat a => a
log_flt_max) Double
forall a. RealFloat a => a
log_flt_max)

v2 :: Prim a => Gen a -> Gen (Vec2 a)
v2 :: Gen a -> Gen (Vec2 a)
v2 Gen a
a = a -> a -> Vec2 a
forall a. Prim a => a -> a -> Vec2 a
Vec2 (a -> a -> Vec2 a) -> Gen a -> GenT Identity (a -> Vec2 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
a GenT Identity (a -> Vec2 a) -> Gen a -> Gen (Vec2 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a

v3 :: Prim a => Gen a -> Gen (Vec3 a)
v3 :: Gen a -> Gen (Vec3 a)
v3 Gen a
a = a -> a -> a -> Vec3 a
forall a. Prim a => a -> a -> a -> Vec3 a
Vec3 (a -> a -> a -> Vec3 a)
-> Gen a -> GenT Identity (a -> a -> Vec3 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
a GenT Identity (a -> a -> Vec3 a)
-> Gen a -> GenT Identity (a -> Vec3 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> Vec3 a) -> Gen a -> Gen (Vec3 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a

v4 :: Prim a => Gen a -> Gen (Vec4 a)
v4 :: Gen a -> Gen (Vec4 a)
v4 Gen a
a = a -> a -> a -> a -> Vec4 a
forall a. Prim a => a -> a -> a -> a -> Vec4 a
Vec4 (a -> a -> a -> a -> Vec4 a)
-> Gen a -> GenT Identity (a -> a -> a -> Vec4 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
a GenT Identity (a -> a -> a -> Vec4 a)
-> Gen a -> GenT Identity (a -> a -> Vec4 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> Vec4 a)
-> Gen a -> GenT Identity (a -> Vec4 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> Vec4 a) -> Gen a -> Gen (Vec4 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a

v8 :: Prim a => Gen a -> Gen (Vec8 a)
v8 :: Gen a -> Gen (Vec8 a)
v8 Gen a
a = a -> a -> a -> a -> a -> a -> a -> a -> Vec8 a
forall a. Prim a => a -> a -> a -> a -> a -> a -> a -> a -> Vec8 a
Vec8 (a -> a -> a -> a -> a -> a -> a -> a -> Vec8 a)
-> Gen a
-> GenT Identity (a -> a -> a -> a -> a -> a -> a -> Vec8 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
a GenT Identity (a -> a -> a -> a -> a -> a -> a -> Vec8 a)
-> Gen a -> GenT Identity (a -> a -> a -> a -> a -> a -> Vec8 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> a -> a -> a -> Vec8 a)
-> Gen a -> GenT Identity (a -> a -> a -> a -> a -> Vec8 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> a -> a -> Vec8 a)
-> Gen a -> GenT Identity (a -> a -> a -> a -> Vec8 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> a -> Vec8 a)
-> Gen a -> GenT Identity (a -> a -> a -> Vec8 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> Vec8 a)
-> Gen a -> GenT Identity (a -> a -> Vec8 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> Vec8 a)
-> Gen a -> GenT Identity (a -> Vec8 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> Vec8 a) -> Gen a -> Gen (Vec8 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a

v16 :: Prim a => Gen a -> Gen (Vec16 a)
v16 :: Gen a -> Gen (Vec16 a)
v16 Gen a
a = a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> Vec16 a
forall a.
Prim a =>
a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> a
-> Vec16 a
Vec16 (a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> a
 -> Vec16 a)
-> Gen a
-> GenT
     Identity
     (a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> Vec16 a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen a
a GenT
  Identity
  (a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> Vec16 a)
-> Gen a
-> GenT
     Identity
     (a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT
  Identity
  (a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> Vec16 a)
-> Gen a
-> GenT
     Identity
     (a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> a
      -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT
  Identity
  (a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> a
   -> Vec16 a)
-> Gen a
-> GenT
     Identity
     (a
      -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT
  Identity
  (a
   -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
-> Gen a
-> GenT
     Identity
     (a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT
  Identity
  (a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
-> Gen a
-> GenT
     Identity
     (a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT
  Identity
  (a -> a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
-> Gen a
-> GenT
     Identity (a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT
  Identity (a -> a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
-> Gen a
-> GenT Identity (a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a
              GenT Identity (a -> a -> a -> a -> a -> a -> a -> a -> Vec16 a)
-> Gen a
-> GenT Identity (a -> a -> a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> a -> a -> a -> a -> Vec16 a)
-> Gen a -> GenT Identity (a -> a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> a -> a -> a -> Vec16 a)
-> Gen a -> GenT Identity (a -> a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> a -> a -> Vec16 a)
-> Gen a -> GenT Identity (a -> a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> a -> Vec16 a)
-> Gen a -> GenT Identity (a -> a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> a -> Vec16 a)
-> Gen a -> GenT Identity (a -> a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> a -> Vec16 a)
-> Gen a -> GenT Identity (a -> Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a GenT Identity (a -> Vec16 a) -> Gen a -> Gen (Vec16 a)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen a
a

log_flt_max :: RealFloat a => a
log_flt_max :: a
log_flt_max = a -> a
forall a. Floating a => a -> a
log a
forall a. RealFloat a => a
flt_max

flt_max :: RealFloat a => a
flt_max :: a
flt_max = a
x
  where
    n :: Int
n     = a -> Int
forall a. RealFloat a => a -> Int
floatDigits a
x
    b :: Integer
b     = a -> Integer
forall a. RealFloat a => a -> Integer
floatRadix a
x
    (Int
_,Int
u) = a -> (Int, Int)
forall a. RealFloat a => a -> (Int, Int)
floatRange a
x
    x :: a
x     = Integer -> Int -> a
forall a. RealFloat a => Integer -> Int -> a
encodeFloat (Integer
bInteger -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^Int
n Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
1) (Int
u Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n)

flt_min :: RealFloat a => a
flt_min :: a
flt_min = a
x
  where
    n :: Int
n     = a -> Int
forall a. RealFloat a => a -> Int
floatDigits a
x
    b :: Integer
b     = a -> Integer
forall a. RealFloat a => a -> Integer
floatRadix a
x
    (Int
l,Int
_) = a -> (Int, Int)
forall a. RealFloat a => a -> (Int, Int)
floatRange a
x
    x :: a
x     = Integer -> Int -> a
forall a. RealFloat a => Integer -> Int -> a
encodeFloat (Integer
bInteger -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^Int
n Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
- Integer
1) (Int
l Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)

except :: Gen e -> (e -> Bool) -> Gen e
except :: Gen e -> (e -> Bool) -> Gen e
except Gen e
gen e -> Bool
f  = do
  e
v <- Gen e
gen
  Bool -> GenT Identity () -> GenT Identity ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (e -> Bool
f e
v) GenT Identity ()
forall (m :: * -> *) a. MonadGen m => m a
Gen.discard
  e -> Gen e
forall (m :: * -> *) a. Monad m => a -> m a
return e
v

splitEvery :: Int -> [a] -> [[a]]
splitEvery :: Int -> [a] -> [[a]]
splitEvery Int
_ [] = [[a]] -> [[a]]
forall a. [a] -> [a]
cycle [[]]
splitEvery Int
n [a]
xs =
  let ([a]
h,[a]
t) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
xs
  in  [a]
h [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: Int -> [a] -> [[a]]
forall a. Int -> [a] -> [[a]]
splitEvery Int
n [a]
t

splitPlaces :: [Int] -> [a] -> [[a]]
splitPlaces :: [Int] -> [a] -> [[a]]
splitPlaces []     [a]
_  = []
splitPlaces (Int
i:[Int]
is) [a]
vs =
  let ([a]
h,[a]
t) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
i [a]
vs
  in  [a]
h [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [Int] -> [a] -> [[a]]
forall a. [Int] -> [a] -> [[a]]
splitPlaces [Int]
is [a]
t