{-# LANGUAGE CPP #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wall #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Main where
import Data.Functor.Rep
import GHC.Exts (IsList(..))
import NumHask.Array
import NumHask.Hedgehog
import NumHask.Prelude as P
import Numeric.Dimensions as D
import Test.DocTest
import qualified Hedgehog as H
import qualified NumHask.Hedgehog.Prop.Space as I
import qualified Prelude
genAIntegral :: forall a m r. (H.MonadGen m, Dimensions r, Additive a, Bounded a, ToInteger a, FromInteger a) => m (Array [] (r :: [Nat]) a)
genAIntegral = fromList <$> replicateM (fromIntegral n) integral_
where
n = totalDim $ dims @Nat @r
genARational :: forall a m r. (H.MonadGen m, Dimensions r, Field a, Subtractive a, ToRatio a, FromRatio a) => m (Array [] (r :: [Nat]) a)
genARational = fromList <$> replicateM (fromIntegral n) negUniform
where
n = totalDim $ dims @Nat @r
main :: IO ()
main = do
putStrLn ("Array DocTest turned on" :: Text)
doctest ["src/NumHask/Array.hs"]
putStrLn ("Example DocTest turned on" :: Text)
doctest ["src/NumHask/Array/Example.hs"]
bVInt <- assertProps "Vector Int 6" (Prelude.fromInteger 100)
(genAIntegral :: H.Gen (Vector [] 6 Int)) integralProps'
bMInt <- assertProps "Matrix [] '[3,4] Int" (Prelude.fromInteger 100)
(genAIntegral :: H.Gen (Array [] '[3,4] Int)) integralProps'
-- bVFloat <- assertProps "Vector Float 6" (Prelude.fromInteger 100)
-- (genARational :: H.Gen (Vector [] 6 Float)) (fieldProps' acc)
bMFloat <- assertProps "Array [] '[3,4] Float" (Prelude.fromInteger 100)
(genARational :: H.Gen (Array [] '[3,4] Float)) (fieldProps' acc)
unless (bVInt && bMInt && bMFloat)
exitFailure
where
acc = tabulate (const 1.0)
integralProps'
:: forall a.
( Show a
, Eq a
, Distributive a
, Subtractive a
, Signed a
)
=> H.Gen a
-> [(H.PropertyName, H.Property)]
integralProps' g = mconcat $
(\x -> x g) <$>
[ isAdditive
, isSubtractive
, isMultiplicative
, \x -> [("distributive", isDistributive zero (+) (*) x)]
, \x -> [("signed", NumHask.Hedgehog.isSigned x)]
]
-- | field laws
fieldProps'
:: forall a.
( Show a
, Epsilon a
, Lattice a
, LowerBoundedField a
, BoundedJoinSemiLattice a
, BoundedMeetSemiLattice a
, Signed a
)
=> a
-> H.Gen a
-> [(H.PropertyName, H.Property)]
fieldProps' acc g = mconcat $
(\x -> x g) <$>
[ I.isAdditive acc
, \x -> [("subtractive", I.isSubtractive acc x)]
, I.isMultiplicative acc
, \x -> [("distributive", I.isDistributiveTimesPlus one x)]
, \x -> [("divisive", I.isDivisive one x)]
, \x -> [("signed", I.isSigned one x)]
]