packages feed

eigen-3.3.4.2: test/regression.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

import Control.Applicative (liftA2)
import Eigen.Matrix as M
import Eigen.Solver.LA
import Data.List as List
import Control.Monad
import Data.Maybe (fromMaybe)

a :: Maybe (MatrixXd 5 3)
a = fromList 
  [ [1,3.02, 6.89]
  , [1,2.01, 5.39]
  , [1,2.41, 6.01]
  , [1,2.09, 5.55]
  , [1,2.58, 6.32]
  ]

b :: Maybe (MatrixXd 5 1)
b = fromList $ List.map return [-4.32,-3.79,-4.01,-3.86,-4.10]

main :: IO ()
main = do
  print a
  print b
  
  forM_ [FullPivLU, HouseholderQR, ColPivHouseholderQR, FullPivHouseholderQR, JacobiSVD] $ \d -> do
    let x :: Maybe (MatrixXd 3 1)
        x = liftA2 (solve d) a b
    let e :: Maybe Double
        e = relativeError <$> x <*> a <*> b
        e' :: Maybe Double
        e' = liftA2 (/) (norm <$> (sub <$> (liftA2 mul a x) <*> b)) (norm <$> b)
    putStrLn $ replicate 20 '*'
    --print d
    print x
    print e
    print e'
    putStrLn "\n-2.34666 - 0.25349 x1 - 0.174965 x2"
    putStrLn "done"

  print $ (identity :: MatrixXd 4 4)
  print $ M.normalize <$> a
  print $ M.transpose <$> a

  let _a :: Maybe (MatrixXd 3 3)
      _a = M.fromList
        [ [ 0.680,  0.597, -0.330]
        , [-0.211,  0.823,  0.536]
        , [ 0.566, -0.605, -0.444]
        ]
      _b = M.inverse <$> _a
  
  print _a
  print _b
  print $ liftA2 M.mul _a _b

  print $ linearRegression (M.Row @5)
    [ [-4.32, 3.02, 6.89]
    , [-3.79, 2.01, 5.39]
    , [-4.01, 2.41, 6.01]
    , [-3.86, 2.09, 5.55]
    , [-4.10, 2.58, 6.32]
    ]