summaryrefslogtreecommitdiff
path: root/lib/Numeric/LinearAlgebra
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Numeric/LinearAlgebra')
-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
3 files changed, 71 insertions, 17 deletions
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