AERN-Real-Interval-2011.1: src/Numeric/AERN/RealArithmetic/Interval/ElementaryFromFieldOps.hs
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ImplicitParams #-}
{-|
Module : Numeric.AERN.RealArithmetic.Interval.ElementaryFromFieldOps
Description : elementary operations using generic direct implementation
Copyright : (c) Michal Konecny
License : BSD3
Maintainer : mikkonecny@gmail.com
Stability : experimental
Portability : portable
Elementary operations using generic direct implementation.
-}
module Numeric.AERN.RealArithmetic.Interval.ElementaryFromFieldOps
(expDefaultEffortWithIters, expOutIters, expInIters,
sqrtDefaultEffortWithIters, sqrtOutIters, sqrtInIters)
where
import Numeric.AERN.RealArithmetic.RefinementOrderRounding.ElementaryFromFieldOps.Exponentiation
import Numeric.AERN.RealArithmetic.Interval.ElementaryFromFieldOps.Sqrt
import qualified Numeric.AERN.RealArithmetic.NumericOrderRounding as ArithUpDn
import qualified Numeric.AERN.RealArithmetic.RefinementOrderRounding as ArithInOut
import Numeric.AERN.RealArithmetic.RefinementOrderRounding.OpsImplicitEffort
import qualified Numeric.AERN.Basics.NumericOrder as NumOrd
import qualified Numeric.AERN.Basics.RefinementOrder as RefOrd
import Numeric.AERN.Basics.RefinementOrder.OpsImplicitEffort
import Numeric.AERN.RealArithmetic.ExactOps
import Numeric.AERN.RealArithmetic.Interval
import Numeric.AERN.Basics.Interval
import Numeric.AERN.Basics.Consistency
import Numeric.AERN.Basics.Effort
instance
(ArithInOut.RoundedMixedField (Interval e) Int,
ArithInOut.RoundedField (Interval e),
ArithUpDn.Convertible (Interval e) Int,
ArithInOut.Convertible Double (Interval e),
NumOrd.PartialComparison e,
RefOrd.OuterRoundedLatticeEffort (Interval e))
=>
(ArithInOut.RoundedExponentiationEffort (Interval e))
where
type ArithInOut.ExpEffortIndicator (Interval e) =
((ArithInOut.FieldOpsEffortIndicator (Interval e),
ArithInOut.MixedFieldOpsEffortIndicator (Interval e) Int)
,
Int1To10
,
((RefOrd.JoinMeetOutEffortIndicator (Interval e),
NumOrd.PartialCompareEffortIndicator e),
(ArithUpDn.ConvertEffortIndicator (Interval e) Int,
ArithInOut.ConvertEffortIndicator Double (Interval e)))
)
expDefaultEffort i@(Interval l r) =
((ArithInOut.fieldOpsDefaultEffort i,
ArithInOut.mixedFieldOpsDefaultEffort i sampleI)
,
Int1To10 10
,
((RefOrd.joinmeetOutDefaultEffort i,
NumOrd.pCompareDefaultEffort l),
(ArithUpDn.convertDefaultEffort i sampleI,
ArithInOut.convertDefaultEffort sampleD i))
)
where
sampleI = 1 :: Int
sampleD = 1 :: Double
expDefaultEffortWithIters ::
(NumOrd.PartialComparison e,
RefOrd.OuterRoundedLatticeEffort (Interval e),
ArithInOut.RoundedFieldEffort (Interval e),
ArithInOut.RoundedMixedFieldEffort (Interval e) Int,
ArithUpDn.Convertible (Interval e) Int,
ArithInOut.Convertible Double (Interval e))
=>
(Interval e) ->
Int ->
ArithInOut.ExpEffortIndicator (Interval e)
expDefaultEffortWithIters i@(Interval l r) n =
((ArithInOut.fieldOpsDefaultEffort i,
ArithInOut.mixedFieldOpsDefaultEffort i sampleI)
,
Int1To10 n
,
((RefOrd.joinmeetOutDefaultEffort i,
NumOrd.pCompareDefaultEffort l),
(ArithUpDn.convertDefaultEffort i sampleI,
ArithInOut.convertDefaultEffort sampleD i))
)
where
sampleI = 1 :: Int
sampleD = 1 :: Double
instance
(ArithInOut.RoundedMixedField (Interval e) Int,
ArithInOut.RoundedField (Interval e),
ArithUpDn.Convertible (Interval e) Int,
ArithInOut.Convertible Double (Interval e),
HasZero e, HasOne e,
HasInfinities e,
NumOrd.PartialComparison e,
RefOrd.OuterRoundedLattice (Interval e))
=>
(ArithInOut.RoundedExponentiation (Interval e))
where
expOutEff
((effortField, effortMixedField),
(Int1To10 effortTaylor),
((effortMeet, effortComp), effortConv))
(Interval l r) = Interval resL resR
where
Interval resL _ =
expOutThinArg
effortField effortMixedField
effortMeet effortComp effortComp effortConv
effortTaylor
(Interval l l)
Interval _ resR =
expOutThinArg
effortField effortMixedField
effortMeet effortComp effortComp effortConv
effortTaylor
(Interval r r)
expInEff
((effortField, effortMixedField),
(Int1To10 effortTaylor),
((effortMeet, effortComp), effortConv))
(Interval l r) = Interval resL resR
where
Interval _ resL =
expOutThinArg
effortField effortMixedField
effortMeet effortComp effortComp effortConv
effortTaylor
(Interval l l)
Interval resR _ =
expOutThinArg
effortField effortMixedField
effortMeet effortComp effortComp effortConv
effortTaylor
(Interval r r)
expOutIters, expInIters ::
(ArithInOut.RoundedMixedField (Interval e) Int,
ArithInOut.RoundedField (Interval e),
ArithUpDn.Convertible (Interval e) Int,
ArithInOut.Convertible Double (Interval e),
HasZero e, HasOne e,
HasInfinities e,
NumOrd.PartialComparison e,
RefOrd.OuterRoundedLattice (Interval e))
=>
Int -> (Interval e) -> (Interval e)
expOutIters n i = ArithInOut.expOutEff (expDefaultEffortWithIters i n) i
expInIters n i = ArithInOut.expInEff (expDefaultEffortWithIters i n) i
instance
(ArithUpDn.RoundedMixedFieldEffort e Int,
ArithUpDn.RoundedFieldEffort e,
ArithUpDn.Convertible e Double,
NumOrd.PartialComparison e,
NumOrd.RoundedLatticeEffort e)
=>
(ArithInOut.RoundedSquareRootEffort (Interval e))
where
type ArithInOut.SqrtEffortIndicator (Interval e) =
((ArithUpDn.FieldOpsEffortIndicator e,
ArithUpDn.MixedFieldOpsEffortIndicator e Int)
,
Int1To10
,
((NumOrd.MinmaxEffortIndicator e, NumOrd.PartialCompareEffortIndicator e),
ArithUpDn.ConvertEffortIndicator e Double)
)
sqrtDefaultEffort i@(Interval l r) =
((ArithUpDn.fieldOpsDefaultEffort l,
ArithUpDn.mixedFieldOpsDefaultEffort l sampleI)
,
Int1To10 10
,
((NumOrd.minmaxDefaultEffort l, NumOrd.pCompareDefaultEffort l),
ArithUpDn.convertDefaultEffort l sampleD)
)
where
sampleI = 1 :: Int
sampleD = 1 :: Double
sqrtDefaultEffortWithIters ::
(ArithUpDn.RoundedMixedFieldEffort e Int,
ArithUpDn.RoundedFieldEffort e,
ArithUpDn.Convertible e Double,
NumOrd.PartialComparison e,
NumOrd.RoundedLatticeEffort e)
=>
(Interval e) ->
Int ->
ArithInOut.SqrtEffortIndicator (Interval e)
sqrtDefaultEffortWithIters i@(Interval l r) n =
((ArithUpDn.fieldOpsDefaultEffort l,
ArithUpDn.mixedFieldOpsDefaultEffort l sampleI)
,
Int1To10 n
,
((NumOrd.minmaxDefaultEffort l, NumOrd.pCompareDefaultEffort l),
ArithUpDn.convertDefaultEffort l sampleD)
)
where
sampleI = 1 :: Int
sampleD = 1 :: Double
instance
(ArithUpDn.RoundedMixedField e Int,
ArithUpDn.RoundedField e,
ArithUpDn.Convertible e Double,
HasZero e, HasOne e,
NumOrd.PartialComparison e,
NumOrd.RoundedLattice e,
Show e)
=>
(ArithInOut.RoundedSquareRoot (Interval e))
where
sqrtOutEff
((effortField, effortMixedField),
(Int1To10 effortNewton),
((effortMinmax, effortComp), effortConv))
(Interval l r) =
case NumOrd.pEqualEff effortComp l r of
Just True -> sqrtL
_ -> Interval sqrtLL sqrtRR
where
sqrtL@(Interval sqrtLL _) = sqrt l
sqrtR@(Interval _ sqrtRR) = sqrt r
sqrt =
sqrtOutThinArg
effortField
effortMixedField
effortMinmax
effortComp
effortConv
effortNewton
sqrtInEff
((effortField, effortMixedField),
(Int1To10 effortNewton),
((effortMinmax, effortComp), effortConv))
(Interval l r) =
case NumOrd.pEqualEff effortComp l r of
Just True -> Interval sqrtLR sqrtLL -- invert
_ -> Interval sqrtLR sqrtRL
where
(Interval sqrtLL sqrtLR) = sqrt l
(Interval sqrtRL sqrtRR) = sqrt r
sqrt =
sqrtOutThinArg
effortField
effortMixedField
effortMinmax
effortComp
effortConv
effortNewton
sqrtOutIters, sqrtInIters ::
(ArithUpDn.RoundedMixedField e Int,
ArithUpDn.RoundedField e,
ArithUpDn.Convertible e Double,
HasZero e, HasOne e,
NumOrd.PartialComparison e,
NumOrd.RoundedLattice e,
Show e)
=>
Int -> (Interval e) -> (Interval e)
sqrtOutIters n i = ArithInOut.sqrtOutEff (sqrtDefaultEffortWithIters i n) i
sqrtInIters n i = ArithInOut.sqrtInEff (sqrtDefaultEffortWithIters i n) i