module Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom
(
ERChebPoly(..), TermKey
)
where
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Basic
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Eval
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Reduce
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Ring
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Derivative
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Bounds
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Enclosure
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.EnclosureInner
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Compose
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Integration
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Derivative
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Division
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.DivisionInner
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Elementary
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.ElementaryInner
import qualified Data.Number.ER.RnToRm.UnitDom.Base as UFB
import qualified Data.Number.ER.Real.Base as B
import Data.Number.ER.Real.Approx.Interval
import Data.Number.ER.BasicTypes.DomainBox (VariableID(..), DomainBox, DomainBoxMappable, DomainIntBox)
import qualified Data.Map as Map
import Data.Number.ER.Real.DefaultRepr
import Data.Number.ER.BasicTypes.DomainBox.IntMap
type P = ERChebPoly (Box Int) B
x0 = chplVar 0 :: P
x1 = chplVar 1 :: P
x2 = chplVar 2 :: P
x3 = chplVar 3 :: P
x4 = chplVar 4 :: P
p1 = x1 *^ x1 *^ x1 +^ x1 *^ (x2 +^ (chplConst 2)) *^ (x3 -^ (chplConst 3))
e23 = enclRAConst (ERInterval 2 3) :: (P,P)
e32 = enclRAConst (ERInterval 3 2) :: (P,P)
em12 = enclRAConst (ERInterval (1) 2) :: (P,P)
e2m1 = enclRAConst (ERInterval 2 (1)) :: (P,P)
ex0 = enclThin x0
ex0sq = enclMultiply 3 10 ex0 ex0
ep = enclAdd 3 10 (enclConst 2) (enclAdd 3 10 ex0 ex0sq)
i23 = ienclRAConst (ERInterval 2 3) :: ((P,P),Bool)
i32 = ienclRAConst (ERInterval 3 2) :: ((P,P),Bool)
im12 = ienclRAConst (ERInterval (1) 2) :: ((P,P),Bool)
i2m1 = ienclRAConst (ERInterval 2 (1)) :: ((P,P),Bool)
ix0 = ienclThin x0
instance
(B.ERRealBase rb, RealFrac rb,
DomainBox box varid Int, Ord box, Show varid,
DomainBoxMappable boxb boxras varid rb [ERInterval rb],
DomainBoxMappable boxra boxras varid (ERInterval rb) [ERInterval rb],
DomainIntBox boxra varid (ERInterval rb)) =>
(UFB.ERUnitFnBase boxb boxra varid rb (ERInterval rb) (ERChebPoly box rb))
where
raEndpoints _ (ERInterval l h) = (l,h)
raFromEndpoints _ (l,h) = ERInterval l h
compareApprox = chplCompareApprox
showDiGrCmp = chplShow
isValid = chplHasNoNaNOrInfty
check = chplCheck
getGranularity = chplGetGranularity
setMinGranularity = chplSetMinGranularity
setGranularity = chplSetGranularity
getDegree = chplGetDegree
reduceDegreeUp = chplReduceDegreeUp
getSize = chplCountTerms
reduceSizeUp = chplReduceTermCountUp
getVariables = chplGetVars
const = chplConst
affine = chplAffine
bounds = chplBounds
upperBound = chplUpperBound
upperBoundPrecise = chplUpperBoundExpensive
maxUp = chplMaxUp
minUp = chplMinUp
maxDown = chplMaxDn
minDown = chplMinDn
neg = chplNeg
addConstUp = chplAddConstUp
scaleUp = chplScaleUp
scaleApproxUp = chplScaleRAUp
(+^) = (+^)
(-^) = (-^)
(*^) = (*^)
recipUp md mt ix f = snd $ enclRecip md mt ix (md + 1) (chplNeg f, f)
evalUp pt f = chplEvalUp f pt
evalApprox x ufb = chplRAEval (\ b -> ERInterval b b) ufb x
partialEvalApproxUp substitutions ufb =
snd $
chplPartialRAEval (UFB.raEndpoints ufb) ufb substitutions
composeUp m n f v fv = snd $ enclCompose m n f v (enclThin fv)
composeManyUp m n f subst = snd $ enclComposeMany m n f (Map.map enclThin subst)
composeDown m n f v fv = chplNeg $ fst $ enclCompose m n f v (enclThin fv)
composeManyDown m n f subst = chplNeg $ fst $ enclComposeMany m n f (Map.map enclThin subst)
integrate = chplIntegrate
differentiate var fb = chplDifferentiate fb var
instance
(B.ERRealBase rb, RealFrac rb,
DomainBox box varid Int, Ord box, Show varid,
DomainBoxMappable boxb boxras varid rb [ERInterval rb],
DomainBoxMappable boxra boxras varid (ERInterval rb) [ERInterval rb],
DomainIntBox boxra varid (ERInterval rb)) =>
(UFB.ERUnitFnBaseEncl boxb boxra varid rb (ERInterval rb) (ERChebPoly box rb))
where
boundsEncl = enclBounds
constEncl (low, high) = (chplConst (low), chplConst high)
evalEncl pt encl = enclRAEval encl pt
evalEnclInner pt encl = enclRAEvalInner encl pt
addConstEncl _ _ = enclAddConst
scaleEncl = enclScale
addEncl = enclAdd
multiplyEncl = enclMultiply
recipEncl md mt ix = enclRecip md mt ix (md + 1)
composeEncl = enclCompose
composeManyEncls = enclComposeMany
instance
(B.ERRealBase rb, RealFrac rb,
DomainBox box varid Int, Ord box, Show varid,
DomainBoxMappable boxb boxras varid rb [ERInterval rb],
DomainBoxMappable boxra boxras varid (ERInterval rb) [ERInterval rb],
DomainIntBox boxra varid (ERInterval rb)) =>
(UFB.ERUnitFnBaseIEncl boxb boxra varid rb (ERInterval rb) (ERChebPoly box rb))
where
constIEncl (low, high) = ((chplConst (low), chplConst high), low >= high)
evalIEncl pt ie = ienclRAEval ie pt
addIEncl = ienclAdd
multiplyIEncl = ienclMultiply
recipIEnclPositive md mt ix = ienclRecipPositive md mt ix (md + 1)
composeIEncl = error "ERChebPoly: composeIEncl not yet"
composeManyIEncls = error "ERChebPoly: composeManyIEncls not yet"
instance
(B.ERRealBase rb, RealFrac rb,
DomainBox box varid Int, Ord box, Show varid,
DomainBoxMappable boxb boxras varid rb [ERInterval rb],
DomainBoxMappable boxra boxras varid (ERInterval rb) [ERInterval rb],
DomainIntBox boxra varid (ERInterval rb)) =>
(UFB.ERUnitFnBaseElementary boxb boxra varid rb (ERInterval rb) (ERChebPoly box rb))
where
sqrtEncl md ms ix = enclSqrt md ms ix md
expEncl = enclExp
logEncl = enclLog
sinEncl = enclSine
cosEncl = enclCosine
atanEncl = enclAtan
instance
(B.ERRealBase rb, RealFrac rb,
DomainBox box varid Int, Ord box, Show varid,
DomainBoxMappable boxb boxras varid rb [ERInterval rb],
DomainBoxMappable boxra boxras varid (ERInterval rb) [ERInterval rb],
DomainIntBox boxra varid (ERInterval rb)) =>
(UFB.ERUnitFnBaseIElementary boxb boxra varid rb (ERInterval rb) (ERChebPoly box rb))
where
sqrtIEncl md ms ix = ienclSqrt md ms ix md
expIEncl = error "ERChebPoly: expIEncl not yet"
logIEncl = error "ERChebPoly: logIEncl not yet"
sinIEncl = error "ERChebPoly: sinIEncl not yet"
cosIEncl = error "ERChebPoly: cosIEncl not yet"
atanIEncl = error "ERChebPoly: atanIEncl not yet"