AERN-Real-0.10.0: src/Data/Number/ER/Real/Approx/Tests/Properties.hs
{-|
Module : Data.Number.ER.Real.Base.Tests.Properties
Description : (testing) properties to check for real approximations
Copyright : (c) 2009 Michal Konecny
License : BSD3
Maintainer : mik@konecny.aow.cz
Stability : experimental
Portability : portable
Properties of real approximations we want to check in tests.
-}
module Data.Number.ER.Real.Approx.Tests.Properties
where
import Data.Number.ER.Real.Approx.Tests.Generate
import Data.Number.ER.Real.Approx.Tests.Reporting
import Data.Number.ER.BasicTypes.Tests.Generate
import qualified Data.Number.ER.Real.Approx as RA
import Data.Number.ER.Real.Approx ((+:),(-:),(*:),(/:))
import qualified Data.Number.ER.Real.Approx.Elementary as RAEL
import Data.Number.ER.BasicTypes
import Data.Number.ER.Misc
import Test.QuickCheck
type RAPropTupleUnary ira =
ira ->
String ->
((Ix20, RAThin ira) -> Bool,
(Ix20, RAConsistent ira) -> Bool,
(Ix20, RAThin ira) -> Bool,
(Ix20, RAConsistent ira) -> Bool,
(Ix20, RADirected ira) -> Bool)
props_ra_AMinusA_eq_oi ::
(RA.ERIntApprox ira, RA.ERInnerOuterApprox ira) => RAPropTupleUnary ira
props_ra_AMinusA_eq_oi =
props_ra_eq_oi_unary 0 (\ix a -> a - a) (\ix a -> a -: a)
props_ra_ADivA_eq_oi ::
(RA.ERIntApprox ira, RA.ERInnerOuterApprox ira) => RAPropTupleUnary ira
props_ra_ADivA_eq_oi =
props_ra_eq_oi_unary 1 (\ix a -> a / a) (\ix a -> a /: a)
props_ra_AddCommut_eq_oi ::
(RA.ERIntApprox ira, RA.ERInnerOuterApprox ira) => RAPropTupleUnary ira
props_ra_AddCommut_eq_oi =
props_ra_eq_oi_unary 0 commutDiff commutDiffInner
where
commutDiff ix a =
(a + b) - (b + a)
where
b = 1 / (a + 1)
commutDiffInner ix a =
(a +: b) -: (b +: a)
where
b = 1 / (a + 1)
props_ra_MultCommut_eq_oi ::
(RA.ERIntApprox ira, RA.ERInnerOuterApprox ira) => RAPropTupleUnary ira
props_ra_MultCommut_eq_oi =
props_ra_eq_oi_unary 0 commutDiff commutDiffInner
where
commutDiff ix a =
(a * b) - (b * a)
where
b = 1 / (a + 1)
commutDiffInner ix a =
(a *: b) -: (b *: a)
where
b = 1 / (a + 1)
props_ra_AddAssoc_eq_oi ::
(RA.ERIntApprox ira, RA.ERInnerOuterApprox ira) => RAPropTupleUnary ira
props_ra_AddAssoc_eq_oi =
props_ra_eq_oi_unary 0 assocDiff assocDiffInner
where
assocDiff ix a =
((a + b) + c) - (a + (b + c))
where
b = 1 / (a + 1)
c = (a - 1)
assocDiffInner ix a =
((a +: b) +: c) -: (a +: (b +: c))
where
b = 1 / (a + 1)
c = (a - 1)
props_ra_MultAssoc_eq_oi ::
(RA.ERIntApprox ira, RA.ERInnerOuterApprox ira) => RAPropTupleUnary ira
props_ra_MultAssoc_eq_oi =
props_ra_eq_oi_unary 0 assocDiff assocDiffInner
where
assocDiff ix a =
((a * b) * c) - (a * (b * c))
where
b = 1 / (a + 1)
c = (a - 1)
assocDiffInner ix a =
((a *: b) *: c) -: (a *: (b *: c))
where
b = 1 / (a + 1)
c = (a - 1)
props_ra_Distr_eq_oi ::
(RA.ERIntApprox ira, RA.ERInnerOuterApprox ira) => RAPropTupleUnary ira
props_ra_Distr_eq_oi =
props_ra_eq_oi_unary 0 distrDiff distrDiffInner
where
distrDiff ix a =
(a * (b + c)) - (a * b + a * c)
where
b = 1 / (a + 1)
c = (a - 1)
distrDiffInner ix a =
(a *: (b +: c)) -: ((a *: b) +: (a *: c))
where
b = 1 / (a + 1)
c = (a - 1)
props_ra_SinCos_eq_oi ::
(RAEL.ERInnerOuterApproxElementary ira, RAEL.ERApproxElementary ira) => RAPropTupleUnary ira
props_ra_SinCos_eq_oi =
props_ra_eq_oi_unary 1 sincos sincosInner
where
sincos ix a =
(RAEL.sin ix a)^2 + (RAEL.cos ix a)^2
sincosInner ix a =
(sina *: sina) +: (cosa *: cosa)
where
sina = RAEL.sinInner ix a
cosa = RAEL.cosInner ix a
props_ra_TanATan_eq_oi ::
(RAEL.ERInnerOuterApproxElementary ira, RAEL.ERApproxElementary ira) => RAPropTupleUnary ira
props_ra_TanATan_eq_oi =
props_ra_eq_oi_unary 0 tanAtan tanAtanInner
where
tanAtan ixP a =
-- unsafePrint
-- (
-- "tanAtan: "
-- ++ "\n ix = " ++ show ix
-- ++ "\n a = " ++ show a
-- ++ "\n atan ix a = " ++ show tana
-- ++ "\n tan ix (atan ix a) = " ++ show tanatana
-- ) $
tanatana - a
where
tanatana = RAEL.tan ix tana
tana = RAEL.atan ix a
ix = min 10 ixP
tanAtanInner ixP a =
(RAEL.tanInner ix $ RAEL.atanInner ix a) -: a
where
ix = min 10 ixP
props_ra_LogExp_eq_oi ::
(RAEL.ERInnerOuterApproxElementary ira, RAEL.ERApproxElementary ira) => RAPropTupleUnary ira
props_ra_LogExp_eq_oi =
props_ra_eq_oi_unary 0 logExp logExpInner
where
logExp ixP a =
-- unsafePrint
-- (
-- "logExp: "
-- ++ "\n ix = " ++ show ix
-- ++ "\n a = " ++ show a
-- ++ "\n exp ix a = " ++ show expa
-- ++ "\n log ix (exp ix a) = " ++ show logexpa
-- ) $
logexpa - a
where
logexpa = RAEL.log ix expa
expa = RAEL.exp ix a
ix = min 10 ixP
logExpInner ixP a =
logexpa -: a
where
logexpa = RAEL.logInner ix expa
expa = RAEL.expInner ix a
ix = min 10 ixP
{------------------ auxiliary functions ------------------------}
props_ra_eq_oi_unary constRes opOuter opInner sampleRA reportFileName =
(prop_Eq_Thin, prop_Eq_Consistent,
prop_OI_Thin, prop_OI_Consistent, prop_OI_Directed)
where
prop_Eq_Thin (Ix20 ix, RAThin a) =
raConsistentWithPrecise sampleRA (reportFileName ++ "_Eq_Thin") (ix,aId) 0 constRes resOuter
where
resOuter = opOuter ix a
aId = RA.showApprox 10 True True a
prop_Eq_Consistent (Ix20 ix, RAConsistent a) =
raConsistentWithPrecise sampleRA (reportFileName ++ "_Eq_Consistent") (ix,aId) 0 constRes resOuter
where
resOuter = opOuter ix a
aId = RA.showApprox 10 True True a
prop_OI_Thin (Ix20 ix, RAThin a) =
raIncludedIn sampleRA (reportFileName ++ "_OI_Thin") (ix, aId) 0 resInner resOuter
where
resOuter = opOuter ix a
resInner = opInner ix a
aId = RA.showApprox 10 True True a
prop_OI_Consistent (Ix20 ix, RAConsistent a) =
raIncludedIn sampleRA (reportFileName ++ "_OI_Consistent") (ix,aId) 0 resInner resOuter
where
resOuter = opOuter ix a
resInner = opInner ix a
aId = RA.showApprox 10 True True a
prop_OI_Directed (Ix20 ix, RADirected a) =
raIncludedIn sampleRA (reportFileName ++ "_OI_Directed") (ix, aId) 0 resInner resOuter
where
resOuter = opOuter ix a
resInner = opInner ix a
aId = RA.showApprox 10 True True a
raConsistentWithPrecise sampleRA reportFileName caseId subId preciseVal approxVal
| result =
unsafeERTestReport reportFileName
(caseId, subId, preciseVal, approxVal) $
result
| otherwise =
unsafePrint
(
"raAntiIncludes failed"
++ "\n caseId = " ++ show caseId
++ "\n subId = " ++ show subId
++ "\n preciseVal = " ++ show preciseVal
++ "\n approxVal = " ++ show approxVal
) $
result
where
result =
(approxVal `RA.refines` preciseVal)
||
(preciseVal `RA.refines` approxVal)
_ = [sampleRA, approxVal]
raIncludedIn sampleRA reportFileName caseId subId innerVal outerVal
| result =
unsafeERTestReport reportFileName
(caseId, subId, innerVal, outerVal) $
result
| otherwise =
unsafePrint
(
"raIncludes failed"
++ "\n caseId = " ++ show caseId
++ "\n subId = " ++ show subId
++ "\n innerVal = " ++ show innerVal
++ "\n outerVal = " ++ show outerVal
) $
result
where
result = innerVal `RA.refines` outerVal
_ = [sampleRA, innerVal]