diff options
Diffstat (limited to 'packages/base/src/Internal/Modular.hs')
-rw-r--r-- | packages/base/src/Internal/Modular.hs | 52 |
1 files changed, 41 insertions, 11 deletions
diff --git a/packages/base/src/Internal/Modular.hs b/packages/base/src/Internal/Modular.hs index 6c6d5c5..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) |
@@ -131,6 +133,9 @@ instance KnownNat m => Element (Mod m I) | |||
131 | rowOp c a i1 i2 j1 j2 x = rowOpAux (c_rowOpMI m') c (unMod a) i1 i2 j1 j2 (f2iM x) | 133 | rowOp c a i1 i2 j1 j2 x = rowOpAux (c_rowOpMI m') c (unMod a) i1 i2 j1 j2 (f2iM x) |
132 | where | 134 | where |
133 | m' = fromIntegral . natVal $ (undefined :: Proxy m) | 135 | m' = fromIntegral . natVal $ (undefined :: Proxy m) |
136 | gemm u p a b c = gemmg (c_gemmMI m') (f2i u) p (f2iM a) (f2iM b) (f2iM c) | ||
137 | where | ||
138 | m' = fromIntegral . natVal $ (undefined :: Proxy m) | ||
134 | 139 | ||
135 | instance KnownNat m => Element (Mod m Z) | 140 | instance KnownNat m => Element (Mod m Z) |
136 | where | 141 | where |
@@ -146,6 +151,9 @@ instance KnownNat m => Element (Mod m Z) | |||
146 | rowOp c a i1 i2 j1 j2 x = rowOpAux (c_rowOpML m') c (unMod a) i1 i2 j1 j2 (f2iM x) | 151 | rowOp c a i1 i2 j1 j2 x = rowOpAux (c_rowOpML m') c (unMod a) i1 i2 j1 j2 (f2iM x) |
147 | where | 152 | where |
148 | m' = fromIntegral . natVal $ (undefined :: Proxy m) | 153 | m' = fromIntegral . natVal $ (undefined :: Proxy m) |
154 | gemm u p a b c = gemmg (c_gemmML m') (f2i u) p (f2iM a) (f2iM b) (f2iM c) | ||
155 | where | ||
156 | m' = fromIntegral . natVal $ (undefined :: Proxy m) | ||
149 | 157 | ||
150 | 158 | ||
151 | instance forall m . KnownNat m => Container Vector (Mod m I) | 159 | instance forall m . KnownNat m => Container Vector (Mod m I) |
@@ -344,7 +352,11 @@ test = (ok, info) | |||
344 | lg = (3><3) (repeat (3*10^(9::Int))) :: Matrix Z | 352 | lg = (3><3) (repeat (3*10^(9::Int))) :: Matrix Z |
345 | lgm = fromZ lg :: Matrix (Mod 10000000000 Z) | 353 | lgm = fromZ lg :: Matrix (Mod 10000000000 Z) |
346 | 354 | ||
347 | 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) | ||
348 | 360 | ||
349 | checkGen x = norm_Inf $ flatten $ invg x <> x - ident (rows x) | 361 | checkGen x = norm_Inf $ flatten $ invg x <> x - ident (rows x) |
350 | 362 | ||
@@ -354,6 +366,11 @@ test = (ok, info) | |||
354 | where | 366 | where |
355 | (l,u,p,_ :: Int) = luFact $ mutable (luST okf) t | 367 | (l,u,p,_ :: Int) = luFact $ mutable (luST okf) t |
356 | 368 | ||
369 | checkSolve aa = norm_Inf $ flatten (aa <> x - bb) | ||
370 | where | ||
371 | bb = flipud aa | ||
372 | x = luSolve' (luPacked' aa) bb | ||
373 | |||
357 | info = do | 374 | info = do |
358 | print v | 375 | print v |
359 | print m | 376 | print m |
@@ -377,9 +394,9 @@ test = (ok, info) | |||
377 | print $ lgm <> lgm | 394 | print $ lgm <> lgm |
378 | 395 | ||
379 | print (checkGen (gen 5 :: Matrix R)) | 396 | print (checkGen (gen 5 :: Matrix R)) |
380 | print (checkGen (gen 5 :: Matrix C)) | ||
381 | print (checkGen (gen 5 :: Matrix Float)) | 397 | print (checkGen (gen 5 :: Matrix Float)) |
382 | print (checkGen (gen 5 :: Matrix (Complex Float))) | 398 | print (checkGen (cgen 5 :: Matrix C)) |
399 | print (checkGen (sgen 5 :: Matrix (Complex Float))) | ||
383 | print (invg (gen 5) :: Matrix (Mod 7 I)) | 400 | print (invg (gen 5) :: Matrix (Mod 7 I)) |
384 | print (invg (gen 5) :: Matrix (Mod 7 Z)) | 401 | print (invg (gen 5) :: Matrix (Mod 7 Z)) |
385 | 402 | ||
@@ -388,11 +405,18 @@ test = (ok, info) | |||
388 | 405 | ||
389 | print $ checkLU (magnit 0) (gen 5 :: Matrix R) | 406 | print $ checkLU (magnit 0) (gen 5 :: Matrix R) |
390 | print $ checkLU (magnit 0) (gen 5 :: Matrix Float) | 407 | print $ checkLU (magnit 0) (gen 5 :: Matrix Float) |
391 | print $ checkLU (magnit 0) (gen 5 :: Matrix C) | 408 | print $ checkLU (magnit 0) (cgen 5 :: Matrix C) |
392 | print $ checkLU (magnit 0) (gen 5 :: Matrix (Complex Float)) | 409 | print $ checkLU (magnit 0) (sgen 5 :: Matrix (Complex Float)) |
393 | print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I)) | 410 | print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I)) |
394 | print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 Z)) | 411 | print $ checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 Z)) |
395 | 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 | |||
396 | 420 | ||
397 | ok = and | 421 | ok = and |
398 | [ toInt (m #> v) == cmod 11 (toInt m #> toInt v ) | 422 | [ toInt (m #> v) == cmod 11 (toInt m #> toInt v ) |
@@ -401,16 +425,22 @@ test = (ok, info) | |||
401 | , am <> gaussElim am bm == bm | 425 | , am <> gaussElim am bm == bm |
402 | , (checkGen (gen 5 :: Matrix R)) < 1E-15 | 426 | , (checkGen (gen 5 :: Matrix R)) < 1E-15 |
403 | , (checkGen (gen 5 :: Matrix Float)) < 2E-7 | 427 | , (checkGen (gen 5 :: Matrix Float)) < 2E-7 |
404 | , (checkGen (gen 5 :: Matrix C)) < 1E-15 | 428 | , (checkGen (cgen 5 :: Matrix C)) < 1E-15 |
405 | , (checkGen (gen 5 :: Matrix (Complex Float))) < 2E-7 | 429 | , (checkGen (sgen 5 :: Matrix (Complex Float))) < 2E-7 |
406 | , (checkGen (gen 5 :: Matrix (Mod 7 I))) == 0 | 430 | , (checkGen (gen 5 :: Matrix (Mod 7 I))) == 0 |
407 | , (checkGen (gen 5 :: Matrix (Mod 7 Z))) == 0 | 431 | , (checkGen (gen 5 :: Matrix (Mod 7 Z))) == 0 |
408 | , (checkLU (magnit 1E-10) (gen 5 :: Matrix R)) < 1E-15 | 432 | , (checkLU (magnit 1E-10) (gen 5 :: Matrix R)) < 2E-15 |
409 | , (checkLU (magnit 1E-5) (gen 5 :: Matrix Float)) < 1E-6 | 433 | , (checkLU (magnit 1E-5) (gen 5 :: Matrix Float)) < 1E-6 |
410 | , (checkLU (magnit 1E-10) (gen 5 :: Matrix C)) < 1E-15 | 434 | , (checkLU (magnit 1E-10) (cgen 5 :: Matrix C)) < 5E-15 |
411 | , (checkLU (magnit 1E-5) (gen 5 :: Matrix (Complex Float))) < 1E-6 | 435 | , (checkLU (magnit 1E-5) (sgen 5 :: Matrix (Complex Float))) < 1E-6 |
412 | , (checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I))) == 0 | 436 | , (checkLU (magnit 0) (gen 5 :: Matrix (Mod 7 I))) == 0 |
413 | , (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 | ||
414 | , 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)) |
415 | , gm <> gm == konst 0 (3,3) | 445 | , gm <> gm == konst 0 (3,3) |
416 | , lgm <> lgm == konst 0 (3,3) | 446 | , lgm <> lgm == konst 0 (3,3) |