{-# LINE 1 "src/Data/Number/Flint/Fmpz/Mod/Mat/FFI.hsc" #-}
module Data.Number.Flint.Fmpz.Mod.Mat.FFI (
FmpzModMat (..)
, CFmpzModMat (..)
, newFmpzModMat
, withFmpzModMat
, withNewFmpzModMat
, fmpz_mod_mat_entry
, fmpz_mod_mat_set_entry
, fmpz_mod_mat_init
, fmpz_mod_mat_init_set
, fmpz_mod_mat_clear
, fmpz_mod_mat_nrows
, fmpz_mod_mat_ncols
, _fmpz_mod_mat_set_mod
, fmpz_mod_mat_one
, fmpz_mod_mat_zero
, fmpz_mod_mat_swap
, fmpz_mod_mat_swap_entrywise
, fmpz_mod_mat_is_empty
, fmpz_mod_mat_is_square
, _fmpz_mod_mat_reduce
, fmpz_mod_mat_randtest
, fmpz_mod_mat_window_init
, fmpz_mod_mat_window_clear
, fmpz_mod_mat_concat_horizontal
, fmpz_mod_mat_concat_vertical
, fmpz_mod_mat_print_pretty
, fmpz_mod_mat_is_zero
, fmpz_mod_mat_set
, fmpz_mod_mat_transpose
, fmpz_mod_mat_set_fmpz_mat
, fmpz_mod_mat_get_fmpz_mat
, fmpz_mod_mat_add
, fmpz_mod_mat_sub
, fmpz_mod_mat_neg
, fmpz_mod_mat_scalar_mul_si
, fmpz_mod_mat_scalar_mul_ui
, fmpz_mod_mat_scalar_mul_fmpz
, fmpz_mod_mat_mul
, _fmpz_mod_mat_mul_classical_threaded_pool_op
, fmpz_mod_mat_mul_classical_threaded
, fmpz_mod_mat_sqr
, fmpz_mod_mat_mul_fmpz_vec
, fmpz_mod_mat_fmpz_vec_mul
, fmpz_mod_mat_trace
, fmpz_mod_mat_rref
, fmpz_mod_mat_strong_echelon_form
, fmpz_mod_mat_howell_form
, fmpz_mod_mat_inv
, fmpz_mod_mat_lu
, fmpz_mod_mat_solve_tril
, fmpz_mod_mat_solve_triu
, fmpz_mod_mat_solve
, fmpz_mod_mat_can_solve
, fmpz_mod_mat_similarity
) where
import Foreign.C.String
import Foreign.C.Types
import Foreign.ForeignPtr
import Foreign.Ptr ( Ptr, FunPtr, plusPtr )
import Foreign.Storable
import Foreign.Marshal ( free )
import Data.Number.Flint.Flint
import Data.Number.Flint.ThreadPool
import Data.Number.Flint.Fmpz
import Data.Number.Flint.Fmpz.Mat
import Data.Number.Flint.Fmpz.Poly
import Data.Number.Flint.Fmpz.Mod
import Data.Number.Flint.Fmpq
data FmpzModMat = FmpzModMat {-# UNPACK #-} !(ForeignPtr CFmpzModMat)
data CFmpzModMat = CFmpzModMat (Ptr CFmpzMat) (Ptr CFmpz)
instance Storable CFmpzModMat where
{-# INLINE sizeOf #-}
sizeOf :: CFmpzModMat -> Int
sizeOf CFmpzModMat
_ = (Int
40)
{-# LINE 117 "src/Data/Number/Flint/Fmpz/Mod/Mat/FFI.hsc" #-}
{-# INLINE alignment #-}
alignment :: CFmpzModMat -> Int
alignment CFmpzModMat
_ = Int
8
{-# LINE 119 "src/Data/Number/Flint/Fmpz/Mod/Mat/FFI.hsc" #-}
peek ptr = CFmpzModMat
<$> (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 121 "src/Data/Number/Flint/Fmpz/Mod/Mat/FFI.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 122 "src/Data/Number/Flint/Fmpz/Mod/Mat/FFI.hsc" #-}
poke = undefined
newFmpzModMat :: CLong -> CLong -> Fmpz -> IO FmpzModMat
newFmpzModMat CLong
nrows CLong
ncols Fmpz
n = do
ForeignPtr CFmpzModMat
x <- IO (ForeignPtr CFmpzModMat)
forall a. Storable a => IO (ForeignPtr a)
mallocForeignPtr
ForeignPtr CFmpzModMat
-> (Ptr CFmpzModMat -> IO (Fmpz, ())) -> IO (Fmpz, ())
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzModMat
x ((Ptr CFmpzModMat -> IO (Fmpz, ())) -> IO (Fmpz, ()))
-> (Ptr CFmpzModMat -> IO (Fmpz, ())) -> IO (Fmpz, ())
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzModMat
x ->
Fmpz -> (Ptr CFmpz -> IO ()) -> IO (Fmpz, ())
forall {a}. Fmpz -> (Ptr CFmpz -> IO a) -> IO (Fmpz, a)
withFmpz Fmpz
n ((Ptr CFmpz -> IO ()) -> IO (Fmpz, ()))
-> (Ptr CFmpz -> IO ()) -> IO (Fmpz, ())
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpz
n ->
Ptr CFmpzModMat -> CLong -> CLong -> Ptr CFmpz -> IO ()
fmpz_mod_mat_init Ptr CFmpzModMat
x CLong
nrows CLong
ncols Ptr CFmpz
n
FinalizerPtr CFmpzModMat -> ForeignPtr CFmpzModMat -> IO ()
forall a. FinalizerPtr a -> ForeignPtr a -> IO ()
addForeignPtrFinalizer FinalizerPtr CFmpzModMat
p_fmpz_mod_mat_clear ForeignPtr CFmpzModMat
x
FmpzModMat -> IO FmpzModMat
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (FmpzModMat -> IO FmpzModMat) -> FmpzModMat -> IO FmpzModMat
forall a b. (a -> b) -> a -> b
$ ForeignPtr CFmpzModMat -> FmpzModMat
FmpzModMat ForeignPtr CFmpzModMat
x
{-# INLINE withFmpzModMat #-}
withFmpzModMat :: FmpzModMat -> (Ptr CFmpzModMat -> IO a) -> IO (FmpzModMat, a)
withFmpzModMat (FmpzModMat ForeignPtr CFmpzModMat
x) Ptr CFmpzModMat -> IO a
f = do
ForeignPtr CFmpzModMat
-> (Ptr CFmpzModMat -> IO (FmpzModMat, a)) -> IO (FmpzModMat, a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzModMat
x ((Ptr CFmpzModMat -> IO (FmpzModMat, a)) -> IO (FmpzModMat, a))
-> (Ptr CFmpzModMat -> IO (FmpzModMat, a)) -> IO (FmpzModMat, a)
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzModMat
px -> Ptr CFmpzModMat -> IO a
f Ptr CFmpzModMat
px IO a -> (a -> IO (FmpzModMat, a)) -> IO (FmpzModMat, a)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (FmpzModMat, a) -> IO (FmpzModMat, a)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((FmpzModMat, a) -> IO (FmpzModMat, a))
-> (a -> (FmpzModMat, a)) -> a -> IO (FmpzModMat, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ForeignPtr CFmpzModMat -> FmpzModMat
FmpzModMat ForeignPtr CFmpzModMat
x,)
{-# INLINE withNewFmpzModMat #-}
withNewFmpzModMat :: CLong
-> CLong -> Fmpz -> (Ptr CFmpzModMat -> IO a) -> IO (FmpzModMat, a)
withNewFmpzModMat CLong
nrows CLong
ncols Fmpz
n Ptr CFmpzModMat -> IO a
f =
CLong -> CLong -> Fmpz -> IO FmpzModMat
newFmpzModMat CLong
nrows CLong
ncols Fmpz
n IO FmpzModMat
-> (FmpzModMat -> IO (FmpzModMat, a)) -> IO (FmpzModMat, a)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (FmpzModMat -> (Ptr CFmpzModMat -> IO a) -> IO (FmpzModMat, a))
-> (Ptr CFmpzModMat -> IO a) -> FmpzModMat -> IO (FmpzModMat, a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip FmpzModMat -> (Ptr CFmpzModMat -> IO a) -> IO (FmpzModMat, a)
forall {a}.
FmpzModMat -> (Ptr CFmpzModMat -> IO a) -> IO (FmpzModMat, a)
withFmpzModMat Ptr CFmpzModMat -> IO a
f
fmpz_mod_mat_entry :: Ptr CFmpzModMat -> CLong -> CLong -> IO (Ptr CFmpz)
fmpz_mod_mat_entry :: Ptr CFmpzModMat -> CLong -> CLong -> IO (Ptr CFmpz)
fmpz_mod_mat_entry Ptr CFmpzModMat
mat CLong
i CLong
j = do
CFmpzModMat Ptr CFmpzMat
a Ptr CFmpz
_ <- Ptr CFmpzModMat -> IO CFmpzModMat
forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzModMat
mat
Ptr CFmpzMat -> CLong -> CLong -> IO (Ptr CFmpz)
fmpz_mat_entry Ptr CFmpzMat
a CLong
i CLong
j
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_set_entry"
fmpz_mod_mat_set_entry :: Ptr CFmpzModMat -> CLong -> CLong -> Ptr CFmpz -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_init"
fmpz_mod_mat_init :: Ptr CFmpzModMat -> CLong -> CLong -> Ptr CFmpz -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_init_set"
fmpz_mod_mat_init_set :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_clear"
fmpz_mod_mat_clear :: Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h &fmpz_mod_mat_clear"
p_fmpz_mod_mat_clear :: FunPtr (Ptr CFmpzModMat -> IO ())
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_nrows"
fmpz_mod_mat_nrows :: Ptr CFmpzModMat -> IO CLong
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_ncols"
fmpz_mod_mat_ncols :: Ptr CFmpzModMat -> IO CLong
foreign import ccall "fmpz_mod_mat.h _fmpz_mod_mat_set_mod"
_fmpz_mod_mat_set_mod :: Ptr CFmpzModMat -> Ptr CFmpz -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_one"
fmpz_mod_mat_one :: Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_zero"
fmpz_mod_mat_zero :: Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_swap"
fmpz_mod_mat_swap :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_swap_entrywise"
fmpz_mod_mat_swap_entrywise :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_is_empty"
fmpz_mod_mat_is_empty :: Ptr CFmpzModMat -> IO CInt
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_is_square"
fmpz_mod_mat_is_square :: Ptr CFmpzModMat -> IO CInt
foreign import ccall "fmpz_mod_mat.h _fmpz_mod_mat_reduce"
_fmpz_mod_mat_reduce :: Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_randtest"
fmpz_mod_mat_randtest :: Ptr CFmpzModMat -> Ptr CFRandState -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_window_init"
fmpz_mod_mat_window_init :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> CLong -> CLong -> CLong -> CLong -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_window_clear"
fmpz_mod_mat_window_clear :: Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_concat_horizontal"
fmpz_mod_mat_concat_horizontal :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_concat_vertical"
fmpz_mod_mat_concat_vertical :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_print_pretty"
fmpz_mod_mat_print_pretty :: Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_is_zero"
fmpz_mod_mat_is_zero :: Ptr CFmpzModMat -> IO CInt
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_set"
fmpz_mod_mat_set :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_transpose"
fmpz_mod_mat_transpose :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_set_fmpz_mat"
fmpz_mod_mat_set_fmpz_mat :: Ptr CFmpzModMat -> Ptr CFmpzMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_get_fmpz_mat"
fmpz_mod_mat_get_fmpz_mat :: Ptr CFmpzMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_add"
fmpz_mod_mat_add :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_sub"
fmpz_mod_mat_sub :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_neg"
fmpz_mod_mat_neg :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_scalar_mul_si"
fmpz_mod_mat_scalar_mul_si :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> CLong -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_scalar_mul_ui"
fmpz_mod_mat_scalar_mul_ui :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> CLong -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_scalar_mul_fmpz"
fmpz_mod_mat_scalar_mul_fmpz :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpz -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_mul"
fmpz_mod_mat_mul :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h _fmpz_mod_mat_mul_classical_threaded_pool_op"
_fmpz_mod_mat_mul_classical_threaded_pool_op :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> CInt -> Ptr CThreadPoolHandle -> CLong -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_mul_classical_threaded"
fmpz_mod_mat_mul_classical_threaded :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_sqr"
fmpz_mod_mat_sqr :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_mul_fmpz_vec"
fmpz_mod_mat_mul_fmpz_vec :: Ptr CFmpz -> Ptr CFmpzModMat -> Ptr CFmpz -> CLong -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_fmpz_vec_mul"
fmpz_mod_mat_fmpz_vec_mul :: Ptr CFmpz -> Ptr CFmpz -> CLong -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_trace"
fmpz_mod_mat_trace :: Ptr CFmpz -> Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_rref"
fmpz_mod_mat_rref :: Ptr CLong -> Ptr CFmpzModMat -> IO CLong
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_strong_echelon_form"
fmpz_mod_mat_strong_echelon_form :: Ptr CFmpzModMat -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_howell_form"
fmpz_mod_mat_howell_form :: Ptr CFmpzModMat -> IO CLong
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_inv"
fmpz_mod_mat_inv :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_lu"
fmpz_mod_mat_lu :: Ptr CLong -> Ptr CFmpzModMat -> CInt -> Ptr CFmpzModCtx -> IO CLong
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_solve_tril"
fmpz_mod_mat_solve_tril :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> CInt -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_solve_triu"
fmpz_mod_mat_solve_triu :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> CInt -> Ptr CFmpzModCtx -> IO ()
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_solve"
fmpz_mod_mat_solve :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_can_solve"
fmpz_mod_mat_can_solve :: Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModMat -> Ptr CFmpzModCtx -> IO CInt
foreign import ccall "fmpz_mod_mat.h fmpz_mod_mat_similarity"
fmpz_mod_mat_similarity :: Ptr CFmpzModMat -> CLong -> Ptr CFmpz -> Ptr CFmpzModCtx -> IO ()