packages feed

AERN-Basics-2011.1: src/Numeric/AERN/Basics/RefinementOrder/InPlace/RoundedBasis.hs

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-|
    Module      :  Numeric.AERN.Basics.RefinementOrder.InPlace.RoundedBasis
    Description :  domain bases with outwards and inwards rounded operations  
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable
    
    Domain bases with outwards and inwards rounded in-place operations.
    
    This module is hidden and reexported via its grand-parent RefinementOrder. 
-}
module Numeric.AERN.Basics.RefinementOrder.InPlace.RoundedBasis 
where

import Numeric.AERN.Basics.Mutable
import Control.Monad.ST (ST)

import Numeric.AERN.Basics.Effort
import Numeric.AERN.Basics.Exception
import Numeric.AERN.Basics.PartialOrdering
import Numeric.AERN.Basics.RefinementOrder.PartialComparison
import Numeric.AERN.Basics.RefinementOrder.Arbitrary
import Numeric.AERN.Basics.RefinementOrder.RoundedBasis

import Numeric.AERN.Basics.Laws.OperationRelation
import Numeric.AERN.Basics.Laws.RoundedOperation

import Numeric.AERN.Basics.Laws.RoundedOpInPlace

import Numeric.AERN.Misc.Maybe

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


{-|
    A type with outward-rounding lattice operations.
-}
class (OuterRoundedBasisEffort t, CanBeMutable t) =>
    OuterRoundedBasisInPlace t
    where
    partialJoinOutInPlaceEff :: OpPartialMutable2Eff (PartialJoinOutEffortIndicator t) t s 

partialJoinOutInPlaceEffFromPure :: 
    (CanBeMutable t, OuterRoundedBasis t) => 
    OpPartialMutable2Eff (PartialJoinOutEffortIndicator t) t s  
partialJoinOutInPlaceEffFromPure = pureToPartial2Eff partialJoinOutEff 

partialJoinOutEffFromInPlace ::
 (CanBeMutable t, OuterRoundedBasisInPlace t) =>
 (PartialJoinOutEffortIndicator t) -> t -> t -> Maybe t
partialJoinOutEffFromInPlace = mutablePartial2EffToPure partialJoinOutInPlaceEff 

{-|
    A type with inward-rounding lattice operations.
-}
class (InnerRoundedBasisEffort t, CanBeMutable t) =>
    InnerRoundedBasisInPlace t
    where
    partialJoinInInPlaceEff :: OpPartialMutable2Eff (PartialJoinInEffortIndicator t) t s 

class (OuterRoundedBasisInPlace t, InnerRoundedBasisInPlace t) => RoundedBasisInPlace t 

partialJoinInInPlaceEffFromPure :: 
    (CanBeMutable t, InnerRoundedBasis t) => 
    OpPartialMutable2Eff (PartialJoinInEffortIndicator t) t s  
partialJoinInInPlaceEffFromPure = pureToPartial2Eff partialJoinInEff 

partialJoinInEffFromInPlace ::
 (CanBeMutable t, InnerRoundedBasisInPlace t) =>
 (PartialJoinInEffortIndicator t) -> t -> t -> Maybe t
partialJoinInEffFromInPlace = mutablePartial2EffToPure partialJoinInInPlaceEff 

propOuterInnerRoundedBasisJoinInPlaceConsistentWithPure ::
    (PartialComparison t, 
     OuterRoundedBasisInPlace t, InnerRoundedBasisInPlace t, 
     RoundedBasis t, 
     CanBeMutable t) =>
    t -> 
    (PartialJoinOutEffortIndicator t, PartialJoinInEffortIndicator t, 
     PartialCompareEffortIndicator t) -> 
     UniformlyOrderedPair t -> Bool
propOuterInnerRoundedBasisJoinInPlaceConsistentWithPure 
    _ (partialjoinOutEffort, partialjoinInEffort, effortComp)
        (UniformlyOrderedPair (e1,e2)) =
    inPlaceConsistentWithPurePartial2 (pLeqEff effortComp) 
        (partialJoinOutInPlaceEff partialjoinOutEffort)  
        (partialJoinInInPlaceEff partialjoinInEffort)
        (partialJoinOutEff partialjoinOutEffort) 
        (partialJoinInEff partialjoinInEffort) 
        e1 e2  

testsOuterInnerRoundedBasisInPlace :: 
    (PartialComparison t,
     OuterRoundedBasisInPlace t, InnerRoundedBasisInPlace t, 
     RoundedBasis t, 
     CanBeMutable t,
     Arbitrary t, Show t, 
     Arbitrary (PartialJoinOutEffortIndicator t), Show (PartialJoinOutEffortIndicator t), 
     Arbitrary (PartialJoinInEffortIndicator t), Show (PartialJoinInEffortIndicator t), 
     Arbitrary (PartialCompareEffortIndicator t), Show (PartialCompareEffortIndicator t), 
     ArbitraryOrderedTuple t,
     Eq t
     ) => 
    (String, t) -> Test
testsOuterInnerRoundedBasisInPlace (name, sample) =
    testGroup (name ++ " partial join rounded in-place") $
        [
         testProperty "partial join in-place=pure"
             (propOuterInnerRoundedBasisJoinInPlaceConsistentWithPure sample)
        ]