summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--THANKS2
-rw-r--r--hmatrix.cabal15
-rw-r--r--lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c62
-rw-r--r--lib/Numeric/LinearAlgebra/Tests.hs9
-rw-r--r--lib/Numeric/LinearAlgebra/Tests/Properties.hs17
5 files changed, 85 insertions, 20 deletions
diff --git a/THANKS b/THANKS
index 98be94e..ac52363 100644
--- a/THANKS
+++ b/THANKS
@@ -92,5 +92,5 @@ module reorganization, monadic mapVectorM, and many other improvements.
92 found a tolerance problem in test "1E5 rots". 92 found a tolerance problem in test "1E5 rots".
93 93
94- Duncan Coutts reported a problem with configure.hs and contributed 94- Duncan Coutts reported a problem with configure.hs and contributed
95 a solution. 95 a solution and a simplified a Setup.lhs.
96 96
diff --git a/hmatrix.cabal b/hmatrix.cabal
index 3048217..51444af 100644
--- a/hmatrix.cabal
+++ b/hmatrix.cabal
@@ -86,10 +86,14 @@ flag finit
86 description: Force FPU initialization in foreing calls 86 description: Force FPU initialization in foreing calls
87 default: False 87 default: False
88 88
89flag fpudebug 89flag debugfpu
90 description: Check FPU stack 90 description: Check FPU stack
91 default: False 91 default: False
92 92
93flag debugnan
94 description: Check NaN
95 default: False
96
93library 97library
94 98
95 Build-Depends: base >= 4 && < 5, 99 Build-Depends: base >= 4 && < 5,
@@ -173,9 +177,12 @@ library
173 if flag(finit) 177 if flag(finit)
174 cpp-options: -DFINIT 178 cpp-options: -DFINIT
175 179
176 if flag(fpudebug) 180 if flag(debugfpu)
177 cc-options: -DFPUDEBUG 181 cc-options: -DFPUDEBUG
178 182
183 if flag(debugnan)
184 cc-options: -DNANDEBUG
185
179 if impl(ghc == 7.0.1) 186 if impl(ghc == 7.0.1)
180 cpp-options: -DNONORMVTEST 187 cpp-options: -DNONORMVTEST
181 188
@@ -209,3 +216,7 @@ source-repository head
209 location: http://patch-tag.com/r/aruiz/hmatrix 216 location: http://patch-tag.com/r/aruiz/hmatrix
210-- location: http://code.haskell.org/hmatrix 217-- location: http://code.haskell.org/hmatrix
211 218
219-- Test-Suite tests
220-- type: exitcode-stdio-1.0
221-- main-is: examples/tests.hs
222
diff --git a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c
index 77a8847..4bf29b7 100644
--- a/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c
+++ b/lib/Numeric/LinearAlgebra/LAPACK/lapack-aux.c
@@ -48,25 +48,55 @@
48void asm_finit() { 48void asm_finit() {
49#ifdef i386 49#ifdef i386
50 50
51 #if FPUDEBUG 51// asm("finit");
52 uint val=0;
53 asm("fstsw"
54 : "=a" (val)
55 : "a" (val)
56 );
57 52
58 val = (val%16384)/2048; // bits 13-11 53 static unsigned char buf[108];
54 asm("FSAVE %0":"=m" (buf));
59 55
60 if (val != 0) { 56 #if FPUDEBUG
61 printf("Warning: FPU Stack: %d\n",val); 57 if(buf[8]!=255 || buf[9]!=255) {
62 asm("finit"); 58 printf("Warning: Nonempty FPU Stack. TAG = %x %x\n",buf[8],buf[9]);
63 } 59 }
64 #else 60 #endif
65 asm("finit"); 61
62 #if NANDEBUG
63 asm("FRSTOR %0":"=m" (buf));
66 #endif 64 #endif
67 65
68#endif 66#endif
69} 67}
68
69//---------------------------------------
70
71#if NANDEBUG
72
73#define CHECKNANR(M,msg) \
74{ int k; \
75for(k=0; k<(M##r * M##c); k++) { \
76 if(M##p[k] != M##p[k]) { \
77 printf(msg); \
78 TRACEMAT(M) \
79 /*exit(1);*/ \
80 } \
81} \
82}
83
84#define CHECKNANC(M,msg) \
85{ int k; \
86for(k=0; k<(M##r * M##c); k++) { \
87 if( M##p[k].r != M##p[k].r \
88 || M##p[k].i != M##p[k].i) { \
89 printf(msg); \
90 /*exit(1);*/ \
91 } \
92} \
93}
94
95#else
96#define CHECKNANC(M,msg)
97#define CHECKNANR(M,msg)
98#endif
99
70//--------------------------------------- 100//---------------------------------------
71 101
72//////////////////// real svd //////////////////////////////////// 102//////////////////// real svd ////////////////////////////////////
@@ -1031,6 +1061,8 @@ void dgemm_(char *, char *, integer *, integer *, integer *,
1031int multiplyR(int ta, int tb, KDMAT(a),KDMAT(b),DMAT(r)) { 1061int multiplyR(int ta, int tb, KDMAT(a),KDMAT(b),DMAT(r)) {
1032 //REQUIRES(ac==br && ar==rr && bc==rc,BAD_SIZE); 1062 //REQUIRES(ac==br && ar==rr && bc==rc,BAD_SIZE);
1033 DEBUGMSG("dgemm_"); 1063 DEBUGMSG("dgemm_");
1064 CHECKNANR(a,"NaN multR Input\n")
1065 CHECKNANR(b,"NaN multR Input\n")
1034 integer m = ta?ac:ar; 1066 integer m = ta?ac:ar;
1035 integer n = tb?br:bc; 1067 integer n = tb?br:bc;
1036 integer k = ta?ar:ac; 1068 integer k = ta?ar:ac;
@@ -1040,6 +1072,7 @@ int multiplyR(int ta, int tb, KDMAT(a),KDMAT(b),DMAT(r)) {
1040 double alpha = 1; 1072 double alpha = 1;
1041 double beta = 0; 1073 double beta = 0;
1042 dgemm_(ta?"T":"N",tb?"T":"N",&m,&n,&k,&alpha,ap,&lda,bp,&ldb,&beta,rp,&ldc); 1074 dgemm_(ta?"T":"N",tb?"T":"N",&m,&n,&k,&alpha,ap,&lda,bp,&ldb,&beta,rp,&ldc);
1075 CHECKNANR(r,"NaN multR Output\n")
1043 OK 1076 OK
1044} 1077}
1045 1078
@@ -1050,6 +1083,8 @@ void zgemm_(char *, char *, integer *, integer *, integer *,
1050int multiplyC(int ta, int tb, KCMAT(a),KCMAT(b),CMAT(r)) { 1083int multiplyC(int ta, int tb, KCMAT(a),KCMAT(b),CMAT(r)) {
1051 //REQUIRES(ac==br && ar==rr && bc==rc,BAD_SIZE); 1084 //REQUIRES(ac==br && ar==rr && bc==rc,BAD_SIZE);
1052 DEBUGMSG("zgemm_"); 1085 DEBUGMSG("zgemm_");
1086 CHECKNANC(a,"NaN multC Input\n")
1087 CHECKNANC(b,"NaN multC Input\n")
1053 integer m = ta?ac:ar; 1088 integer m = ta?ac:ar;
1054 integer n = tb?br:bc; 1089 integer n = tb?br:bc;
1055 integer k = ta?ar:ac; 1090 integer k = ta?ar:ac;
@@ -1062,6 +1097,7 @@ int multiplyC(int ta, int tb, KCMAT(a),KCMAT(b),CMAT(r)) {
1062 ap,&lda, 1097 ap,&lda,
1063 bp,&ldb,&beta, 1098 bp,&ldb,&beta,
1064 rp,&ldc); 1099 rp,&ldc);
1100 CHECKNANC(r,"NaN multC Output\n")
1065 OK 1101 OK
1066} 1102}
1067 1103
diff --git a/lib/Numeric/LinearAlgebra/Tests.hs b/lib/Numeric/LinearAlgebra/Tests.hs
index 5036e3f..e859450 100644
--- a/lib/Numeric/LinearAlgebra/Tests.hs
+++ b/lib/Numeric/LinearAlgebra/Tests.hs
@@ -17,7 +17,7 @@ Some tests.
17module Numeric.LinearAlgebra.Tests( 17module Numeric.LinearAlgebra.Tests(
18-- module Numeric.LinearAlgebra.Tests.Instances, 18-- module Numeric.LinearAlgebra.Tests.Instances,
19-- module Numeric.LinearAlgebra.Tests.Properties, 19-- module Numeric.LinearAlgebra.Tests.Properties,
20 qCheck, runTests, runBenchmarks 20 qCheck, runTests, runBenchmarks, findNaN
21--, runBigTests 21--, runBigTests
22) where 22) where
23 23
@@ -512,6 +512,8 @@ runTests n = do
512 putStrLn "------ chol" 512 putStrLn "------ chol"
513 test (cholProp . rPosDef) 513 test (cholProp . rPosDef)
514 test (cholProp . cPosDef) 514 test (cholProp . cPosDef)
515 test (exactProp . rPosDef)
516 test (exactProp . cPosDef)
515 putStrLn "------ expm" 517 putStrLn "------ expm"
516 test (expmDiagProp . complex. rSqWC) 518 test (expmDiagProp . complex. rSqWC)
517 test (expmDiagProp . cSqWC) 519 test (expmDiagProp . cSqWC)
@@ -594,6 +596,11 @@ makeUnitary v | realPart n > 1 = v / scalar n
594-- runBigTests :: IO () 596-- runBigTests :: IO ()
595-- runBigTests = undefined 597-- runBigTests = undefined
596 598
599-- testcase for nonempty fpu stack
600findNaN :: Int -> Bool
601findNaN n = all (bugProp . eye) (take n $ cycle [1..20])
602 where eye m = ident m :: Matrix ( Double)
603
597-------------------------------------------------------------------------------- 604--------------------------------------------------------------------------------
598 605
599-- | Performance measurements. 606-- | Performance measurements.
diff --git a/lib/Numeric/LinearAlgebra/Tests/Properties.hs b/lib/Numeric/LinearAlgebra/Tests/Properties.hs
index b5f0501..fe13544 100644
--- a/lib/Numeric/LinearAlgebra/Tests/Properties.hs
+++ b/lib/Numeric/LinearAlgebra/Tests/Properties.hs
@@ -1,4 +1,4 @@
1{-# LANGUAGE CPP #-} 1{-# LANGUAGE CPP, FlexibleContexts #-}
2{-# OPTIONS_GHC -fno-warn-unused-imports #-} 2{-# OPTIONS_GHC -fno-warn-unused-imports #-}
3----------------------------------------------------------------------------- 3-----------------------------------------------------------------------------
4{- | 4{- |
@@ -29,13 +29,14 @@ module Numeric.LinearAlgebra.Tests.Properties (
29 pinvProp, 29 pinvProp,
30 detProp, 30 detProp,
31 nullspaceProp, 31 nullspaceProp,
32 bugProp,
32 svdProp1, svdProp1a, svdProp1b, svdProp2, svdProp3, svdProp4, 33 svdProp1, svdProp1a, svdProp1b, svdProp2, svdProp3, svdProp4,
33 svdProp5a, svdProp5b, svdProp6a, svdProp6b, svdProp7, 34 svdProp5a, svdProp5b, svdProp6a, svdProp6b, svdProp7,
34 eigProp, eigSHProp, eigProp2, eigSHProp2, 35 eigProp, eigSHProp, eigProp2, eigSHProp2,
35 qrProp, rqProp, rqProp1, rqProp2, rqProp3, 36 qrProp, rqProp, rqProp1, rqProp2, rqProp3,
36 hessProp, 37 hessProp,
37 schurProp1, schurProp2, 38 schurProp1, schurProp2,
38 cholProp, 39 cholProp, exactProp,
39 expmDiagProp, 40 expmDiagProp,
40 multProp1, multProp2, 41 multProp1, multProp2,
41 subProp, 42 subProp,
@@ -132,6 +133,15 @@ nullspaceProp m = null nl `trivial` (null nl || m <> n |~| zeros (r,c)
132 133
133------------------------------------------------------------------ 134------------------------------------------------------------------
134 135
136-- testcase for nonempty fpu stack
137-- uncommenting unitary' signature eliminates the problem
138bugProp m = m |~| u <> real d <> trans v && unitary' u && unitary' v
139 where (u,d,v) = fullSVD m
140 -- unitary' :: (Num (Vector t), Field t) => Matrix t -> Bool
141 unitary' a = unitary a
142
143------------------------------------------------------------------
144
135-- fullSVD 145-- fullSVD
136svdProp1 m = m |~| u <> real d <> trans v && unitary u && unitary v 146svdProp1 m = m |~| u <> real d <> trans v && unitary u && unitary v
137 where (u,d,v) = fullSVD m 147 where (u,d,v) = fullSVD m
@@ -237,7 +247,8 @@ schurProp2 m = m |~| u <> s <> ctrans u && unitary u && upperHessenberg s -- fix
237 247
238cholProp m = m |~| ctrans c <> c && upperTriang c 248cholProp m = m |~| ctrans c <> c && upperTriang c
239 where c = chol m 249 where c = chol m
240 -- pos = positiveDefinite m 250
251exactProp m = chol m == chol (m+0)
241 252
242expmDiagProp m = expm (logm m) :~ 7 ~: complex m 253expmDiagProp m = expm (logm m) :~ 7 ~: complex m
243 where logm = matFunc log 254 where logm = matFunc log