module Algebra.Algorithms.FGLM (FGLMEnv(..), lMap, gLex, bLex, proced,
monomial, look, (.==), (%==), image, Machine) where
import Algebra.Ring.Polynomial
import Control.Lens
import Control.Monad
import Control.Monad.Reader
import Control.Monad.ST
import Data.Function
import Data.Maybe
import Data.STRef
import qualified Data.Vector as V
import Prelude hiding (Num (..), recip, (^))
data FGLMEnv s r ord n = FGLMEnv { _lMap :: OrderedPolynomial r ord n -> V.Vector r
, _gLex :: STRef s [OrderedPolynomial r Lex n]
, _bLex :: STRef s [OrderedPolynomial r ord n]
, _proced :: STRef s (Maybe (OrderedPolynomial r Lex n))
, _monomial :: STRef s (OrderedMonomial Lex n)
}
makeLenses ''FGLMEnv
type Machine s r ord n = ReaderT (FGLMEnv s r ord n) (ST s)
look :: Getting (STRef s b) (FGLMEnv s r ord n) (STRef s b) -> Machine s r ord n b
look = lift . readSTRef <=< view
(.==) :: (MonadTrans t, MonadReader s (t (ST s1))) => Getting (STRef s1 a) s (STRef s1 a) -> a -> t (ST s1) ()
v .== a = do
ref <- view v
lift $ writeSTRef ref a
(%==) :: (MonadTrans t, MonadReader s (t (ST s1))) => Getting (STRef s1 a) s (STRef s1 a) -> (a -> a) -> t (ST s1) ()
v %== f = do
ref <- view v
lift $ modifySTRef' ref f
infix 4 .==, %==
image :: (MonadReader (FGLMEnv s r ord n) f) => OrderedPolynomial r ord n -> f (V.Vector r)
image a = views lMap ($ a)