{-# LANGUAGE ViewPatterns #-}
module ArrayFire.BLAS where
import Data.Complex
import ArrayFire.FFI
import ArrayFire.Internal.BLAS
import ArrayFire.Internal.Types
matmul
:: AFType a
=> Array a
-> Array a
-> MatProp
-> MatProp
-> Array a
matmul :: forall a.
AFType a =>
Array a -> Array a -> MatProp -> MatProp -> Array a
matmul Array a
arr1 Array a
arr2 MatProp
prop1 MatProp
prop2 = do
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
arr1 Array a
arr2 (\Ptr AFArray
p AFArray
a AFArray
b -> Ptr AFArray
-> AFArray -> AFArray -> AFMatProp -> AFMatProp -> IO AFErr
af_matmul Ptr AFArray
p AFArray
a AFArray
b (MatProp -> AFMatProp
toMatProp MatProp
prop1) (MatProp -> AFMatProp
toMatProp MatProp
prop2))
dot
:: AFType a
=> Array a
-> Array a
-> MatProp
-> MatProp
-> Array a
dot :: forall a.
AFType a =>
Array a -> Array a -> MatProp -> MatProp -> Array a
dot Array a
arr1 Array a
arr2 MatProp
prop1 MatProp
prop2 =
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
arr1 Array a
arr2 (\Ptr AFArray
p AFArray
a AFArray
b -> Ptr AFArray
-> AFArray -> AFArray -> AFMatProp -> AFMatProp -> IO AFErr
af_dot Ptr AFArray
p AFArray
a AFArray
b (MatProp -> AFMatProp
toMatProp MatProp
prop1) (MatProp -> AFMatProp
toMatProp MatProp
prop2))
dotAll
:: AFType a
=> Array a
-> Array a
-> MatProp
-> MatProp
-> Complex Double
dotAll :: forall a.
AFType a =>
Array a -> Array a -> MatProp -> MatProp -> Complex Double
dotAll Array a
arr1 Array a
arr2 MatProp
prop1 MatProp
prop2 = do
let (Double
real,Double
imag) =
Array a
-> Array a
-> (Ptr Double -> Ptr Double -> AFArray -> AFArray -> IO AFErr)
-> (Double, Double)
forall a b arr.
(Storable a, Storable b) =>
Array arr
-> Array arr
-> (Ptr a -> Ptr b -> AFArray -> AFArray -> IO AFErr)
-> (a, b)
infoFromArray22 Array a
arr1 Array a
arr2 ((Ptr Double -> Ptr Double -> AFArray -> AFArray -> IO AFErr)
-> (Double, Double))
-> (Ptr Double -> Ptr Double -> AFArray -> AFArray -> IO AFErr)
-> (Double, Double)
forall a b. (a -> b) -> a -> b
$ \Ptr Double
a Ptr Double
b AFArray
c AFArray
d ->
Ptr Double
-> Ptr Double
-> AFArray
-> AFArray
-> AFMatProp
-> AFMatProp
-> IO AFErr
af_dot_all Ptr Double
a Ptr Double
b AFArray
c AFArray
d (MatProp -> AFMatProp
toMatProp MatProp
prop1) (MatProp -> AFMatProp
toMatProp MatProp
prop2)
Double
real Double -> Double -> Complex Double
forall a. a -> a -> Complex a
:+ Double
imag
transpose
:: AFType a
=> Array a
-> Bool
-> Array a
transpose :: forall a. AFType a => Array a -> Bool -> Array a
transpose Array a
arr1 (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
arr1 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_transpose Ptr AFArray
x AFArray
y CBool
b)
transposeInPlace
:: AFType a
=> Array a
-> Bool
-> IO ()
transposeInPlace :: forall a. AFType a => Array a -> Bool -> IO ()
transposeInPlace Array a
arr (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
arr Array a -> (AFArray -> IO AFErr) -> IO ()
forall a. Array a -> (AFArray -> IO AFErr) -> IO ()
`inPlace` (AFArray -> CBool -> IO AFErr
`af_transpose_inplace` CBool
b)