AERN-Basics-2011.1: src/Numeric/AERN/Basics/RefinementOrder/InPlace/RoundedLattice.hs
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ImplicitParams #-}
{-|
Module : Numeric.AERN.Basics.RefinementOrder.InPlace.RoundedLattice
Description : lattices with directed-rounded in-place operations
Copyright : (c) Michal Konecny, Jan Duracz
License : BSD3
Maintainer : mikkonecny@gmail.com
Stability : experimental
Portability : portable
Lattices with directed-rounded in-place operations.
This module is hidden and reexported via its grand-parent RefinementOrder.
-}
module Numeric.AERN.Basics.RefinementOrder.InPlace.RoundedLattice
where
import Prelude hiding ((<=))
import Numeric.AERN.Basics.Exception
import Numeric.AERN.Basics.Mutable
import Control.Monad.ST (ST)
import Numeric.AERN.Basics.Effort
import Numeric.AERN.Basics.PartialOrdering
import Numeric.AERN.Basics.RefinementOrder.Arbitrary
import Numeric.AERN.Basics.RefinementOrder.PartialComparison
import Numeric.AERN.Basics.RefinementOrder.Extrema
import Numeric.AERN.Basics.RefinementOrder.RoundedLattice
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 directed-rounding lattice operations.
-}
class
(OuterRoundedLatticeEffort t, CanBeMutable t) =>
OuterRoundedLatticeInPlace t
where
joinOutInPlaceEff :: OpMutable2Eff (JoinMeetOutEffortIndicator t) t s
meetOutInPlaceEff :: OpMutable2Eff (JoinMeetOutEffortIndicator t) t s
joinOutInPlaceEffFromPure,
meetOutInPlaceEffFromPure ::
(CanBeMutable t, OuterRoundedLattice t) =>
OpMutable2Eff (JoinMeetOutEffortIndicator t) t s
joinOutInPlaceEffFromPure = pureToMutable2Eff joinOutEff
meetOutInPlaceEffFromPure = pureToMutable2Eff meetOutEff
joinOutEffFromInPlace,
meetOutEffFromInPlace ::
(CanBeMutable t, OuterRoundedLatticeInPlace t) =>
(JoinMeetOutEffortIndicator t) -> t -> t -> t
joinOutEffFromInPlace = mutable2EffToPure joinOutInPlaceEff
meetOutEffFromInPlace = mutable2EffToPure meetOutInPlaceEff
class
(InnerRoundedLatticeEffort t, CanBeMutable t) =>
InnerRoundedLatticeInPlace t
where
joinInInPlaceEff :: OpMutable2Eff (JoinMeetInEffortIndicator t) t s
meetInInPlaceEff :: OpMutable2Eff (JoinMeetInEffortIndicator t) t s
joinInInPlaceEffFromPure,
meetInInPlaceEffFromPure ::
(CanBeMutable t, InnerRoundedLattice t) =>
OpMutable2Eff (JoinMeetInEffortIndicator t) t s
joinInInPlaceEffFromPure = pureToMutable2Eff joinInEff
meetInInPlaceEffFromPure = pureToMutable2Eff meetInEff
joinInEffFromInPlace,
meetInEffFromInPlace ::
(CanBeMutable t, InnerRoundedLatticeInPlace t) =>
(JoinMeetInEffortIndicator t) -> t -> t -> t
joinInEffFromInPlace = mutable2EffToPure joinInInPlaceEff
meetInEffFromInPlace = mutable2EffToPure meetInInPlaceEff
propOuterInnerRoundedLatticeJoinInPlaceConsistentWithPure ::
(PartialComparison t,
OuterRoundedLatticeInPlace t, InnerRoundedLatticeInPlace t,
RoundedLattice t,
CanBeMutable t) =>
t ->
(JoinMeetOutEffortIndicator t, JoinMeetInEffortIndicator t,
PartialCompareEffortIndicator t) ->
UniformlyOrderedPair t -> Bool
propOuterInnerRoundedLatticeJoinInPlaceConsistentWithPure
_ (joinmeetOutEffort, joinmeetInEffort, effortComp)
(UniformlyOrderedPair (e1,e2)) =
inPlaceConsistentWithPure2 (pLeqEff effortComp)
(joinOutInPlaceEff joinmeetOutEffort)
(joinInInPlaceEff joinmeetInEffort)
(joinOutEff joinmeetOutEffort)
(joinInEff joinmeetInEffort)
e1 e2
propOuterInnerRoundedLatticeMeetInPlaceConsistentWithPure ::
(PartialComparison t,
OuterRoundedLatticeInPlace t, InnerRoundedLatticeInPlace t,
RoundedLattice t,
CanBeMutable t) =>
t ->
(JoinMeetOutEffortIndicator t, JoinMeetInEffortIndicator t,
PartialCompareEffortIndicator t) ->
UniformlyOrderedPair t -> Bool
propOuterInnerRoundedLatticeMeetInPlaceConsistentWithPure
_ (joinmeetOutEffort, joinmeetInEffort, effortComp)
(UniformlyOrderedPair (e1,e2)) =
inPlaceConsistentWithPure2 (pLeqEff effortComp)
(meetOutInPlaceEff joinmeetOutEffort)
(meetInInPlaceEff joinmeetInEffort)
(meetOutEff joinmeetOutEffort)
(meetInEff joinmeetInEffort)
e1 e2
testsOuterInnerRoundedLatticeInPlace ::
(PartialComparison t,
OuterRoundedLatticeInPlace t, InnerRoundedLatticeInPlace t,
RoundedLattice t,
CanBeMutable t,
Arbitrary t, Show t,
Arbitrary (JoinMeetOutEffortIndicator t), Show (JoinMeetOutEffortIndicator t),
Arbitrary (JoinMeetInEffortIndicator t), Show (JoinMeetInEffortIndicator t),
Arbitrary (PartialCompareEffortIndicator t), Show (PartialCompareEffortIndicator t),
ArbitraryOrderedTuple t,
Eq t
) =>
(String, t) -> Test
testsOuterInnerRoundedLatticeInPlace (name, sample) =
testGroup (name ++ " (join,meet) rounded in-place") $
[
testProperty "join in-place=pure"
(propOuterInnerRoundedLatticeJoinInPlaceConsistentWithPure sample)
,
testProperty "meet in-place=pure"
(propOuterInnerRoundedLatticeMeetInPlaceConsistentWithPure sample)
]