diff options
Diffstat (limited to 'packages/base/src/Internal/Modular.hs')
-rw-r--r-- | packages/base/src/Internal/Modular.hs | 46 |
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 | |||
34 | import Internal.Vectorized (prodI,sumI,prodL,sumL) | 34 | import Internal.Vectorized (prodI,sumI,prodL,sumL) |
35 | import Internal.LAPACK (multiplyI, multiplyL) | 35 | import Internal.LAPACK (multiplyI, multiplyL) |
36 | import Internal.Algorithms(luFact) | 36 | import Internal.Algorithms(luFact) |
37 | import Internal.Util(Normed(..),Indexable(..),gaussElim, gaussElim_1, gaussElim_2,luST, magnit) | 37 | import Internal.Util(Normed(..),Indexable(..), |
38 | gaussElim, gaussElim_1, gaussElim_2, | ||
39 | luST, luSolve', luPacked', magnit) | ||
38 | import Internal.ST(mutable) | 40 | import Internal.ST(mutable) |
39 | import GHC.TypeLits | 41 | import GHC.TypeLits |
40 | import Data.Proxy(Proxy) | 42 | import 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) |