packages feed

AERN-Basics-2011.1: src/Numeric/AERN/Basics/Effort.hs

{-|
    Module      :  Numeric.AERN.Basics.Effort
    Description :  indicating computational effort for approximate computations
    Copyright   :  (c) Michal Konecny
    License     :  BSD3

    Maintainer  :  mikkonecny@gmail.com
    Stability   :  experimental
    Portability :  portable
    
    Indicating computational effort for approximate computations.
-}
module Numeric.AERN.Basics.Effort where

import Numeric.AERN.Misc.List

import Test.QuickCheck

class EffortIndicator t where
    {-| get a range of independent increments to a given effort indicator (may be empty) -}
    effortIncrementVariants :: t -> [t]
    {-| repeat the increment present in the given pair for the larger effort indicator -}
    effortRepeatIncrement :: (t,t) -> t
    {-| get an increasing sequence of effort indicators of the same type 
        as long as possible, ideally infinite -}
    effortIncrementSequence :: t -> [t]

newtype Int1To5 = Int1To5 { fromInt1To5 :: Int }
newtype Int1To10 = Int1To10 { fromInt1To10 :: Int }
newtype Int1To20 = Int1To20 { fromInt1To20 :: Int }
newtype Int1To50 = Int1To50 { fromInt1To50 :: Int }
newtype Int1To100 = Int1To100 { fromInt1To100 :: Int }
newtype Int1To1000 = Int1To1000 { fromInt1To1000 :: Int }

instance Show Int1To5 where
    show (Int1To5 i) = show i

instance Show Int1To10 where
    show (Int1To10 i) = show i

instance Show Int1To20 where
    show (Int1To20 i) = show i

instance Show Int1To50 where
    show (Int1To50 i) = show i

instance Show Int1To100 where
    show (Int1To100 i) = show i

instance Show Int1To1000 where
    show (Int1To1000 i) = show i

instance Arbitrary Int1To5 where
    arbitrary =
        do
        i <- choose (1, 5)
        return $ Int1To5 i

instance Arbitrary Int1To10 where
    arbitrary =
        do
        i <- choose (1, 10)
        return $ Int1To10 i

instance Arbitrary Int1To20 where
    arbitrary =
        do
        i <- choose (1, 20)
        return $ Int1To20 i

instance Arbitrary Int1To50 where
    arbitrary =
        do
        i <- choose (1, 50)
        return $ Int1To50 i

instance Arbitrary Int1To100 where
    arbitrary =
        do
        i <- choose (1, 100)
        return $ Int1To100 i

instance Arbitrary Int1To1000 where
    arbitrary =
        do
        i <- choose (1, 1000)
        return $ Int1To1000 i

instance EffortIndicator Int1To5 where
    effortIncrementVariants (Int1To5 i) = [Int1To5 $ i + 1]
    effortRepeatIncrement (Int1To5 i1, Int1To5 i2) = Int1To5 $ i2 + (i2 - i1)
    effortIncrementSequence (Int1To5 i) =
        map Int1To5 $ map (i +) $ fibs12
        where
        fibs12 = scanl (+) 1 (1:fibs12)

instance EffortIndicator Int1To10 where
    effortIncrementVariants (Int1To10 i) = [Int1To10 $ i + 1]
    effortRepeatIncrement (Int1To10 i1, Int1To10 i2) = Int1To10 $ i2 + (i2 - i1)
    effortIncrementSequence (Int1To10 i) =
        map Int1To10 $ map (i +) $ fibs12
        where
        fibs12 = scanl (+) 1 (1:fibs12)

instance EffortIndicator Int1To20 where
    effortIncrementVariants (Int1To20 i) = [Int1To20 $ i + 1]
    effortRepeatIncrement (Int1To20 i1, Int1To20 i2) = Int1To20 $ i2 + (i2 - i1)
    effortIncrementSequence (Int1To20 i) =
        map Int1To20 $ map (i +) $ fibs12
        where
        fibs12 = scanl (+) 1 (1:fibs12)

