packages feed

matrix-0.3.6.2: test/Examples.hs

import Data.Matrix
import Data.Ratio
import System.Exit (exitFailure)
import System.IO (hFlush,stdout)
import Data.Either (isLeft)

-- We flush stdout explictly to get output printed
-- in real-time in Windows systems.
putStr' :: String -> IO ()
putStr' str = putStr str >> hFlush stdout

testExample :: String -> Bool -> IO ()
testExample n b = do
  putStr' $ "Test (" ++ n ++ "): "
  if b then putStrLn "OK."
       else putStrLn "Failed." >> exitFailure

testEquality :: Eq a => String -> (a,a) -> IO ()
testEquality n (x,y) = testExample n $ x == y

main :: IO ()
main = sequence_
  [ testEquality "matrix"
      ( matrix 4 4 $ \(i,j) -> 2*i - j
      , fromList 4 4
          [ 1 , 0 , -1 , -2
          , 3 , 2 ,  1 ,  0
          , 5 , 4 ,  3 ,  2
          , 7 , 6 ,  5 ,  4 ]
        )
  , testEquality "fromList"
      ( fromList 3 3 [1..]
      , fromList 3 3
          [ 1 , 2 , 3
          , 4 , 5 , 6
          , 7 , 8 , 9 ]
        )
  , testEquality "fromLists (1)"
      ( fromLists [ [1,2,3] , [4,5,6] , [7,8,9] ]
      , fromList 3 3
          [ 1 , 2 , 3
          , 4 , 5 , 6
          , 7 , 8 , 9 ]
        )
  , testEquality "fromLists (2)"
      ( fromLists [ [1,2,3] , [4,5,6,7] , [8,9,0] ]
      , fromList 3 3
          [ 1 , 2 , 3
          , 4 , 5 , 6
          , 8 , 9 , 0 ]
        )
  , testEquality "identity"
      ( identity 3 , fromList 3 3 [1,0,0 , 0,1,0 , 0,0,1]
        )
  , testEquality "diagonalList"
      ( diagonalList 3 0 [1..] , fromList 3 3 [1,0,0 , 0,2,0 , 0,0,3]
        )
  , testEquality "transpose"
      ( transpose $ fromList 3 3 [1..9]
      , fromList 3 3 [1,4,7 , 2,5,8 , 3,6,9]
        )
  , testEquality "extendTo"
      ( extendTo 0 4 5 $ fromList 3 3 [1..9]
      , fromList 4 5
          [ 1 , 2 , 3 , 0 , 0
          , 4 , 5 , 6 , 0 , 0
          , 7 , 8 , 9 , 0 , 0
          , 0 , 0 , 0 , 0 , 0
            ]
        )
  , testEquality "mapRow"
      ( mapRow (\_ x -> x + 1) 2 $ fromList 3 3 [1..9]
      , fromList 3 3 [1,2,3 , 5,6,7 , 7,8,9]
        )
  , testEquality "mapCol"
      ( mapCol (\_ x -> x + 1) 2 $ fromList 3 3 [1..9]
      , fromList 3 3 [1,3,3 , 4,6,6 , 7,9,9]
        )
  , testEquality "mapPos"
      ( mapPos (\(r,c) x -> r + 2 * c) $ fromList 2 2 [1..4]
      , fromList 2 2 [3, 5, 4, 6]
      )
  , testEquality "submatrix"
      ( submatrix 1 2 2 3 $ fromList 3 3 [1..9]
      , fromList 2 2 [2,3 , 5,6]
        )
  , testEquality "minorMatrix"
      ( minorMatrix 2 2 $ fromList 3 3 [1..9]
      , fromList 2 2 [1,3 , 7,9]
        )
  , testEquality "scaleMatrix"
      ( scaleMatrix 2 $ fromList 3 3 [1..9]
      , fromList 3 3 [2,4,6 , 8,10,12 , 14,16,18]
        )
  , testEquality "scaleRow"
      ( scaleRow 2 2 $ fromList 3 3 [1..9]
      , fromList 3 3 [1,2,3 , 8,10,12 , 7,8,9]
        )
  , testEquality "combineRows"
      ( combineRows 2 2 1 $ fromList 3 3 [1..9]
      , fromList 3 3 [1,2,3 , 6,9,12 , 7,8,9]
        )
  , testEquality "switchRows"
      ( switchRows 1 2 $ fromList 3 3 [1..9]
      , fromList 3 3 [4,5,6 , 1,2,3 , 7,8,9]
        )
  , testEquality "switchCols"
      ( switchCols 1 2 $ fromList 3 3 [1..9]
      , fromList 3 3 [2,1,3 , 5,4,6 , 8,7,9]
        )
  , testEquality "toList"
      ( toList $ fromList 3 3 [1..9]
      , [1..9]
        )
  , testEquality "toLists"
      ( toLists $ fromList 3 3 [1..9]
      , [ [1,2,3] , [4,5,6] , [7,8,9] ]
        )
  , testEquality "inverse (1)"
      ( inverse $ fromList 2 2 [1,7, 2,4]
      , Right $ fromList 2 2 [-4/10,7/10, 2/10,-1/10] :: Either String (Matrix Rational)
        )
  , testEquality "inverse (2)"
      ( inverse $ fromList 3 3 [1,7,-12,  2,4,10,  0,-23,1]
      , Right $ fromList 3 3 [117/386, 269/772, 59/386,
            -1/386, 1/772, -17/386,
            -23/386, 23/772, -5/386] :: Either String (Matrix Rational))
  , testEquality "inverse (3)"
      ( inverse $ fromList 4 4 [1,2345,23,78,   12,34556,123,-1242,   429,-131,0,0,  0,0,0,-1]
      , Right $ fromList 4 4 [
            -5371/72415160, 3013/217245480, 506353/217245480, -41658/1810379,
            -17589/72415160, 3289/72415160, -51/72415160, -136422/1810379,
            617754/9051895, -125767/27155685, -802/27155685, 20050470/1810379,
            0, 0, 0, -1] :: Either String (Matrix Rational))
  , testEquality "inverse (4)"
      ( inverse $ fromList 2 2 [0,1, 1,0]
      , Right $ fromList 2 2 [0,1, 1,0] :: Either String (Matrix Rational))
  , testEquality "inverse (5)"
      ( inverse $ fromList 3 3 [1,0,0, 0,0,1, 0,1,0]
      , Right $ fromList 3 3 [1,0,0, 0,0,1, 0,1,0] :: Either String (Matrix Rational))
  , testExample "inverse (6)" $ isLeft $ inverse $ fromList 2 2 [1,1,2,2]
  , testEquality "inverse (7)" ( inverse $ fromList 3 3 [0,0,0, 0,0,0, 0,0,0 :: Double], Left "Attempt to invert a non-invertible matrix")
  , testEquality "rref (bug #42)"
      ( rref (fromList 9 10
                [-1,1,0,0,0,0,0,0,1,1
                ,1,-1,0,0,0,0,1,0,1,1
                ,1,1,-1,0,0,0,0,1,0,1
                ,0,0,1,-1,0,0,0,0,0,1
                ,0,0,0,1,-1,1,0,0,0,1
                ,0,0,0,0,0,-1,1,0,0,1
                ,0,0,0,0,0,0,-1,0,1,1
                ,0,0,0,0,0,0,0,-1,0,1
                ,0,0,0,0,0,0,0,0,-1,1
                ] :: Matrix Rational)
      , Right (fromList 9 10
        [1,0,0,0,(-1)%2,0,0,0,0,0
        ,0,1,0,0,(-1)%2,0,0,0,0,0
        ,0,0,1,0,-1,0,0,0,0,0
        ,0,0,0,1,-1,0,0,0,0,0
        ,0,0,0,0,0,1,0,0,0,0
        ,0,0,0,0,0,0,1,0,0,0
        ,0,0,0,0,0,0,0,1,0,0
        ,0,0,0,0,0,0,0,0,1,0
        ,0,0,0,0,0,0,0,0,0,1
        ] :: Matrix Rational)
      )
  , testEquality "rref (bug #52)"
      ( rref $ fromList 2 3 [1,2,3,2,4,6]
      , Right $ fromList 2 3 [1,2,3,0,0,0]
      )
  ]