packages feed

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