{-# LANGUAGE FlexibleInstances, FlexibleContexts #-} module Main where import Test.Hspec import Test.QuickCheck import Numeric.LinearAlgebra import qualified Data.Vector.Storable as V import Test.Gen import Test.Utils main = hspec $ do describe "Corr Single" $ do it "implements corr2 correct.0" $ do forAll (pair (squared_real_matrices 3) (squared_real_matrices 4)) $ \(m1, m2) -> ioProperty $ do r <- test_corr2 2 m1 m2 return $ good_corr2 2 m1 m2 `eqShowWhenFail` r it "implements corr2 correct.1" $ do forAll (pair (squared_real_matrices 9) (squared_real_matrices 9)) $ \(m1, m2) -> ioProperty $ do r <- test_corr2 4 m1 m2 return $ good_corr2 4 m1 m2 `eq` r it "implements corr2 correct.2" $ do forAll (pair (squared_real_matrices 5) (squared_real_matrices 28)) $ \(m1, m2) -> ioProperty $ do r <- test_corr2 2 m1 m2 return $ eqShowWhenFail (good_corr2 2 m1 m2) r it "implements corr2 correct.3" $ do forAll (pair (choose (2,30)) (pair small_matrices small_matrices)) $ \(p, (m1, m2)) -> ioProperty $ do r <- test_corr2 p m1 m2 return $ good_corr2 p m1 m2 `eqShowWhenFail` r describe "Corr Many" $ do it "with 2 kernels" $ do forAll (pair (sequence $ replicate 2 $ squared_real_matrices 3) (squared_real_matrices 7)) $ \(m1s, m2) -> ioProperty $ do rs <- test_corr2_arr 2 m1s m2 return $ conjoin $ zipWith (\m r -> good_corr2 2 m m2 `eqShowWhenFail` r) m1s rs it "with 5 kernels" $ do forAll (pair (sequence $ replicate 4 $ squared_real_matrices 15) (squared_real_matrices 88)) $ \(m1s, m2) -> ioProperty $ do rs <- test_corr2_arr 2 m1s m2 ss <- return $ map (\m -> good_corr2 2 m m2) m1s return $ conjoin $ zipWith eq rs ss eqShowWhenFail m1 m2 = whenFail (do let va = flatten m1 let vb = flatten m2 let err x 0 = x err x y = abs ((x - y) / y) let ev = (V.zipWith err va vb) ei = V.maxIndex ev putStrLn $ "Max error ration: " ++ show (ev V.! ei, va V.! ei, vb V.! ei) putStrLn $ show m1 putStrLn $ show m2) (m1 `eq` m2)