summaryrefslogtreecommitdiff
path: root/lib/Numeric/LinearAlgebra/Tests
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Numeric/LinearAlgebra/Tests')
-rw-r--r--lib/Numeric/LinearAlgebra/Tests/Instances.hs63
-rw-r--r--lib/Numeric/LinearAlgebra/Tests/Properties.hs70
2 files changed, 127 insertions, 6 deletions
diff --git a/lib/Numeric/LinearAlgebra/Tests/Instances.hs b/lib/Numeric/LinearAlgebra/Tests/Instances.hs
index 583143a..af486c8 100644
--- a/lib/Numeric/LinearAlgebra/Tests/Instances.hs
+++ b/lib/Numeric/LinearAlgebra/Tests/Instances.hs
@@ -14,10 +14,13 @@ Arbitrary instances for vectors, matrices.
14-} 14-}
15 15
16module Numeric.LinearAlgebra.Tests.Instances( 16module Numeric.LinearAlgebra.Tests.Instances(
17 Sq(..), 17 Sq(..), rSq,cSq,
18 Rot(..), 18 Rot(..), rRot,cRot,
19 Her(..), 19 Her(..), rHer,cHer,
20 WC(..) 20 WC(..), rWC,cWC,
21 SqWC(..), rSqWC, cSqWC,
22 PosDef(..), rPosDef, cPosDef,
23 RM,CM, rM,cM
21) where 24) where
22 25
23import Numeric.LinearAlgebra 26import Numeric.LinearAlgebra
@@ -74,7 +77,7 @@ instance (Field a, Arbitrary a) => Arbitrary (Her a) where
74 return $ Her (m' + ctrans m') 77 return $ Her (m' + ctrans m')
75 coarbitrary = undefined 78 coarbitrary = undefined
76 79
77-- a well-conditioned matrix (the singular values are between 1 and 100) 80-- a well-conditioned general matrix (the singular values are between 1 and 100)
78newtype (WC a) = WC (Matrix a) deriving Show 81newtype (WC a) = WC (Matrix a) deriving Show
79instance (Field a, Arbitrary a) => Arbitrary (WC a) where 82instance (Field a, Arbitrary a) => Arbitrary (WC a) where
80 arbitrary = do 83 arbitrary = do
@@ -87,3 +90,53 @@ instance (Field a, Arbitrary a) => Arbitrary (WC a) where
87 let s = diagRect (fromList sv) r c 90 let s = diagRect (fromList sv) r c
88 return $ WC (u <> real s <> trans v) 91 return $ WC (u <> real s <> trans v)
89 coarbitrary = undefined 92 coarbitrary = undefined
93
94-- a well-conditioned square matrix (the singular values are between 1 and 100)
95newtype (SqWC a) = SqWC (Matrix a) deriving Show
96instance (Field a, Arbitrary a) => Arbitrary (SqWC a) where
97 arbitrary = do
98 Sq m <- arbitrary
99 let (u,_,v) = svd m
100 n = rows m
101 sv <- replicateM n (choose (1,100))
102 let s = diag (fromList sv)
103 return $ SqWC (u <> real s <> trans v)
104 coarbitrary = undefined
105
106-- a positive definite square matrix (the eigenvalues are between 0 and 100)
107newtype (PosDef a) = PosDef (Matrix a) deriving Show
108instance (Field a, Arbitrary a) => Arbitrary (PosDef a) where
109 arbitrary = do
110 Her m <- arbitrary
111 let (_,v) = eigSH m
112 n = rows m
113 l <- replicateM n (choose (0,100))
114 let s = diag (fromList l)
115 p = v <> real s <> ctrans v
116 return $ PosDef (0.5 .* p + 0.5 .* ctrans p)
117 coarbitrary = undefined
118
119type RM = Matrix Double
120type CM = Matrix (Complex Double)
121
122rM m = m :: RM
123cM m = m :: CM
124
125rHer (Her m) = m :: RM
126cHer (Her m) = m :: CM
127
128rRot (Rot m) = m :: RM
129cRot (Rot m) = m :: CM
130
131rSq (Sq m) = m :: RM
132cSq (Sq m) = m :: CM
133
134rWC (WC m) = m :: RM
135cWC (WC m) = m :: CM
136
137rSqWC (SqWC m) = m :: RM
138cSqWC (SqWC m) = m :: CM
139
140rPosDef (PosDef m) = m :: RM
141cPosDef (PosDef m) = m :: CM
142
diff --git a/lib/Numeric/LinearAlgebra/Tests/Properties.hs b/lib/Numeric/LinearAlgebra/Tests/Properties.hs
index 351615b..0317469 100644
--- a/lib/Numeric/LinearAlgebra/Tests/Properties.hs
+++ b/lib/Numeric/LinearAlgebra/Tests/Properties.hs
@@ -19,6 +19,7 @@ where
19 19
20import Numeric.LinearAlgebra 20import Numeric.LinearAlgebra
21import Numeric.LinearAlgebra.Tests.Instances(Sq(..),Her(..),Rot(..)) 21import Numeric.LinearAlgebra.Tests.Instances(Sq(..),Her(..),Rot(..))
22import Test.QuickCheck
22 23
23-- relative error 24-- relative error
24dist :: (Normed t, Num t) => t -> t -> Double 25dist :: (Normed t, Num t) => t -> t -> Double
@@ -53,7 +54,74 @@ degenerate m = rank m < min (rows m) (cols m)
53 54
54wellCond m = rcond m > 1/100 55wellCond m = rcond m > 1/100
55 56
57positiveDefinite m = minimum (toList e) > 0
58 where (e,v) = eigSH m
59
60upperTriang m = rows m == 1 || down == z
61 where down = fromList $ concat $ zipWith drop [1..] (toLists (ctrans m))
62 z = constant 0 (dim down)
63
64upperHessenberg m = rows m < 3 || down == z
65 where down = fromList $ concat $ zipWith drop [2..] (toLists (ctrans m))
66 z = constant 0 (dim down)
67
68zeros (r,c) = reshape c (constant 0 (r*c))
69
70ones (r,c) = zeros (r,c) + 1
71
56----------------------------------------------------- 72-----------------------------------------------------
57 73
58luTest m = m |~| p <> l <> u && det p == s 74luProp m = m |~| p <> l <> u && det p == s
59 where (l,u,p,s) = lu m 75 where (l,u,p,s) = lu m
76
77invProp m = m <> inv m |~| ident (rows m)
78
79pinvProp m = m <> p <> m |~| m
80 && p <> m <> p |~| p
81 && hermitian (m<>p)
82 && hermitian (p<>m)
83 where p = pinv m
84
85detProp m = s d1 |~| s d2
86 where d1 = det m
87 d2 = det' m * det q
88 det' m = product $ toList $ takeDiag r
89 (q,r) = qr m
90 s x = fromList [x]
91
92nullspaceProp m = null nl `trivial` (null nl || m <> n |~| zeros (r,c))
93 where nl = nullspacePrec 1 m
94 n = fromColumns nl
95 r = rows m
96 c = cols m - rank m
97
98svdProp1 m = u <> real d <> trans v |~| m
99 && unitary u && unitary v
100 where (u,d,v) = full svd m
101
102svdProp2 m = (m |~| 0) `trivial` ((m |~| 0) || u <> real (diag s) <> trans v |~| m)
103 where (u,s,v) = economy svd m
104
105eigProp m = complex m <> v |~| v <> diag s
106 where (s, v) = eig m
107
108eigSHProp m = m <> v |~| v <> real (diag s)
109 && unitary v
110 && m |~| v <> real (diag s) <> ctrans v
111 where (s, v) = eigSH m
112
113qrProp m = q <> r |~| m && unitary q && upperTriang r
114 where (q,r) = qr m
115
116hessProp m = m |~| p <> h <> ctrans p && unitary p && upperHessenberg h
117 where (p,h) = hess m
118
119schurProp1 m = m |~| u <> s <> ctrans u && unitary u && upperTriang s
120 where (u,s) = schur m
121
122schurProp2 m = m |~| u <> s <> ctrans u && unitary u && upperHessenberg s -- fixme
123 where (u,s) = schur m
124
125cholProp m = m |~| ctrans c <> c && upperTriang c
126 where c = chol m
127 pos = positiveDefinite m