instance EffortIndicator Int1To50 where
    effortIncrementVariants (Int1To50 i) = [Int1To50 $ i + 1]
    effortRepeatIncrement (Int1To50 i1, Int1To50 i2) = Int1To50 $ i2 + (i2 - i1)
    effortIncrementSequence (Int1To50 i) =
        map Int1To50 $ map (i +) $ fibs12
        where
        fibs12 = scanl (+) 1 (1:fibs12)

instance EffortIndicator Int1To100 where
    effortIncrementVariants (Int1To100 i) = [Int1To100 $ i + 1]
    effortRepeatIncrement (Int1To100 i1, Int1To100 i2) = Int1To100 $ i2 + (i2 - i1)
    effortIncrementSequence (Int1To100 i) =
        map Int1To100 $ map (i +) $ fibs12
        where
        fibs12 = scanl (+) 1 (1:fibs12)

instance EffortIndicator Int1To1000 where
    effortIncrementVariants (Int1To1000 i) = [Int1To1000 $ i + 1]
    effortRepeatIncrement (Int1To1000 i1, Int1To1000 i2) = Int1To1000 $ i2 + (i2 - i1)
    effortIncrementSequence (Int1To1000 i) =
        map Int1To1000 $ map (i +) $ fibs12
        where
        fibs12 = scanl (+) 1 (1:fibs12)

instance EffortIndicator () where
    effortIncrementVariants _ = []
    effortRepeatIncrement _ = ()
    effortIncrementSequence i = []

instance (EffortIndicator t1, EffortIndicator t2) => EffortIndicator (t1, t2)
    where
    effortIncrementVariants (i1, i2) = 
        i1Variants ++ i2Variants
        where
        i1Variants =
            map (\i -> (i, i2)) (effortIncrementVariants i1)
        i2Variants =
            map (\i -> (i1, i)) (effortIncrementVariants i2)
    effortRepeatIncrement ((i1, i2), (j1, j2)) = 
        (effortRepeatIncrement (i1, j1), effortRepeatIncrement (i2, j2)) 
    effortIncrementSequence (i1, i2) =
        case (effortIncrementSequence i1, effortIncrementSequence i2) of
            ([], []) -> []
            (s1, []) -> map (\e -> (e, i2)) s1 
            ([], s2) -> map (\e -> (i1, e)) s2
            (s1, s2) -> zipFill s1 s2
        
instance (EffortIndicator t1, EffortIndicator t2, EffortIndicator t3) => EffortIndicator (t1, t2, t3)
    where
    effortIncrementVariants (i1, i2, i3) = 
        i1Variants ++ i2Variants ++ i3Variants
        where
        i1Variants =
            map (\i -> (i, i2, i3)) (effortIncrementVariants i1)
        i2Variants =
            map (\i -> (i1, i, i3)) (effortIncrementVariants i2)
        i3Variants =
            map (\i -> (i1, i2, i)) (effortIncrementVariants i3)
    effortRepeatIncrement ((i1, i2, i3), (j1, j2, j3)) = 
        (effortRepeatIncrement (i1, j1), effortRepeatIncrement (i2, j2), effortRepeatIncrement (i3, j3)) 
    effortIncrementSequence (i1, i2, i3) =
        case (effortIncrementSequence i1, effortIncrementSequence i2, effortIncrementSequence i3) of
            ([], [], []) -> []
            (s1, [], []) -> map (\e -> (e, i2, i3)) s1 
            ([], s2, []) -> map (\e -> (i1, e, i3)) s2
            ([], [], s3) -> map (\e -> (i1, i2, e)) s3
            (s1, s2, []) -> map (\(e1,e2) -> (e1, e2, i3)) $ zipFill s1 s2 
            (s1, [], s3) -> map (\(e1,e3) -> (e1, i2, e3)) $ zipFill s1 s3 
            ([], s2, s3) -> map (\(e2,e3) -> (i1, e2, e3)) $ zipFill s2 s3 
            (s1, s2, s3) -> zipFill3 s1 s2 s3