{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Data.Poly.Multi.Semiring
( MultiPoly
, VMultiPoly
, UMultiPoly
, unMultiPoly
, toMultiPoly
, monomial
, scale
, pattern X
, pattern Y
, pattern Z
, eval
, subst
, deriv
, integral
, segregate
, unsegregate
) where
import Data.Finite
import Data.Euclidean (Field)
import Data.Semiring (Semiring(..))
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Generic.Sized as SG
import qualified Data.Vector.Sized as SV
import qualified Data.Vector.Unboxed.Sized as SU
import GHC.TypeNats (KnownNat, type (<=))
import Data.Poly.Internal.Multi (MultiPoly, VMultiPoly, UMultiPoly, unMultiPoly, segregate, unsegregate)
import qualified Data.Poly.Internal.Multi as Multi
import Data.Poly.Internal.Multi.Field ()
import Data.Poly.Internal.Multi.GcdDomain ()
toMultiPoly
:: (Eq a, Semiring a, G.Vector v (SU.Vector n Word, a))
=> v (SU.Vector n Word, a)
-> MultiPoly v n a
toMultiPoly = Multi.toMultiPoly'
monomial
:: (Eq a, Semiring a, G.Vector v (SU.Vector n Word, a))
=> SU.Vector n Word
-> a
-> MultiPoly v n a
monomial = Multi.monomial'
scale
:: (Eq a, Semiring a, KnownNat n, G.Vector v (SU.Vector n Word, a))
=> SU.Vector n Word
-> a
-> MultiPoly v n a
-> MultiPoly v n a
scale = Multi.scale'
pattern X
:: (Eq a, Semiring a, KnownNat n, 1 <= n, G.Vector v (SU.Vector n Word, a))
=> MultiPoly v n a
pattern X = Multi.X'
pattern Y
:: (Eq a, Semiring a, KnownNat n, 2 <= n, G.Vector v (SU.Vector n Word, a))
=> MultiPoly v n a
pattern Y = Multi.Y'
pattern Z
:: (Eq a, Semiring a, KnownNat n, 3 <= n, G.Vector v (SU.Vector n Word, a))
=> MultiPoly v n a
pattern Z = Multi.Z'
eval
:: (Semiring a, G.Vector v (SU.Vector n Word, a), G.Vector u a)
=> MultiPoly v n a
-> SG.Vector u n a
-> a
eval = Multi.eval'
subst
:: (Eq a, Semiring a, KnownNat m, G.Vector v (SU.Vector n Word, a), G.Vector w (SU.Vector m Word, a))
=> MultiPoly v n a
-> SV.Vector n (MultiPoly w m a)
-> MultiPoly w m a
subst = Multi.subst'
deriv
:: (Eq a, Semiring a, G.Vector v (SU.Vector n Word, a))
=> Finite n
-> MultiPoly v n a
-> MultiPoly v n a
deriv = Multi.deriv'
integral
:: (Field a, G.Vector v (SU.Vector n Word, a))
=> Finite n
-> MultiPoly v n a
-> MultiPoly v n a
integral = Multi.integral'