{-# LINE 1 "src/Data/Number/Flint/Support/D/Mat/FFI.hsc" #-}
module Data.Number.Flint.Support.D.Mat.FFI (
DMat (..)
, CDMat (..)
, newDMat
, withDMat
, withNewDMat
, d_mat_init
, d_mat_clear
, d_mat_set
, d_mat_swap
, d_mat_swap_entrywise
, d_mat_entry
, d_mat_get_entry
, d_mat_entry_ptr
, d_mat_zero
, d_mat_one
, d_mat_randtest
, d_mat_get_str
, d_mat_fprint
, d_mat_print
, d_mat_equal
, d_mat_approx_equal
, d_mat_is_zero
, d_mat_is_approx_zero
, d_mat_is_empty
, d_mat_is_square
, d_mat_transpose
, d_mat_mul_classical
, d_mat_gso
, d_mat_qr
) where
import Foreign.C.Types
import Foreign.C.String
import Foreign.Ptr
import Foreign.ForeignPtr
import Foreign.Storable
import Foreign.Marshal.Array
import Data.Number.Flint.Flint
data DMat = DMat {-# UNPACK #-} !(ForeignPtr CDMat)
data CDMat = CDMat (Ptr CDouble) CLong CLong (Ptr (Ptr CDouble))
instance Storable CDMat where
{-# INLINE sizeOf #-}
sizeOf :: CDMat -> Int
sizeOf CDMat
_ = (Int
32)
{-# LINE 70 "src/Data/Number/Flint/Support/D/Mat/FFI.hsc" #-}
{-# INLINE alignment #-}
alignment :: CDMat -> Int
alignment CDMat
_ = Int
8
{-# LINE 72 "src/Data/Number/Flint/Support/D/Mat/FFI.hsc" #-}
peek ptr = CDMat
<$> (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 74 "src/Data/Number/Flint/Support/D/Mat/FFI.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 75 "src/Data/Number/Flint/Support/D/Mat/FFI.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 76 "src/Data/Number/Flint/Support/D/Mat/FFI.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 77 "src/Data/Number/Flint/Support/D/Mat/FFI.hsc" #-}
poke = error "CDMat.poke: Not defined."
newDMat :: CLong -> CLong -> IO DMat
newDMat CLong
rows CLong
cols = do
ForeignPtr CDMat
x <- forall a. Storable a => IO (ForeignPtr a)
mallocForeignPtr
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CDMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CDMat
x -> Ptr CDMat -> CLong -> CLong -> IO ()
d_mat_init Ptr CDMat
x CLong
rows CLong
cols
forall a. FinalizerPtr a -> ForeignPtr a -> IO ()
addForeignPtrFinalizer FunPtr (Ptr CDMat -> IO ())
p_d_mat_clear ForeignPtr CDMat
x
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ ForeignPtr CDMat -> DMat
DMat ForeignPtr CDMat
x
{-# INLINE withDMat #-}
withDMat :: DMat -> (Ptr CDMat -> IO a) -> IO (DMat, a)
withDMat (DMat ForeignPtr CDMat
x) Ptr CDMat -> IO a
f = do
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CDMat
x forall a b. (a -> b) -> a -> b
$ \Ptr CDMat
px -> Ptr CDMat -> IO a
f Ptr CDMat
px forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall (m :: * -> *) a. Monad m => a -> m a
return forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ForeignPtr CDMat -> DMat
DMat ForeignPtr CDMat
x,)
{-# INLINE withNewDMat #-}
withNewDMat :: CLong -> CLong -> (Ptr CDMat -> IO a) -> IO (DMat, a)
withNewDMat CLong
rows CLong
cols Ptr CDMat -> IO a
f = do
DMat
x <- CLong -> CLong -> IO DMat
newDMat CLong
rows CLong
cols
forall {a}. DMat -> (Ptr CDMat -> IO a) -> IO (DMat, a)
withDMat DMat
x Ptr CDMat -> IO a
f
foreign import ccall "d_mat.h d_mat_init"
d_mat_init :: Ptr CDMat -> CLong -> CLong -> IO ()
foreign import ccall "d_mat.h d_mat_clear"
d_mat_clear :: Ptr CDMat -> IO ()
foreign import ccall "d_mat.h &d_mat_clear"
p_d_mat_clear :: FunPtr (Ptr CDMat -> IO ())
foreign import ccall "d_mat.h d_mat_set"
d_mat_set :: Ptr CDMat -> Ptr CDMat -> IO ()
foreign import ccall "d_mat.h d_mat_swap"
d_mat_swap :: Ptr CDMat -> Ptr CDMat -> IO ()
foreign import ccall "d_mat.h d_mat_swap_entrywise"
d_mat_swap_entrywise :: Ptr CDMat -> Ptr CDMat -> IO ()
d_mat_entry :: Ptr CDMat -> CLong -> CLong -> IO CDouble
d_mat_entry :: Ptr CDMat -> CLong -> CLong -> IO CDouble
d_mat_entry Ptr CDMat
mat CLong
i CLong
j = do
CDMat Ptr CDouble
_ CLong
r CLong
c Ptr (Ptr CDouble)
rows <- forall a. Storable a => Ptr a -> IO a
peek Ptr CDMat
mat
Ptr CDouble
row_i <- forall a. Storable a => Ptr a -> IO a
peek (Ptr (Ptr CDouble)
rows forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` (forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
i))
CDouble
result <- forall a. Storable a => Ptr a -> IO a
peek (Ptr CDouble
row_i forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` (forall a b. (Integral a, Num b) => a -> b
fromIntegral CLong
j))
forall (m :: * -> *) a. Monad m => a -> m a
return CDouble
result
foreign import ccall "d_mat.h d_mat_get_entry"
d_mat_get_entry :: Ptr CDMat -> CLong -> CLong -> IO CDouble
foreign import ccall "d_mat.h d_mat_entry_ptr"
d_mat_entry_ptr :: Ptr CDMat -> CLong -> CLong -> IO (Ptr CDouble)
foreign import ccall "d_mat.h d_mat_zero"
d_mat_zero :: Ptr CDMat -> IO ()
foreign import ccall "d_mat.h d_mat_one"
d_mat_one :: Ptr CDMat -> IO ()
foreign import ccall "d_mat.h d_mat_randtest"
d_mat_randtest :: Ptr CDMat -> Ptr CFRandState -> CLong -> CLong -> IO ()
foreign import ccall "d_mat.h d_mat_get_str"
d_mat_get_str :: Ptr CDMat -> IO CString
foreign import ccall "d_mat.h d_mat_fprint"
d_mat_fprint :: Ptr CFile -> Ptr CDMat -> IO ()
d_mat_print :: Ptr CDMat -> IO ()
d_mat_print :: Ptr CDMat -> IO ()
d_mat_print Ptr CDMat
mat = do
forall a. (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr Ptr CDMat -> IO CString
d_mat_get_str Ptr CDMat
mat
forall (m :: * -> *) a. Monad m => a -> m a
return ()
foreign import ccall "d_mat.h d_mat_equal"
d_mat_equal :: Ptr CDMat -> Ptr CDMat -> IO CInt
foreign import ccall "d_mat.h d_mat_approx_equal"
d_mat_approx_equal :: Ptr CDMat -> Ptr CDMat -> CDouble -> IO CInt
foreign import ccall "d_mat.h d_mat_is_zero"
d_mat_is_zero :: Ptr CDMat -> IO CInt
foreign import ccall "d_mat.h d_mat_is_approx_zero"
d_mat_is_approx_zero :: Ptr CDMat -> CDouble -> IO CInt
foreign import ccall "d_mat.h d_mat_is_empty"
d_mat_is_empty :: Ptr CDMat -> IO CInt
foreign import ccall "d_mat.h d_mat_is_square"
d_mat_is_square :: Ptr CDMat -> IO CInt
foreign import ccall "d_mat.h d_mat_transpose"
d_mat_transpose :: Ptr CDMat -> Ptr CDMat -> IO ()
foreign import ccall "d_mat.h d_mat_mul_classical"
d_mat_mul_classical :: Ptr CDMat -> Ptr CDMat -> Ptr CDMat -> IO ()
foreign import ccall "d_mat.h d_mat_gso"
d_mat_gso :: Ptr CDMat -> Ptr CDMat -> IO ()
foreign import ccall "d_mat.h d_mat_qr"
d_mat_qr :: Ptr CDMat -> Ptr CDMat -> Ptr CDMat -> IO ()