packages feed

exp-pairs-0.1.4.0: tests/Matrix3.hs

module Matrix3 where

import qualified Data.Matrix as M
import qualified Math.ExpPairs.Matrix3 as M3

import Test.Tasty
import Test.Tasty.QuickCheck as QC

import Instances ()

toM :: M3.Matrix3 a -> M.Matrix a
toM = M.fromList 3 3 . M3.toList

toM3 :: M.Matrix a -> M3.Matrix3 a
toM3 = M3.fromList . M.toList

testOp :: (M3.Matrix3 Integer -> M3.Matrix3 Integer -> M3.Matrix3 Integer) -> (M.Matrix Integer -> M.Matrix Integer -> M.Matrix Integer) -> M3.Matrix3 Integer -> M3.Matrix3 Integer -> Bool
testOp op1 op2 m1 m2 = m'==m'' where
  m'  = toM $ m1 `op1` m2
  m'' = toM m1 `op2` toM m2

testMakarov :: M3.Matrix3 Integer -> M3.Matrix3 Integer -> Bool
testMakarov m1 m2 = m1 * m2 == m1 `M3.makarovMult` m2

testLaderman :: M3.Matrix3 Integer -> M3.Matrix3 Integer -> Bool
testLaderman m1 m2 = m1 * m2 == m1 `M3.ladermanMult` m2

testDet1 :: M3.Matrix3 Integer -> Bool
testDet1 m = M3.det m == M.detLaplace (toM m)

testDet2 :: M3.Matrix3 Rational -> Bool
testDet2 m = M3.det m == M.detLU (toM m)

testRecip :: M3.Matrix3 Rational -> Bool
testRecip m = M3.det m==0 || m/=m' && m==m'' && M3.det m * M3.det m' == 1 where
  m' = recip m
  m'' = recip m'

testConv :: M3.Matrix3 Integer -> Bool
testConv m = (toM3 . toM) m == m

testNormalize :: Integer -> M3.Matrix3 Integer -> Bool
testNormalize a m = (M3.normalize m' == m') && (a==0 || a>0 && m'==m'' || a<0 && m'==negate m'') where
  m' = M3.normalize m
  m'' = M3.normalize (m * fromInteger a)

testMultCol :: M3.Matrix3 Integer -> (Integer, Integer, Integer) -> Bool
testMultCol m v@(v1, v2, v3) = a==a' && b==b' && c==c' where
  (a, b, c) = M3.multCol m v
  [a', b', c'] = M.toList $ toM m * M.fromList 3 1 [v1, v2, v3]

testSuite :: TestTree
testSuite = testGroup "Matrix3"
  [ QC.testProperty "plus"      $ testOp (+) (+)
  , QC.testProperty "minus"     $ testOp (-) (-)
  , QC.testProperty "mult"      $ testOp (*) (*)
  , QC.testProperty "makarov"     testMakarov
  , QC.testProperty "laderman"    testLaderman
  , QC.testProperty "det1"        testDet1
  , QC.testProperty "conversion"  testConv
  , QC.testProperty "det2"        testDet2
  , QC.testProperty "recip"       testRecip
  , QC.testProperty "normalize"   testNormalize
  , QC.testProperty "mult column" testMultCol
  ]