packages feed

AERN-Real-2011.1: src/Numeric/AERN/RealArithmetic/NumericOrderRounding/InPlace/Elementary.hs

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-|
    Module      :  Numeric.AERN.RealArithmetic.NumericOrderRounding.InPlace.Elementary
    Description :  support for various common elementary functions
    Copyright   :  (c) Michal Konecny, Jan Duracz
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable
    
    Support for various common elementary functions.
    
    This module is hidden and reexported via its parent NumericOrderRounding.InPlace. 
-}

module Numeric.AERN.RealArithmetic.NumericOrderRounding.InPlace.Elementary where

import Numeric.AERN.RealArithmetic.NumericOrderRounding.Elementary

import Numeric.AERN.RealArithmetic.ExactOps
import Numeric.AERN.RealArithmetic.NumericOrderRounding.FieldOps

import Numeric.AERN.Basics.Effort
import Numeric.AERN.Basics.Exception (HasLegalValues)
import Numeric.AERN.Basics.Mutable
import Numeric.AERN.RealArithmetic.Laws
import Numeric.AERN.RealArithmetic.Measures
import qualified Numeric.AERN.Basics.NumericOrder as NumOrd

import Test.QuickCheck
import Test.Framework (testGroup, Test)
import Test.Framework.Providers.QuickCheck2 (testProperty)

class (RoundedExponentiation t, CanBeMutable t) => RoundedExponentiationInPlace t where
    expUpInPlaceEff :: OpMutable1Eff (ExpEffortIndicator t) t s
    expDnInPlaceEff :: OpMutable1Eff (ExpEffortIndicator t) t s

expUpInPlaceEffFromPure,
 expDnInPlaceEffFromPure ::
    (CanBeMutable t, RoundedExponentiation t) =>
    OpMutable1Eff (ExpEffortIndicator t) t s
expUpInPlaceEffFromPure =
    pureToMutable1Eff expUpEff
expDnInPlaceEffFromPure =
    pureToMutable1Eff expDnEff

expUpInPlaceEffFromInPlace,
 expDnInPlaceEffFromInPlace ::
    (RoundedExponentiationInPlace t) =>
    (ExpEffortIndicator t) -> t -> t
expUpInPlaceEffFromInPlace = 
    mutable1EffToPure expUpInPlaceEff 
expDnInPlaceEffFromInPlace = 
    mutable1EffToPure expDnInPlaceEff 

propUpDnExpInPlace ::
    (NumOrd.PartialComparison t, 
     RoundedExponentiationInPlace t, 
     RoundedExponentiation t, 
     Neg t,
     Show t, HasLegalValues t,
     Show (ExpEffortIndicator t),
     EffortIndicator (ExpEffortIndicator t),
     Show (NumOrd.PartialCompareEffortIndicator t),
     EffortIndicator (NumOrd.PartialCompareEffortIndicator t)
     ) =>
    t ->
    (NumOrd.PartialCompareEffortIndicator t, 
     ExpEffortIndicator t) -> 
    (NumOrd.UniformlyOrderedSingleton t) -> 
    Bool
propUpDnExpInPlace sample initEffort (NumOrd.UniformlyOrderedSingleton e1) =
    equalRoundingUpDn "in-place rounded exp"
        expr1Up expr1Dn expr2Up expr2Dn 
        NumOrd.pLeqEff initEffort
    where
    expUpEffViaInPlace = mutable1EffToPure expUpInPlaceEff
    expDnEffViaInPlace = mutable1EffToPure expDnInPlaceEff
    expr1Up eff = expUpEff eff e1
    expr1Dn eff = expDnEff eff e1
    expr2Up eff = expUpEffViaInPlace eff e1
    expr2Dn eff = expDnEffViaInPlace eff e1

testsUpDnExpInPlace (name, sample) =
    testGroup (name ++ " in place exp") $
        [
            testProperty "matches pure" (propUpDnExpInPlace sample)
        ]

        
class (RoundedSquareRoot t, CanBeMutable t) => RoundedSquareRootInPlace t where
    sqrtUpInPlaceEff :: OpMutable1Eff (SqrtEffortIndicator t) t s
    sqrtDnInPlaceEff :: OpMutable1Eff (SqrtEffortIndicator t) t s

sqrtUpInPlaceEffFromPure,
 sqrtDnInPlaceEffFromPure ::
    (CanBeMutable t, RoundedSquareRoot t) =>
    OpMutable1Eff (SqrtEffortIndicator t) t s
sqrtUpInPlaceEffFromPure =
    pureToMutable1Eff sqrtUpEff
sqrtDnInPlaceEffFromPure =
    pureToMutable1Eff sqrtDnEff

sqrtUpInPlaceEffFromInPlace,
 sqrtDnInPlaceEffFromInPlace ::
    (RoundedSquareRootInPlace t) =>
    (SqrtEffortIndicator t) -> t -> t 
sqrtUpInPlaceEffFromInPlace = 
    mutable1EffToPure sqrtUpInPlaceEff 
sqrtDnInPlaceEffFromInPlace = 
    mutable1EffToPure sqrtDnInPlaceEff 

propUpDnSqrtInPlace ::
    (NumOrd.PartialComparison t, 
     RoundedSquareRootInPlace t, 
     RoundedSquareRoot t, 
     Neg t,
     Show t, HasLegalValues t,
     Show (SqrtEffortIndicator t),
     EffortIndicator (SqrtEffortIndicator t),
     Show (NumOrd.PartialCompareEffortIndicator t),
     EffortIndicator (NumOrd.PartialCompareEffortIndicator t)
     ) =>
    t ->
    (NumOrd.PartialCompareEffortIndicator t, 
     SqrtEffortIndicator t) -> 
    (NumOrd.UniformlyOrderedSingleton t) -> 
    Bool
propUpDnSqrtInPlace sample initEffort (NumOrd.UniformlyOrderedSingleton e1) =
    equalRoundingUpDn "in-place rounded sqrt"
        sqrtr1Up sqrtr1Dn sqrtr2Up sqrtr2Dn 
        NumOrd.pLeqEff initEffort
    where
    sqrtUpEffViaInPlace = mutable1EffToPure sqrtUpInPlaceEff
    sqrtDnEffViaInPlace = mutable1EffToPure sqrtDnInPlaceEff
    sqrtr1Up eff = sqrtUpEff eff e1
    sqrtr1Dn eff = sqrtDnEff eff e1
    sqrtr2Up eff = sqrtUpEffViaInPlace eff e1
    sqrtr2Dn eff = sqrtDnEffViaInPlace eff e1

testsUpDnSqrtInPlace (name, sample) =
    testGroup (name ++ " in place sqrt") $
        [
            testProperty "matches pure" (propUpDnSqrtInPlace sample)
        ]