{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Camfort.Specification.Units.InferenceBackendFlint where
import Control.Monad
import Data.List (partition)
import Foreign
import Foreign.C.Types
import Numeric.LinearAlgebra (atIndex, rows, cols)
import qualified Numeric.LinearAlgebra as H
import System.IO.Unsafe (unsafePerformIO)
newtype FMPZ = FMPZ { FMPZ -> SLong
unFMPZ :: SLong }
deriving (Ptr b -> Int -> IO FMPZ
Ptr b -> Int -> FMPZ -> IO ()
Ptr FMPZ -> IO FMPZ
Ptr FMPZ -> Int -> IO FMPZ
Ptr FMPZ -> Int -> FMPZ -> IO ()
Ptr FMPZ -> FMPZ -> IO ()
FMPZ -> Int
(FMPZ -> Int)
-> (FMPZ -> Int)
-> (Ptr FMPZ -> Int -> IO FMPZ)
-> (Ptr FMPZ -> Int -> FMPZ -> IO ())
-> (forall b. Ptr b -> Int -> IO FMPZ)
-> (forall b. Ptr b -> Int -> FMPZ -> IO ())
-> (Ptr FMPZ -> IO FMPZ)
-> (Ptr FMPZ -> FMPZ -> IO ())
-> Storable FMPZ
forall b. Ptr b -> Int -> IO FMPZ
forall b. Ptr b -> Int -> FMPZ -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
poke :: Ptr FMPZ -> FMPZ -> IO ()
$cpoke :: Ptr FMPZ -> FMPZ -> IO ()
peek :: Ptr FMPZ -> IO FMPZ
$cpeek :: Ptr FMPZ -> IO FMPZ
pokeByteOff :: Ptr b -> Int -> FMPZ -> IO ()
$cpokeByteOff :: forall b. Ptr b -> Int -> FMPZ -> IO ()
peekByteOff :: Ptr b -> Int -> IO FMPZ
$cpeekByteOff :: forall b. Ptr b -> Int -> IO FMPZ
pokeElemOff :: Ptr FMPZ -> Int -> FMPZ -> IO ()
$cpokeElemOff :: Ptr FMPZ -> Int -> FMPZ -> IO ()
peekElemOff :: Ptr FMPZ -> Int -> IO FMPZ
$cpeekElemOff :: Ptr FMPZ -> Int -> IO FMPZ
alignment :: FMPZ -> Int
$calignment :: FMPZ -> Int
sizeOf :: FMPZ -> Int
$csizeOf :: FMPZ -> Int
Storable, FMPZ -> FMPZ -> Bool
(FMPZ -> FMPZ -> Bool) -> (FMPZ -> FMPZ -> Bool) -> Eq FMPZ
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FMPZ -> FMPZ -> Bool
$c/= :: FMPZ -> FMPZ -> Bool
== :: FMPZ -> FMPZ -> Bool
$c== :: FMPZ -> FMPZ -> Bool
Eq, Eq FMPZ
Eq FMPZ
-> (FMPZ -> FMPZ -> Ordering)
-> (FMPZ -> FMPZ -> Bool)
-> (FMPZ -> FMPZ -> Bool)
-> (FMPZ -> FMPZ -> Bool)
-> (FMPZ -> FMPZ -> Bool)
-> (FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ -> FMPZ)
-> Ord FMPZ
FMPZ -> FMPZ -> Bool
FMPZ -> FMPZ -> Ordering
FMPZ -> FMPZ -> FMPZ
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: FMPZ -> FMPZ -> FMPZ
$cmin :: FMPZ -> FMPZ -> FMPZ
max :: FMPZ -> FMPZ -> FMPZ
$cmax :: FMPZ -> FMPZ -> FMPZ
>= :: FMPZ -> FMPZ -> Bool
$c>= :: FMPZ -> FMPZ -> Bool
> :: FMPZ -> FMPZ -> Bool
$c> :: FMPZ -> FMPZ -> Bool
<= :: FMPZ -> FMPZ -> Bool
$c<= :: FMPZ -> FMPZ -> Bool
< :: FMPZ -> FMPZ -> Bool
$c< :: FMPZ -> FMPZ -> Bool
compare :: FMPZ -> FMPZ -> Ordering
$ccompare :: FMPZ -> FMPZ -> Ordering
$cp1Ord :: Eq FMPZ
Ord, Integer -> FMPZ
FMPZ -> FMPZ
FMPZ -> FMPZ -> FMPZ
(FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ)
-> (FMPZ -> FMPZ)
-> (FMPZ -> FMPZ)
-> (Integer -> FMPZ)
-> Num FMPZ
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> FMPZ
$cfromInteger :: Integer -> FMPZ
signum :: FMPZ -> FMPZ
$csignum :: FMPZ -> FMPZ
abs :: FMPZ -> FMPZ
$cabs :: FMPZ -> FMPZ
negate :: FMPZ -> FMPZ
$cnegate :: FMPZ -> FMPZ
* :: FMPZ -> FMPZ -> FMPZ
$c* :: FMPZ -> FMPZ -> FMPZ
- :: FMPZ -> FMPZ -> FMPZ
$c- :: FMPZ -> FMPZ -> FMPZ
+ :: FMPZ -> FMPZ -> FMPZ
$c+ :: FMPZ -> FMPZ -> FMPZ
Num, Num FMPZ
Ord FMPZ
Num FMPZ -> Ord FMPZ -> (FMPZ -> Rational) -> Real FMPZ
FMPZ -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: FMPZ -> Rational
$ctoRational :: FMPZ -> Rational
$cp2Real :: Ord FMPZ
$cp1Real :: Num FMPZ
Real, Int -> FMPZ
FMPZ -> Int
FMPZ -> [FMPZ]
FMPZ -> FMPZ
FMPZ -> FMPZ -> [FMPZ]
FMPZ -> FMPZ -> FMPZ -> [FMPZ]
(FMPZ -> FMPZ)
-> (FMPZ -> FMPZ)
-> (Int -> FMPZ)
-> (FMPZ -> Int)
-> (FMPZ -> [FMPZ])
-> (FMPZ -> FMPZ -> [FMPZ])
-> (FMPZ -> FMPZ -> [FMPZ])
-> (FMPZ -> FMPZ -> FMPZ -> [FMPZ])
-> Enum FMPZ
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: FMPZ -> FMPZ -> FMPZ -> [FMPZ]
$cenumFromThenTo :: FMPZ -> FMPZ -> FMPZ -> [FMPZ]
enumFromTo :: FMPZ -> FMPZ -> [FMPZ]
$cenumFromTo :: FMPZ -> FMPZ -> [FMPZ]
enumFromThen :: FMPZ -> FMPZ -> [FMPZ]
$cenumFromThen :: FMPZ -> FMPZ -> [FMPZ]
enumFrom :: FMPZ -> [FMPZ]
$cenumFrom :: FMPZ -> [FMPZ]
fromEnum :: FMPZ -> Int
$cfromEnum :: FMPZ -> Int
toEnum :: Int -> FMPZ
$ctoEnum :: Int -> FMPZ
pred :: FMPZ -> FMPZ
$cpred :: FMPZ -> FMPZ
succ :: FMPZ -> FMPZ
$csucc :: FMPZ -> FMPZ
Enum, Enum FMPZ
Real FMPZ
Real FMPZ
-> Enum FMPZ
-> (FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ -> FMPZ)
-> (FMPZ -> FMPZ -> (FMPZ, FMPZ))
-> (FMPZ -> FMPZ -> (FMPZ, FMPZ))
-> (FMPZ -> Integer)
-> Integral FMPZ
FMPZ -> Integer
FMPZ -> FMPZ -> (FMPZ, FMPZ)
FMPZ -> FMPZ -> FMPZ
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: FMPZ -> Integer
$ctoInteger :: FMPZ -> Integer
divMod :: FMPZ -> FMPZ -> (FMPZ, FMPZ)
$cdivMod :: FMPZ -> FMPZ -> (FMPZ, FMPZ)
quotRem :: FMPZ -> FMPZ -> (FMPZ, FMPZ)
$cquotRem :: FMPZ -> FMPZ -> (FMPZ, FMPZ)
mod :: FMPZ -> FMPZ -> FMPZ
$cmod :: FMPZ -> FMPZ -> FMPZ
div :: FMPZ -> FMPZ -> FMPZ
$cdiv :: FMPZ -> FMPZ -> FMPZ
rem :: FMPZ -> FMPZ -> FMPZ
$crem :: FMPZ -> FMPZ -> FMPZ
quot :: FMPZ -> FMPZ -> FMPZ
$cquot :: FMPZ -> FMPZ -> FMPZ
$cp2Integral :: Enum FMPZ
$cp1Integral :: Real FMPZ
Integral)
newtype SLong = SLong { SLong -> Int64
unSLong :: Int64 }
deriving (Ptr b -> Int -> IO SLong
Ptr b -> Int -> SLong -> IO ()
Ptr SLong -> IO SLong
Ptr SLong -> Int -> IO SLong
Ptr SLong -> Int -> SLong -> IO ()
Ptr SLong -> SLong -> IO ()
SLong -> Int
(SLong -> Int)
-> (SLong -> Int)
-> (Ptr SLong -> Int -> IO SLong)
-> (Ptr SLong -> Int -> SLong -> IO ())
-> (forall b. Ptr b -> Int -> IO SLong)
-> (forall b. Ptr b -> Int -> SLong -> IO ())
-> (Ptr SLong -> IO SLong)
-> (Ptr SLong -> SLong -> IO ())
-> Storable SLong
forall b. Ptr b -> Int -> IO SLong
forall b. Ptr b -> Int -> SLong -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
poke :: Ptr SLong -> SLong -> IO ()
$cpoke :: Ptr SLong -> SLong -> IO ()
peek :: Ptr SLong -> IO SLong
$cpeek :: Ptr SLong -> IO SLong
pokeByteOff :: Ptr b -> Int -> SLong -> IO ()
$cpokeByteOff :: forall b. Ptr b -> Int -> SLong -> IO ()
peekByteOff :: Ptr b -> Int -> IO SLong
$cpeekByteOff :: forall b. Ptr b -> Int -> IO SLong
pokeElemOff :: Ptr SLong -> Int -> SLong -> IO ()
$cpokeElemOff :: Ptr SLong -> Int -> SLong -> IO ()
peekElemOff :: Ptr SLong -> Int -> IO SLong
$cpeekElemOff :: Ptr SLong -> Int -> IO SLong
alignment :: SLong -> Int
$calignment :: SLong -> Int
sizeOf :: SLong -> Int
$csizeOf :: SLong -> Int
Storable, SLong -> SLong -> Bool
(SLong -> SLong -> Bool) -> (SLong -> SLong -> Bool) -> Eq SLong
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SLong -> SLong -> Bool
$c/= :: SLong -> SLong -> Bool
== :: SLong -> SLong -> Bool
$c== :: SLong -> SLong -> Bool
Eq, Eq SLong
Eq SLong
-> (SLong -> SLong -> Ordering)
-> (SLong -> SLong -> Bool)
-> (SLong -> SLong -> Bool)
-> (SLong -> SLong -> Bool)
-> (SLong -> SLong -> Bool)
-> (SLong -> SLong -> SLong)
-> (SLong -> SLong -> SLong)
-> Ord SLong
SLong -> SLong -> Bool
SLong -> SLong -> Ordering
SLong -> SLong -> SLong
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: SLong -> SLong -> SLong
$cmin :: SLong -> SLong -> SLong
max :: SLong -> SLong -> SLong
$cmax :: SLong -> SLong -> SLong
>= :: SLong -> SLong -> Bool
$c>= :: SLong -> SLong -> Bool
> :: SLong -> SLong -> Bool
$c> :: SLong -> SLong -> Bool
<= :: SLong -> SLong -> Bool
$c<= :: SLong -> SLong -> Bool
< :: SLong -> SLong -> Bool
$c< :: SLong -> SLong -> Bool
compare :: SLong -> SLong -> Ordering
$ccompare :: SLong -> SLong -> Ordering
$cp1Ord :: Eq SLong
Ord, Integer -> SLong
SLong -> SLong
SLong -> SLong -> SLong
(SLong -> SLong -> SLong)
-> (SLong -> SLong -> SLong)
-> (SLong -> SLong -> SLong)
-> (SLong -> SLong)
-> (SLong -> SLong)
-> (SLong -> SLong)
-> (Integer -> SLong)
-> Num SLong
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
fromInteger :: Integer -> SLong
$cfromInteger :: Integer -> SLong
signum :: SLong -> SLong
$csignum :: SLong -> SLong
abs :: SLong -> SLong
$cabs :: SLong -> SLong
negate :: SLong -> SLong
$cnegate :: SLong -> SLong
* :: SLong -> SLong -> SLong
$c* :: SLong -> SLong -> SLong
- :: SLong -> SLong -> SLong
$c- :: SLong -> SLong -> SLong
+ :: SLong -> SLong -> SLong
$c+ :: SLong -> SLong -> SLong
Num, Num SLong
Ord SLong
Num SLong -> Ord SLong -> (SLong -> Rational) -> Real SLong
SLong -> Rational
forall a. Num a -> Ord a -> (a -> Rational) -> Real a
toRational :: SLong -> Rational
$ctoRational :: SLong -> Rational
$cp2Real :: Ord SLong
$cp1Real :: Num SLong
Real, Int -> SLong
SLong -> Int
SLong -> [SLong]
SLong -> SLong
SLong -> SLong -> [SLong]
SLong -> SLong -> SLong -> [SLong]
(SLong -> SLong)
-> (SLong -> SLong)
-> (Int -> SLong)
-> (SLong -> Int)
-> (SLong -> [SLong])
-> (SLong -> SLong -> [SLong])
-> (SLong -> SLong -> [SLong])
-> (SLong -> SLong -> SLong -> [SLong])
-> Enum SLong
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: SLong -> SLong -> SLong -> [SLong]
$cenumFromThenTo :: SLong -> SLong -> SLong -> [SLong]
enumFromTo :: SLong -> SLong -> [SLong]
$cenumFromTo :: SLong -> SLong -> [SLong]
enumFromThen :: SLong -> SLong -> [SLong]
$cenumFromThen :: SLong -> SLong -> [SLong]
enumFrom :: SLong -> [SLong]
$cenumFrom :: SLong -> [SLong]
fromEnum :: SLong -> Int
$cfromEnum :: SLong -> Int
toEnum :: Int -> SLong
$ctoEnum :: Int -> SLong
pred :: SLong -> SLong
$cpred :: SLong -> SLong
succ :: SLong -> SLong
$csucc :: SLong -> SLong
Enum, Enum SLong
Real SLong
Real SLong
-> Enum SLong
-> (SLong -> SLong -> SLong)
-> (SLong -> SLong -> SLong)
-> (SLong -> SLong -> SLong)
-> (SLong -> SLong -> SLong)
-> (SLong -> SLong -> (SLong, SLong))
-> (SLong -> SLong -> (SLong, SLong))
-> (SLong -> Integer)
-> Integral SLong
SLong -> Integer
SLong -> SLong -> (SLong, SLong)
SLong -> SLong -> SLong
forall a.
Real a
-> Enum a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
toInteger :: SLong -> Integer
$ctoInteger :: SLong -> Integer
divMod :: SLong -> SLong -> (SLong, SLong)
$cdivMod :: SLong -> SLong -> (SLong, SLong)
quotRem :: SLong -> SLong -> (SLong, SLong)
$cquotRem :: SLong -> SLong -> (SLong, SLong)
mod :: SLong -> SLong -> SLong
$cmod :: SLong -> SLong -> SLong
div :: SLong -> SLong -> SLong
$cdiv :: SLong -> SLong -> SLong
rem :: SLong -> SLong -> SLong
$crem :: SLong -> SLong -> SLong
quot :: SLong -> SLong -> SLong
$cquot :: SLong -> SLong -> SLong
$cp2Integral :: Enum SLong
$cp1Integral :: Real SLong
Integral)
data FMPZMat
instance Storable FMPZMat where
sizeOf :: FMPZMat -> Int
sizeOf FMPZMat
_ =
Ptr Any -> Int
forall a. Storable a => a -> Int
sizeOf Ptr Any
forall a. Ptr a
nullPtr
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ SLong -> Int
forall a. Storable a => a -> Int
sizeOf (SLong
forall a. HasCallStack => a
undefined :: SLong)
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ SLong -> Int
forall a. Storable a => a -> Int
sizeOf (SLong
forall a. HasCallStack => a
undefined :: SLong)
Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Ptr Any -> Int
forall a. Storable a => a -> Int
sizeOf Ptr Any
forall a. Ptr a
nullPtr
alignment :: FMPZMat -> Int
alignment FMPZMat
_ = SLong -> Int
forall a. Storable a => a -> Int
alignment (SLong
forall a. HasCallStack => a
undefined :: SLong)
peek :: Ptr FMPZMat -> IO FMPZMat
peek Ptr FMPZMat
_ = IO FMPZMat
forall a. HasCallStack => a
undefined
poke :: Ptr FMPZMat -> FMPZMat -> IO ()
poke Ptr FMPZMat
_ = FMPZMat -> IO ()
forall a. HasCallStack => a
undefined
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_init" fmpz_mat_init :: Ptr FMPZMat -> SLong -> SLong -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_set" fmpz_mat_set :: Ptr FMPZMat -> Ptr FMPZMat -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_entry" fmpz_mat_entry :: Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
foreign import ccall unsafe "flint/fmpz.h fmpz_set_si" fmpz_set_si :: Ptr FMPZ -> SLong -> IO ()
foreign import ccall unsafe "flint/fmpz.h fmpz_get_si" fmpz_get_si :: Ptr FMPZ -> IO SLong
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_clear" fmpz_mat_clear :: Ptr FMPZMat -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_print_pretty" fmpz_mat_print_pretty :: Ptr FMPZMat -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_mul" fmpz_mat_mul :: Ptr FMPZMat -> Ptr FMPZMat -> Ptr FMPZMat -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_window_init" fmpz_mat_window_init :: Ptr FMPZMat -> Ptr FMPZMat -> SLong -> SLong -> SLong -> SLong -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_window_clear" fmpz_mat_window_clear :: Ptr FMPZMat -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_rref" fmpz_mat_rref :: Ptr FMPZMat -> Ptr FMPZ -> Ptr FMPZMat -> IO SLong
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_inv" fmpz_mat_inv :: Ptr FMPZMat -> Ptr FMPZ -> Ptr FMPZMat -> IO CInt
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_hnf" fmpz_mat_hnf :: Ptr FMPZMat -> Ptr FMPZMat -> IO ()
foreign import ccall unsafe "flint/fmpz_mat.h fmpz_mat_rank" fmpz_mat_rank :: Ptr FMPZMat -> IO SLong
rref :: H.Matrix Double -> (H.Matrix Double, Int, Int)
rref :: Matrix Double -> (Matrix Double, Int, Int)
rref Matrix Double
m = IO (Matrix Double, Int, Int) -> (Matrix Double, Int, Int)
forall a. IO a -> a
unsafePerformIO (IO (Matrix Double, Int, Int) -> (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int) -> (Matrix Double, Int, Int)
forall a b. (a -> b) -> a -> b
$ do
(Ptr FMPZMat -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int))
-> (Ptr FMPZMat -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int)
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM -> do
(Ptr FMPZMat -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int))
-> (Ptr FMPZMat -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int)
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
inputM -> do
(Ptr FMPZ -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZ -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int))
-> (Ptr FMPZ -> IO (Matrix Double, Int, Int))
-> IO (Matrix Double, Int, Int)
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZ
den -> do
let numRows :: SLong
numRows = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
rows Matrix Double
m
let numCols :: SLong
numCols = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
cols Matrix Double
m
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
outputM SLong
numRows SLong
numCols
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
inputM SLong
numRows SLong
numCols
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0..SLong
numRowsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
inputM SLong
i SLong
j
Ptr FMPZ -> SLong -> IO ()
fmpz_set_si Ptr FMPZ
e (Double -> SLong
forall a b. (RealFrac a, Integral b) => a -> b
floor (Matrix Double
m Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
i, SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
j)))
SLong
r <- Ptr FMPZMat -> Ptr FMPZ -> Ptr FMPZMat -> IO SLong
fmpz_mat_rref Ptr FMPZMat
outputM Ptr FMPZ
den Ptr FMPZMat
inputM
FMPZ
d <- Ptr FMPZ -> IO FMPZ
forall a. Storable a => Ptr a -> IO a
peek Ptr FMPZ
den
[[Double]]
lists <- [SLong] -> (SLong -> IO [Double]) -> IO [[Double]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong
numRowsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO [Double]) -> IO [[Double]])
-> (SLong -> IO [Double]) -> IO [[Double]]
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
[SLong] -> (SLong -> IO Double) -> IO [Double]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO Double) -> IO [Double])
-> (SLong -> IO Double) -> IO [Double]
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
outputM SLong
i SLong
j
SLong -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SLong -> Double) -> IO SLong -> IO Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr FMPZ -> IO SLong
fmpz_get_si Ptr FMPZ
e
let m' :: Matrix Double
m' = [[Double]] -> Matrix Double
forall t. Element t => [[t]] -> Matrix t
H.fromLists [[Double]]
lists
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
inputM
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
outputM
(Matrix Double, Int, Int) -> IO (Matrix Double, Int, Int)
forall (m :: * -> *) a. Monad m => a -> m a
return (Matrix Double
m', FMPZ -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral FMPZ
d, SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
r)
hnf :: H.Matrix Double -> H.Matrix Double
hnf :: Matrix Double -> Matrix Double
hnf Matrix Double
m = IO (Matrix Double) -> Matrix Double
forall a. IO a -> a
unsafePerformIO (IO (Matrix Double) -> Matrix Double)
-> IO (Matrix Double) -> Matrix Double
forall a b. (a -> b) -> a -> b
$ do
(Ptr FMPZMat -> IO (Matrix Double)) -> IO (Matrix Double)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO (Matrix Double)) -> IO (Matrix Double))
-> (Ptr FMPZMat -> IO (Matrix Double)) -> IO (Matrix Double)
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM -> do
(Ptr FMPZMat -> IO (Matrix Double)) -> IO (Matrix Double)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO (Matrix Double)) -> IO (Matrix Double))
-> (Ptr FMPZMat -> IO (Matrix Double)) -> IO (Matrix Double)
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
inputM -> do
let numRows :: SLong
numRows = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
rows Matrix Double
m
let numCols :: SLong
numCols = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
cols Matrix Double
m
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
outputM SLong
numRows SLong
numCols
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
inputM SLong
numRows SLong
numCols
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0..SLong
numRowsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
inputM SLong
i SLong
j
Ptr FMPZ -> SLong -> IO ()
fmpz_set_si Ptr FMPZ
e (Double -> SLong
forall a b. (RealFrac a, Integral b) => a -> b
floor (Matrix Double
m Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
i, SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
j)))
Ptr FMPZMat -> Ptr FMPZMat -> IO ()
fmpz_mat_hnf Ptr FMPZMat
outputM Ptr FMPZMat
inputM
SLong
r <- Ptr FMPZMat -> IO SLong
fmpz_mat_rank Ptr FMPZMat
outputM
[[Double]]
lists <- [SLong] -> (SLong -> IO [Double]) -> IO [[Double]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
rSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO [Double]) -> IO [[Double]])
-> (SLong -> IO [Double]) -> IO [[Double]]
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
[SLong] -> (SLong -> IO Double) -> IO [Double]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO Double) -> IO [Double])
-> (SLong -> IO Double) -> IO [Double]
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
outputM SLong
i SLong
j
SLong -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SLong -> Double) -> IO SLong -> IO Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr FMPZ -> IO SLong
fmpz_get_si Ptr FMPZ
e
let m' :: Matrix Double
m' = [[Double]] -> Matrix Double
forall t. Element t => [[t]] -> Matrix t
H.fromLists [[Double]]
lists
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
inputM
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
outputM
Matrix Double -> IO (Matrix Double)
forall (m :: * -> *) a. Monad m => a -> m a
return Matrix Double
m'
inv :: H.Matrix Double -> Maybe (H.Matrix Double, Int)
inv :: Matrix Double -> Maybe (Matrix Double, Int)
inv Matrix Double
m = IO (Maybe (Matrix Double, Int)) -> Maybe (Matrix Double, Int)
forall a. IO a -> a
unsafePerformIO (IO (Maybe (Matrix Double, Int)) -> Maybe (Matrix Double, Int))
-> IO (Maybe (Matrix Double, Int)) -> Maybe (Matrix Double, Int)
forall a b. (a -> b) -> a -> b
$ do
(Ptr FMPZMat -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int)))
-> (Ptr FMPZMat -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int))
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM -> do
(Ptr FMPZMat -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int)))
-> (Ptr FMPZMat -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int))
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
inputM -> do
(Ptr FMPZ -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZ -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int)))
-> (Ptr FMPZ -> IO (Maybe (Matrix Double, Int)))
-> IO (Maybe (Matrix Double, Int))
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZ
den -> do
let numRows :: SLong
numRows = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
rows Matrix Double
m
let numCols :: SLong
numCols = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
cols Matrix Double
m
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
outputM SLong
numRows SLong
numCols
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
inputM SLong
numRows SLong
numCols
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0..SLong
numRowsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
inputM SLong
i SLong
j
Ptr FMPZ -> SLong -> IO ()
fmpz_set_si Ptr FMPZ
e (Double -> SLong
forall a b. (RealFrac a, Integral b) => a -> b
floor (Matrix Double
m Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
i, SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
j)))
CInt
r <- Ptr FMPZMat -> Ptr FMPZ -> Ptr FMPZMat -> IO CInt
fmpz_mat_inv Ptr FMPZMat
outputM Ptr FMPZ
den Ptr FMPZMat
inputM
FMPZ
d <- Ptr FMPZ -> IO FMPZ
forall a. Storable a => Ptr a -> IO a
peek Ptr FMPZ
den
Ptr FMPZMat -> IO ()
fmpz_mat_print_pretty Ptr FMPZMat
outputM
[[Double]]
lists <- [SLong] -> (SLong -> IO [Double]) -> IO [[Double]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong
numRowsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO [Double]) -> IO [[Double]])
-> (SLong -> IO [Double]) -> IO [[Double]]
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
[SLong] -> (SLong -> IO Double) -> IO [Double]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO Double) -> IO [Double])
-> (SLong -> IO Double) -> IO [Double]
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
outputM SLong
i SLong
j
SLong -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SLong -> Double) -> IO SLong -> IO Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr FMPZ -> IO SLong
fmpz_get_si Ptr FMPZ
e
let m' :: Matrix Double
m' = [[Double]] -> Matrix Double
forall t. Element t => [[t]] -> Matrix t
H.fromLists [[Double]]
lists
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
inputM
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
outputM
if CInt
r CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
1 then
Maybe (Matrix Double, Int) -> IO (Maybe (Matrix Double, Int))
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (Matrix Double, Int) -> IO (Maybe (Matrix Double, Int)))
-> Maybe (Matrix Double, Int) -> IO (Maybe (Matrix Double, Int))
forall a b. (a -> b) -> a -> b
$ (Matrix Double, Int) -> Maybe (Matrix Double, Int)
forall a. a -> Maybe a
Just (Matrix Double
m', FMPZ -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral FMPZ
d)
else
Maybe (Matrix Double, Int) -> IO (Maybe (Matrix Double, Int))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (Matrix Double, Int)
forall a. Maybe a
Nothing
withMatrix :: H.Matrix Double -> ((SLong, SLong, Ptr FMPZMat) -> IO b) -> IO b
withMatrix :: Matrix Double -> ((SLong, SLong, Ptr FMPZMat) -> IO b) -> IO b
withMatrix Matrix Double
m (SLong, SLong, Ptr FMPZMat) -> IO b
f = do
(Ptr FMPZMat -> IO b) -> IO b
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO b) -> IO b) -> (Ptr FMPZMat -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM -> do
let numRows :: SLong
numRows = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
rows Matrix Double
m
let numCols :: SLong
numCols = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> SLong) -> Int -> SLong
forall a b. (a -> b) -> a -> b
$ Matrix Double -> Int
forall t. Matrix t -> Int
cols Matrix Double
m
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
outputM SLong
numRows SLong
numCols
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0 .. SLong
numRows SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
- SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
i ->
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0 .. SLong
numCols SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
- SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
outputM SLong
i SLong
j
Ptr FMPZ -> SLong -> IO ()
fmpz_set_si Ptr FMPZ
e (Double -> SLong
forall a b. (RealFrac a, Integral b) => a -> b
floor (Matrix Double
m Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
i, SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
j)) :: SLong)
b
x <- (SLong, SLong, Ptr FMPZMat) -> IO b
f (SLong
numRows, SLong
numCols, Ptr FMPZMat
outputM)
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
outputM
b -> IO b
forall (m :: * -> *) a. Monad m => a -> m a
return b
x
withBlankMatrix :: SLong -> SLong -> (Ptr FMPZMat -> IO b) -> IO b
withBlankMatrix :: SLong -> SLong -> (Ptr FMPZMat -> IO b) -> IO b
withBlankMatrix SLong
numRows SLong
numCols Ptr FMPZMat -> IO b
f = do
(Ptr FMPZMat -> IO b) -> IO b
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO b) -> IO b) -> (Ptr FMPZMat -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM -> do
Ptr FMPZMat -> SLong -> SLong -> IO ()
fmpz_mat_init Ptr FMPZMat
outputM (SLong -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
numRows) (SLong -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral SLong
numCols)
b
x <- Ptr FMPZMat -> IO b
f Ptr FMPZMat
outputM
Ptr FMPZMat -> IO ()
fmpz_mat_clear Ptr FMPZMat
outputM
b -> IO b
forall (m :: * -> *) a. Monad m => a -> m a
return b
x
withWindow :: Ptr FMPZMat -> SLong -> SLong -> SLong -> SLong -> (Ptr FMPZMat -> IO b) -> IO b
withWindow :: Ptr FMPZMat
-> SLong
-> SLong
-> SLong
-> SLong
-> (Ptr FMPZMat -> IO b)
-> IO b
withWindow Ptr FMPZMat
underM SLong
r1 SLong
c1 SLong
r2 SLong
c2 Ptr FMPZMat -> IO b
f = do
(Ptr FMPZMat -> IO b) -> IO b
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr FMPZMat -> IO b) -> IO b) -> (Ptr FMPZMat -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
window -> do
Ptr FMPZMat
-> Ptr FMPZMat -> SLong -> SLong -> SLong -> SLong -> IO ()
fmpz_mat_window_init Ptr FMPZMat
window Ptr FMPZMat
underM SLong
r1 SLong
c1 SLong
r2 SLong
c2
b
x <- Ptr FMPZMat -> IO b
f Ptr FMPZMat
window
Ptr FMPZMat -> IO ()
fmpz_mat_window_clear Ptr FMPZMat
window
b -> IO b
forall (m :: * -> *) a. Monad m => a -> m a
return b
x
flintToHMatrix :: SLong -> SLong -> Ptr FMPZMat -> IO (H.Matrix Double)
flintToHMatrix :: SLong -> SLong -> Ptr FMPZMat -> IO (Matrix Double)
flintToHMatrix SLong
numRows SLong
numCols Ptr FMPZMat
flintM = do
[[Double]]
lists <- [SLong] -> (SLong -> IO [Double]) -> IO [[Double]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong
numRowsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO [Double]) -> IO [[Double]])
-> (SLong -> IO [Double]) -> IO [[Double]]
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
[SLong] -> (SLong -> IO Double) -> IO [Double]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO Double) -> IO [Double])
-> (SLong -> IO Double) -> IO [Double]
forall a b. (a -> b) -> a -> b
$ \ SLong
j -> do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
flintM SLong
i SLong
j
SLong -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SLong -> Double) -> IO SLong -> IO Double
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` Ptr FMPZ -> IO SLong
fmpz_get_si Ptr FMPZ
e
Matrix Double -> IO (Matrix Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Matrix Double -> IO (Matrix Double))
-> Matrix Double -> IO (Matrix Double)
forall a b. (a -> b) -> a -> b
$ [[Double]] -> Matrix Double
forall t. Element t => [[t]] -> Matrix t
H.fromLists [[Double]]
lists
pokeM :: Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM :: Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM Ptr FMPZMat
flintM SLong
i SLong
j SLong
v = do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
flintM SLong
i SLong
j
Ptr FMPZ -> SLong -> IO ()
fmpz_set_si Ptr FMPZ
e SLong
v
peekM :: Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM :: Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
flintM SLong
i SLong
j = do
Ptr FMPZ
e <- Ptr FMPZMat -> SLong -> SLong -> IO (Ptr FMPZ)
fmpz_mat_entry Ptr FMPZMat
flintM SLong
i SLong
j
Ptr FMPZ -> IO SLong
fmpz_get_si Ptr FMPZ
e
copyMatrix :: Ptr FMPZMat -> Ptr FMPZMat -> SLong -> SLong -> SLong -> SLong -> IO ()
copyMatrix :: Ptr FMPZMat
-> Ptr FMPZMat -> SLong -> SLong -> SLong -> SLong -> IO ()
copyMatrix Ptr FMPZMat
m1 Ptr FMPZMat
m2 SLong
r1 SLong
c1 SLong
r2 SLong
c2 =
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
r1 .. SLong
r2SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
i ->
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
c1 .. SLong
c2SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j ->
Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
m2 SLong
i SLong
j IO SLong -> (SLong -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM Ptr FMPZMat
m1 SLong
i SLong
j
normHNF :: H.Matrix Double -> (H.Matrix Double, [Int])
normHNF :: Matrix Double -> (Matrix Double, [Int])
normHNF Matrix Double
m
| (Matrix Double -> Int
forall t. Matrix t -> Int
rows Matrix Double
m, Matrix Double -> Int
forall t. Matrix t -> Int
cols Matrix Double
m) (Int, Int) -> (Int, Int) -> Bool
forall a. Eq a => a -> a -> Bool
== (Int
1, Int
1) = (Int -> Matrix Double
forall a. (Num a, Element a) => Int -> Matrix a
H.ident (if Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
H.atIndex Matrix Double
m (Int
0, Int
0) Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
/= Double
0 then Int
1 else Int
0), [])
| Bool
otherwise = (Matrix Double
m', [Int]
indices)
where
numCols :: Int
numCols = Matrix Double -> Int
forall t. Matrix t -> Int
cols Matrix Double
m
indexLookup :: Int -> Int
indexLookup Int
j | Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
numCols = Int
j
| Bool
otherwise = [Int]
indices [Int] -> Int -> Int
forall a. [a] -> Int -> a
!! (Int
j Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
numCols)
indices :: [Int]
indices = (Int -> Int) -> [Int] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map Int -> Int
indexLookup ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ ((Matrix Double, [Int]) -> [Int])
-> [(Matrix Double, [Int])] -> [Int]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Matrix Double, [Int]) -> [Int]
forall a b. (a, b) -> b
snd [(Matrix Double, [Int])]
rs1
([(Matrix Double, [Int])]
rs1, (Matrix Double
m',[]):[(Matrix Double, [Int])]
_) = ((Matrix Double, [Int]) -> Bool)
-> [(Matrix Double, [Int])]
-> ([(Matrix Double, [Int])], [(Matrix Double, [Int])])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break ([Int] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([Int] -> Bool)
-> ((Matrix Double, [Int]) -> [Int])
-> (Matrix Double, [Int])
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Matrix Double, [Int]) -> [Int]
forall a b. (a, b) -> b
snd) [(Matrix Double, [Int])]
results
results :: [(Matrix Double, [Int])]
results = [(Matrix Double, [Int])] -> [(Matrix Double, [Int])]
forall a. [a] -> [a]
tail ([(Matrix Double, [Int])] -> [(Matrix Double, [Int])])
-> [(Matrix Double, [Int])] -> [(Matrix Double, [Int])]
forall a b. (a -> b) -> a -> b
$ ((Matrix Double, [Int]) -> (Matrix Double, [Int]))
-> (Matrix Double, [Int]) -> [(Matrix Double, [Int])]
forall a. (a -> a) -> a -> [a]
iterate (Matrix Double -> (Matrix Double, [Int])
normHNF' (Matrix Double -> (Matrix Double, [Int]))
-> ((Matrix Double, [Int]) -> Matrix Double)
-> (Matrix Double, [Int])
-> (Matrix Double, [Int])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Matrix Double, [Int]) -> Matrix Double
forall a b. (a, b) -> a
fst) (Matrix Double
m, [])
normHNF' :: H.Matrix Double -> (H.Matrix Double, [Int])
normHNF' :: Matrix Double -> (Matrix Double, [Int])
normHNF' Matrix Double
m = ([SLong] -> [Int])
-> (Matrix Double, [SLong]) -> (Matrix Double, [Int])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((SLong -> Int) -> [SLong] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map SLong -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral) ((Matrix Double, [SLong]) -> (Matrix Double, [Int]))
-> (IO (Matrix Double, [SLong]) -> (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
-> (Matrix Double, [Int])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (Matrix Double, [SLong]) -> (Matrix Double, [SLong])
forall a. IO a -> a
unsafePerformIO (IO (Matrix Double, [SLong]) -> (Matrix Double, [Int]))
-> IO (Matrix Double, [SLong]) -> (Matrix Double, [Int])
forall a b. (a -> b) -> a -> b
$ Matrix Double
-> ((SLong, SLong, Ptr FMPZMat) -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
forall b.
Matrix Double -> ((SLong, SLong, Ptr FMPZMat) -> IO b) -> IO b
withMatrix Matrix Double
m (SLong, SLong, Ptr FMPZMat) -> IO (Matrix Double, [SLong])
normhnf
normhnf :: (SLong, SLong, Ptr FMPZMat) -> IO (H.Matrix Double, [SLong])
normhnf :: (SLong, SLong, Ptr FMPZMat) -> IO (Matrix Double, [SLong])
normhnf (SLong
numRows, SLong
numCols, Ptr FMPZMat
inputM) = do
SLong
-> SLong
-> (Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
forall b. SLong -> SLong -> (Ptr FMPZMat -> IO b) -> IO b
withBlankMatrix SLong
numRows SLong
numCols ((Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong]))
-> (Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM -> do
Ptr FMPZMat -> Ptr FMPZMat -> IO ()
fmpz_mat_hnf Ptr FMPZMat
outputM Ptr FMPZMat
inputM
SLong
rank <- Ptr FMPZMat -> IO SLong
fmpz_mat_rank Ptr FMPZMat
outputM
[(SLong, SLong)]
indices <- Ptr FMPZMat -> SLong -> SLong -> IO [(SLong, SLong)]
elemrowscale Ptr FMPZMat
outputM SLong
rank SLong
numCols
Ptr FMPZMat -> SLong -> SLong -> [(SLong, SLong)] -> IO ()
elemrowadds Ptr FMPZMat
outputM SLong
rank SLong
numCols [(SLong, SLong)]
indices
[((SLong, SLong), [SLong])]
lcoefs <- (((SLong, SLong), [SLong]) -> Bool)
-> [((SLong, SLong), [SLong])] -> [((SLong, SLong), [SLong])]
forall a. (a -> Bool) -> [a] -> [a]
filter ((SLong -> SLong -> Bool
forall a. Ord a => a -> a -> Bool
> SLong
1) (SLong -> Bool)
-> (((SLong, SLong), [SLong]) -> SLong)
-> ((SLong, SLong), [SLong])
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SLong] -> SLong
forall a. [a] -> a
head ([SLong] -> SLong)
-> (((SLong, SLong), [SLong]) -> [SLong])
-> ((SLong, SLong), [SLong])
-> SLong
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((SLong, SLong), [SLong]) -> [SLong]
forall a b. (a, b) -> b
snd) ([((SLong, SLong), [SLong])] -> [((SLong, SLong), [SLong])])
-> IO [((SLong, SLong), [SLong])] -> IO [((SLong, SLong), [SLong])]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [SLong]
-> (SLong -> IO ((SLong, SLong), [SLong]))
-> IO [((SLong, SLong), [SLong])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0 .. SLong
rankSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] (\ SLong
i -> do
[(SLong, SLong)]
cs <- [SLong] -> [SLong] -> [(SLong, SLong)]
forall a b. [a] -> [b] -> [(a, b)]
zip [SLong
0..] ([SLong] -> [(SLong, SLong)]) -> IO [SLong] -> IO [(SLong, SLong)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` [IO SLong] -> IO [SLong]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [ Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
outputM SLong
i SLong
j | SLong
j <- [SLong
0 .. SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ]
let ([(SLong, SLong)]
_, (SLong
j, SLong
lcoef):[(SLong, SLong)]
rest) = ((SLong, SLong) -> Bool)
-> [(SLong, SLong)] -> ([(SLong, SLong)], [(SLong, SLong)])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span ((SLong -> SLong -> Bool
forall a. Eq a => a -> a -> Bool
== SLong
0) (SLong -> Bool)
-> ((SLong, SLong) -> SLong) -> (SLong, SLong) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SLong, SLong) -> SLong
forall a b. (a, b) -> b
snd) [(SLong, SLong)]
cs
((SLong, SLong), [SLong]) -> IO ((SLong, SLong), [SLong])
forall (m :: * -> *) a. Monad m => a -> m a
return ((SLong
i, SLong
j), SLong
lcoefSLong -> [SLong] -> [SLong]
forall a. a -> [a] -> [a]
:((SLong, SLong) -> SLong) -> [(SLong, SLong)] -> [SLong]
forall a b. (a -> b) -> [a] -> [b]
map (SLong, SLong) -> SLong
forall a b. (a, b) -> b
snd [(SLong, SLong)]
rest))
let ([((SLong, SLong), [SLong])]
multCands, [((SLong, SLong), [SLong])]
consCands) = (((SLong, SLong), [SLong]) -> Bool)
-> [((SLong, SLong), [SLong])]
-> ([((SLong, SLong), [SLong])], [((SLong, SLong), [SLong])])
forall a. (a -> Bool) -> [a] -> ([a], [a])
partition (\ ((SLong, SLong)
_, SLong
lcoef:[SLong]
rest) -> (SLong -> Bool) -> [SLong] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ((SLong -> SLong -> Bool
forall a. Eq a => a -> a -> Bool
== SLong
0) (SLong -> Bool) -> (SLong -> SLong) -> SLong -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SLong -> SLong -> SLong
forall a. Integral a => a -> a -> a
`rem` SLong
lcoef)) [SLong]
rest) [((SLong, SLong), [SLong])]
lcoefs
[((SLong, SLong), [SLong])]
-> (((SLong, SLong), [SLong]) -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [((SLong, SLong), [SLong])]
multCands ((((SLong, SLong), [SLong]) -> IO ()) -> IO ())
-> (((SLong, SLong), [SLong]) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ ((SLong
i, SLong
j), SLong
lcoef:[SLong]
_) ->
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
j..SLong
numCols SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
- SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j' -> do
SLong
x <- Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
outputM SLong
i SLong
j'
Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM Ptr FMPZMat
outputM SLong
i SLong
j' (SLong -> IO ()) -> SLong -> IO ()
forall a b. (a -> b) -> a -> b
$ SLong
x SLong -> SLong -> SLong
forall a. Integral a => a -> a -> a
`div` SLong
lcoef
let genColCons :: ((a, a), [b]) -> (a, b)
genColCons ((a
_, a
j), b
lcoef:[b]
rest) = (a
j, b
minNLcoef b -> b -> b
forall a. Integral a => a -> a -> a
`div` b -> b -> b
forall a. Integral a => a -> a -> a
gcd b
lcoef b
minNLcoef)
where
restABS :: [b]
restABS = (b -> b) -> [b] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map b -> b
forall a. Num a => a -> a
abs [b]
rest
minNLcoef :: b
minNLcoef = [b] -> b
forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a
minimum ((b -> Bool) -> [b] -> [b]
forall a. (a -> Bool) -> [a] -> [a]
filter (b -> b -> Bool
forall a. Eq a => a -> a -> Bool
/= b
0) [b]
restABS)
genColCons ((a, a), [b])
_ = [Char] -> (a, b)
forall a. HasCallStack => [Char] -> a
error [Char]
"normhnf: genColCons: impossible: missing leading co-efficient"
let consCols :: [(SLong, SLong)]
consCols = (((SLong, SLong), [SLong]) -> (SLong, SLong))
-> [((SLong, SLong), [SLong])] -> [(SLong, SLong)]
forall a b. (a -> b) -> [a] -> [b]
map ((SLong, SLong), [SLong]) -> (SLong, SLong)
forall b a a. Integral b => ((a, a), [b]) -> (a, b)
genColCons [((SLong, SLong), [SLong])]
consCands
let ops :: [Ptr FMPZMat -> SLong -> IO ()]
ops = [ \ Ptr FMPZMat
flintM SLong
i -> do Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM Ptr FMPZMat
flintM SLong
i SLong
j SLong
1
Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM Ptr FMPZMat
flintM SLong
i (SLong
numCols SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
+ SLong
k) (-SLong
d)
| ((SLong
j, SLong
d), SLong
k) <- [(SLong, SLong)] -> [SLong] -> [((SLong, SLong), SLong)]
forall a b. [a] -> [b] -> [(a, b)]
zip [(SLong, SLong)]
consCols [SLong
0..] ]
let numOps :: SLong
numOps = Int -> SLong
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Ptr FMPZMat -> SLong -> IO ()] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Ptr FMPZMat -> SLong -> IO ()]
ops)
let numRows' :: SLong
numRows' = SLong
numOps SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
+ SLong
rank
let numCols' :: SLong
numCols' = SLong
numOps SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
+ SLong
numCols
SLong
-> SLong
-> (Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
forall b. SLong -> SLong -> (Ptr FMPZMat -> IO b) -> IO b
withBlankMatrix SLong
numRows' SLong
numCols' ((Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong]))
-> (Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM' -> do
Ptr FMPZMat
-> Ptr FMPZMat -> SLong -> SLong -> SLong -> SLong -> IO ()
copyMatrix Ptr FMPZMat
outputM' Ptr FMPZMat
outputM SLong
0 SLong
0 SLong
rank SLong
numCols
[(SLong, Ptr FMPZMat -> SLong -> IO ())]
-> ((SLong, Ptr FMPZMat -> SLong -> IO ()) -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ ([SLong]
-> [Ptr FMPZMat -> SLong -> IO ()]
-> [(SLong, Ptr FMPZMat -> SLong -> IO ())]
forall a b. [a] -> [b] -> [(a, b)]
zip [SLong
rank..] [Ptr FMPZMat -> SLong -> IO ()]
ops) (((SLong, Ptr FMPZMat -> SLong -> IO ()) -> IO ()) -> IO ())
-> ((SLong, Ptr FMPZMat -> SLong -> IO ()) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ (SLong
i, Ptr FMPZMat -> SLong -> IO ()
op) -> Ptr FMPZMat -> SLong -> IO ()
op Ptr FMPZMat
outputM' SLong
i
SLong
-> SLong
-> (Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
forall b. SLong -> SLong -> (Ptr FMPZMat -> IO b) -> IO b
withBlankMatrix SLong
numRows' SLong
numCols' ((Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong]))
-> (Ptr FMPZMat -> IO (Matrix Double, [SLong]))
-> IO (Matrix Double, [SLong])
forall a b. (a -> b) -> a -> b
$ \ Ptr FMPZMat
outputM'' -> do
Ptr FMPZMat -> Ptr FMPZMat -> IO ()
fmpz_mat_hnf Ptr FMPZMat
outputM'' Ptr FMPZMat
outputM'
SLong
rank' <- Ptr FMPZMat -> IO SLong
fmpz_mat_rank Ptr FMPZMat
outputM''
[(SLong, SLong)]
indices' <- Ptr FMPZMat -> SLong -> SLong -> IO [(SLong, SLong)]
elemrowscale Ptr FMPZMat
outputM'' SLong
rank' SLong
numCols'
Ptr FMPZMat -> SLong -> SLong -> [(SLong, SLong)] -> IO ()
elemrowadds Ptr FMPZMat
outputM'' SLong
rank' SLong
numCols' [(SLong, SLong)]
indices'
Matrix Double
h <- SLong -> SLong -> Ptr FMPZMat -> IO (Matrix Double)
flintToHMatrix SLong
rank' SLong
numCols' Ptr FMPZMat
outputM''
(Matrix Double, [SLong]) -> IO (Matrix Double, [SLong])
forall (m :: * -> *) a. Monad m => a -> m a
return (Matrix Double
h, ((SLong, SLong) -> SLong) -> [(SLong, SLong)] -> [SLong]
forall a b. (a -> b) -> [a] -> [b]
map (SLong, SLong) -> SLong
forall a b. (a, b) -> a
fst [(SLong, SLong)]
consCols)
elemrowscale :: Ptr FMPZMat -> SLong -> SLong -> IO [(SLong, SLong)]
elemrowscale :: Ptr FMPZMat -> SLong -> SLong -> IO [(SLong, SLong)]
elemrowscale Ptr FMPZMat
outputM SLong
rank SLong
numCols = do
[((SLong, SLong), [SLong])]
lcoefs <- (((SLong, SLong), [SLong]) -> Bool)
-> [((SLong, SLong), [SLong])] -> [((SLong, SLong), [SLong])]
forall a. (a -> Bool) -> [a] -> [a]
filter ((SLong -> SLong -> Bool
forall a. Ord a => a -> a -> Bool
> SLong
1) (SLong -> Bool)
-> (((SLong, SLong), [SLong]) -> SLong)
-> ((SLong, SLong), [SLong])
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SLong] -> SLong
forall a. [a] -> a
head ([SLong] -> SLong)
-> (((SLong, SLong), [SLong]) -> [SLong])
-> ((SLong, SLong), [SLong])
-> SLong
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((SLong, SLong), [SLong]) -> [SLong]
forall a b. (a, b) -> b
snd) ([((SLong, SLong), [SLong])] -> [((SLong, SLong), [SLong])])
-> IO [((SLong, SLong), [SLong])] -> IO [((SLong, SLong), [SLong])]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [SLong]
-> (SLong -> IO ((SLong, SLong), [SLong]))
-> IO [((SLong, SLong), [SLong])]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [SLong
0 .. SLong
rankSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] (\ SLong
i -> do
[(SLong, SLong)]
cs <- [SLong] -> [SLong] -> [(SLong, SLong)]
forall a b. [a] -> [b] -> [(a, b)]
zip [SLong
0..] ([SLong] -> [(SLong, SLong)]) -> IO [SLong] -> IO [(SLong, SLong)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` [IO SLong] -> IO [SLong]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
sequence [ Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
outputM SLong
i SLong
j | SLong
j <- [SLong
0 .. SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ]
let ([(SLong, SLong)]
_, (SLong
j, SLong
lcoef):[(SLong, SLong)]
rest) = ((SLong, SLong) -> Bool)
-> [(SLong, SLong)] -> ([(SLong, SLong)], [(SLong, SLong)])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span ((SLong -> SLong -> Bool
forall a. Eq a => a -> a -> Bool
== SLong
0) (SLong -> Bool)
-> ((SLong, SLong) -> SLong) -> (SLong, SLong) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SLong, SLong) -> SLong
forall a b. (a, b) -> b
snd) [(SLong, SLong)]
cs
((SLong, SLong), [SLong]) -> IO ((SLong, SLong), [SLong])
forall (m :: * -> *) a. Monad m => a -> m a
return ((SLong
i, SLong
j), SLong
lcoefSLong -> [SLong] -> [SLong]
forall a. a -> [a] -> [a]
:((SLong, SLong) -> SLong) -> [(SLong, SLong)] -> [SLong]
forall a b. (a -> b) -> [a] -> [b]
map (SLong, SLong) -> SLong
forall a b. (a, b) -> b
snd [(SLong, SLong)]
rest))
let multCands :: [((SLong, SLong), [SLong])]
multCands = (((SLong, SLong), [SLong]) -> Bool)
-> [((SLong, SLong), [SLong])] -> [((SLong, SLong), [SLong])]
forall a. (a -> Bool) -> [a] -> [a]
filter (\ ((SLong, SLong)
_, SLong
lcoef:[SLong]
rest) -> (SLong -> Bool) -> [SLong] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all ((SLong -> SLong -> Bool
forall a. Eq a => a -> a -> Bool
== SLong
0) (SLong -> Bool) -> (SLong -> SLong) -> SLong -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SLong -> SLong -> SLong
forall a. Integral a => a -> a -> a
`rem` SLong
lcoef)) [SLong]
rest) [((SLong, SLong), [SLong])]
lcoefs
[((SLong, SLong), [SLong])]
-> (((SLong, SLong), [SLong]) -> IO (SLong, SLong))
-> IO [(SLong, SLong)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [((SLong, SLong), [SLong])]
multCands ((((SLong, SLong), [SLong]) -> IO (SLong, SLong))
-> IO [(SLong, SLong)])
-> (((SLong, SLong), [SLong]) -> IO (SLong, SLong))
-> IO [(SLong, SLong)]
forall a b. (a -> b) -> a -> b
$ \ ((SLong
i, SLong
j), SLong
lcoef:[SLong]
_) -> do
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
j..SLong
numCols SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
- SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j' -> do
SLong
x <- Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
outputM SLong
i SLong
j'
Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM Ptr FMPZMat
outputM SLong
i SLong
j' (SLong -> IO ()) -> SLong -> IO ()
forall a b. (a -> b) -> a -> b
$ SLong
x SLong -> SLong -> SLong
forall a. Integral a => a -> a -> a
`div` SLong
lcoef
(SLong, SLong) -> IO (SLong, SLong)
forall (m :: * -> *) a. Monad m => a -> m a
return (SLong
i, SLong
j)
elemrowadds :: Ptr FMPZMat -> SLong -> SLong -> [(SLong, SLong)] -> IO ()
elemrowadds :: Ptr FMPZMat -> SLong -> SLong -> [(SLong, SLong)] -> IO ()
elemrowadds Ptr FMPZMat
outputM SLong
_ SLong
numCols [(SLong, SLong)]
indices = do
[(SLong, SLong)] -> ((SLong, SLong) -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [(SLong, SLong)]
indices (((SLong, SLong) -> IO ()) -> IO ())
-> ((SLong, SLong) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ (SLong
lcI, SLong
lcJ) -> do
let j :: SLong
j = SLong
lcJ
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
0..SLong
lcISLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
i -> do
SLong
x <- Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
outputM SLong
i SLong
j
if SLong
x SLong -> SLong -> Bool
forall a. Eq a => a -> a -> Bool
== SLong
0 then
() -> IO ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
else do
let sf :: SLong
sf = SLong
x
[SLong] -> (SLong -> IO ()) -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [SLong
lcJ..SLong
numColsSLong -> SLong -> SLong
forall a. Num a => a -> a -> a
-SLong
1] ((SLong -> IO ()) -> IO ()) -> (SLong -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ SLong
j' -> do
SLong
x1 <- Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
outputM SLong
i SLong
j'
SLong
x2 <- Ptr FMPZMat -> SLong -> SLong -> IO SLong
peekM Ptr FMPZMat
outputM SLong
lcI SLong
j'
Ptr FMPZMat -> SLong -> SLong -> SLong -> IO ()
pokeM Ptr FMPZMat
outputM SLong
i SLong
j' (SLong
x1 SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
- SLong
x2 SLong -> SLong -> SLong
forall a. Num a => a -> a -> a
* SLong
sf)