arrayfire-0.1.0.0: test/ArrayFire/LAPACKSpec.hs
{-# LANGUAGE TypeApplications #-}
module ArrayFire.LAPACKSpec where
import qualified ArrayFire as A
import Prelude
import Test.Hspec
spec :: Spec
spec =
describe "LAPACK spec" $ do
it "Should have LAPACK available" $ do
A.isLAPACKAvailable `shouldBe` True
it "Should perform svd" $ do
let (s,v,d) = A.svd $ A.matrix @Double (4,2) [ [1,2], [3,4], [5,6], [7,8] ]
A.getDims s `shouldBe` (4,4,1,1)
A.getDims v `shouldBe` (2,1,1,1)
A.getDims d `shouldBe` (2,2,1,1)
it "Should perform svd in place" $ do
let (s,v,d) = A.svdInPlace $ A.matrix @Double (4,2) [ [1,2], [3,4], [5,6], [7,8] ]
A.getDims s `shouldBe` (4,4,1,1)
A.getDims v `shouldBe` (2,1,1,1)
A.getDims d `shouldBe` (2,2,1,1)
it "Should perform lu" $ do
let (s,v,d) = A.lu $ A.matrix @Double (2,2) [[3,1],[4,2]]
A.getDims s `shouldBe` (2,2,1,1)
A.getDims v `shouldBe` (2,2,1,1)
A.getDims d `shouldBe` (2,1,1,1)
it "Should perform qr" $ do
let (s,v,d) = A.lu $ A.matrix @Double (3,3) [[12,6,4],[-51,167,24],[4,-68,-41]]
A.getDims s `shouldBe` (3,3,1,1)
A.getDims v `shouldBe` (3,3,1,1)
A.getDims d `shouldBe` (3,1,1,1)
it "Should get determinant of Double" $ do
let eles = [[3 A.:+ 1, 8 A.:+ 1], [4 A.:+ 1, 6 A.:+ 1]]
(x,y) = A.det (A.matrix @(A.Complex Double) (2,2) eles)
x `shouldBe` (-14)
let (x,y) = A.det $ A.matrix @Double (2,2) [[3,8],[4,6]]
x `shouldBe` (-14)
it "Should calculate inverse" $ do
let x = flip A.inverse A.None $ A.matrix @Double (2,2) [[4,7],[2,6]]
x `shouldBe` A.matrix @Double (2,2) [[0.6,-0.2],[-0.7,0.4]]
-- it "Should calculate psuedo inverse" $ do
-- let x = A.pinverse (A.matrix @Double (2,2) [[4,7],[2,6]]) 1.0 A.None
-- x `shouldBe` A.matrix @Double (2,2) [[0.6,-0.2],[-0.7,0.4]]