diff options
Diffstat (limited to 'test/Main.hs')
-rw-r--r-- | test/Main.hs | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/test/Main.hs b/test/Main.hs index a04533f..f149ab7 100644 --- a/test/Main.hs +++ b/test/Main.hs @@ -8,35 +8,55 @@ import Test.Tasty.Hedgehog import Test.Tasty.HUnit import qualified Numeric.AD as AD +import qualified Numeric.AD.Double as AD.Double import Numeric.ADDual +import qualified Numeric.ADDual.Array.Internal as ADDA import Numeric.ADDual.Examples -(~==) :: (Foldable t, Fractional a, Ord a, Show (t a)) => t a -> t a -> PropertyT IO () -a ~== b - | length (toList a) == length (toList b) - , and (zipWith close (toList a) (toList b)) - = return () - | otherwise - = diff a (\_ _ -> False) b - where - close x y = abs (x - y) < 1e-5 || - (let m = max (abs x) (abs y) in m > 1e-5 && abs (x - y) / m < 1e-5) +(~=) :: (Fractional a, Ord a) => a -> a -> Bool +x ~= y = abs (x - y) < 1e-5 || (let m = max (abs x) (abs y) in m > 1e-5 && abs (x - y) / m < 1e-5) + +(~==) :: (Fractional a, Ord a, Show a) => a -> a -> PropertyT IO () +x ~== y = diff x (~=) y + +(~=!) :: (Foldable t, Fractional a, Ord a) => t a -> t a -> Bool +a ~=! b = length (toList a) == length (toList b) && and (zipWith (~=) (toList a) (toList b)) + +(~==!) :: (Foldable t, Fractional a, Ord a, Show (t a)) => t a -> t a -> PropertyT IO () +a ~==! b = diff a (~=!) b main :: IO () main = defaultMain $ testGroup "Tests" [testCase "product [1..5]" $ gradient' @Double product [1..5] 1 @?= (120, [120, 60, 40, 30, 24]) + ,testProperty "neural 80" $ property $ do input <- forAll (genNeuralInput 80) let (res, grad) = gradient' fneural input 1 res === fneural input - grad ~== AD.grad fneural input + grad ~==! AD.grad fneural input + AD.grad fneural input === AD.Double.grad fneural input + ,testProperty "neural 150" $ property $ do input <- forAll (genNeuralInput 150) let (res, grad) = gradient' fneural input 1 res === fneural input - grad ~== AD.grad fneural input + grad ~==! AD.grad fneural input + AD.grad fneural input === AD.Double.grad fneural input + + ,testProperty "primal neural == neural_A" $ property $ do + input <- forAll (genNeuralInput_A 100) + let resA = fneural_A input + let res = fneural (cvtFNeuralAtoFNeural input) + resA ~== res + + ,testProperty "neural_A 100" $ property $ do + input <- forAll (genNeuralInput_A 100) + let (resA, gradA) = ADDA.gradient' fneural_A input 1 + let (res, grad) = gradient' fneural (cvtFNeuralAtoFNeural input) 1 + resA ~== res + cvtFNeuralAtoFNeural gradA ~==! grad ] |