summaryrefslogtreecommitdiff
path: root/packages/base/src/Internal/Modular.hs
diff options
context:
space:
mode:
Diffstat (limited to 'packages/base/src/Internal/Modular.hs')
-rw-r--r--packages/base/src/Internal/Modular.hs46
1 files changed, 35 insertions, 11 deletions
diff --git a/packages/base/src/Internal/Modular.hs b/packages/base/src/Internal/Modular.hs
index d158111..1cae1ac 100644
--- a/packages/base/src/Internal/Modular.hs
+++ b/packages/base/src/Internal/Modular.hs
@@ -34,7 +34,9 @@ import Internal.Container
34import Internal.Vectorized (prodI,sumI,prodL,sumL) 34import Internal.Vectorized (prodI,sumI,prodL,sumL)
35import Internal.LAPACK (multiplyI, multiplyL) 35import Internal.LAPACK (multiplyI, multiplyL)
36import Internal.Algorithms(luFact) 36import Internal.Algorithms(luFact)
37import Internal.Util(Normed(..),Indexable(..),gaussElim, gaussElim_1, gaussElim_2,luST, magnit) 37import Internal.Util(Normed(..),Indexable(..),
38 gaussElim, gaussElim_1, gaussElim_2,
39 luST, luSolve', luPacked', magnit)
38import Internal.ST(mutable) 40import Internal.ST(mutable)
39import GHC.TypeLits 41import GHC.TypeLits
40import Data.Proxy(Proxy) 42import Data.Proxy(Proxy)
@@ -350,7 +352,11 @@ test = (ok, info)
350 lg = (3><3) (repeat (3*10^(9::Int))) :: Matrix Z 352 lg = (3><3) (repeat (3*10^(9::Int))) :: Matrix Z
351 lgm = fromZ lg :: Matrix (Mod 10000000000 Z) 353 lgm = fromZ lg :: Matrix (Mod 10000000000 Z)
352 354
353 gen n = diagRect 1 (konst 5 n) n n :: Numeric t => Matrix t 355 gen n = diagRect 1 (konst 5 n) n n :: Numeric t => Matrix t
356
357 rgen n = gen n :: Matrix R
358 cgen n = complex (rgen n) + fliprl (complex (rgen n)) * scalar (0:+1) :: Matrix C
359 sgen n = single (cgen n)
354 360
355 checkGen x = norm_Inf $ flatten $ invg x <> x - ident (rows x) 361 checkGen x = norm_Inf $ flatten $ invg x <> x - ident (rows x)
356 362
@@ -360,6 +366,11 @@ test = (ok, info)
360 where 366 where
361 (l,u,p,_ :: Int) = luFact $ mutable (luST okf) t 367 (l,u,p,_ :: Int) = luFact $ mutable (luST okf) t
362 368
369 checkSolve aa = norm_Inf $ flatten (aa <> x - bb)
370 where
371 bb = flipud aa
372 x = luSolve' (luPacked' aa) bb
373
363 info = do 374 info = do
364 print v 375 print v
365 print m 376 print m
@@ -383,9 +394,9 @@ test = (ok, info)
383 print $ lgm <> lgm 394 print $ lgm <> lgm
384 395
385 print (checkGen (gen 5 :: Matrix R)) 396 print (checkGen (gen 5 :: Matrix R))
386 print (checkGen (gen 5 :: Matrix C))
387 print (checkGen (gen 5 :: Matrix Float)) 397 print (checkGen (gen 5 :: Matrix Float))
388 print (checkGen (gen 5 :: Matrix (Complex Float))) 398 print (checkGen (cgen 5 :: Matrix C))
399 print (checkGen (sgen 5 :: Matrix (Complex Float)))
389 print (invg (gen 5) :: Matrix (Mod 7 I)) 400 print (invg (gen 5) :: Matrix (Mod 7 I))
390 print (invg (gen 5) :: Matrix (Mod 7 Z)) 401 print (invg (gen 5) :: Matrix (Mod 7 Z))
391 402
@@ -394,11 +405,18 @@ test = (ok, info)
394 405
395 print $ checkLU (magnit 0) (gen 5 :: Matrix R) 406 print $ checkLU (magnit 0) (gen 5 :: Matrix R)
396 print $ checkLU (magnit 0) (gen 5 :: Matrix Float) 407 print $ checkLU (magnit 0) (gen 5 :: Matrix Float)
397 print $ checkLU (magnit 0) (gen 5 :: Matrix C) 408 print $ checkLU (magnit 0) (cgen 5 :: Matrix C)
398 print $ checkLU (magnit 0) (gen 5 :: Matrix (Complex Float)) 409 print $ checkLU (magnit 0) (sgen 5 :: Matrix (Complex Float))
399 print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I)) 410 print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I))
400 print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 Z)) 411 print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 Z))
401 412
413 print $ checkSolve (gen 5 :: Matrix R)
414 print $ checkSolve (gen 5 :: Matrix Float)
415 print $ checkSolve (cgen 5 :: Matrix C)
416 print $ checkSolve (sgen 5 :: Matrix (Complex Float))
417 print $ checkSolve (gen 5 :: Matrix (Mod 7 I))
418 print $ checkSolve (gen 5 :: Matrix (Mod 7 Z))
419
402 420
403 ok = and 421 ok = and
404 [ toInt (m #> v) == cmod 11 (toInt m #> toInt v ) 422 [ toInt (m #> v) == cmod 11 (toInt m #> toInt v )
@@ -407,16 +425,22 @@ test = (ok, info)
407 , am <> gaussElim am bm == bm 425 , am <> gaussElim am bm == bm
408 , (checkGen (gen 5 :: Matrix R)) < 1E-15 426 , (checkGen (gen 5 :: Matrix R)) < 1E-15
409 , (checkGen (gen 5 :: Matrix Float)) < 2E-7 427 , (checkGen (gen 5 :: Matrix Float)) < 2E-7
410 , (checkGen (gen 5 :: Matrix C)) < 1E-15 428 , (checkGen (cgen 5 :: Matrix C)) < 1E-15
411 , (checkGen (gen 5 :: Matrix (Complex Float))) < 2E-7 429 , (checkGen (sgen 5 :: Matrix (Complex Float))) < 2E-7
412 , (checkGen (gen 5 :: Matrix (Mod 7 I))) == 0 430 , (checkGen (gen 5 :: Matrix (Mod 7 I))) == 0
413 , (checkGen (gen 5 :: Matrix (Mod 7 Z))) == 0 431 , (checkGen (gen 5 :: Matrix (Mod 7 Z))) == 0
414 , (checkLU (magnit 1E-10) (gen 5 :: Matrix R)) < 1E-15 432 , (checkLU (magnit 1E-10) (gen 5 :: Matrix R)) < 2E-15
415 , (checkLU (magnit 1E-5) (gen 5 :: Matrix Float)) < 1E-6 433 , (checkLU (magnit 1E-5) (gen 5 :: Matrix Float)) < 1E-6
416 , (checkLU (magnit 1E-10) (gen 5 :: Matrix C)) < 1E-15 434 , (checkLU (magnit 1E-10) (cgen 5 :: Matrix C)) < 5E-15
417 , (checkLU (magnit 1E-5) (gen 5 :: Matrix (Complex Float))) < 1E-6 435 , (checkLU (magnit 1E-5) (sgen 5 :: Matrix (Complex Float))) < 1E-6
418 , (checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I))) == 0 436 , (checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I))) == 0
419 , (checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 Z))) == 0 437 , (checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 Z))) == 0
438 , checkSolve (gen 5 :: Matrix R) < 2E-15
439 , checkSolve (gen 5 :: Matrix Float) < 1E-6
440 , checkSolve (cgen 5 :: Matrix C) < 4E-15
441 , checkSolve (sgen 5 :: Matrix (Complex Float)) < 1E-6
442 , checkSolve (gen 5 :: Matrix (Mod 7 I)) == 0
443 , checkSolve (gen 5 :: Matrix (Mod 7 Z)) == 0
420 , prodElements (konst (9:: Mod 10 I) (12::Int)) == product (replicate 12 (9:: Mod 10 I)) 444 , prodElements (konst (9:: Mod 10 I) (12::Int)) == product (replicate 12 (9:: Mod 10 I))
421 , gm <> gm == konst 0 (3,3) 445 , gm <> gm == konst 0 (3,3)
422 , lgm <> lgm == konst 0 (3,3) 446 , lgm <> lgm == konst 0 (3,3)