{-# LINE 1 "src/Data/Number/Flint/Fmpz/Poly/Mat/FFI.hsc" #-}
module Data.Number.Flint.Fmpz.Poly.Mat.FFI (
FmpzPolyMat (..)
, CFmpzPolyMat (..)
, newFmpzPolyMat
, withFmpzPolyMat
, withNewFmpzPolyMat
, fmpz_poly_mat_init
, fmpz_poly_mat_init_set
, fmpz_poly_mat_clear
, fmpz_poly_mat_nrows
, fmpz_poly_mat_ncols
, fmpz_poly_mat_entry
, fmpz_poly_mat_set
, fmpz_poly_mat_swap
, fmpz_poly_mat_swap_entrywise
, fmpz_poly_mat_print
, fmpz_poly_mat_randtest
, fmpz_poly_mat_randtest_unsigned
, fmpz_poly_mat_randtest_sparse
, fmpz_poly_mat_zero
, fmpz_poly_mat_one
, fmpz_poly_mat_equal
, fmpz_poly_mat_is_zero
, fmpz_poly_mat_is_one
, fmpz_poly_mat_is_empty
, fmpz_poly_mat_is_square
, fmpz_poly_mat_max_bits
, fmpz_poly_mat_max_length
, fmpz_poly_mat_transpose
, fmpz_poly_mat_evaluate_fmpz
, fmpz_poly_mat_scalar_mul_fmpz_poly
, fmpz_poly_mat_scalar_mul_fmpz
, fmpz_poly_mat_add
, fmpz_poly_mat_sub
, fmpz_poly_mat_neg
, fmpz_poly_mat_mul
, fmpz_poly_mat_mul_classical
, fmpz_poly_mat_mul_KS
, fmpz_poly_mat_mullow
, fmpz_poly_mat_sqr
, fmpz_poly_mat_sqr_classical
, fmpz_poly_mat_sqr_KS
, fmpz_poly_mat_sqrlow
, fmpz_poly_mat_pow
, fmpz_poly_mat_pow_trunc
, fmpz_poly_mat_prod
, fmpz_poly_mat_find_pivot_any
, fmpz_poly_mat_find_pivot_partial
, fmpz_poly_mat_fflu
, fmpz_poly_mat_rref
, fmpz_poly_mat_trace
, fmpz_poly_mat_det
, fmpz_poly_mat_det_fflu
, fmpz_poly_mat_det_interpolate
, fmpz_poly_mat_rank
, fmpz_poly_mat_inv
, fmpz_poly_mat_nullspace
, fmpz_poly_mat_solve
, fmpz_poly_mat_solve_fflu
, fmpz_poly_mat_solve_fflu_precomp
) where
import System.IO.Unsafe
import Control.Monad
import Foreign.C.String
import Foreign.C.Types
import Foreign.ForeignPtr
import Foreign.Ptr ( Ptr, FunPtr, nullPtr, plusPtr )
import Foreign.Storable
import Foreign.Marshal ( free )
import Foreign.Marshal.Array ( advancePtr )
import Data.Number.Flint.Flint
import Data.Number.Flint.Fmpz
import Data.Number.Flint.Fmpz.Poly
import Data.Number.Flint.Fmpz.Mat
import Data.Number.Flint.Fmpq
import Data.Number.Flint.NMod.Types
import Data.Number.Flint.Support.D.Mat
import Data.Number.Flint.Support.Mpf.Mat
data FmpzPolyMat = FmpzPolyMat {-# UNPACK #-} !(ForeignPtr CFmpzPolyMat)
data CFmpzPolyMat = CFmpzPolyMat (Ptr CFmpzPoly) CLong CLong (Ptr (Ptr CFmpzPoly))
instance Storable CFmpzPolyMat where
{-# INLINE sizeOf #-}
sizeOf :: CFmpzPolyMat -> Int
sizeOf CFmpzPolyMat
_ = (Int
32)
{-# LINE 125 "src/Data/Number/Flint/Fmpz/Poly/Mat/FFI.hsc" #-}
{-# INLINE alignment #-}
alignment :: CFmpzPolyMat -> Int
alignment CFmpzPolyMat
_ = Int
8
{-# LINE 127 "src/Data/Number/Flint/Fmpz/Poly/Mat/FFI.hsc" #-}
peek ptr = CFmpzPolyMat
<$> (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 129 "src/Data/Number/Flint/Fmpz/Poly/Mat/FFI.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 130 "src/Data/Number/Flint/Fmpz/Poly/Mat/FFI.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 131 "src/Data/Number/Flint/Fmpz/Poly/Mat/FFI.hsc" #-}
<*> (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 132 "src/Data/Number/Flint/Fmpz/Poly/Mat/FFI.hsc" #-}
poke = error "CFmpzPolyMat.poke: Not defined."
newFmpzPolyMat :: CLong -> CLong -> IO FmpzPolyMat
newFmpzPolyMat CLong
rows CLong
cols = do
ForeignPtr CFmpzPolyMat
x <- IO (ForeignPtr CFmpzPolyMat)
forall a. Storable a => IO (ForeignPtr a)
mallocForeignPtr
ForeignPtr CFmpzPolyMat -> (Ptr CFmpzPolyMat -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzPolyMat
x ((Ptr CFmpzPolyMat -> IO ()) -> IO ())
-> (Ptr CFmpzPolyMat -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyMat
x -> Ptr CFmpzPolyMat -> CLong -> CLong -> IO ()
fmpz_poly_mat_init Ptr CFmpzPolyMat
x CLong
rows CLong
cols
FinalizerPtr CFmpzPolyMat -> ForeignPtr CFmpzPolyMat -> IO ()
forall a. FinalizerPtr a -> ForeignPtr a -> IO ()
addForeignPtrFinalizer FinalizerPtr CFmpzPolyMat
p_fmpz_poly_mat_clear ForeignPtr CFmpzPolyMat
x
FmpzPolyMat -> IO FmpzPolyMat
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (FmpzPolyMat -> IO FmpzPolyMat) -> FmpzPolyMat -> IO FmpzPolyMat
forall a b. (a -> b) -> a -> b
$ ForeignPtr CFmpzPolyMat -> FmpzPolyMat
FmpzPolyMat ForeignPtr CFmpzPolyMat
x
{-# INLINE withFmpzPolyMat #-}
withFmpzPolyMat :: FmpzPolyMat -> (Ptr CFmpzPolyMat -> IO a) -> IO (FmpzPolyMat, a)
withFmpzPolyMat (FmpzPolyMat ForeignPtr CFmpzPolyMat
x) Ptr CFmpzPolyMat -> IO a
f = do
ForeignPtr CFmpzPolyMat
-> (Ptr CFmpzPolyMat -> IO (FmpzPolyMat, a)) -> IO (FmpzPolyMat, a)
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtr ForeignPtr CFmpzPolyMat
x ((Ptr CFmpzPolyMat -> IO (FmpzPolyMat, a)) -> IO (FmpzPolyMat, a))
-> (Ptr CFmpzPolyMat -> IO (FmpzPolyMat, a)) -> IO (FmpzPolyMat, a)
forall a b. (a -> b) -> a -> b
$ \Ptr CFmpzPolyMat
px -> Ptr CFmpzPolyMat -> IO a
f Ptr CFmpzPolyMat
px IO a -> (a -> IO (FmpzPolyMat, a)) -> IO (FmpzPolyMat, a)
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (FmpzPolyMat, a) -> IO (FmpzPolyMat, a)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((FmpzPolyMat, a) -> IO (FmpzPolyMat, a))
-> (a -> (FmpzPolyMat, a)) -> a -> IO (FmpzPolyMat, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ForeignPtr CFmpzPolyMat -> FmpzPolyMat
FmpzPolyMat ForeignPtr CFmpzPolyMat
x,)
{-# INLINE withNewFmpzPolyMat #-}
withNewFmpzPolyMat :: CLong -> CLong -> (Ptr CFmpzPolyMat -> IO a) -> IO (FmpzPolyMat, a)
withNewFmpzPolyMat CLong
rows CLong
cols Ptr CFmpzPolyMat -> IO a
f = do
FmpzPolyMat
x <- CLong -> CLong -> IO FmpzPolyMat
newFmpzPolyMat CLong
rows CLong
cols
FmpzPolyMat -> (Ptr CFmpzPolyMat -> IO a) -> IO (FmpzPolyMat, a)
forall {a}.
FmpzPolyMat -> (Ptr CFmpzPolyMat -> IO a) -> IO (FmpzPolyMat, a)
withFmpzPolyMat FmpzPolyMat
x Ptr CFmpzPolyMat -> IO a
f
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_init"
fmpz_poly_mat_init :: Ptr CFmpzPolyMat -> CLong -> CLong -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_init_set"
fmpz_poly_mat_init_set :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_clear"
fmpz_poly_mat_clear :: Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h &fmpz_poly_mat_clear"
p_fmpz_poly_mat_clear :: FunPtr (Ptr CFmpzPolyMat -> IO ())
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_nrows"
fmpz_poly_mat_nrows :: Ptr CFmpzPolyMat -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_ncols"
fmpz_poly_mat_ncols :: Ptr CFmpzPolyMat -> IO CLong
fmpz_poly_mat_entry :: Ptr CFmpzPolyMat -> CLong -> CLong -> IO (Ptr CFmpzPoly)
fmpz_poly_mat_entry :: Ptr CFmpzPolyMat -> CLong -> CLong -> IO (Ptr CFmpzPoly)
fmpz_poly_mat_entry Ptr CFmpzPolyMat
mat CLong
i CLong
j = do
CFmpzPolyMat Ptr CFmpzPoly
entries CLong
r CLong
c Ptr (Ptr CFmpzPoly)
rows <- Ptr CFmpzPolyMat -> IO CFmpzPolyMat
forall a. Storable a => Ptr a -> IO a
peek Ptr CFmpzPolyMat
mat
Ptr CFmpzPoly -> IO (Ptr CFmpzPoly)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Ptr CFmpzPoly -> IO (Ptr CFmpzPoly))
-> Ptr CFmpzPoly -> IO (Ptr CFmpzPoly)
forall a b. (a -> b) -> a -> b
$ Ptr CFmpzPoly
entries Ptr CFmpzPoly -> Int -> Ptr CFmpzPoly
forall a. Storable a => Ptr a -> Int -> Ptr a
`advancePtr` (CLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CLong
iCLong -> CLong -> CLong
forall a. Num a => a -> a -> a
*CLong
cCLong -> CLong -> CLong
forall a. Num a => a -> a -> a
+CLong
j))
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_set"
fmpz_poly_mat_set :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_swap"
fmpz_poly_mat_swap :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_swap_entrywise"
fmpz_poly_mat_swap_entrywise :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_fprint"
fmpz_poly_mat_fprint :: Ptr CFile -> Ptr CFmpzPolyMat -> CString -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_get_str"
fmpz_poly_mat_get_str :: Ptr CFmpzPolyMat -> CString -> IO CString
fmpz_poly_mat_print :: Ptr CFmpzPolyMat -> CString -> IO ()
fmpz_poly_mat_print :: Ptr CFmpzPolyMat -> CString -> IO ()
fmpz_poly_mat_print Ptr CFmpzPolyMat
mat CString
x = do
(Ptr CFmpzPolyMat -> IO CString) -> Ptr CFmpzPolyMat -> IO CInt
forall a. (Ptr a -> IO CString) -> Ptr a -> IO CInt
printCStr (\Ptr CFmpzPolyMat
mat -> Ptr CFmpzPolyMat -> CString -> IO CString
fmpz_poly_mat_get_str Ptr CFmpzPolyMat
mat CString
x) Ptr CFmpzPolyMat
mat
() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_randtest"
fmpz_poly_mat_randtest :: Ptr CFmpzPolyMat -> Ptr CFRandState -> CLong -> CFBitCnt -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_randtest_unsigned"
fmpz_poly_mat_randtest_unsigned :: Ptr CFmpzPolyMat -> Ptr CFRandState -> CLong -> CFBitCnt -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_randtest_sparse"
fmpz_poly_mat_randtest_sparse :: Ptr CFmpzPolyMat -> Ptr CFRandState -> CLong -> CFBitCnt -> CFloat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_zero"
fmpz_poly_mat_zero :: Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_one"
fmpz_poly_mat_one :: Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_equal"
fmpz_poly_mat_equal :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_is_zero"
fmpz_poly_mat_is_zero :: Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_is_one"
fmpz_poly_mat_is_one :: Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_is_empty"
fmpz_poly_mat_is_empty :: Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_is_square"
fmpz_poly_mat_is_square :: Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_max_bits"
fmpz_poly_mat_max_bits :: Ptr CFmpzPolyMat -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_max_length"
fmpz_poly_mat_max_length :: Ptr CFmpzPolyMat -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_transpose"
fmpz_poly_mat_transpose :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_evaluate_fmpz"
fmpz_poly_mat_evaluate_fmpz :: Ptr CFmpzMat -> Ptr CFmpzPolyMat -> Ptr CFmpz -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_scalar_mul_fmpz_poly"
fmpz_poly_mat_scalar_mul_fmpz_poly :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpzPoly -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_scalar_mul_fmpz"
fmpz_poly_mat_scalar_mul_fmpz :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpz -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_add"
fmpz_poly_mat_add :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_sub"
fmpz_poly_mat_sub :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_neg"
fmpz_poly_mat_neg :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_mul"
fmpz_poly_mat_mul :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_mul_classical"
fmpz_poly_mat_mul_classical :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_mul_KS"
fmpz_poly_mat_mul_KS :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_mullow"
fmpz_poly_mat_mullow :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> CLong -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_sqr"
fmpz_poly_mat_sqr :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_sqr_classical"
fmpz_poly_mat_sqr_classical :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_sqr_KS"
fmpz_poly_mat_sqr_KS :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_sqrlow"
fmpz_poly_mat_sqrlow :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> CLong -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_pow"
fmpz_poly_mat_pow :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> CULong -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_pow_trunc"
fmpz_poly_mat_pow_trunc :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> CULong -> CLong -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_prod"
fmpz_poly_mat_prod :: Ptr CFmpzPolyMat -> Ptr (Ptr CFmpzPolyMat) -> CLong -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_find_pivot_any"
fmpz_poly_mat_find_pivot_any :: Ptr CFmpzPolyMat -> CLong -> CLong -> CLong -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_find_pivot_partial"
fmpz_poly_mat_find_pivot_partial :: Ptr CFmpzPolyMat -> CLong -> CLong -> CLong -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_fflu"
fmpz_poly_mat_fflu :: Ptr CFmpzPolyMat -> Ptr CFmpzPoly -> Ptr CLong -> Ptr CFmpzPolyMat -> CInt -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_rref"
fmpz_poly_mat_rref :: Ptr CFmpzPolyMat -> Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_trace"
fmpz_poly_mat_trace :: Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_det"
fmpz_poly_mat_det :: Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_det_fflu"
fmpz_poly_mat_det_fflu :: Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_det_interpolate"
fmpz_poly_mat_det_interpolate :: Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> IO ()
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_rank"
fmpz_poly_mat_rank :: Ptr CFmpzPolyMat -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_inv"
fmpz_poly_mat_inv :: Ptr CFmpzPolyMat -> Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_nullspace"
fmpz_poly_mat_nullspace :: Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO CLong
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_solve"
fmpz_poly_mat_solve :: Ptr CFmpzPolyMat -> Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_solve_fflu"
fmpz_poly_mat_solve_fflu :: Ptr CFmpzPolyMat -> Ptr CFmpzPoly -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO CInt
foreign import ccall "fmpz_poly_mat.h fmpz_poly_mat_solve_fflu_precomp"
fmpz_poly_mat_solve_fflu_precomp :: Ptr CFmpzPolyMat -> Ptr CLong -> Ptr CFmpzPolyMat -> Ptr CFmpzPolyMat -> IO ()