{-|
    Module      :  Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Division
    Description :  (testing) properties of polynomial enclosure division
    Copyright   :  (c) 2007-2008 Michal Konecny
    License     :  BSD3

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  portable
    
    Quickcheck properties of polynomial enclosure division.
-}
module Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Division
where

import Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Common

import qualified Data.Number.ER.RnToRm.UnitDom.Base as UFB
import Data.Number.ER.RnToRm.UnitDom.Base.Tests.Generate

import qualified Data.Number.ER.Real.Approx as RA
import Data.Number.ER.Real.Approx.Interval

import Data.Number.ER.BasicTypes
import Data.Number.ER.BasicTypes.Tests.Generate 

import Test.QuickCheck

prop_enclRecip_ThickEncl_consistent
        sampleE reportFileName
        (Deg5Size10 maxDegree maxSize,
         Ix10 ix,
         SmallRatio sepNum sepDenom,
         (isNegative, FBEnclThickSize10Small (n,preEncl))) =
    recip_encl_consistent
        sampleE reportFileName
        maxDegree maxSize 
        ix 
        sepNum sepDenom isNegative n preEncl

prop_enclRecip_ParalEncl_consistent
        sampleE reportFileName
        (Deg5Size10 maxDegree maxSize,
         Ix10 ix,
         SmallRatio sepNum sepDenom,
         (isNegative, FBEnclParalSize10Small (n,preEncl))) =
    recip_encl_consistent 
        sampleE reportFileName
        maxDegree maxSize 
        ix 
        sepNum sepDenom isNegative n preEncl

prop_enclRecip_ThinEncl_consistent
        sampleE reportFileName
        (Deg5Size10 maxDegree maxSize,
         Ix10 ix,
         SmallRatio sepNum sepDenom,
         (isNegative, FBEnclThinSize10Small (n,preEncl))) =
    recip_encl_consistent 
        sampleE reportFileName
        maxDegree maxSize 
        ix 
        sepNum sepDenom isNegative n preEncl

recip_encl_consistent 
        sampleE reportFileName
        maxDegree maxSize 
        ix 
        sepNum sepDenom isNegative pId preEncl =
    excludedZero ==>
    enclAtKeyPointsPointwiseUnaryInnerInOuter
        reportFileName
        ((maxDegree, maxSize), ix, (sepNum, sepDenom), (isNegative, pId)) 
        ((RA./:) 1)
        pEncl resEncl
    where
    _ = [sampleE, pEncl]
    resEncl = UFB.recipEncl maxDegree maxSize ix pEncl
    (excludedZero, pEncl) =
        enclRestrictRange ix maxDegree maxSize rangeNoZero preEncl
    rangeNoZero
        | isNegative = (Nothing, Just (-sepB))
        | otherwise = (Just sepB, Nothing)
    sepB = abs sepNumB / sepDenomB
    sepNumB = fromInteger $ toInteger sepNum
    sepDenomB = fromInteger $ toInteger sepDenom