{-# LANGUAGE ViewPatterns #-}
module ArrayFire.LAPACK where
import ArrayFire.Internal.LAPACK
import ArrayFire.FFI
import ArrayFire.Types
import ArrayFire.Internal.Types
svd
:: AFType a
=> Array a
-> (Array a, Array a, Array a)
svd :: forall a. AFType a => Array a -> (Array a, Array a, Array a)
svd = (Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
forall a.
Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
`op3p` Ptr AFArray -> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr
af_svd)
svdInPlace
:: AFType a
=> Array a
-> (Array a, Array a, Array a)
svdInPlace :: forall a. AFType a => Array a -> (Array a, Array a, Array a)
svdInPlace = (Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
forall a.
Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
`op3p` Ptr AFArray -> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr
af_svd_inplace)
lu
:: AFType a
=> Array a
-> (Array a, Array a, Array a)
lu :: forall a. AFType a => Array a -> (Array a, Array a, Array a)
lu = (Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
forall a.
Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
`op3p` Ptr AFArray -> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr
af_lu)
luInPlace
:: AFType a
=> Array a
-> Bool
-> Array a
luInPlace :: forall a. AFType a => Array a -> Bool -> Array a
luInPlace Array a
a (Int -> CBool
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CBool) -> (Bool -> Int) -> Bool -> CBool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Int
forall a. Enum a => a -> Int
fromEnum -> CBool
b) = Array a
a Array a -> (Ptr AFArray -> AFArray -> IO AFErr) -> Array a
forall a.
Array a -> (Ptr AFArray -> AFArray -> IO AFErr) -> Array a
`op1` (\Ptr AFArray
x AFArray
y -> Ptr AFArray -> AFArray -> CBool -> IO AFErr
af_lu_inplace Ptr AFArray
x AFArray
y CBool
b)
qr
:: AFType a
=> Array a
-> (Array a, Array a, Array a)
qr :: forall a. AFType a => Array a -> (Array a, Array a, Array a)
qr = (Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
forall a.
Array a
-> (Ptr AFArray
-> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr)
-> (Array a, Array a, Array a)
`op3p` Ptr AFArray -> Ptr AFArray -> Ptr AFArray -> AFArray -> IO AFErr
af_qr)
qrInPlace
:: AFType a
=> Array a
-> Array a
qrInPlace :: forall a. AFType a => Array a -> Array a
qrInPlace = (Array a -> (Ptr AFArray -> AFArray -> IO AFErr) -> Array a
forall a.
Array a -> (Ptr AFArray -> AFArray -> IO AFErr) -> Array a
`op1` Ptr AFArray -> AFArray -> IO AFErr
af_qr_inplace)
cholesky
:: AFType a
=> Array a
-> Bool
-> (Int, Array a)
cholesky :: forall a. AFType a => Array a -> Bool -> (Int, Array a)
cholesky Array a
a (Int -> CBool
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CBool) -> (Bool -> Int) -> Bool -> CBool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Int
forall a. Enum a => a -> Int
fromEnum -> CBool
b) = do
let (CInt
x',Array a
y') = Array a
-> (Ptr AFArray -> Ptr CInt -> AFArray -> IO AFErr)
-> (CInt, Array a)
forall b a.
Storable b =>
Array a
-> (Ptr AFArray -> Ptr b -> AFArray -> IO AFErr) -> (b, Array a)
op1b Array a
a (\Ptr AFArray
x Ptr CInt
y AFArray
z -> Ptr AFArray -> Ptr CInt -> AFArray -> CBool -> IO AFErr
af_cholesky Ptr AFArray
x Ptr CInt
y AFArray
z CBool
b)
(CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral CInt
x', Array a
y')
choleskyInplace
:: AFType a
=> Array a
-> Bool
-> Int
choleskyInplace :: forall a. AFType a => Array a -> Bool -> Int
choleskyInplace Array a
a (Int -> CBool
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> CBool) -> (Bool -> Int) -> Bool -> CBool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Int
forall a. Enum a => a -> Int
fromEnum -> CBool
b) =
CInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt -> Int) -> CInt -> Int
forall a b. (a -> b) -> a -> b
$ Array a -> (Ptr CInt -> AFArray -> IO AFErr) -> CInt
forall a b.
Storable a =>
Array b -> (Ptr a -> AFArray -> IO AFErr) -> a
infoFromArray Array a
a (\Ptr CInt
x AFArray
y -> Ptr CInt -> AFArray -> CBool -> IO AFErr
af_cholesky_inplace Ptr CInt
x AFArray
y CBool
b)
solve
:: AFType a
=> Array a
-> Array a
-> MatProp
-> Array a
solve :: forall a. AFType a => Array a -> Array a -> MatProp -> Array a
solve Array a
a Array a
b MatProp
m =
Array a
-> Array a
-> (Ptr AFArray -> AFArray -> AFArray -> IO AFErr)
-> Array a
forall b a.
Array b
-> Array a
-> (Ptr AFArray -> AFArray -> AFArray -> IO AFErr)
-> Array a
op2 Array a
a Array a
b (\Ptr AFArray
x AFArray
y AFArray
z -> Ptr AFArray -> AFArray -> AFArray -> AFMatProp -> IO AFErr
af_solve Ptr AFArray
x AFArray
y AFArray
z (MatProp -> AFMatProp
toMatProp MatProp
m))
solveLU
:: AFType a
=> Array a
-> Array a
-> Array a
-> MatProp
-> Array a
solveLU :: forall a.
AFType a =>
Array a -> Array a -> Array a -> MatProp -> Array a
solveLU Array a
a Array a
b Array a
c MatProp
m =
Array a
-> Array a
-> Array a
-> (Ptr AFArray -> AFArray -> AFArray -> AFArray -> IO AFErr)
-> Array a
forall b a.
Array b
-> Array a
-> Array a
-> (Ptr AFArray -> AFArray -> AFArray -> AFArray -> IO AFErr)
-> Array a
op3 Array a
a Array a
b Array a
c (\Ptr AFArray
x AFArray
y AFArray
z AFArray
w -> Ptr AFArray
-> AFArray -> AFArray -> AFArray -> AFMatProp -> IO AFErr
af_solve_lu Ptr AFArray
x AFArray
y AFArray
z AFArray
w (MatProp -> AFMatProp
toMatProp MatProp
m))
inverse
:: AFType a
=> Array a
-> MatProp
-> Array a
inverse :: forall a. AFType a => Array a -> MatProp -> Array a
inverse Array a
a MatProp
m =
Array a
a Array a -> (Ptr AFArray -> AFArray -> IO AFErr) -> Array a
forall a.
Array a -> (Ptr AFArray -> AFArray -> IO AFErr) -> Array a
`op1` (\Ptr AFArray
x AFArray
y -> Ptr AFArray -> AFArray -> AFMatProp -> IO AFErr
af_inverse Ptr AFArray
x AFArray
y (MatProp -> AFMatProp
toMatProp MatProp
m))
rank
:: AFType a
=> Array a
-> Double
-> Int
rank :: forall a. AFType a => Array a -> Double -> Int
rank Array a
a Double
b =
CUInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Array a
a Array a -> (Ptr CUInt -> AFArray -> IO AFErr) -> CUInt
forall a b.
Storable a =>
Array b -> (Ptr a -> AFArray -> IO AFErr) -> a
`infoFromArray` (\Ptr CUInt
x AFArray
y -> Ptr CUInt -> AFArray -> Double -> IO AFErr
af_rank Ptr CUInt
x AFArray
y Double
b))
det
:: AFType a
=> Array a
-> (Double,Double)
det :: forall a. AFType a => Array a -> (Double, Double)
det = (Array a
-> (Ptr Double -> Ptr Double -> AFArray -> IO AFErr)
-> (Double, Double)
forall a b arr.
(Storable a, Storable b) =>
Array arr -> (Ptr a -> Ptr b -> AFArray -> IO AFErr) -> (a, b)
`infoFromArray2` Ptr Double -> Ptr Double -> AFArray -> IO AFErr
af_det)
norm
:: AFType a
=> Array a
-> NormType
-> Double
-> Double
-> Double
norm :: forall a.
AFType a =>
Array a -> NormType -> Double -> Double -> Double
norm Array a
arr (NormType -> AFNormType
fromNormType -> AFNormType
a) Double
b Double
c =
Array a
arr Array a -> (Ptr Double -> AFArray -> IO AFErr) -> Double
forall a b.
Storable a =>
Array b -> (Ptr a -> AFArray -> IO AFErr) -> a
`infoFromArray` (\Ptr Double
w AFArray
y -> Ptr Double -> AFArray -> AFNormType -> Double -> Double -> IO AFErr
af_norm Ptr Double
w AFArray
y AFNormType
a Double
b Double
c)
isLAPACKAvailable
:: Bool
isLAPACKAvailable :: Bool
isLAPACKAvailable =
Int -> Bool
forall a. Enum a => Int -> a
toEnum (Int -> Bool) -> (CBool -> Int) -> CBool -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CBool -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CBool -> Bool) -> CBool -> Bool
forall a b. (a -> b) -> a -> b
$ (Ptr CBool -> IO AFErr) -> CBool
forall a. Storable a => (Ptr a -> IO AFErr) -> a
afCall1' Ptr CBool -> IO AFErr
af_is_lapack_available