massiv-test-0.1.0: tests/Data/Massiv/Array/Delayed/WindowedSpec.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MonoLocalBinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UndecidableInstances #-}
module Data.Massiv.Array.Delayed.WindowedSpec (spec) where
import Data.Massiv.Array.Delayed
import Data.Massiv.Array.Unsafe
import Data.Massiv.Array as A
import Test.Massiv.Core
data ArrDW ix e = ArrDW (Array D ix e) (Array DW ix e)
instance (Show ix, Index ix, Show (Array D ix e), Show (Array DW ix e)) => Show (ArrDW ix e) where
show (ArrDW d dw) =
"Delayed:\n" ++
show d ++
"\nCorresponding Windowed:\n" ++
--show dw ++
windowInfo
where
windowInfo =
maybe
"\n No Window"
(\Window {windowStart, windowSize} ->
"\n With Window starting index (" ++
show windowStart ++ ") and size (" ++ show windowSize ++ ")") $
getWindow dw
instance (Arbitrary ix, CoArbitrary ix, Index ix, Arbitrary e, Typeable e) =>
Arbitrary (ArrDW ix e) where
arbitrary = do
ArrTiny (arr :: Array D ix e) <- arbitrary
let sz = size arr
ArrDW arr <$>
if totalElem sz == 0
then return (makeArray (getComp arr) sz (unsafeIndex arr))
else do
wix <- flip (liftIndex2 mod) (unSz sz) <$> arbitrary
wsz <- liftIndex (+1) . flip (liftIndex2 mod) (liftIndex2 (-) (unSz sz) wix) <$> arbitrary
return $ makeWindowedArray arr wix (Sz wsz) (unsafeIndex arr)
prop_EqDelayed ::
(Ragged L ix Int, Load DW ix Int) => Proxy ix -> ArrDW ix Int -> Property
prop_EqDelayed _ (ArrDW arrD arrDW) =
computeAs P arrD === computeAs P arrDW
prop_EqDelayedStride ::
(Ragged L ix Int, StrideLoad DW ix Int) => Proxy ix -> Stride ix -> ArrDW ix Int -> Property
prop_EqDelayedStride _ stride (ArrDW arrD arrDW) =
computeWithStrideAs P stride arrD === computeWithStrideAs P stride arrDW
spec :: Spec
spec = do
describe "Equivalency with Delayed" $ do
it "Ix1" $ property $ prop_EqDelayed (Proxy :: Proxy Ix1)
it "Ix2" $ property $ prop_EqDelayed (Proxy :: Proxy Ix2)
it "Ix3" $ property $ prop_EqDelayed (Proxy :: Proxy Ix3)
it "Ix4" $ property $ prop_EqDelayed (Proxy :: Proxy Ix4)
it "Ix5" $ property $ prop_EqDelayed (Proxy :: Proxy Ix5)
it "Ix2T" $ property $ prop_EqDelayed (Proxy :: Proxy Ix2T)
describe "Equivalency with Stride With Delayed" $ do
it "Ix1" $ property $ prop_EqDelayedStride (Proxy :: Proxy Ix1)
it "Ix2" $ property $ prop_EqDelayedStride (Proxy :: Proxy Ix2)
it "Ix3" $ property $ prop_EqDelayedStride (Proxy :: Proxy Ix3)
it "Ix4" $ property $ prop_EqDelayedStride (Proxy :: Proxy Ix4)
it "Ix5" $ property $ prop_EqDelayedStride (Proxy :: Proxy Ix5)
it "Ix2T" $ property $ prop_EqDelayedStride (Proxy :: Proxy Ix2T)