ADPfusion-0.6.0.0: tests/QuickCheck/Point.hs
{-# Options_GHC -O0 #-}
module QuickCheck.Point where
import Control.Applicative
import Control.Monad
import Data.Strict.Tuple
import Data.Vector.Fusion.Util
import Debug.Trace
--import GHC.TypeNats
import qualified Data.Vector.Fusion.Stream.Monadic as SM
import qualified Data.Vector.Unboxed as VU
import System.IO.Unsafe
import Test.QuickCheck
import Test.QuickCheck.All
import Test.QuickCheck.Monadic
-- #ifdef ADPFUSION_TEST_SUITE_PROPERTIES
import Test.Tasty.TH
import Test.Tasty.QuickCheck
-- #endif
import Data.PrimitiveArray
import ADP.Fusion.PointL
-- * Epsilon cases
prop_I_Epsilon ix@(PointL j) = zs == ls where
zs = (id <<< Epsilon @Global ... stoList) maxPLi ix
ls = [ () | j == 0 ]
prop_O_Epsilon ix@(PointL j) = zs == ls where
zs = (id <<< Epsilon @Global ... stoList) maxPLo ix
ls = [ () | j == maxI ]
prop_I_ZEpsilon ix@(Z:.PointL j) = zs == ls where
zs = (id <<< (M:|Epsilon @Global) ... stoList) (ZZ:..maxPLi) ix
ls = [ Z:.() | j == 0 ]
prop_O_ZEpsilon ix@(Z:.PointL j) = zs == ls where
zs = (id <<< (M:|Epsilon @Global) ... stoList) (ZZ:..maxPLo) ix
ls = [ Z:.() | j == maxI ]
prop_O_ZEpsilonEpsilon ix@(Z:.PointL j:.PointL l) = zs == ls where
zs = (id <<< (M:|Epsilon @Global:|Epsilon @Global) ... stoList) (ZZ:..maxPLo:..maxPLo) ix
ls = [ Z:.():.() | j == maxI, l == maxI ]
-- * Deletion cases
prop_I_ItNC ix@(PointL j) = zs == ls where
zs = ((,,) <<< tSI % Deletion % chr xs ... stoList) maxPLi ix
ls = [ ( unsafeIndex xsP (PointL $ j-1)
, ()
, xs VU.! (j-1)
) | j >= 1, j <= (maxI) ]
prop_O_ItNC ix@(PointL j) = zs == ls where
zs = ((,,) <<< tSO % Deletion % chr xs ... stoList) maxPLo ix
ls = [ ( unsafeIndex xsPo (PointL $ j+1)
, ()
, xs VU.! (j+0)
) | j >= 0, j <= (maxI-1) ]
{-# Noinline prop_O_ItNC #-}
prop_O_ZItNC ix@(Z:.PointL j) = zs == ls where
zs = ((,,) <<< tZ1O % (M:|Deletion) % (M:|chr xs) ... stoList) (ZZ:..maxPLo) ix
ls = [ ( unsafeIndex xsZPo (Z:.PointL (j+1))
, Z:.()
, Z:.xs VU.! (j+0)
) | j >= 0, j <= (maxI-1) ]
prop_O_2dimIt_NC_CN ix@(Z:.PointL j:.PointL l) = zs == ls where
zs = ((,,) <<< tZ2O % (M:|Deletion:|chr xs) % (M:|chr xs:|Deletion) ... stoList) (ZZ:..maxPLo:..maxPLo) ix
ls = [ ( unsafeIndex xsPPo (Z:.PointL (j+1):.PointL (l+1))
, Z:.() :.xs VU.! (l+0)
, Z:.xs VU.! (j+0):.()
) | j>=0, l>=0, j<=(maxI-1), l<=(maxI-1) ]
prop_I_2dimIt_NC_CN ix@(Z:.PointL j:.PointL l) = zs == ls where
zs = ((,,) <<< tZ2I % (M:|Deletion:|chr xs) % (M:|chr xs:|Deletion) ... stoList) (ZZ:..maxPLi:..maxPLi) ix
ls = [ ( unsafeIndex xsPP (Z:.PointL (j-1):.PointL (l-1))
, Z:.() :.xs VU.! (l-1)
, Z:.xs VU.! (j-1):.()
) | j>=1, l>=1, j<=maxI, l<=maxI ]
-- * terminal cases
-- | A single character terminal
--
-- X_j -> c_j || j==1
prop_I_Tt ix@(Z:.PointL j) = zs == ls where
zs = (id <<< (M:|chr xs) ... stoList) (ZZ:..maxPLi) ix
ls = [ (Z:.xs VU.! (j-1)) | 1==j ]
-- |
--
-- X_j -> ε_{j-1} c_j ||| j==1
-- E_{j-1} -> X_{j} c_j
-- E_j -> X_{j+1} c_{j+1} ||| j-1==max ?!
prop_O_Tt ix@(Z:.(PointL j))
| zs == ls = True
| otherwise = traceShow (j,zs,ls) False
where
zs = (id <<< (M:|chr xs) ... stoList) (ZZ:..maxPLo) ix
ls = [ (Z:.xs VU.! j) | j==maxI-1 ]
-- | Two single-character terminals
prop_I_CC ix@(Z:.PointL i) = zs == ls where
zs = ((,) <<< (M:|chr xs) % (M:|chr xs) ... stoList) (ZZ:..maxPLi) ix
ls = [ (Z:.xs VU.! (i-2), Z:.xs VU.! (i-1)) | 2==i ]
-- | Just a table
prop_I_It ix@(PointL j) = zs == ls where
zs = (id <<< tSI ... stoList) maxPLi ix
ls = [ unsafeIndex xsP ix | j>=0, j<=maxI ]
prop_O_It ix@(PointL j) = zs == ls where
zs = (id <<< tSO ... stoList) maxPLo ix
ls = [ unsafeIndex xsPo ix | j>=0, j<=maxI ]
prop_I_ZIt ix@(Z:.PointL j) = zs == ls where
zs = (id <<< tZ1I ... stoList) (ZZ:..maxPLi) ix
ls = [ unsafeIndex xsZP ix | j>=0, j<=maxI ]
prop_I_2dimIt ix@(Z:.PointL i:.PointL j) = zs == ls where
zs = (id <<< tZ2I ... stoList) (ZZ:..maxPLi:..maxPLi) ix
ls = [ unsafeIndex xsPP ix | j>=0, j<=maxI ]
prop_O_ZIt ix@(Z:.PointL j) = zs == ls where
zs = (id <<< tZ1O ... stoList) (ZZ:..maxPLo) ix
ls = [ unsafeIndex xsZPo ix | j>=0, j<=maxI ]
-- | Table, then single terminal
prop_I_ItC ix@(PointL j) = zs == ls where
zs = ((,) <<< tSI % chr xs ... stoList) maxPLi ix
ls = [ ( unsafeIndex xsP (PointL $ j-1)
, xs VU.! (j-1)
) | j>=1, j<=maxI ]
-- | @A^*_j -> A^*_{j+1} c_{j+1)@ !
prop_O_ItC ix@(PointL j)
| zs == ls = True
| otherwise = traceShow (j,zs,ls) False
where
zs = ((,) <<< tSO % chr xs ... stoList) maxPLo ix
ls = [ ( unsafeIndex xsPo (PointL $ j+1)
, xs VU.! (j+0) -- j-1 in inside, here moved one right!
) | j >= 0, j <= (maxI-1) ]
prop_O_ItCC ix@(PointL j) = zs == ls where
zs = ((,,) <<< tSO % chr xs % chr xs ... stoList) maxPLo ix
ls = [ ( unsafeIndex xsPo (PointL $ j+2)
, xs VU.! (j+0)
, xs VU.! (j+1)
) | j >= 0, j <= (maxI-2) ]
prop_O_ItCCC ix@(PointL j) = zs == ls where
zs = ((,,,) <<< tSO % chr xs % chr xs % chr xs ... stoList) maxPLo ix
ls = [ ( unsafeIndex xsPo (PointL $ j+3)
, xs VU.! (j+0)
, xs VU.! (j+1)
, xs VU.! (j+2)
) | j >= 0, j <= (maxI-3) ]
prop_O_ZItCC ix@(Z:.PointL j) = zs == ls where
zs = ((,,) <<< tZ1O % (M:|chr xs) % (M:|chr xs) ... stoList) (ZZ:..maxPLo) ix
ls = [ ( unsafeIndex xsZPo (Z:.PointL (j+2))
, Z:.xs VU.! (j+0)
, Z:.xs VU.! (j+1)
) | j >= 0, j <= (maxI-2) ]
-- | synvar followed by a 2-tape character terminal
prop_I_2dimItCC ix@(Z:.PointL j:.PointL l) = zs == ls where
zs = ((,,) <<< tZ2I % (M:|chr xs:|chr xs) % (M:|chr xs:|chr xs) ... stoList) (ZZ:..maxPLi:..maxPLi) ix
ls = [ ( unsafeIndex xsPP (Z:.PointL (j-2):.PointL (l-2))
, Z:.xs VU.! (j-2):.xs VU.! (l-2)
, Z:.xs VU.! (j-1):.xs VU.! (l-1)
) | j>=2, l>=2, j<=maxI, l<=maxI ]
prop_O_2dimItCC ix@(Z:.PointL j:.PointL l) = zs == ls where
zs = ((,,) <<< tZ2O % (M:|chr xs:|chr xs) % (M:|chr xs:|chr xs) ... stoList) (ZZ:..maxPLo:..maxPLo) ix
ls = [ ( unsafeIndex xsPPo (Z:.PointL (j+2):.PointL (l+2))
, Z:.xs VU.! (j+0):.xs VU.! (l+0)
, Z:.xs VU.! (j+1):.xs VU.! (l+1)
) | j>=0, l>=0, j<=(maxI-2), l<=(maxI-2) ]
-- * 'Strng' tests
-- ** Just the 'Strng' terminal
prop_I_ManyV ix@(PointL j) = zs == ls where
zs = (id <<< manyV xs ... stoList) maxPLi ix
ls = [ (VU.slice 0 j xs) ]
prop_I_SomeV ix@(PointL j)
| zs == ls = True
| otherwise = traceShow (ix,zs,ls) False
where
zs = (id <<< someV xs ... stoList) maxPLi ix
ls = [ (VU.slice 0 j xs) | j>0 ]
prop_2dim_ManyV_ManyV ix@(Z:.PointL i:.PointL j) = zs == ls where
zs = (id <<< (M:|manyV xs:|manyV xs) ... stoList) (ZZ:..maxPLi:..maxPLi) ix
ls = [ (Z:.VU.slice 0 i xs:.VU.slice 0 j xs) ]
prop_2dim_SomeV_SomeV ix@(Z:.PointL i:.PointL j) = zs == ls where
zs = (id <<< (M:|someV xs:|someV xs) ... stoList) (ZZ:..maxPLi:..maxPLi) ix
ls = [ (Z:.VU.slice 0 i xs:.VU.slice 0 j xs) | i > 0 && j > 0 ]
-- ** Together with a syntactic variable.
prop_I_Itbl_ManyV ix@(PointL i) = zs == ls where
zs = ((,) <<< tSI % manyV xs ... stoList) maxPLi ix
ls = [ (unsafeIndex xsP (PointL k), VU.slice k (i-k) xs) | k <- [0..i] ]
prop_I_Itbl_SomeV ix@(PointL i) = zs == ls where
zs = ((,) <<< tSI % someV xs ... stoList) maxPLi ix
ls = [ (unsafeIndex xsP (PointL k), VU.slice k (i-k) xs) | k <- [0..i-1] ]
-- | NOTE Be aware of the needed match between the type-level and value-level
-- @13@s.
prop_I_Itbl_Str ix@(PointL i) = zs == ls where
zs = ((,) <<< tSI % Str @_ @_ @Nothing @13 @Nothing xs ... stoList) maxPLi ix
ls = [ (unsafeIndex xsP (PointL k), VU.slice k (i-k) xs) | k <- [0..i-13] ]
-- | And now for some funny type-level shenanigans.
prop_I_Itbl_StrTyLvl (Positive bound', ix@(PointL i)) = let bound = bound' `mod` 23 in
case (someNatVal bound) of
Nothing → error "zzz"
Just (SomeNat (Proxy ∷ Proxy b)) →
let zs = ((,) <<< tSI % Str @_ @_ @Nothing @b @Nothing xs ... stoList) maxPLi ix
ls = [ (unsafeIndex xsP (PointL k), VU.slice k (i-k) xs) | k <- [0..i-bv] ]
bv = fromIntegral $ natVal (Proxy ∷ Proxy b)
in zs == ls
prop_I_1dim_Itbl_ManyV ix@(Z:.PointL i) = zs == ls where
zs = ((,) <<< tZ1I % (M:|manyV xs) ... stoList) (ZZ:..maxPLi) ix
ls = [ (unsafeIndex xsZP (Z:.PointL k), Z:. VU.slice k (i-k) xs) | k <- [0..i] ]
prop_I_1dim_Itbl_SomeV ix@(Z:.PointL i) = zs == ls where
zs = ((,) <<< tZ1I % (M:|someV xs) ... stoList) (ZZ:..maxPLi) ix
ls = [ (unsafeIndex xsZP (Z:.PointL k), Z:. VU.slice k (i-k) xs) | k <- [0..i-1] ]
prop_I_2dim_Itbl_ManyV_ManyV ix@(Z:.PointL i:.PointL j) = zs == ls where
zs = ((,) <<< tZ2I % (M:|manyV xs:|manyV xs) ... stoList) (ZZ:..maxPLi:..maxPLi) ix
ls = [ (unsafeIndex xsPP (Z:.PointL k:.PointL l), Z:. VU.slice k (i-k) xs :. VU.slice l (j-l) xs) | k <- [0..i], l <- [0..j] ]
prop_I_2dim_Itbl_SomeV_SomeV ix@(Z:.PointL i:.PointL j) = zs == ls where
zs = ((,) <<< tZ2I % (M:|someV xs:|someV xs) ... stoList) (ZZ:..maxPLi:..maxPLi) ix
ls = [ (unsafeIndex xsPP (Z:.PointL k:.PointL l), Z:. VU.slice k (i-k) xs :. VU.slice l (j-l) xs) | k <- [0..i-1], l <- [0..j-1] ]
stoList = unId . SM.toList
--infixl 8 >>>
--(>>>) f xs = \lu ij -> SM.map f . mkStream (build xs) (initialContext ij) lu $ ij
tSI = TW (ITbl @_ @_ @_ @_ @0 @0 EmptyOk xsP) (\ (_ :: LimitType (PointL I)) (_ :: PointL I) -> Id (1::Int))
tSO = TW (ITbl @_ @_ @_ @_ @0 @0 EmptyOk xsPo) (\ (_ :: LimitType (PointL O)) (_ :: PointL O) -> Id (1::Int))
tZ1I = TW (ITbl @_ @_ @_ @_ @0 @0 (Z:.EmptyOk) xsZP) (\ (_::LimitType (Z:.PointL I)) (_::Z:.PointL I) -> Id (1::Int))
tZ1O = TW (ITbl @_ @_ @_ @_ @0 @0 (Z:.EmptyOk) xsZPo) (\ (_::LimitType (Z:.PointL O)) (_::Z:.PointL O) -> Id (1::Int))
tZ2I = TW (ITbl @_ @_ @_ @_ @0 @0 (Z:.EmptyOk:.EmptyOk) xsPP) (\ (_::LimitType (Z:.PointL I:.PointL I)) (_::Z:.PointL I:.PointL I) -> Id (1::Int))
tZ2O = TW (ITbl @_ @_ @_ @_ @0 @0 (Z:.EmptyOk:.EmptyOk) xsPPo) (\ (_::LimitType (Z:.PointL O:.PointL O)) (_::Z:.PointL O:.PointL O) -> Id (1::Int))
xsP :: Unboxed (PointL I) Int
xsP = fromList maxPLi [0 ..]
xsZP :: Unboxed (Z:.PointL I) Int
xsZP = fromList (ZZ:..maxPLi) [0 ..]
xsPo :: Unboxed (PointL O) Int
xsPo = fromList maxPLo [0 ..]
xsZPo :: Unboxed (Z:.PointL O) Int
xsZPo = fromList (ZZ:..maxPLo) [0 ..]
xsPP :: Unboxed (Z:.PointL I:.PointL I) Int
xsPP = fromList (ZZ:..maxPLi:..maxPLi) [0 ..]
xsPPo :: Unboxed (Z:.PointL O:.PointL O) Int
xsPPo = fromList (ZZ:..maxPLo:..maxPLo) [0 ..]
mxsPP = unsafePerformIO $ zzz where
zzz :: IO (MutArr IO (Unboxed (Z:.PointL I:.PointL I) Int))
zzz = fromListM (ZZ:..maxPLi:..maxPLi) [0 ..]
maxI =100
maxPLi :: LimitType (PointL I)
maxPLi = LtPointL maxI
maxPLo :: LimitType (PointL O)
maxPLo = LtPointL maxI
xs = VU.fromList [0 .. maxI - 1 :: Int]
-- * general quickcheck stuff
options = stdArgs {maxSuccess = 1000 } -- 0}
customCheck = quickCheckWithResult options
return []
allProps = $forAllProperties customCheck
-- #ifdef ADPFUSION_TEST_SUITE_PROPERTIES
testgroup_point = $(testGroupGenerator)
-- #endif