summaryrefslogtreecommitdiff
path: root/packages/tests/src/Numeric/GSL/Tests.hs
diff options
context:
space:
mode:
Diffstat (limited to 'packages/tests/src/Numeric/GSL/Tests.hs')
-rw-r--r--packages/tests/src/Numeric/GSL/Tests.hs131
1 files changed, 131 insertions, 0 deletions
diff --git a/packages/tests/src/Numeric/GSL/Tests.hs b/packages/tests/src/Numeric/GSL/Tests.hs
new file mode 100644
index 0000000..9dff6f5
--- /dev/null
+++ b/packages/tests/src/Numeric/GSL/Tests.hs
@@ -0,0 +1,131 @@
1{-# OPTIONS_GHC -fno-warn-unused-imports -fno-warn-incomplete-patterns #-}
2{- |
3Module : Numeric.GLS.Tests
4Copyright : (c) Alberto Ruiz 2014
5License : BSD3
6Maintainer : Alberto Ruiz
7Stability : provisional
8
9Tests for GSL bindings.
10
11-}
12
13module Numeric.GSL.Tests(
14 runTests
15) where
16
17import Control.Monad(when)
18import System.Exit (exitFailure)
19
20import Test.HUnit (runTestTT, failures, Test(..), errors)
21
22import Numeric.LinearAlgebra
23import Numeric.GSL
24import Numeric.LinearAlgebra.Tests (qCheck, utest)
25import Numeric.LinearAlgebra.Tests.Properties ((|~|), (~~))
26
27---------------------------------------------------------------------
28
29fittingTest = utest "levmar" (ok1 && ok2)
30 where
31 xs = map return [0 .. 39]
32 sigma = 0.1
33 ys = map return $ toList $ fromList (map (head . expModel [5,0.1,1]) xs)
34 + scalar sigma * (randomVector 0 Gaussian 40)
35 dats = zip xs (zip ys (repeat sigma))
36 dat = zip xs ys
37
38 expModel [a,lambda,b] [t] = [a * exp (-lambda * t) + b]
39 expModelDer [a,lambda,_b] [t] = [[exp (-lambda * t), -t * a * exp(-lambda*t) , 1]]
40
41 sols = fst $ fitModelScaled 1E-4 1E-4 20 (expModel, expModelDer) dats [1,0,0]
42 sol = fst $ fitModel 1E-4 1E-4 20 (expModel, expModelDer) dat [1,0,0]
43
44 ok1 = and (zipWith f sols [5,0.1,1]) where f (x,d) r = abs (x-r)<2*d
45 ok2 = norm2 (fromList (map fst sols) - fromList sol) < 1E-5
46
47---------------------------------------------------------------------
48
49odeTest = utest "ode" (last (toLists sol) ~~ newsol)
50 where
51 sol = odeSolveV RK8pd 1E-6 1E-6 0 (l2v $ vanderpol 10) (fromList [1,0]) ts
52 ts = linspace 101 (0,100)
53 l2v f = \t -> fromList . f t . toList
54 vanderpol mu _t [x,y] = [y, -x + mu * y * (1-x**2) ]
55 newsol = [-1.758888036617841, 8.364349410519058e-2]
56 -- oldsol = [-1.7588880332411019, 8.364348908711941e-2]
57
58---------------------------------------------------------------------
59
60rootFindingTest = TestList [ utest "root Hybrids" (fst sol1 ~~ [1,1])
61 , utest "root Newton" (rows (snd sol2) == 2)
62 ]
63 where sol1 = root Hybrids 1E-7 30 (rosenbrock 1 10) [-10,-5]
64 sol2 = rootJ Newton 1E-7 30 (rosenbrock 1 10) (jacobian 1 10) [-10,-5]
65 rosenbrock a b [x,y] = [ a*(1-x), b*(y-x**2) ]
66 jacobian a b [x,_y] = [ [-a , 0]
67 , [-2*b*x, b] ]
68
69---------------------------------------------------------------------
70
71minimizationTest = TestList
72 [ utest "minimization conjugatefr" (minim1 f df [5,7] ~~ [1,2])
73 , utest "minimization nmsimplex2" (minim2 f [5,7] `elem` [24,25])
74 ]
75 where f [x,y] = 10*(x-1)**2 + 20*(y-2)**2 + 30
76 df [x,y] = [20*(x-1), 40*(y-2)]
77 minim1 g dg ini = fst $ minimizeD ConjugateFR 1E-3 30 1E-2 1E-4 g dg ini
78 minim2 g ini = rows $ snd $ minimize NMSimplex2 1E-2 30 [1,1] g ini
79
80---------------------------------------------------------------------
81
82derivTest = abs (d (\x-> x * d (\y-> x+y) 1) 1 - 1) < 1E-10
83 where d f x = fst $ derivCentral 0.01 f x
84
85---------------------------------------------------------------------
86
87quad f a b = fst $ integrateQAGS 1E-9 100 f a b
88
89-- A multiple integral can be easily defined using partial application
90quad2 f a b g1 g2 = quad h a b
91 where h x = quad (f x) (g1 x) (g2 x)
92
93volSphere r = 8 * quad2 (\x y -> sqrt (r*r-x*x-y*y))
94 0 r (const 0) (\x->sqrt (r*r-x*x))
95
96---------------------------------------------------------------------
97
98-- besselTest = utest "bessel_J0_e" ( abs (r-expected) < e )
99-- where (r,e) = bessel_J0_e 5.0
100-- expected = -0.17759677131433830434739701
101
102-- exponentialTest = utest "exp_e10_e" ( abs (v*10^e - expected) < 4E-2 )
103-- where (v,e,_err) = exp_e10_e 30.0
104-- expected = exp 30.0
105
106--------------------------------------------------------------------
107
108polyEval cs x = foldr (\c ac->ac*x+c) 0 cs
109
110polySolveProp p = length p <2 || last p == 0|| 1E-8 > maximum (map magnitude $ map (polyEval (map (:+0) p)) (polySolve p))
111
112
113-- | All tests must pass with a maximum dimension of about 20
114-- (some tests may fail with bigger sizes due to precision loss).
115runTests :: Int -- ^ maximum dimension
116 -> IO ()
117runTests n = do
118 let test p = qCheck n p
119 putStrLn "------ fft"
120 test (\v -> ifft (fft v) |~| v)
121 c <- runTestTT $ TestList
122 [ fittingTest
123 , odeTest
124 , rootFindingTest
125 , minimizationTest
126 , utest "deriv" derivTest
127 , utest "integrate" (abs (volSphere 2.5 - 4/3*pi*2.5**3) < 1E-8)
128 , utest "polySolve" (polySolveProp [1,2,3,4])
129 ]
130 when (errors c + failures c > 0) exitFailure
131 return ()