module Main where
import Approx
import Data.Complex
import Data.Ratio
import Math.HypergeoMatrix
import Test.Tasty (defaultMain, testGroup)
import Test.Tasty.HUnit (assertEqual, testCase)
main :: IO ()
main = defaultMain $
testGroup "Tests"
[ testCase "a 2F1 value" $ do
let alpha = 2 :: Double
h <- hypergeomat 10 2 [1,2] [3] [0.2, 0.5]
assertEqual ""
(approx 8 1.79412894456143)
(approx 8 h),
testCase "a complex 2F1 value" $ do
let c = 2 :+ 3 :: Complex Double
h <- hypergeomat 10 2 [1,2] [c] [0.2 :+ 1, 0.5]
assertEqual ""
(approx' 6 (1.887753 :+ 0.566665))
(approx' 6 h),
testCase "compare with rational" $ do
h1 <- hypergeomat 10 2 [1%2, 3] [3%2, 1%3, 2] [1%5, 1%4, 1%8]
let h1' = fromRational h1
h2 <- hypergeomat 10 (2::Double) [1/2, 3] [3/2, 1/3, 2] [1/5, 1/4, 1/8]
assertEqual ""
(approx 15 h1')
(approx 15 h2),
testCase "0F0 = exponential of trace" $ do
let x = [0.1, 0.2, 0.1 :+ 0.3] :: [Complex Double]
h <- hypergeomat 20 2 [] [] x
assertEqual ""
(approx' 10 (exp(sum x)))
(approx' 10 h),
testCase "1F0 is det(I-X)^(-a)" $ do
let x = [0.4, 0.45, 0.5] :: [Double]
a = 2 :: Double
h <- hypergeomat 35 2 [a] [] x
assertEqual ""
(approx 4 (product(map (1 -) x)**(-a)))
(approx 4 h)
]