aern2-real 0.1.2 → 0.2.0.0
raw patch · 45 files changed
+1698/−5515 lines, 45 filesdep +collect-errorsdep +integer-logarithmsdep −aern2-realdep −aesondep −bytestringdep ~QuickCheckdep ~aern2-mpdep ~hspec
Dependencies added: collect-errors, integer-logarithms
Dependencies removed: aern2-real, aeson, bytestring, containers, convertible, lens, random, stm, transformers
Dependency ranges changed: QuickCheck, aern2-mp, hspec, mixed-types-num
Files
- LICENSE +1/−1
- README.md +110/−0
- aern2-real.cabal +44/−142
- bench/aern2-real-benchOp.hs +0/−126
- changelog.md +9/−0
- src/AERN2/AccuracySG.hs +0/−136
- src/AERN2/Complex.hs +101/−0
- src/AERN2/Limit.hs +0/−156
- src/AERN2/MPBallWithGlobalPrec.hs +0/−73
- src/AERN2/QA/NetLog.hs +0/−120
- src/AERN2/QA/Protocol.hs +0/−277
- src/AERN2/QA/Strategy/Cached.hs +0/−23
- src/AERN2/QA/Strategy/Cached/Arrow.hs +0/−121
- src/AERN2/QA/Strategy/Cached/NetState.hs +0/−142
- src/AERN2/QA/Strategy/CachedUnsafe.hs +0/−97
- src/AERN2/QA/Strategy/Parallel.hs +0/−227
- src/AERN2/Real.hs +68/−148
- src/AERN2/Real/Arithmetic.hs +0/−306
- src/AERN2/Real/CKleenean.hs +101/−0
- src/AERN2/Real/Comparisons.hs +345/−0
- src/AERN2/Real/Elementary.hs +227/−0
- src/AERN2/Real/Field.hs +399/−0
- src/AERN2/Real/Limit.hs +60/−0
- src/AERN2/Real/Tests.hs +127/−146
- src/AERN2/Real/Type.hs +106/−82
- src/AERN2/Sequence.hs +0/−67
- src/AERN2/Sequence/Branching.hs +0/−161
- src/AERN2/Sequence/Comparison.hs +0/−360
- src/AERN2/Sequence/Elementary.hs +0/−307
- src/AERN2/Sequence/Field.hs +0/−197
- src/AERN2/Sequence/Helpers.hs +0/−246
- src/AERN2/Sequence/PreludeOps.hs +0/−95
- src/AERN2/Sequence/Ring.hs +0/−289
- src/AERN2/Sequence/Type.hs +0/−265
- src/AERN2/Utils/Arrows.hs +0/−58
- src/AERN2/WithGlobalParam.hs +0/−40
- src/AERN2/WithGlobalParam/Branching.hs +0/−73
- src/AERN2/WithGlobalParam/Comparison.hs +0/−261
- src/AERN2/WithGlobalParam/Elementary.hs +0/−158
- src/AERN2/WithGlobalParam/Field.hs +0/−106
- src/AERN2/WithGlobalParam/Helpers.hs +0/−85
- src/AERN2/WithGlobalParam/Ring.hs +0/−203
- src/AERN2/WithGlobalParam/Type.hs +0/−200
- test/AERN2/RealSpec.hs +0/−20
- test/Spec.hs +0/−1
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2015-2017 Michal Konecny+Copyright (c) 2015-2021 Michal Konecny All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ README.md view
@@ -0,0 +1,110 @@+# aern2-real++Exact real arithmetic++## Numeric data types++This package provides the following two data types:++* `CReal`: Exact real numbers via lazy sequences of interval approximations+ +* `CKleenean`: Lazy Kleeneans, naturally arising from comparisons of `CReal`s+ +The type `CReal` has instances of both [mixed-types-num](https://hackage.haskell.org/package/mixed-types-num) type classes such as `CanAdd`, `CanSqrt` as well as with traditional Prelude type classes such as `Ord`, `Num` and `Floating`.+The type `CKleenean` supports the usual Boolean operations.++### Examples++First, let us test exact real arithmetic with Prelude operations:++ $ stack ghci aern2-real:lib --no-load --ghci-options AERN2.Real+ *AERN2.MP> import Prelude hiding (pi)+ *AERN2.MP Prelude>++ ...> pi+ {?(prec 36): [3.141592653584666550159454345703125 ± ~1.4552e-11 ~2^(-36)]}++ ...> pi ? (bits 1000)+ [3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117... ± ~0.0000 ~2^(-1230)]++ ...> pi ? (bits 1000000)+ [3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117... ± ~0.0000 ~2^(-1028468)]+ (4.12 secs, 270,972,152 bytes)++ ...> pi ^ 2+ [9.8696044010893586188344909998725639610631902560... ± ~8.1120e-30 ~2^(-96)]+ {?(prec 36): [9.8696044009993784129619598388671875 ± ~1.4964e-10 ~2^(-32)]}++ ...> pi ^ pi+ <interactive>:18:1: error:+ • No instance for (Integral CReal) arising from a use of ‘^’++ ...> sin pi+ {?(prec 36): [0.000000000005126565838509122841060161590576171875 ± ~1.4559e-11 ~2^(-35)]}++ ...> (sin pi) ? (bits 10000) -- guaranteed accuracy at least 10000+ [-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000... ± ~0.0000 ~2^(-13539)]+ (0.21 secs, 196,580,192 bytes)++ ...> (sin pi) ? (prec 10000) -- no guaranteed accuracy+ [-0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000... ± ~0.0000 ~2^(-13539)]+ (0.13 secs, 107,844,784 bytes)++ ...> pi > 0+ True++ ...> pi == pi+ *** Exception: Failed to decide equality of Sequences. If you switch to MixedTypesNumPrelude instead of Prelude, comparison of Sequences returns CSequence Kleenean or similar instead of Bool.++Some things do not work with Prelude. Let us try using MixedTypesNumPrelude operations:++ $ stack ghci aern2-real:lib --no-load --ghci-options AERN2.Real+ *AERN2.MP> import MixedTypesNumPrelude+ *AERN2.MP MixedTypesNumPrelude>++ ...> pi ^ pi+ {?(prec 36): [36.462159605538498632520418490483602438877178488347481362195878876490337527904728176508797332644462... ± ~2.7112e-9 ~2^(-28)]}++ ...> (pi ^ pi) ? (bits 10000)+ [36.462159607207911770990826022692123666365508402228818738709335922934074368881699904620079875706774... ± ~0.0000 ~2^(-13532)]+ (0.81 secs, 631,865,912 bytes)++ ...> pi > 0+ {?(prec 36): CertainTrue}++ ...> pi == pi+ {?(prec 36): TrueOrFalse}++ ...> pi == pi + 2^(-100)+ {?(prec 36): TrueOrFalse}++ ...> (pi == pi + 2^(-100)) ? (prec 1000)+ CertainFalse++ ...> 2^0.5+ {?(prec 36): [1.414213562371930730340852514178195642186126256312482171419747717302107387071785637999710161238908... ± ~1.0305e-11 ~2^(-36)]}++## Partial functions and error handling++Errors due to invalid input, such as division by zero or logarithm of a negative number can be only semi-detected in the same way as comparisons can be only semi-decided.+Therefore, an invalid input gives a `CReal` leads to errors or potential errors only when extracting an approximation:++ ...> bad1 = pi/0+ ...> bad1 ? (prec 100)+ {{ERROR: division by 0}}}++ ...> bad2 = 1/(pi-pi)+ ...> bad2 ? (prec 100)+ {{POTENTIAL ERROR: division by 0}}++When we are sure that potential errors are harmless, we can clear them:++ ...> ok3 = sqrt (pi-pi)+ ...> ok3 ? (prec 10)+ [0.022097086912079610143710452219156792352805496193468570709228515625 ± ~2.2097e-2 ~2^(-5)]{{POTENTIAL ERROR: out of domain: negative sqrt argument}}+ ...> clearPotentialErrors $ ok3 ? (prec 10)+ [0.022097086912079610143710452219156792352805496193468570709228515625 ± ~2.2097e-2 ~2^(-5)]++## Specification and tests++The approximations obtained using `? (bits n)` or `? (prec p)` are intervals of type `CN MPBall` from package [aern2-mp](../aern2-mp/README.md). This type is also used internally for all `CReal` arithmetic. The `MPBall` arithmetic is tested against a fairly complete hspec/QuickCheck specification of algebraic properties.
aern2-real.cabal view
@@ -1,154 +1,56 @@+cabal-version: 1.12++-- This file has been generated from package.yaml by hpack version 0.33.0.+--+-- see: https://github.com/sol/hpack+--+-- hash: b57c88210a794528b882a16827029297ad35afce7480417eae1b92b8862d8853+ name: aern2-real-version: 0.1.2-cabal-version: >= 1.9.2-build-type: Simple-homepage: https://github.com/michalkonecny/aern2+version: 0.2.0.0+synopsis: Real numbers as sequences of MPBalls+description: Please see the README on GitHub at <https://github.com/michalkonecny/aern2/#readme>+category: Math+homepage: https://github.com/michalkonecny/aern2#readme+bug-reports: https://github.com/michalkonecny/aern2/issues author: Michal Konecny-maintainer: Michal Konecny <mikkonecny@gmail.com>-copyright: (c) 2015-2019 Michal Konecny+maintainer: mikkonecny@gmail.com+copyright: 2015-2021 Michal Konecny license: BSD3 license-file: LICENSE-extra-source-files: changelog.md-stability: experimental-category: Math-synopsis: Exact real numbers via Cauchy sequences and MPFR-Description:- Exact real numbers as Cauchy sequences of MPFR approximations.- .- See module "AERN2.Real" for further documentation.-+build-type: Simple+extra-source-files:+ README.md+ changelog.md source-repository head- type: git- location: https://github.com/mikkonecny/aern2.git- subdir: aern2-real+ type: git+ location: https://github.com/michalkonecny/aern2 library- hs-source-dirs: src- build-depends:- base == 4.*- , containers >= 0.5- , convertible >= 1.1.1.0- , hspec >= 2.1- -- , hspec-smallcheck >= 0.3 && < 0.5- , QuickCheck >= 2.7- , transformers >= 0.4- , lens >= 4.13- , stm >= 2.4- , bytestring >= 0.10- , aeson >= 0.11- , mixed-types-num >= 0.3.2- , aern2-mp >= 0.1.4- ghc-options: -Wall -fno-warn-orphans- extensions:- RebindableSyntax,- PostfixOperators,- ScopedTypeVariables,- TypeFamilies,- TypeOperators,- ConstraintKinds,- DefaultSignatures,- MultiParamTypeClasses,- FlexibleContexts,- FlexibleInstances,- UndecidableInstances,- Arrows exposed-modules:- AERN2.Utils.Arrows- AERN2.QA.Protocol- AERN2.QA.NetLog- AERN2.QA.Strategy.CachedUnsafe- AERN2.QA.Strategy.Cached.NetState- AERN2.QA.Strategy.Cached.Arrow- AERN2.QA.Strategy.Cached- AERN2.QA.Strategy.Parallel- AERN2.AccuracySG- AERN2.WithGlobalParam.Type- AERN2.WithGlobalParam.Helpers- AERN2.WithGlobalParam.Comparison- AERN2.WithGlobalParam.Branching- AERN2.WithGlobalParam.Ring- AERN2.WithGlobalParam.Field- AERN2.WithGlobalParam.Elementary- AERN2.WithGlobalParam- AERN2.MPBallWithGlobalPrec- AERN2.Sequence.Type- AERN2.Sequence.Helpers- AERN2.Sequence.Comparison- AERN2.Sequence.Branching- AERN2.Sequence.Ring- AERN2.Sequence.Field- AERN2.Sequence.Elementary- AERN2.Sequence.PreludeOps- AERN2.Sequence- AERN2.Real.Type- AERN2.Real.Arithmetic- AERN2.Real.Tests- AERN2.Real- AERN2.Limit--test-suite spec- type:- exitcode-stdio-1.0- ghc-options:- -Wall- extensions:- RebindableSyntax,- PostfixOperators,- ScopedTypeVariables,- FlexibleContexts- hs-source-dirs:- test- main-is:- Spec.hs+ AERN2.Complex+ AERN2.Real+ AERN2.Real.CKleenean+ AERN2.Real.Comparisons+ AERN2.Real.Elementary+ AERN2.Real.Field+ AERN2.Real.Limit+ AERN2.Real.Tests+ AERN2.Real.Type other-modules:- AERN2.RealSpec- build-depends:- base == 4.*- -- , mixed-types-num >= 0.3.1 && < 0.4- -- , aern2-mp- , aern2-real- , hspec >= 2.1- -- , hspec-smallcheck >= 0.3 && < 0.5- , QuickCheck >= 2.7--executable aern2-real-benchOp- ghc-options:- -Wall- extensions:- RebindableSyntax,- PostfixOperators,- ScopedTypeVariables,- FlexibleContexts,- TypeSynonymInstances+ Paths_aern2_real hs-source-dirs:- bench- main-is:- aern2-real-benchOp.hs+ src+ default-extensions: RebindableSyntax, ScopedTypeVariables, TypeFamilies, TypeOperators, ConstraintKinds, DefaultSignatures, MultiParamTypeClasses, FlexibleContexts, FlexibleInstances, UndecidableInstances+ other-extensions: TemplateHaskell+ ghc-options: -Wall build-depends:- base == 4.*- , mixed-types-num >= 0.3.1- , aern2-mp == 0.1.*- , aern2-real- , random- , QuickCheck---- executable aern2-generate-netlog-elm--- ghc-options:--- -Wall--- extensions:--- RebindableSyntax,--- PostfixOperators,--- ScopedTypeVariables,--- FlexibleContexts,--- TypeSynonymInstances--- hs-source-dirs:--- tools--- main-is:--- aern2-generate-netlog.hs--- build-depends:--- base == 4.*--- , elm-bridge--- , mixed-types-num >= 0.3.1--- , aern2-mp == 0.1.*--- , aern2-real+ QuickCheck+ , aern2-mp >=0.2+ , base ==4.*+ , collect-errors >=0.1+ , hspec+ , integer-logarithms+ , mixed-types-num >=0.5.1+ default-language: Haskell2010
− bench/aern2-real-benchOp.hs
@@ -1,126 +0,0 @@-{-|- Module : Main (file aern2-real-benchOp)- Description : execute a CR operation for benchmarking- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable--}-module Main where--import MixedTypesNumPrelude--- import Prelude--import Text.Printf--import System.Environment--import System.IO.Unsafe (unsafePerformIO)-import System.Random (randomRIO)--import Test.QuickCheck--import AERN2.Utils.Bench--import AERN2.MP-import AERN2.Real-import AERN2.Real.Tests () -- instance Arbitrary CauchyReal--main :: IO ()-main =- do- args <- getArgs- (computationDescription, results) <- processArgs args- putStrLn $ computationDescription- putStrLn $ "accuracies = " ++ show (map getAccuracy results)--processArgs ::- [String] ->- IO (String, [MPBall])-processArgs [op, countS, accuracyS] =- return (computationDescription, results)- where- computationDescription =- printf "computing %s (%d times) using accuracy %d" op count ac- ac :: Integer- ac = read accuracyS- count :: Integer- count = read countS-- results =- case op of- "exp" ->- map ((? (bitsS ac)) . exp) $- unsafePerformIO $ pickValues valuesSmall count- "log" ->- map ((~!) . (? (bitsS ac)) . log) $- unsafePerformIO $ pickValues valuesPositive count- "sqrt" ->- map ((~!) . (? (bitsS ac)) . sqrt) $- unsafePerformIO $ pickValues valuesPositive count- "cos" ->- map ((? (bitsS ac)) . cos) $- unsafePerformIO $ pickValues values count- "add" ->- map ((? (bitsS ac)) . (uncurry (+))) $- unsafePerformIO $ pickValues2 values values count- "mul" ->- map ((? (bitsS ac)) . (uncurry (*))) $- unsafePerformIO $ pickValues2 values values count- "div" ->- map ((~!) . (? (bitsS ac)) . (uncurry (/))) $- unsafePerformIO $ pickValues2 values valuesPositive count- "logistic" ->- map ((? (bitsS ac)) . (logistic 3.82 count)) $- [real 0.125]- _ -> error $ "unknown op " ++ op-processArgs _ =- error "expecting arguments: <operation> <count> <precision>"--logistic :: Rational -> Integer -> CauchyReal -> CauchyReal-logistic c n x- | n == 0 = x- | otherwise = logistic c (n-1) $ c * x * (1-x)--pickValues2 :: [CauchyReal] -> [CauchyReal] -> Integer -> IO [(CauchyReal, CauchyReal)]-pickValues2 vals1 vals2 count =- do- p1 <- pickValues vals1 count- p2 <- pickValues vals2 count- return $ zip p1 p2--pickValues :: [CauchyReal] -> Integer -> IO [CauchyReal]-pickValues vals count =- sequence $- [- do- i1 <- randomRIO (1,maxIndex)- let x = vals !! i1- return x- | _j <- [1..count]- ]--maxIndex :: Integer-maxIndex = 1000--valuesSmall :: [CauchyReal]-valuesSmall = map makeSmall values- where- makeSmall :: CauchyReal -> CauchyReal- makeSmall x- | abs (getBall x) !<! 1000000 = x- | otherwise = 1000000 * (x/!(1000000+(abs x)))- where- getBall :: CauchyReal -> MPBall- getBall xx = xx ? (bitsS 53)--valuesPositive :: [CauchyReal]-valuesPositive = filter ((!>! 0) . getBall) values- where- getBall :: CauchyReal -> MPBall- getBall x = x ? (bitsS 53)--values :: [CauchyReal]-values = listFromGen (real <$> (arbitrary :: Gen Rational))
changelog.md view
@@ -1,3 +1,11 @@+# Change log for aern2-real++* v 0.2.0 2021-05-17+ * moving Arrow-based functionality to package aern2-net+ * replacing Arrow-based sequences by list-based sequences+ * switch to new simplified collect-errors, mixed-types-num 0.5.0+ * got rid of EnsureCE etc.+ * not introducing CN wrapper unless at least one parameter is already CN * v 0.1.2 2019-03-19 * adapts to mixed-types-num 0.3.2 (new divI, mod) * v 0.1.1.0 2017-12-06@@ -12,3 +20,4 @@ * arrow-based networks of nodes communicating via query-answer protocols * networks executable with cached and parallel strategies * network execution can be visualised in browser using an Elm frontend+
− src/AERN2/AccuracySG.hs
@@ -1,136 +0,0 @@-{-# LANGUAGE Arrows #-}-{-|- Module : AERN2.AccuracySG- Description : strict and guide accuracy pairs- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- strict and guide accuracy pairs--}-module AERN2.AccuracySG-(- AccuracySG(..), acSG0, default_acSG, accuracySG, bitsS, bitsSG-, accuracySGdefaultTolerance-, CanAdjustToAccuracySG(..)-)-where--import MixedTypesNumPrelude-import qualified Prelude as P--import Control.Arrow---- import qualified Control.CollectErrors as CE-import Control.CollectErrors (CollectErrors) --, EnsureCE, CanEnsureCE, ensureCE)--import AERN2.MP.Accuracy-import AERN2.MP.Ball--{-| An accuracy specification which includes a soft target "guide" accuracy- in addition to the usual string accuracy requirement. -}-data AccuracySG =- AccuracySG { _acStrict :: Accuracy, _acGuide :: Accuracy }- deriving (P.Eq)--instance Show AccuracySG where- show (AccuracySG acS acG) =- "bitsSG " ++ (show $ fromAccuracy acS) ++ " " ++ (show $ fromAccuracy acG)--instance ConvertibleExactly AccuracySG Accuracy where- safeConvertExactly (AccuracySG acS acG) = Right $ acS `max` acG--accuracySGdefaultTolerance :: Integer-accuracySGdefaultTolerance = 20--accuracySG :: Accuracy -> AccuracySG-accuracySG ac = AccuracySG ac (ac + accuracySGdefaultTolerance)--bitsSG :: Integer -> Integer -> AccuracySG-bitsSG acS acG = AccuracySG (bits acS) (bits acG)--bitsS :: Integer -> AccuracySG-bitsS = accuracySG . bits--acSG0 :: AccuracySG-acSG0 = bitsS 0--default_acSG :: AccuracySG-default_acSG = bitsS 100--instance HasEqAsymmetric AccuracySG AccuracySG-instance HasOrderAsymmetric AccuracySG AccuracySG where- geq (AccuracySG acS1 acG1) (AccuracySG acS2 acG2) =- acS1 >= acS2 && acG1 >= acG2- greaterThan acSG1 acSG2 =- acSG1 >= acSG2 && acSG1 /= acSG2- leq = flip geq- lessThan = flip greaterThan--instance HasOrderAsymmetric Accuracy AccuracySG where- greaterThan ac (AccuracySG acS acG) =- ac > acS && ac > acG - accuracySGdefaultTolerance- geq ac (AccuracySG acS acG) =- ac >= acS && ac >= acG - accuracySGdefaultTolerance- leq ac (AccuracySG acS _acG) =- ac <= acS- lessThan ac (AccuracySG acS _acG) =- ac < acS--instance HasOrderAsymmetric AccuracySG Accuracy where- greaterThan = flip lessThan- lessThan = flip greaterThan- leq = flip leq- geq = flip geq--instance CanMinMaxAsymmetric AccuracySG AccuracySG where- min = lift2 min- max = lift2 max--lift2 ::- (Accuracy -> Accuracy -> Accuracy)- -> (AccuracySG -> AccuracySG -> AccuracySG)-lift2 op (AccuracySG acS1 acG1) (AccuracySG acS2 acG2) =- AccuracySG (acS1 `op` acS2) (acG1 `op` acG2)--instance CanAddAsymmetric AccuracySG Integer where- add (AccuracySG acS acG) n = AccuracySG (acS + n) (acG + n)-instance CanAddAsymmetric Integer AccuracySG where- type AddType Integer AccuracySG = AccuracySG- add = flip add-instance CanSub AccuracySG Integer where---class CanAdjustToAccuracySG t where- adjustToAccuracySG :: AccuracySG -> t -> t--instance CanAdjustToAccuracySG MPBall where- adjustToAccuracySG (AccuracySG acS acG) =- setPrecisionAtLeastAccuracy acS . reduceSizeUsingAccuracyGuide acG--instance CanAdjustToAccuracySG Bool where- adjustToAccuracySG _ = id--instance CanAdjustToAccuracySG t => CanAdjustToAccuracySG (Maybe t) where- adjustToAccuracySG acSG = fmap (adjustToAccuracySG acSG)--instance CanAdjustToAccuracySG t => CanAdjustToAccuracySG (CollectErrors es t) where- adjustToAccuracySG acSG = fmap (adjustToAccuracySG acSG)--instance- (Arrow to, CanUnionAsymmetric e1 e2)- =>- CanUnionAsymmetric (to AccuracySG e1) (to AccuracySG e2)- -- this instance is important for "parallel if"- where- type UnionType (to AccuracySG e1) (to AccuracySG e2) =- to AccuracySG (UnionType e1 e2)- union xA yA =- proc ac ->- do- x <- xA -< ac- y <- yA -< ac- returnA -< union x y
+ src/AERN2/Complex.hs view
@@ -0,0 +1,101 @@+{-# OPTIONS_GHC -Wno-orphans #-}+{-|+ Module : AERN2.Complex+ Description : Exact complex numbers+ Copyright : (c) Michal Konecny+ License : BSD3++ Maintainer : mikkonecny@gmail.com+ Stability : experimental+ Portability : portable++ Exact complex numbers represented by Cauchy sequences of (Complex MPBall)'s.+-}+module AERN2.Complex+(+ -- * complex numbers and conversions+ CComplex, ccomplex, HasCComplex, CanBeCComplex,+)+where++import MixedTypesNumPrelude+-- -- import qualified Prelude as P++import Data.Complex++import AERN2.Real++type CComplex = Complex CReal++type CanBeCComplex t = ConvertibleExactly t CComplex++type HasCComplex t = ConvertibleExactly CComplex t++ccomplex :: (CanBeCComplex t) => t -> CComplex+ccomplex = convertExactly++instance (HasCReals t, HasIntegers t) => (ConvertibleExactly CReal (Complex t))+ where+ safeConvertExactly n =+ do+ nT <- safeConvertExactly n+ zT <- safeConvertExactly 0+ return $ nT :+ zT++-- {- reals mixed with complex -}++-- instance+-- (CanAddAsymmetric CReal t)+-- =>+-- CanAddAsymmetric CReal (Complex t)+-- where+-- type AddType CReal (Complex t) = Complex (AddType CReal t)+-- add r (a :+ i) = (r + a) :+ (z + i)+-- where+-- z = realA 0+-- _ = [z,r]++-- instance+-- (CanAddAsymmetric t CReal)+-- =>+-- CanAddAsymmetric (Complex t) CReal+-- where+-- type AddType (Complex t) CReal = Complex (AddType t CReal)+-- add (a :+ i) r = (a + r) :+ (i + z)+-- where+-- z = realA 0+-- _ = [z,r]++-- instance+-- (CanAdd CReal t, CanNegSameType t)+-- =>+-- CanSub CReal (Complex t)++-- instance+-- (CanAdd t CReal)+-- =>+-- CanSub (Complex t) CReal++-- instance+-- (CanMulAsymmetric CReal t)+-- =>+-- CanMulAsymmetric CReal (Complex t)+-- where+-- type MulType CReal (Complex t) = Complex (MulType CReal t)+-- mul r (a :+ i) = (r * a) :+ (r * i)++-- instance+-- (CanMulAsymmetric t CReal)+-- =>+-- CanMulAsymmetric (Complex t) CReal+-- where+-- type MulType (Complex t) CReal = Complex (MulType t CReal)+-- mul (a :+ i) r = (a * r) :+ (i * r)+++_test1 :: CComplex+_test1 = ccomplex 1.0++_test2 :: CComplex+_test2 = ccomplex $ creal 1+
− src/AERN2/Limit.hs
@@ -1,156 +0,0 @@-{-# LANGUAGE CPP #-}--- #define DEBUG--module AERN2.Limit where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#define maybeTraceIO putStrLn-#else-#define maybeTrace (\ (_ :: String) t -> t)-#define maybeTraceIO (\ (_ :: String) -> return ())-#endif--import MixedTypesNumPrelude--import Control.CollectErrors--import AERN2.QA.Protocol-import AERN2.Real-------------- limit------------class HasLimits ix s where- type LimitType ix s- limit :: (ix -> s) -> LimitType ix s--instance HasLimits Rational CauchyReal where- type LimitType Rational CauchyReal = CauchyReal- limit s = newCR "limit" [] makeQ- where- makeQ (me, _src) ac@(AccuracySG acS _acG) =- updateRadius (+ (errorBound e)) $ (s e ?<- me) (ac + 1)- where- e = 0.5^!(fromAccuracy acS + 1)--instance HasLimits Rational CauchyRealCN where- type LimitType Rational CauchyRealCN = CauchyRealCN- limit s = newCRCN "limit" [] makeQ- where- makeQ (me, _src) ac@(AccuracySG acS _acG) =- lift1CE (updateRadius (+ (errorBound e))) $ (s e ?<- me) (ac + 1)- where- e = 0.5^!(fromAccuracy acS + 1)--instance HasLimits Rational (CauchyReal -> CauchyRealCN) where- type LimitType Rational (CauchyReal -> CauchyRealCN) = (CauchyReal -> CauchyRealCN)- limit fs x = newCRCN "limit" [AnyProtocolQA x] makeQ- where- makeQ (me, _src) ac@(AccuracySG acS _acG) =- maybeTrace ("limit (CauchyReal -> CauchyRealCN): ac = " ++ show ac ) $- lift1CE (updateRadius (+ (errorBound e))) $ (fx ?<- me) (ac + 1)- where- fx = fs e x- e = 0.5^!(fromAccuracy acS + 1)--{-- The following strategies are inspired by- Mueller: The iRRAM: Exact Arithmetic in C++, Section 10.1- https://link.springer.com/chapter/10.1007/3-540-45335-0_14--}--instance HasLimits Rational (MPBall -> CN MPBall) where- type LimitType Rational (MPBall -> CN MPBall) = (MPBall -> CN MPBall)- limit fs x =- maybeTrace ("limit (MPBall -> CN MPBall): x = " ++ show x) $- maybeTrace ("limit (MPBall -> CN MPBall): xPNext = " ++ show xPNext) $- maybeTrace ("limit (MPBall -> CN MPBall): accuracies = " ++ show accuracies) $- tryAccuracies accuracies- where- acX = getFiniteAccuracy x- accuracies = aux (fromAccuracy acX)- where- aux a- | a >= 4 = bits a : aux ((100 * a) `divINoCN` 105)- | otherwise = [bits a]- xPNext = setPrecision (increaseP $ getPrecision x) x- increaseP p =- prec $ (integer p) + 10- -- prec $ ((101 * (integer p)) `div` 100) + 1-- tryAccuracies [] =- noValueNumErrorPotentialECN (Nothing :: Maybe MPBall) $- NumError "limit (MPBall -> CN MPBall) failed"- tryAccuracies (ac : rest) =- let result = withAccuracy ac in- case getErrorsCN result of- [] -> result- _ -> tryAccuracies rest-- withAccuracy ac =- maybeTrace ("limit (MPBall -> CN MPBall): withAccuracy: ac = " ++ show ac) $- lift1CE (updateRadius (+ (errorBound e))) (fs e xPNext)- where- e = 0.5^!(fromAccuracy ac)--data WithLipschitz f = WithLipschitz f f--instance HasLimits Rational (WithLipschitz (MPBall -> CN MPBall)) where- type LimitType Rational (WithLipschitz (MPBall -> CN MPBall)) = (MPBall -> CN MPBall)- limit ffs xPre =- maybeTrace ("limit (MPBall -> CN MPBall): x = " ++ show x) $- maybeTrace ("limit (MPBall -> CN MPBall): xC = " ++ show xC) $- maybeTrace ("limit (MPBall -> CN MPBall): xE = " ++ show xE) $- maybeTrace ("limit (MPBall -> CN MPBall): accuracies = " ++ show accuracies) $- tryAccuracies accuracies- where- acX = getFiniteAccuracy x- accuracies = aux (fromAccuracy acX)- where- aux a- | a >= 4 = bits a : aux ((100 * a) `divINoCN` 105)- | otherwise = [bits a]- x = increasePrec xPre- where- increasePrec z = setPrecision (inc $ getPrecision xPre) z- inc p =- prec $ (integer p) + 10- -- prec $ ((101 * (integer p)) `div` 100) + 1- xC = centreAsBall x- xE = radius x-- tryAccuracies [] =- noValueNumErrorPotentialECN (Nothing :: Maybe MPBall) $- NumError "limit (MPBall -> CN MPBall) failed"- tryAccuracies (ac : rest) =- let result = withAccuracy ac in- case getErrorsCN result of- [] -> result- _ -> tryAccuracies rest-- withAccuracy ac =- maybeTrace ("limit (MPBall -> CN MPBall): withAccuracy: ac = " ++ show ac) $- lift1CE (updateRadius (+ (errorBound e))) fx- where- e = 0.5^!(fromAccuracy ac)- WithLipschitz f f' = ffs e- fxC_CN = f xC- f'x_CN = f' x- fx :: CN MPBall- fx =- case (ensureNoCN fxC_CN, ensureNoCN f'x_CN) of- ((Just fxC, []), (Just f'x, [])) ->- cn $ updateRadius (+ (xE * (errorBound f'x))) fxC- _ ->- f x -- fallback--instance HasLimits Rational (WithLipschitz (CauchyReal -> CauchyRealCN)) where- type LimitType Rational (WithLipschitz (CauchyReal -> CauchyRealCN)) = (CauchyReal -> CauchyRealCN)- limit ffs x = limit fs x- where- fs e = f- where- WithLipschitz f _ = ffs e
− src/AERN2/MPBallWithGlobalPrec.hs
@@ -1,73 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.MPBallWithGlobalPrec- Description : MPBall parametrised by a global precision- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- This type is useful for iRRAM-style arrow-generic computation- over MPBall with a global precision.--}-module AERN2.MPBallWithGlobalPrec-(- -- * The protocol and type of objects depending on a global parameter- MPBallWithGlobalPrecP, pMPBallWGPrec- , wgprmName, wgprmId, wgprmSources, wgprmRename- , wgprmQuery, (?), wgprmQueryA, wgprmListQueryA- , MPBallWithGlobalPrecA, MPBallWithGlobalPrec- , newMPBallWGPrec, newMPBallWGPrecSimple-)-where--import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow--import AERN2.MP-import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.Real-import AERN2.WithGlobalParam--type MPBallWithGlobalPrecP = WithGlobalParamP Precision MPBall--pMPBallWGPrec :: MPBallWithGlobalPrecP-pMPBallWGPrec = pWGParam Nothing (mpBall 0)--type MPBallWithGlobalPrecA to = WithGlobalParamA to Precision MPBall-type MPBallWithGlobalPrec = MPBallWithGlobalPrecA (->)--newMPBallWGPrec ::- (QAArrow to)- =>- String -> [AnyProtocolQA to] -> ((Maybe (QAId to), Maybe (QAId to)) -> Precision `to` MPBall) -> MPBallWithGlobalPrecA to-newMPBallWGPrec = newWGParam Nothing (mpBall 0)--newMPBallWGPrecSimple ::- (QAArrow to)- =>- ((Maybe (QAId to), Maybe (QAId to)) -> Precision `to` MPBall) -> MPBallWithGlobalPrecA to-newMPBallWGPrecSimple = newMPBallWGPrec "simple" []---$(declForTypes- [[t| Integer |], [t| Int |], [t| Dyadic |], [t| Rational |], [t| CauchyReal |]]- (\ t -> [d|-- instance- (QAArrow to)- =>- ConvertibleExactly $t (MPBallWithGlobalPrecA to)- where- safeConvertExactly x =- Right $ newMPBallWGPrec (show x) [] (\_src -> arr $ p2a)- where- p2a p = convertP p x-- |]))
− src/AERN2/QA/NetLog.hs
@@ -1,120 +0,0 @@-{-# LANGUAGE DeriveGeneric, DeriveAnyClass, GeneralizedNewtypeDeriving #-}-{-|- Module : AERN2.QA.NetLog- Description : QA network log data structure- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- QA network log data structure--}-module AERN2.QA.NetLog-(ValueId(..), QANetLogItem(..), QANetLog-, formatQALog, printQALog, printQANetLogThenResult-, formatQALogJSON, printQALogJSON, writeNetLogJSON)-where--import MixedTypesNumPrelude-import qualified Prelude as P--import Text.Printf--import GHC.Generics-import qualified Data.ByteString.Lazy.Char8 as BS-import Data.Aeson as J-import Data.Aeson.Types as JT--type QANetLog = [QANetLogItem]--data QANetLogItem- = QANetLogCreate- {- qaLogCreate_newId :: ValueId- , qaLogCreate_sources :: [ValueId]- , qaLogCreate_name :: String- }- | QANetLogQuery- {- qaLogQuery_client :: (Maybe ValueId)- , qaLogQuery_provider :: ValueId- , qaLogQuery_description :: String- }- | QANetLogAnswer- {- qaLogAnswer_client :: (Maybe ValueId)- , qaLogAnswer_provider :: ValueId- , qaLogAnswer_cacheUseDescription :: String- , qaLogAnswer_description :: String- }- deriving (Generic)--instance ToJSON QANetLogItem where- toJSON = J.genericToJSON customOptions- where- customOptions = J.defaultOptions- { JT.sumEncoding = JT.ObjectWithSingleField }---instance Show QANetLogItem where- show (QANetLogCreate valId sources name) =- printf "new (%s) %s <- %s"- (show valId) name (show sources)- show (QANetLogQuery mSrcId valId queryS) =- printf "(%s)<-(%s): ? %s"- (show valId) (showSrc mSrcId) queryS- show (QANetLogAnswer mSrcId valId cacheInfoS answerS) =- printf "(%s)->(%s): ! %s (%s)"- (show valId) (showSrc mSrcId) answerS cacheInfoS--showSrc :: (Show a) => Maybe a -> String-showSrc (Just srcId) = show srcId-showSrc Nothing = ""--data ValueId = ValueId Integer- deriving (Show, P.Eq, P.Ord, Generic, ToJSON)--instance Enum ValueId where- toEnum = ValueId . toEnum- fromEnum (ValueId n) = fromEnum n--printQANetLogThenResult :: (Show a) =>(QANetLog, a) -> IO ()-printQANetLogThenResult (lg, result) =- do- printQALog lg- putStrLn $ show result--printQALog :: QANetLog -> IO ()-printQALog = putStrLn . formatQALog 0--formatQALog :: Integer -> QANetLog -> String-formatQALog = aux- where- aux _ [] = ""- aux level (item : rest) =- (indent ++ show item ++ "\n") ++- (aux level' rest)- where- indent = replicate levelNow ' '- (levelNow, level') =- case item of- QANetLogQuery _ _ _ -> (level + 1, level + 1)- QANetLogAnswer _ _ _ _ -> (level, level - 1)- _ -> (level, level)--formatQALogJSON :: QANetLog -> String-formatQALogJSON = BS.unpack . J.encode--printQALogJSON :: QANetLog -> IO ()-printQALogJSON =- BS.putStrLn . J.encode--writeNetLogJSON :: QANetLog -> IO ()-writeNetLogJSON netlog =- writeFile "netlog.js" $- "netlog='" ++ (filter goodChar $ formatQALogJSON netlog) ++ "'"- where- goodChar 'Â' = False- goodChar _ = True
− src/AERN2/QA/Protocol.hs
@@ -1,277 +0,0 @@-{-# LANGUAGE ExistentialQuantification #-}-{-|- Module : AERN2.QA.Protocol- Description : Cacheable question-answer protocols- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Cacheable question-answer protocols--}-module AERN2.QA.Protocol-(- -- * QA protocols and objects- QAProtocol(..), QAProtocolCacheable(..)- , QA(..), QAPromiseA, (?..)- , qaRename- , mapQA, mapQAsameQ- -- * QAArrows- , AnyProtocolQA(..)- , QAArrow(..), defaultNewQA, QARegOption(..)- , qaMakeQuery, qaMakeQueryA, qaMakeQueriesA, qaMakeQueryOnManyA- , (?<-), (?)- , (-:-), (-:-|), (-:-||)- , (-?<-), (-?-), (-?..<-), (-?..-), (-???<-), (-<?<->-)- , qaMake2Queries, (??<-)- , qaMake3Queries-)-where--import MixedTypesNumPrelude-import qualified Prelude as P--- import Text.Printf--import Control.Arrow-import AERN2.Utils.Arrows---- import Data.Maybe-import Data.List--import Control.CollectErrors--{-| A QA protocol at this level is simply a pair of types. -}-class (Show p, Show (Q p), Show (A p)) => QAProtocol p where- type Q p -- a type of queries- type A p -- a type of answers--{-| A QA protocol with a caching method. -}-class (QAProtocol p, HasOrderCertainly (Q p) (Q p)) => QAProtocolCacheable p where- type QACache p- newQACache :: p -> QACache p- lookupQACache :: p -> QACache p -> Q p -> (Maybe (A p), Maybe String) -- ^ the String is a log message- updateQACache :: p -> Q p -> A p -> QACache p -> QACache p--instance (QAProtocol p, SuitableForCE es) => (QAProtocol (CollectErrors es p)) where- type Q (CollectErrors es p) = Q p- type A (CollectErrors es p) = CollectErrors es (A p)--{-| An object we can ask queries about. Queries can be asked in some Arrow @to@. -}-data QA to p = QA__- {- qaName :: String,- qaId :: Maybe (QAId to),- qaSources :: [QAId to],- qaProtocol :: p,- qaSampleQ :: Maybe (Q p),- qaMakeQueryGetPromise ::- (Maybe (QAId to), Maybe (QAId to)) -- this node id, source of query- ->- (Q p) `to` (QAPromiseA to (A p))- }--type QAPromiseA to a = () `to` a--{-| An infix synonym of 'qaMakeQuery'. -}-(?..) :: QA to p -> (Q p) `to` (QAPromiseA to (A p))-(?..) qa = qaMakeQueryGetPromise qa (Nothing, Nothing)--infix 1 ?..--qaRename :: (String -> String) -> QA to p -> QA to p-qaRename f qa = qa { qaName = f (qaName qa) }--mapQA ::- (Arrow to) =>- (p1 -> p2) ->- (Q p1 -> Q p2) ->- (Q p2 -> Q p1) ->- (A p1 -> A p2) ->- QA to p1 -> QA to p2-mapQA- translateP translateQ translateBackQ translateA- (QA__ name qaid sources p sampleQ makeQ) =- QA__ name qaid sources (translateP p) (fmap translateQ sampleQ) $- \ source -> (arr $ ((arr translateA) <<<) ) <<< makeQ source <<< arr translateBackQ--mapQAsameQ ::- (Arrow to, Q p1 ~ Q p2) =>- (p1 -> p2) ->- (A p1 -> A p2) ->- QA to p1 -> QA to p2-mapQAsameQ translateP = mapQA translateP id id--data AnyProtocolQA to =- forall p. (QAProtocolCacheable p) => AnyProtocolQA (QA to p)--anyPqaId :: AnyProtocolQA to -> (Maybe (QAId to))-anyPqaId (AnyProtocolQA qa) = qaId qa--anyPqaSources :: AnyProtocolQA to -> [QAId to]-anyPqaSources (AnyProtocolQA qa) = qaSources qa--data QARegOption =- QARegPreferParallel | QARegPreferSerial- deriving (P.Eq)--{-|- A class of Arrows suitable for use in QA objects.--}-class (ArrowChoice to, P.Eq (QAId to)) => QAArrow to where- type QAId to- {-|- Register a QA object, which leads to a change in its- query processing mechanism so that, eg, answers can be cached- or computations assigned to different threads/processes.-- The "sources" component of the incoming QA object can be- used to record the dependency graph among QA objects.- After registration, the QA object should have its list- of dependencies **empty**- as the registration has recorded them elsewhere.- -}- qaRegister :: (QAProtocolCacheable p) => [QARegOption] -> (QA to p) `to` (QA to p)- {-|- Create a qa object. The object is not "registered" automatically.- Invoking this function does not lead to any `to'-arrow computation.- The function is an operation of 'QAArrow' so that for some arrows,- the question-answer mechanism can be automatically altered.- In particular, this is used to make all objects in the (->) arrow- automatically (unsafely) caching their answers.- For most arrows, the default implementation is sufficient.- -}- newQA :: (QAProtocolCacheable p) =>- String -> [AnyProtocolQA to] -> p -> Maybe (Q p) -> ((Maybe (QAId to), Maybe (QAId to)) -> (Q p) `to` (A p)) -> QA to p- newQA = defaultNewQA- qaFulfilPromiseA :: (QAPromiseA to a) `to` a- qaMakeQueryGetPromiseA :: Maybe (QAId to) -> (QA to p, Q p) `to` (QAPromiseA to (A p))--defaultNewQA ::- (QAArrow to, QAProtocolCacheable p) =>- String -> [AnyProtocolQA to] -> p -> Maybe (Q p) ->- ((Maybe (QAId to), Maybe (QAId to)) -> (Q p) `to` (A p)) -> QA to p-defaultNewQA name sources p sampleQ makeQ =- QA__ name Nothing (nub $ concat $ map getSourceIds sources) p sampleQ makeQPromise- where- getSourceIds source =- case anyPqaId source of- Just id1 -> [id1]- Nothing -> anyPqaSources source- makeQPromise me_src =- proc acSG ->- returnA -< promise acSG- where- promise acSG =- proc () ->- do- a <- makeQ me_src -< acSG- returnA -< a--qaMakeQuery :: (QAArrow to) => (QA to p) -> (Maybe (QAId to)) -> (Q p) `to` (A p)- -- ^ composition of qaMakeQueryGetPromise and the execution of the promise-qaMakeQuery qa src = (qaMakeQueryGetPromise qa (me, src)) >>> qaFulfilPromiseA- where- me = case qaId qa of Nothing -> src; me2 -> me2--qaMakeQueryA :: (QAArrow to) => Maybe (QAId to) -> (QA to p, Q p) `to` (A p)-qaMakeQueryA src = qaMakeQueryGetPromiseA src >>> qaFulfilPromiseA--qaMakeQueriesA :: (QAArrow to) => Maybe (QAId to) -> [(QA to p, Q p)] `to` [A p]-qaMakeQueriesA src = (mapA (qaMakeQueryGetPromiseA src)) >>> (mapA qaFulfilPromiseA)--qaMakeQueryOnManyA :: (QAArrow to) => Maybe (QAId to) -> ([QA to p], Q p) `to` [A p]-qaMakeQueryOnManyA src =- proc (qas, q) -> qaMakeQueriesA src -< map (flip (,) q) qas--{-| An infix synonym of 'qaMakeQuery' -}-(?<-) :: (QAArrow to) => QA to p -> Maybe (QAId to) -> (Q p) `to` (A p)-(?<-) = qaMakeQuery--{-| An infix synonym of 'qaMakeQuery' with no source -}-(?) :: (QAArrow to) => QA to p -> (Q p) `to` (A p)-(?) = \qa -> qaMakeQuery qa Nothing--infix 1 ?, ?<---{-| An infix synonym of 'qaRegister' -}-(-:-) :: (QAArrow to, QAProtocolCacheable p) => (QA to p) `to` (QA to p)-(-:-) = qaRegister []--{-| An infix synonym of 'qaRegister' -}-(-:-||) :: (QAArrow to, QAProtocolCacheable p) => (QA to p) `to` (QA to p)-(-:-||) = qaRegister [QARegPreferParallel]--{-| An infix synonym of 'qaRegister' -}-(-:-|) :: (QAArrow to, QAProtocolCacheable p) => (QA to p) `to` (QA to p)-(-:-|) = qaRegister [QARegPreferSerial]--{-| An infix synonym of 'qaMakeQueryGetPromiseA' -}-(-?..<-) :: (QAArrow to) => Maybe (QAId to) -> (QA to p, Q p) `to` (QAPromiseA to (A p))-(-?..<-) = qaMakeQueryGetPromiseA--{-| An infix synonym of 'qaMakeQueryGetPromiseA' with no source -}-(-?..-) :: (QAArrow to) => (QA to p, Q p) `to` (QAPromiseA to (A p))-(-?..-) = qaMakeQueryGetPromiseA Nothing--{-| An infix synonym of 'qaMakeQueryA' -}-(-?<-) :: (QAArrow to) => Maybe (QAId to) -> (QA to p, Q p) `to` (A p)-(-?<-) = qaMakeQueryA--{-| An infix synonym of 'qaMakeQueryA' with no source -}-(-?-) :: (QAArrow to) => (QA to p, Q p) `to` (A p)-(-?-) = qaMakeQueryA Nothing--{-| An infix synonym of 'qaMakeQueryOnManyA' -}-(-<?<->-) :: (QAArrow to) => Maybe (QAId to) -> ([QA to p], Q p) `to` [A p]-(-<?<->-) = qaMakeQueryOnManyA--{-| An infix synonym of 'qaMakeQueriesA' -}-(-???<-) :: (QAArrow to) => Maybe (QAId to) -> [(QA to p, Q p)] `to` [A p]-(-???<-) = qaMakeQueriesA--infix 0 -?<-, -?..<-, -???<-, -<?<->--infix 0 -:-, -:-|, -:-||--{-| An infix synonym of 'qaMake2Queries'. -}-(??<-) :: (QAArrow to) => (QA to p1, QA to p2) -> Maybe (QAId to) -> (Q p1, Q p2) `to` (A p1, A p2)-(??<-) = qaMake2Queries--infix 0 ??<---{-| Run two queries in an interleaving manner, enabling parallelism. -}-qaMake2Queries :: (QAArrow to) => (QA to p1, QA to p2) -> Maybe (QAId to) -> (Q p1, Q p2) `to` (A p1, A p2)-qaMake2Queries (qa1, qa2) src =- proc (q1,q2) ->- do- ap1 <- (-?..<-) src -< (qa1, q1)- ap2 <- (-?..<-) src -< (qa2, q2)- a1 <- qaFulfilPromiseA -< ap1- a2 <- qaFulfilPromiseA -< ap2- returnA -< (a1,a2)--{-| Run two queries in an interleaving manner, enabling parallelism. -}-qaMake3Queries ::- (QAArrow to) =>- (QA to p1, QA to p2, QA to p3) -> Maybe (QAId to) -> (Q p1, Q p2, Q p3) `to` (A p1, A p2, A p3)-qaMake3Queries (qa1, qa2, qa3) src =- proc (q1,q2,q3) ->- do- ap1 <- (-?..<-) src -< (qa1, q1)- ap2 <- (-?..<-) src -< (qa2, q2)- ap3 <- (-?..<-) src -< (qa3, q3)- a1 <- qaFulfilPromiseA -< ap1- a2 <- qaFulfilPromiseA -< ap2- a3 <- qaFulfilPromiseA -< ap3- returnA -< (a1,a2,a3)--{- arrow conversions -}--instance- (CanSwitchArrow to1 to2, QAArrow to1, QAArrow to2, QAProtocolCacheable p)- =>- ConvertibleExactly (QA to1 p) (QA to2 p)- where- safeConvertExactly qa =- Right $ defaultNewQA (qaName qa) [] (qaProtocol qa) (qaSampleQ qa) (\ _src -> switchArrow (qaMakeQuery qa Nothing))
− src/AERN2/QA/Strategy/Cached.hs
@@ -1,23 +0,0 @@-{-|- Module : AERN2.QA.Strategy.Cached- Description : QA net evaluation with answer caching- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- QA net evaluation with answer caching--}-module AERN2.QA.Strategy.Cached-(- module AERN2.QA.NetLog- , module AERN2.QA.Strategy.Cached.NetState- , module AERN2.QA.Strategy.Cached.Arrow-)-where--import AERN2.QA.NetLog-import AERN2.QA.Strategy.Cached.NetState-import AERN2.QA.Strategy.Cached.Arrow
− src/AERN2/QA/Strategy/Cached/Arrow.hs
@@ -1,121 +0,0 @@-{-# LANGUAGE CPP #-}--- #define DEBUG-{-|- Module : AERN2.QA.Strategy.Cached.Arrow- Description : QA net evaluation with answer caching- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- QA net evaluation with answer caching--}-module AERN2.QA.Strategy.Cached.Arrow-(- module AERN2.QA.NetLog- , module AERN2.QA.Strategy.Cached.NetState- , QACachedA- , executeQACachedA, executeQAUncachedA-)-where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#else-#define maybeTrace (\ (_ :: String) t -> t)-#endif--import MixedTypesNumPrelude--- import qualified Prelude as P--- import Text.Printf--import Control.Arrow--import Control.Monad.Trans.State--import AERN2.QA.Protocol-import AERN2.QA.NetLog-import AERN2.QA.Strategy.Cached.NetState--type QACachedA = Kleisli QACachedM--data QACachedM a =- QACachedM { unQACachedM :: (State (QANetState QACachedM) a) }--instance Functor QACachedM where- fmap f (QACachedM ma) = QACachedM (fmap f ma)-instance Applicative QACachedM where- pure a = QACachedM (pure a)- (QACachedM f) <*> (QACachedM a) = QACachedM (f <*> a)-instance Monad QACachedM where- (QACachedM ma) >>= f =- QACachedM $ ma >>= (unQACachedM . f)--instance QAArrow QACachedA where- type QAId QACachedA = ValueId- qaRegister _ = Kleisli qaRegisterM- where- qaRegisterM (QA__ name Nothing sourceIds p sampleQ q2paA) =- do- valueId <- newId- return $ QA__ name (Just valueId) [] p sampleQ (\me_src -> (Kleisli $ makeQCached me_src valueId))- where- sq2pa me_src = q2pa- where- (Kleisli q2pa) = q2paA me_src- newId =- maybeTrace ("newId: " ++ show name) $- QACachedM $- do- ns <- get- let (i, ns') = insertNode p name sourceIds sq2pa ns- put ns'- return i- makeQCached (_me,src) valueId q =- maybeTrace ("makeQCached: q = " ++ show q) $- QACachedM $- do- ns <- get- let ns' = logQuery ns src valueId (show q)- put ns'- aAndCachePromise <- unQACachedM $ getAnswerPromise ns' p src valueId q- return $ Kleisli (aPromise aAndCachePromise)- where- aPromise aAndCachePromise () =- QACachedM $- do- (a, usedCache, cache') <- unQACachedM $ aAndCachePromise ()- ns2 <- get- let ns2' = logAnswerUpdateCache ns2 p src valueId (show a, usedCache, cache')- put ns2'- return $- maybeTrace ("makeQCached: a = " ++ show a)- a- qaRegisterM _ =- error "internal error in AERN2.QA.Strategy.Cached: qaRegister called with an existing id"-- qaFulfilPromiseA = Kleisli qaFulfilPromiseM- where- qaFulfilPromiseM promiseA =- runKleisli promiseA ()- qaMakeQueryGetPromiseA src = Kleisli qaMakeQueryGetPromiseM- where- qaMakeQueryGetPromiseM (qa, q) =- runKleisli (qaMakeQueryGetPromise qa (me, src)) q- where- me = case qaId qa of Nothing -> src; me2 -> me2--executeQACachedA :: (QACachedA () a) -> (QANetLog, a)-executeQACachedA code =- (net_log ns, result)- where- (result, ns) = (runState $ unQACachedM $ runKleisli code ()) (initQANetState True)--executeQAUncachedA :: (QACachedA () a) -> (QANetLog, a)-executeQAUncachedA code =- (net_log ns, result)- where- (result, ns) = (runState $ unQACachedM $ runKleisli code ()) (initQANetState False)
− src/AERN2/QA/Strategy/Cached/NetState.hs
@@ -1,142 +0,0 @@-{-# LANGUAGE ExistentialQuantification #-}-{-|- Module : AERN2.QA.Strategy.Cached.NetState- Description : state of a QA net- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- A monad-generic state of a QA net.--}-module AERN2.QA.Strategy.Cached.NetState-(- QANetState(..), initQANetState- , AnyQAComputation(..), QAComputation(..)- , insertNode, logQuery, logAnswerUpdateCache, getAnswerPromise-)-where--import MixedTypesNumPrelude--- import qualified Prelude as P--- import Text.Printf--import Control.Arrow--import Unsafe.Coerce---- import Data.Maybe--- import Data.List-import qualified Data.Map as Map--import AERN2.QA.Protocol-import AERN2.QA.NetLog--data QANetState m =- QANetState- {- net_id2value :: Map.Map ValueId (AnyQAComputation m)- , net_log :: QANetLog- , net_should_cache :: Bool- }--data AnyQAComputation m =- forall p . (QAProtocolCacheable p) => -- existentially quantified type- AnyQAComputation (QAComputation m p)--data QAComputation m p =- QAComputation- p- (QACache p)- ((Maybe ValueId, Maybe ValueId) -> Q p -> m (QAPromiseA (Kleisli m) (A p))) -- ^ used only if a suitable answer is not in the above cache--initQANetState :: Bool -> QANetState m-initQANetState should_cache =- QANetState- {- net_id2value = Map.empty- , net_log = []- , net_should_cache = should_cache- }--insertNode ::- (QAProtocolCacheable p) =>- p ->- String ->- [ValueId] ->- ((Maybe ValueId, Maybe ValueId) -> Q p -> m (QAPromiseA (Kleisli m) (A p))) ->- QANetState m ->- (ValueId, QANetState m)-insertNode p name sourceIds q2pa ns =- (i, ns { net_id2value = id2value', net_log = net_log' } )- where- id2value = net_id2value ns- lg = net_log ns- i | Map.null id2value = (ValueId 1)- | otherwise = succ $ fst (Map.findMax id2value)- id2value' = Map.insert i (AnyQAComputation (QAComputation p (newQACache p) q2pa)) id2value- net_log' = lg ++ [logItem]- logItem =- QANetLogCreate i sourceIds name---logQuery ::- QANetState m -> Maybe ValueId -> ValueId -> String -> QANetState m-logQuery ns src valueId qS =- ns { net_log = (net_log ns) ++ [logItem] }- where- logItem = QANetLogQuery src valueId qS--logAnswerUpdateCache ::- (QAProtocolCacheable p)- =>- QANetState m -> p -> Maybe ValueId -> ValueId -> (String, String, QACache p) -> QANetState m-logAnswerUpdateCache ns (p :: p) src valueId (aS, usedCacheS, cache') =- ns- {- net_id2value = id2value',- net_log = (net_log ns) ++ [logItem]- }- where- logItem = QANetLogAnswer src valueId usedCacheS aS- id2value' =- Map.insert valueId- (AnyQAComputation (QAComputation p cache' q2a))- (net_id2value ns)- id2value = net_id2value ns- qaComputation :: (QAComputation m p)- qaComputation = case Map.lookup valueId id2value of- Just (AnyQAComputation comp) -> unsafeCoerce comp- Nothing -> error $ "unknown valueId " ++ show valueId- QAComputation _ _ q2a = qaComputation--getAnswerPromise ::- (QAProtocolCacheable p, Monad m)- =>- QANetState m -> p -> Maybe ValueId -> ValueId -> Q p -> m (() -> m (A p, [Char], QACache p))-getAnswerPromise ns (p :: p) src valueId q =- do- case lookupQACache p cache q of- (Just a, mLogMsg) ->- return $ \() -> return (a, logMsg, cache)- where logMsg = "used cache" ++ case mLogMsg of Nothing -> ""; (Just m) -> " (" ++ m ++ ")"- (_, mLogMsg) ->- do- pa <- q2pa (Just valueId, src) q- a <- runKleisli pa ()- let cache' = updateQACache p q a cache- let a' = case lookupQACache p cache' q of (Just aa, _) -> aa; _ -> a- if should_cache- then return $ \() -> return (a', logMsg, cache')- else return $ \() -> return (a, logMsg, cache)- where logMsg = "not used cache" ++ case mLogMsg of Nothing -> ""; (Just m) -> " (" ++ m ++ ")"- where- id2value = net_id2value ns- should_cache = net_should_cache ns- qaComputation :: (QAComputation m p)- qaComputation = case Map.lookup valueId id2value of- Just (AnyQAComputation comp) -> unsafeCoerce comp- Nothing -> error $ "unknown valueId " ++ show valueId- QAComputation _ cache q2pa = qaComputation
− src/AERN2/QA/Strategy/CachedUnsafe.hs
@@ -1,97 +0,0 @@-{-# LANGUAGE CPP #-}--- #define DEBUG-{-|- Module : AERN2.QA.Strategy.CachedUnsafe- Description : QA net plain evaluation with unsafe IO caching- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- QA net plain evaluation with unsafe IO caching--}-module AERN2.QA.Strategy.CachedUnsafe-(- qaUnsafeCachingMV-)-where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#define maybeTraceIO putStrLn-#else-#define maybeTrace (\ (_ :: String) t -> t)-#define maybeTraceIO (\ (_ :: String)-> return ())-#endif--import MixedTypesNumPrelude--- import qualified Prelude as P--- import Text.Printf--import System.IO.Unsafe (unsafePerformIO)--import Control.Concurrent.MVar--import AERN2.QA.Protocol--{-|- Normal Haskell functions are a trivial QAArrow instance- where registration has no effect.--}-instance QAArrow (->) where- type QAId (->) = ()- qaRegister _ = id- newQA name sources p sampleQ makeQ =- addUnsafeMemoisation $- defaultNewQA name sources p sampleQ makeQ- qaMakeQueryGetPromiseA src (qa,q) = qaMakeQueryGetPromise qa (qaId qa, src) q- qaFulfilPromiseA promise = promise ()--{-| A global variable controlling whether unsafe caching is used in QA objects in the (->) arrow -}-qaUnsafeCachingMV :: MVar Bool-qaUnsafeCachingMV = unsafePerformIO (newMVar True)--{-|- Add caching to pure (->) QA objects via unsafe memoization, inspired by- https://hackage.haskell.org/package/ireal-0.2.3/docs/src/Data-Number-IReal-UnsafeMemo.html#unsafeMemo,- which, in turn, is inspired by Lennart Augustsson's uglymemo.--}-addUnsafeMemoisation :: (QAProtocolCacheable p) => QA (->) p -> QA (->) p-addUnsafeMemoisation qa = qa { qaMakeQueryGetPromise = \ _src -> unsafeMemo }- where- unsafeMemo = (unsafePerformIO .) . unsafePerformIO memoIO- p = qaProtocol qa- -- name = qaName qa- memoIO =- do- -- putStrLn $ "memoIO starting for " ++ name- cacheVar <- newMVar $ newQACache p- return $ useMVar cacheVar- where- useMVar cacheVar q () =- do- shouldCache <- readMVar qaUnsafeCachingMV- if not shouldCache then return $ qaMakeQueryGetPromise qa (Nothing, Nothing) q ()- else- do- -- putStrLn $ "memoIO: q = " ++ (show q)- cache <- readMVar cacheVar- -- putStrLn $ "memoIO: got cache"- case lookupQACache p cache q of- (Just a, _logMsg) ->- do- -- putStrLn $ printf "memoIO %s: using cache: ? %s -> ! %s" name (show q) (show a)- return a- _ ->- do- let a = qaMakeQueryGetPromise qa (Nothing, Nothing) q ()- modifyMVar_ cacheVar (const (return (updateQACache p q a cache)))- -- putStrLn $ printf "memoIO %s: updated cache: ? %s -> ! %s" name (show q) (show a)- cache' <- readMVar cacheVar- case lookupQACache p cache' q of- (Just a', _) -> return a'- -- this arranges that any size reductions specified in lookupQACache are applied even when the cache was not used- _ -> return a
− src/AERN2/QA/Strategy/Parallel.hs
@@ -1,227 +0,0 @@-{-# LANGUAGE CPP #-}--- #define DEBUG-{-|- Module : AERN2.QA.Strategy.Parallel- Description : QA net parallel evaluation- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- QA net parallel evaluation--}-module AERN2.QA.Strategy.Parallel-(- QAParA- , executeQAParA, executeQAParAwithLog-)-where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#define maybeTraceIO putStrLn-#else-#define maybeTrace (\ (_ :: String) t -> t)-#define maybeTraceIO (\ (_ :: String)-> return ())-#endif--import MixedTypesNumPrelude--- import qualified Prelude as P-import Text.Printf--import Control.Arrow--import qualified Data.IntMap as IntMap--import Control.Concurrent-import Control.Concurrent.STM-import Control.Monad.IO.Class--import AERN2.QA.Protocol-import AERN2.QA.NetLog--data QANetState =- QANetState- {- net_nextId :: ValueId- , net_log :: QANetLog- }--initQANetState :: QANetState-initQANetState =- QANetState- {- net_nextId = ValueId 1- , net_log = []- }--getValueId :: QANetState -> [ValueId] -> String -> (QANetState, ValueId)-getValueId ns sources name =- (ns2, vId)- where- ns2 =- ns- {- net_nextId = succ vId- , net_log = (net_log ns) ++ [logItem]- }- vId = net_nextId ns- logItem = QANetLogCreate vId sources name--logQuery ::- QANetState -> Maybe ValueId -> ValueId -> String -> QANetState-logQuery ns src valueId qS =- ns { net_log = (net_log ns) ++ [logItem] }- where- logItem = QANetLogQuery src valueId qS--logAnswer ::- QANetState -> Maybe ValueId -> ValueId -> (String, String) -> QANetState-logAnswer ns src valueId (aS, usedCacheS) =- ns- {- net_log = (net_log ns) ++ [logItem]- }- where- logItem = QANetLogAnswer src valueId usedCacheS aS--type QAParA = Kleisli QAParM--data QAParM a = QAParM { unQAParM :: Maybe (TVar QANetState) -> IO a }--instance Functor QAParM where- -- fmap f (QAParM tv2ma) = QAParM (\nsTV -> fmap f (tv2ma nsTV))- fmap f (QAParM tv2ma) = QAParM (fmap (fmap f) tv2ma)-instance Applicative QAParM where- pure a = QAParM (pure . pure a)- (QAParM tv2f) <*> (QAParM tv2a) =- QAParM (\nsTV -> (tv2f nsTV <*> tv2a nsTV))-instance Monad QAParM where- (QAParM tv2ma) >>= f =- QAParM $ \nsTV -> tv2ma nsTV >>= ($ nsTV) . unQAParM . f-instance MonadIO QAParM where- liftIO = QAParM . const--instance QAArrow QAParA where- type QAId QAParA = ValueId- qaRegister options = Kleisli qaRegisterM- where- isParallel = not (QARegPreferSerial `elem` options)- qaRegisterM qa@(QA__ name Nothing sourceIds (p :: p) sampleQ _) =- QAParM $ \m_nsTV ->- do- vId <- case m_nsTV of- Nothing -> pure (ValueId 0)- Just nsTV ->- atomically $- do- ns <- readTVar nsTV- let (ns2,i) = getValueId ns sourceIds name- writeTVar nsTV ns2- pure i- activeQsTV <- atomically $ newTVar initActiveQs- cacheTV <- atomically $ newTVar $ newQACache p- return $ QA__ name (Just vId) [] p sampleQ (\me_src -> Kleisli $ makeQPar vId activeQsTV cacheTV me_src)- where- initActiveQs = IntMap.empty :: IntMap.IntMap (Q p)- nextActiveQId activeQs- | IntMap.null activeQs = int 1- | otherwise =- int $ 1 + (fst $ IntMap.findMax activeQs)- makeQPar vId activeQsTV cacheTV (_, src) q =- QAParM $ \m_nsTV ->- do- maybeTraceIO $ printf "[%s]: q = %s" name (show q)- case m_nsTV of- Nothing -> pure ()- Just nsTV ->- atomically $ do -- log query- ns <- readTVar nsTV- writeTVar nsTV $ logQuery ns src vId (show q)-- -- consult the cache and index of active queries in an atomic transaction:- (maybeAnswer, mLogMsg, maybeComputeId) <- atomically $- do- cache <- readTVar cacheTV- case lookupQACache p cache q of- (Just a, mLogMsg) -> return (Just a, mLogMsg, Nothing)- (_, mLogMsg) ->- do- activeQs <- readTVar activeQsTV- let alreadyActive = or $ map (!>=! q) $ IntMap.elems activeQs- if alreadyActive then return (Nothing, mLogMsg, Nothing) else- do- let computeId = nextActiveQId activeQs- writeTVar activeQsTV $ IntMap.insert computeId q activeQs- return (Nothing, mLogMsg, Just computeId)- -- act based on the cache and actity consultation:- case (maybeAnswer, maybeComputeId) of- (Just a, _) -> -- got cached answer, just return it:- pure $ promise mLogMsg (pure a)- (_, Just computeId) ->- -- no cached answer, no pending computation:- do- _ <- forkComputation m_nsTV computeId -- start a new computation- pure $ promise mLogMsg waitForAnwer -- and wait for the answer- _ -> -- no cached answer but there is a pending computation:- pure $ promise mLogMsg waitForAnwer -- wait for a pending computation- where- promise mLogMsg answerIO =- Kleisli $ const $ QAParM $ \m_nsTV ->- case m_nsTV of- Nothing -> answerIO- Just nsTV -> do- a <- answerIO- atomically $ do- ns <- readTVar nsTV- writeTVar nsTV $ logAnswer ns src vId (show a, logMsg)- pure a- where- logMsg = case mLogMsg of Just m -> m; _ -> ""- waitForAnwer = atomically $- do- cache <- readTVar cacheTV- case lookupQACache p cache q of- (Just a, _mLogMsg) -> return a- (_, _mLogMsg) -> retry- forkComputation nsTV computeId- | isParallel = do { _ <- forkIO computation; return () }- | otherwise = do { computation; return () }- where- computation =- do- -- compute an answer:- a <- (unQAParM $ runKleisli (qaMakeQuery qa src) q) nsTV- -- update the cache with this answer:- atomically $ modifyTVar cacheTV (updateQACache p q a)- -- remove computeId from active queries:- atomically $ modifyTVar activeQsTV (IntMap.delete computeId)- qaRegisterM _ =- error "internal error in AERN2.QA.Strategy.Par: qaRegister called with an existing id"-- qaFulfilPromiseA = Kleisli qaFulfilPromiseM- where- qaFulfilPromiseM promiseA =- runKleisli promiseA ()- qaMakeQueryGetPromiseA src = Kleisli qaMakeQueryGetPromiseM- where- qaMakeQueryGetPromiseM (qa, q) =- runKleisli (qaMakeQueryGetPromise qa (me, src)) q- where- me = case qaId qa of Nothing -> src; me2 -> me2--executeQAParA :: (QAParA () a) -> IO a-executeQAParA code =- do- (unQAParM $ runKleisli code ()) Nothing--executeQAParAwithLog :: (QAParA () a) -> IO (QANetLog, a)-executeQAParAwithLog code =- do- nsTV <- atomically $ newTVar initQANetState- result <- (unQAParM $ runKleisli code ()) (Just nsTV)- ns <- atomically $ readTVar nsTV- return (net_log ns, result)
src/AERN2/Real.hs view
@@ -8,167 +8,87 @@ Stability : experimental Portability : portable - Exact real numbers represented by fast-converging Cauchy sequences of MPBalls.+ Exact real numbers represented by Cauchy sequences of MPBalls. -} module AERN2.Real (- -- * Re-exported dependencies- module AERN2.MP- , module AERN2.AccuracySG- -- * The type of real numbers- , CauchyRealP, pCR- , CauchyRealA, CauchyReal, newCR- , CauchyRealCNA, CauchyRealCN, newCRCN- -- * Sequence ops specialised to reals- , realName, realId, realSources, realRename- , realWithAccuracy, (?), realWithAccuracyA, realsWithAccuracyA- , (-:-)- , convergentList2CauchyRealA- , seqByPrecision2CauchyRealA- -- * Conversions- , CanBeReal, real, CanBeRealA, realA- , CanBeComplex, complex, CanBeComplexA, complexA- -- * Constants- , pi, piA- -- * Mini demos- , _addslACachedPrint- , _addslAParPrint- , _example_pif- , _nsection+ -- * real numbers and conversions+ CReal, + CSequence (..), + creal, HasCReals, CanBeCReal,+ cseqPrecisions, cseqIndexForPrecision,+ pi,+ -- * limits+ HasLimits(..),+ -- * lazy Kleeneans+ CKleenean, CanBeCKleenean, ckleenean, CanSelect(..),+ -- * extracting approximations+ CanExtractApproximation(..), (?), realWithAccuracy, bits, prec ) where -import AERN2.MP-import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence ()+import AERN2.MP ( bits, prec )+import AERN2.Limit import AERN2.Real.Type-import AERN2.Real.Arithmetic (pi, piA)-import AERN2.Real.Tests ()+import AERN2.Real.Comparisons ()+import AERN2.Real.CKleenean+import AERN2.Real.Field ()+import AERN2.Real.Limit ()+import AERN2.Real.Elementary (pi)+-- import AERN2.Real.Tests () -- imports used in examples below: -import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow--import AERN2.QA.NetLog-import AERN2.QA.Strategy.Cached-import AERN2.QA.Strategy.Parallel+-- import MixedTypesNumPrelude+-- -- import qualified Prelude as P -import Text.Printf--- import AERN2.MP.Dyadic-import AERN2.Sequence+-- import Text.Printf+-- -- import AERN2.MP.Dyadic -{-|- Example arrow-generic real number computation--}-_addA :: (QAArrow to) => (CauchyRealA to, CauchyRealA to) `to` CauchyRealA to-_addA =- -- using -XArrows syntax:- proc (x,y) ->- (-:-)-< x + y- -- -:- is a shorcut for qaRegister--_CRone :: (QAArrow to) => CauchyRealA to-_CRone = realA 1--_addApure :: CauchyReal-_addApure =- _addA (_CRone, pi)- -- equivalent to @_CRonePure + _CRonePure@ since registration does nothing--_addAcached :: QACachedA () (CauchyRealA QACachedA)-_addAcached =- proc () ->- do- xReg <-(-:-)-< _CRone- _addA -< (xReg,piA)- -- equivalent to @(-:-)-< xReg + piA //.. [xReg,xReg]@- -- not equivalent to @returnA -< xR + xR@ since there is no registration--_addAcachedPrint :: IO ()-_addAcachedPrint =- printQANetLogThenResult $ executeQACachedA $- proc () ->- do- x <-_addAcached -< ()- (-?-) -< (x, bitsS 10)--_addslA :: (QAArrow to) => (CauchyRealA to) `to` (CauchyRealCNA to)-_addslA =- proc x ->- do- xReg <-(-:-)-< x- lx <-(-:-)-< log xReg- sx <-(-:-)-< sqrt xReg- a1 <- (-:-)-< sx + lx- a2 <- (-:-)-< sx - lx- (-:-) -< a1 * a2--_addslACachedPrint :: IO ()-_addslACachedPrint =- printQANetLogThenResult $ executeQACachedA $- proc () ->- do- x <-_addslA -< realA 2- (-?-) -< (x, bitsS 100)--_addslAParPrint :: IO ()-_addslAParPrint =- do- r <- executeQAParA $- proc () ->- do- x <-_addslA -< realA 2- (-?-) -< (x, bitsS 100)- print r--{- parallel branching -}+-- {- parallel branching -} -_example_pif :: CauchyReal -> CauchyRealCN-_example_pif r =- if r < 0 then -r else r -- abs via parallel if+-- _example_pif :: CauchyReal -> CauchyRealCN+-- _example_pif r =+-- if r < 0 then -r else r -- abs via parallel if -_example_pif0 :: MPBall -> CN MPBall-_example_pif0 r =- if r < 0 then -r else r -- abs via parallel if+-- _example_pif0 :: MPBall -> CN MPBall+-- _example_pif0 r =+-- if r < 0 then -r else r -- abs via parallel if -_nsection ::- Integer ->- (Rational -> CauchyReal) ->- (Rational,Rational) ->- CauchyRealCN-_nsection n f (l,r) =- newSeqSimple (cn $ mpBall 0) $ withAccuracy- where- withAccuracy (me,_) ac@(AccuracySG _ acG) =- onSegment (l,r)- where- onSegment (a,b) =- let ab = mpBallP p ((a+b)/!2, (b-a)/!2) in- if getAccuracy ab >= ac- then cn ab- else pick me (map withMidpoint midpoints)- where- midpoints = [ (i*a + (n-i)*b)/!n | i <- [1..n-1] ]- withMidpoint :: Rational -> Sequence (Maybe (CN MPBall))- withMidpoint m = newSeqSimple Nothing withAC- where- withAC (meF, _) acF- | fa * fm !<! 0 = Just $ onSegment (a, m)- | fm * fb !<! 0 = Just $ onSegment (m, b)- | fa * fb !>=! 0 = Just $ err- | otherwise = Nothing- where- fa = ((f a) ?<- meF) acF- fm = ((f m) ?<- meF) acF- fb = ((f b) ?<- meF) acF- err :: CN MPBall- err =- noValueNumErrorCertainCN $- NumError $- printf "n-section: function does not have opposite signs on points %s %s" (show a) (show b)- p = prec $ fromAccuracy acG + 8+-- _nsection ::+-- Integer ->+-- (Rational -> CauchyReal) ->+-- (Rational,Rational) ->+-- CauchyRealCN+-- _nsection n f (l,r) =+-- newSeqSimple (cn $ mpBall 0) $ withAccuracy+-- where+-- withAccuracy (me,_) ac@(AccuracySG _ acG) =+-- onSegment (l,r)+-- where+-- onSegment (a,b) =+-- let ab = mpBallP p ((a+b)/!2, (b-a)/!2) in+-- if getAccuracy ab >= ac+-- then cn ab+-- else pick me (map withMidpoint midpoints)+-- where+-- midpoints = [ (i*a + (n-i)*b)/!n | i <- [1..n-1] ]+-- withMidpoint :: Rational -> Sequence (Maybe (CN MPBall))+-- withMidpoint m = newSeqSimple Nothing withAC+-- where+-- withAC (meF, _) acF+-- | fa * fm !<! 0 = Just $ onSegment (a, m)+-- | fm * fb !<! 0 = Just $ onSegment (m, b)+-- | fa * fb !>=! 0 = Just $ err+-- | otherwise = Nothing+-- where+-- fa = ((f a) ?<- meF) acF+-- fm = ((f m) ?<- meF) acF+-- fb = ((f b) ?<- meF) acF+-- err :: CN MPBall+-- err =+-- noValueNumErrorCertainCN $+-- NumError $+-- printf "n-section: function does not have opposite signs on points %s %s" (show a) (show b)+-- p = prec $ fromAccuracy acG + 8
− src/AERN2/Real/Arithmetic.hs
@@ -1,306 +0,0 @@-{-|- Module : AERN2.Real.Arithmetic- Description : arithmetic operations on CR- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Arithmetic operations on Cauchy Real numbers,- except those that are defined for more general sequences--}-module AERN2.Real.Arithmetic-(- pi, piA-)-where--import MixedTypesNumPrelude-import qualified Prelude as P--import Data.Convertible--import Data.Complex--import AERN2.MP.Ball-import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Real.Type--instance (QAArrow to) => Ring (CauchyRealA to)-instance (QAArrow to) => OrderedRing (CauchyRealA to)-instance (QAArrow to) => Field (CauchyRealA to)-instance (QAArrow to) => OrderedField (CauchyRealA to)--instance P.Floating CauchyReal where- pi = pi- sqrt = (~!) . sqrt- exp = exp- sin = sin- cos = cos- log = (~!) . log- (**) = (^!)- atan = error "CauchyReal: atan not implemented yet"- atanh = error "CauchyReal: atanh not implemented yet"- asin = error "CauchyReal: asin not implemented yet"- acos = error "CauchyReal: acos not implemented yet"- sinh = error "CauchyReal: sinh not implemented yet"- cosh = error "CauchyReal: cosh not implemented yet"- asinh = error "CauchyReal: asinh not implemented yet"- acosh = error "CauchyReal: acosh not implemented yet"--instance P.Floating CauchyRealCN where- pi = cn pi- sqrt = sqrt- exp = exp- sin = sin- cos = cos- log = log- -- (**) = (^)- atan = error "CauchyReal: atan not implemented yet"- atanh = error "CauchyReal: atanh not implemented yet"- asin = error "CauchyReal: asin not implemented yet"- acos = error "CauchyReal: acos not implemented yet"- sinh = error "CauchyReal: sinh not implemented yet"- cosh = error "CauchyReal: cosh not implemented yet"- asinh = error "CauchyReal: asinh not implemented yet"- acosh = error "CauchyReal: acosh not implemented yet"--{-|- To get @pi@ in an arbitrary arrow, use 'piA'.--}-pi :: CauchyReal-pi = newCR "pi" [] (\_me_src -> (seqByPrecision2CauchySeq piBallP . _acGuide))--piA :: (QAArrow to) => CauchyRealA to-piA = realA pi---{- sine, cosine of finite values -}--instance CanSinCos Integer where- type SinCosType Integer = CauchyReal- cos = cos . real- sin = sin . real--instance CanSinCos Int where- type SinCosType Int = CauchyReal- cos = cos . real- sin = sin . real--instance CanSinCos Dyadic where- type SinCosType Dyadic = CauchyReal- cos = cos . real- sin = sin . real--instance CanSinCos Rational where- type SinCosType Rational = CauchyReal- cos = cos . real- sin = sin . real--{- sqrt of finite values -}--instance CanSqrt Integer where- type SqrtType Integer = CauchyRealCN- sqrt = sqrt . real--instance CanSqrt Int where- type SqrtType Int = CauchyRealCN- sqrt = sqrt . real--instance CanSqrt Dyadic where- type SqrtType Dyadic = CauchyRealCN- sqrt = sqrt . real--instance CanSqrt Rational where- type SqrtType Rational = CauchyRealCN- sqrt = sqrt . real--{- exp of finite values -}--instance CanExp Integer where- type ExpType Integer = CauchyReal- exp = exp . real--instance CanExp Int where- type ExpType Int = CauchyReal- exp = exp . real--instance CanExp Dyadic where- type ExpType Dyadic = CauchyReal- exp = exp . real--instance CanExp Rational where- type ExpType Rational = CauchyReal- exp = exp . real--{- log of finite values -}--instance CanLog Integer where- type LogType Integer = CauchyRealCN- log = log . real--instance CanLog Int where- type LogType Int = CauchyRealCN- log = log . real--instance CanLog Dyadic where- type LogType Dyadic = CauchyRealCN- log = log . real--instance CanLog Rational where- type LogType Rational = CauchyRealCN- log = log . real--{- non-integer power of finite values -}--instance CanPow Integer Dyadic where- type PowTypeNoCN Integer Dyadic = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--instance CanPow Int Dyadic where- type PowTypeNoCN Int Dyadic = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--instance CanPow Dyadic Dyadic where- type PowTypeNoCN Dyadic Dyadic = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--instance CanPow Rational Dyadic where- type PowTypeNoCN Rational Dyadic = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--instance CanPow Integer Rational where- type PowTypeNoCN Integer Rational = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--instance CanPow Int Rational where- type PowTypeNoCN Int Rational = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--instance CanPow Dyadic Rational where- type PowTypeNoCN Dyadic Rational = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--instance CanPow Rational Rational where- type PowTypeNoCN Rational Rational = CauchyReal- powNoCN b e = powNoCN (real b) (real e)- pow b e = pow (real b) (real e)--{- reals mixed with Double -}--instance Convertible CauchyReal Double where- safeConvert r =- safeConvert (centre (r ? (bitsS 53)))--binaryWithDouble :: (Double -> Double -> Double) -> CauchyReal -> Double -> Double-binaryWithDouble op r d =- op (convert r) d--instance CanAddAsymmetric CauchyReal Double where- type AddType CauchyReal Double = Double- add = binaryWithDouble add--instance CanAddAsymmetric Double CauchyReal where- type AddType Double CauchyReal = Double- add = flip add--instance CanSub CauchyReal Double where- type SubType CauchyReal Double = Double- sub = binaryWithDouble sub--instance CanSub Double CauchyReal where- type SubType Double CauchyReal = Double- sub = flip $ binaryWithDouble (flip sub)--instance CanMulAsymmetric CauchyReal Double where- type MulType CauchyReal Double = Double- mul = binaryWithDouble mul--instance CanMulAsymmetric Double CauchyReal where- type MulType Double CauchyReal = Double- mul = flip mul--instance CanDiv CauchyReal Double where- type DivType CauchyReal Double = Double- divide = binaryWithDouble divide- type DivTypeNoCN CauchyReal Double = Double- divideNoCN = binaryWithDouble divideNoCN--instance CanDiv Double CauchyReal where- type DivType Double CauchyReal = Double- divide = flip $ binaryWithDouble (flip divide)- type DivTypeNoCN Double CauchyReal = Double- divideNoCN = flip $ binaryWithDouble (flip divideNoCN)--instance CanPow CauchyReal Double where- type PowTypeNoCN CauchyReal Double = Double- type PowType CauchyReal Double = Double- powNoCN = binaryWithDouble pow- pow = binaryWithDouble pow--instance CanPow Double CauchyReal where- powNoCN = flip $ binaryWithDouble (flip pow)- type PowType Double CauchyReal = Double- pow = flip $ binaryWithDouble (flip pow)--{- reals mixed with complex -}--instance- (QAArrow to, CanAddAsymmetric (CauchyRealA to) t)- =>- CanAddAsymmetric (CauchyRealA to) (Complex t)- where- type AddType (CauchyRealA to) (Complex t) = Complex (AddType (CauchyRealA to) t)- add r (a :+ i) = (r + a) :+ (z + i)- where- z = realA 0- _ = [z,r]--instance- (QAArrow to, CanAddAsymmetric t (CauchyRealA to))- =>- CanAddAsymmetric (Complex t) (CauchyRealA to)- where- type AddType (Complex t) (CauchyRealA to) = Complex (AddType t (CauchyRealA to))- add (a :+ i) r = (a + r) :+ (i + z)- where- z = realA 0- _ = [z,r]--instance- (QAArrow to, CanAdd (CauchyRealA to) t, CanNegSameType t)- =>- CanSub (CauchyRealA to) (Complex t)--instance- (QAArrow to, CanAdd t (CauchyRealA to))- =>- CanSub (Complex t) (CauchyRealA to)--instance- (CanMulAsymmetric (CauchyRealA to) t)- =>- CanMulAsymmetric (CauchyRealA to) (Complex t)- where- type MulType (CauchyRealA to) (Complex t) = Complex (MulType (CauchyRealA to) t)- mul r (a :+ i) = (r * a) :+ (r * i)--instance- (CanMulAsymmetric t (CauchyRealA to))- =>- CanMulAsymmetric (Complex t) (CauchyRealA to)- where- type MulType (Complex t) (CauchyRealA to) = Complex (MulType t (CauchyRealA to))- mul (a :+ i) r = (a * r) :+ (i * r)
+ src/AERN2/Real/CKleenean.hs view
@@ -0,0 +1,101 @@+{-# OPTIONS_GHC -Wno-orphans #-}+{-|+ Module : AERN2.Real.CKleenean+ Description : lazy Kleenean+ Copyright : (c) Michal Konecny+ License : BSD3++ Maintainer : mikkonecny@gmail.com+ Stability : experimental+ Portability : portable++ Lazy Kleenean, ie a sequence of Kleeneans, usually indexed by increasing precisions.+-}+module AERN2.Real.CKleenean+(+ CKleenean, CanBeCKleenean, ckleenean+ , CanSelect(..)+)+where++import MixedTypesNumPrelude++import qualified Numeric.CollectErrors as CN++-- import Data.Complex++import qualified Data.List as List++import AERN2.MP++import AERN2.Real.Type++type CKleenean = CSequence Kleenean++type CanBeCKleenean t = ConvertibleExactly t CKleenean++ckleenean :: (CanBeCKleenean t) => t -> CKleenean+ckleenean = convertExactly++-- IsBool CKleenean:++instance (ConvertibleExactly t Kleenean) => ConvertibleExactly t CKleenean where+ safeConvertExactly b = Right $ CSequence $ List.repeat $ cn $ kleenean b++instance (CanNeg t) => CanNeg (CSequence t) where+ type NegType (CSequence t) = CSequence (NegType t)+ negate = lift1 negate++instance (CanAndOrAsymmetric t1 t2) => CanAndOrAsymmetric (CSequence t1) (CSequence t2) where+ type AndOrType (CSequence t1) (CSequence t2) = CSequence (AndOrType t1 t2)+ and2 = lift2 and2+ or2 = lift2 or2++-- select:++class (IsBool (SelectType k)) => CanSelect k where+ {-| Must be Bool or similar -}+ type SelectType k + {-|+ Execute two lazy computations "in parallel" until one of them succeeds. + -}+ select :: k -> k -> (SelectType k) {-^ True means that the first computation succeeded. -}++instance CanSelect CKleenean where+ type SelectType CKleenean = Bool+ select (CSequence s1) (CSequence s2) = aux s1 s2+ where+ aux (k1 : rest1) (k2 : rest2) =+ case (CN.toEither k1, CN.toEither k2) of+ (Right CertainTrue, _) -> True + (_, Right CertainTrue) -> False+ (Right CertainFalse, Right CertainFalse) -> error "select: Both branches failed!"+ _ -> aux rest1 rest2+ aux _ _ = error "select: internal error"++instance CanSelect Kleenean where+ type SelectType Kleenean = CN Bool+ select CertainTrue _ = cn True+ select _ CertainTrue = cn False+ select CertainFalse CertainFalse =+ CN.noValueNumErrorPotential $ + CN.NumError "select (Kleenean): Both branches failed!"+ select _ _ = + CN.noValueNumErrorPotential $ + CN.NumError "select (Kleenean): Insufficient information to determine selection."++instance CanSelect (CN Kleenean) where+ type SelectType (CN Kleenean) = CN Bool+ select cnk1 cnk2 =+ do+ k1 <- cnk1+ k2 <- cnk2+ select k1 k2++instance (CanUnionCNSameType t) =>+ HasIfThenElse CKleenean (CSequence t)+ where+ type IfThenElseType CKleenean (CSequence t) = (CSequence t)+ ifThenElse (CSequence sc) (CSequence s1) (CSequence s2) = (CSequence r)+ where+ r = zipWith3 ifThenElse sc s1 s2
+ src/AERN2/Real/Comparisons.hs view
@@ -0,0 +1,345 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-orphans #-}+{-|+ Module : AERN2.Real.Comparisons+ Description : comparison on CReal+ Copyright : (c) Michal Konecny+ License : BSD3++ Maintainer : mikkonecny@gmail.com+ Stability : experimental+ Portability : portable++ Comparison relations over Cauchy Real numbers.+-}+module AERN2.Real.Comparisons+()+where++import MixedTypesNumPrelude+import qualified Prelude as P++-- import Data.Complex++import AERN2.MP.Ball+import AERN2.MP.Dyadic++import AERN2.Real.Type+import AERN2.Real.CKleenean ()++-- equality:++instance+ (HasEqAsymmetric t1 t2, IsBool (CSequence (EqCompareType t1 t2)))+ => + HasEqAsymmetric (CSequence t1) (CSequence t2) + where+ type EqCompareType (CSequence t1) (CSequence t2) = CSequence (EqCompareType t1 t2)+ equalTo = lift2 equalTo++-- order:++instance + (HasOrderAsymmetric t1 t2, IsBool (CSequence (OrderCompareType t1 t2)))+ => + HasOrderAsymmetric (CSequence t1) (CSequence t2) + where+ type OrderCompareType (CSequence t1) (CSequence t2) = CSequence (OrderCompareType t1 t2)+ lessThan = lift2 lessThan+ greaterThan = lift2 greaterThan+ leq = lift2 leq+ geq = lift2 geq++-- abs:++instance+ (CanAbs t1)+ => + CanAbs (CSequence t1)+ where+ type AbsType (CSequence t1) = CSequence (AbsType t1)+ abs = lift1 abs++-- min / max:++instance+ (CanMinMaxAsymmetric t1 t2)+ => + CanMinMaxAsymmetric (CSequence t1) (CSequence t2) + where+ type MinMaxType (CSequence t1) (CSequence t2) = CSequence (MinMaxType t1 t2)+ min = lift2 min+ max = lift2 max++-- mixed type instances:++instance+ (CanMinMaxAsymmetric a MPBall)+ => + CanMinMaxAsymmetric (CSequence a) MPBall+ where+ type MinMaxType (CSequence a) MPBall = MinMaxType (CN a) (CN MPBall)+ min s a = min (s ? (getPrecision a)) (cn a)+ max s a = max (s ? (getPrecision a)) (cn a)++instance+ (CanMinMaxAsymmetric a MPBall)+ => + CanMinMaxAsymmetric (CSequence a) (CN MPBall)+ where+ type MinMaxType (CSequence a) (CN MPBall) = MinMaxType (CN a) (CN MPBall)+ min s a = min (s ? (getPrecision a)) a+ max s a = max (s ? (getPrecision a)) a++instance+ (CanMinMaxAsymmetric MPBall a)+ => + CanMinMaxAsymmetric MPBall (CSequence a)+ where+ type MinMaxType MPBall (CSequence a) = MinMaxType (CN MPBall) (CN a)+ min a s = min (cn a) (s ? (getPrecision a))+ max a s = max (cn a) (s ? (getPrecision a))++instance+ (CanMinMaxAsymmetric MPBall a)+ => + CanMinMaxAsymmetric (CN MPBall) (CSequence a)+ where+ type MinMaxType (CN MPBall) (CSequence a) = MinMaxType (CN MPBall) (CN a)+ min a s = min a (s ? (getPrecision a))+ max a s = max a (s ? (getPrecision a))+++instance+ (HasEqAsymmetric a MPBall)+ => + HasEqAsymmetric (CSequence a) MPBall+ where+ type EqCompareType (CSequence a) MPBall = EqCompareType (CN a) (CN MPBall)+ equalTo s a = equalTo (s ? (getPrecision a)) (cn a)+ notEqualTo s a = notEqualTo (s ? (getPrecision a)) (cn a)++instance+ (HasEqAsymmetric a MPBall)+ => + HasEqAsymmetric (CSequence a) (CN MPBall)+ where+ type EqCompareType (CSequence a) (CN MPBall) = EqCompareType (CN a) (CN MPBall)+ equalTo s a = equalTo (s ? (getPrecision a)) a+ notEqualTo s a = notEqualTo (s ? (getPrecision a)) a++instance+ (HasEqAsymmetric MPBall b)+ => + HasEqAsymmetric MPBall (CSequence b)+ where+ type EqCompareType MPBall (CSequence b) = EqCompareType (CN MPBall) (CN b)+ equalTo a s = equalTo (cn a) (s ? (getPrecision a))+ notEqualTo a s = notEqualTo (cn a) (s ? (getPrecision a))++instance+ (HasEqAsymmetric MPBall b)+ => + HasEqAsymmetric (CN MPBall) (CSequence b)+ where+ type EqCompareType (CN MPBall) (CSequence b) = EqCompareType (CN MPBall) (CN b)+ equalTo a s = equalTo a (s ? (getPrecision a))+ notEqualTo a s = notEqualTo a (s ? (getPrecision a))++instance+ (HasOrderAsymmetric a MPBall)+ => + HasOrderAsymmetric (CSequence a) MPBall+ where+ type OrderCompareType (CSequence a) MPBall = OrderCompareType (CN a) (CN MPBall)+ lessThan s a = lessThan (s ? (getPrecision a)) (cn a)+ greaterThan s a = greaterThan (s ? (getPrecision a)) (cn a)+ leq s a = leq (s ? (getPrecision a)) (cn a)+ geq s a = geq (s ? (getPrecision a)) (cn a)++instance+ (HasOrderAsymmetric a MPBall)+ => + HasOrderAsymmetric (CSequence a) (CN MPBall)+ where+ type OrderCompareType (CSequence a) (CN MPBall) = OrderCompareType (CN a) (CN MPBall)+ lessThan s a = lessThan (s ? (getPrecision a)) a+ greaterThan s a = greaterThan (s ? (getPrecision a)) a+ leq s a = leq (s ? (getPrecision a)) a+ geq s a = geq (s ? (getPrecision a)) a++instance+ (HasOrderAsymmetric MPBall b)+ => + HasOrderAsymmetric MPBall (CSequence b)+ where+ type OrderCompareType MPBall (CSequence b) = OrderCompareType (CN MPBall) (CN b)+ lessThan a s = lessThan (cn a) (s ? (getPrecision a))+ greaterThan a s = greaterThan (cn a) (s ? (getPrecision a))+ leq a s = leq (cn a) (s ? (getPrecision a))+ geq a s = geq (cn a) (s ? (getPrecision a))++instance+ (HasOrderAsymmetric MPBall b)+ => + HasOrderAsymmetric (CN MPBall) (CSequence b)+ where+ type OrderCompareType (CN MPBall) (CSequence b) = OrderCompareType (CN MPBall) (CN b)+ lessThan a s = lessThan a (s ? (getPrecision a))+ greaterThan a s = greaterThan a (s ? (getPrecision a))+ leq a s = leq a (s ? (getPrecision a))+ geq a s = geq a (s ? (getPrecision a))++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance+ (CanMinMaxAsymmetric a $t)+ => + CanMinMaxAsymmetric (CSequence a) $t+ where+ type MinMaxType (CSequence a) $t = CSequence (MinMaxType a $t)+ min = lift1T min+ max = lift1T max++ instance+ (CanMinMaxAsymmetric a $t)+ => + CanMinMaxAsymmetric (CSequence a) (CN $t)+ where+ type MinMaxType (CSequence a) (CN $t) = CSequence (MinMaxType a $t)+ min = lift1T min+ max = lift1T max++ instance+ (CanMinMaxAsymmetric $t a)+ => + CanMinMaxAsymmetric $t (CSequence a)+ where+ type MinMaxType $t (CSequence a) = CSequence (MinMaxType $t a)+ min = liftT1 min+ max = liftT1 max++ instance+ (CanMinMaxAsymmetric $t a)+ => + CanMinMaxAsymmetric (CN $t) (CSequence a)+ where+ type MinMaxType (CN $t) (CSequence a) = CSequence (MinMaxType $t a)+ min = liftT1 min+ max = liftT1 max++ instance+ (HasEqAsymmetric a $t, IsBool (CSequence (EqCompareType a $t)))+ => + HasEqAsymmetric (CSequence a) $t+ where+ type EqCompareType (CSequence a) $t = CSequence (EqCompareType a $t)+ equalTo = lift1T (==)+ notEqualTo = lift1T (/=)++ instance+ (HasEqAsymmetric a $t, IsBool (CSequence (EqCompareType a $t)))+ => + HasEqAsymmetric (CSequence a) (CN $t)+ where+ type EqCompareType (CSequence a) (CN $t) = CSequence (EqCompareType a $t)+ equalTo = lift1T (==)+ notEqualTo = lift1T (/=)++ instance+ (HasEqAsymmetric $t a, IsBool (CSequence (EqCompareType $t a)))+ =>+ HasEqAsymmetric $t (CSequence a)+ where+ type EqCompareType $t (CSequence a) = CSequence (EqCompareType $t a)+ equalTo = liftT1 (==)+ notEqualTo = liftT1 (/=)++ instance+ (HasEqAsymmetric $t a, IsBool (CSequence (EqCompareType $t a)))+ =>+ HasEqAsymmetric (CN $t) (CSequence a)+ where+ type EqCompareType (CN $t) (CSequence a) = CSequence (EqCompareType $t a)+ equalTo = liftT1 (==)+ notEqualTo = liftT1 (/=)++ instance+ (HasOrderAsymmetric a $t, IsBool (CSequence (OrderCompareType a $t)))+ => + HasOrderAsymmetric (CSequence a) $t+ where+ type OrderCompareType (CSequence a) $t = CSequence (OrderCompareType a $t)+ lessThan = lift1T lessThan+ greaterThan = lift1T greaterThan+ leq = lift1T leq+ geq = lift1T geq++ instance+ (HasOrderAsymmetric a $t, IsBool (CSequence (OrderCompareType a $t)))+ => + HasOrderAsymmetric (CSequence a) (CN $t)+ where+ type OrderCompareType (CSequence a) (CN $t) = CSequence (OrderCompareType a $t)+ lessThan = lift1T lessThan+ greaterThan = lift1T greaterThan+ leq = lift1T leq+ geq = lift1T geq++ instance+ (HasOrderAsymmetric $t a, IsBool (CSequence (OrderCompareType $t a)))+ =>+ HasOrderAsymmetric $t (CSequence a)+ where+ type OrderCompareType $t (CSequence a) = CSequence (OrderCompareType $t a)+ lessThan = liftT1 lessThan+ greaterThan = liftT1 greaterThan+ leq = liftT1 leq+ geq = liftT1 geq++ instance+ (HasOrderAsymmetric $t a, IsBool (CSequence (OrderCompareType $t a)))+ =>+ HasOrderAsymmetric (CN $t) (CSequence a)+ where+ type OrderCompareType (CN $t) (CSequence a) = CSequence (OrderCompareType $t a)+ lessThan = liftT1 lessThan+ greaterThan = liftT1 greaterThan+ leq = liftT1 leq+ geq = liftT1 geq++ |]))+++{- Prelude Eq, Ord instances -}++instance+ (HasEqCertainly a a)+ =>+ P.Eq (CSequence a)+ where+ a == b+ | aD !==! bD = True+ | aD !/=! bD = False+ | otherwise =+ error "Failed to decide equality of Sequences. If you switch to MixedTypesNumPrelude instead of Prelude, comparison of Sequences returns CSequence Kleenean or similar instead of Bool."+ where+ aD = a ? defaultPrecision+ bD = b ? defaultPrecision ++instance+ (HasEqCertainly a a, HasOrderCertainly a a)+ =>+ P.Ord (CSequence a)+ where+ compare a b+ | aD !==! bD = P.EQ+ | aD !<! bD = P.LT+ | aD !>! bD = P.GT+ | otherwise =+ error "Failed to decide order of Sequences. If you switch to MixedTypesNumPrelude instead of Prelude, comparison of Sequences returns CSequence Kleenean or similar instead of Bool."+ where+ aD = a ? defaultPrecision+ bD = b ? defaultPrecision
+ src/AERN2/Real/Elementary.hs view
@@ -0,0 +1,227 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-orphans #-}+{-|+ Module : AERN2.Real.Elementary+ Description : selected elementary operations on CReal+ Copyright : (c) Michal Konecny+ License : BSD3++ Maintainer : mikkonecny@gmail.com+ Stability : experimental+ Portability : portable++ Selected elementary operations on Cauchy Real numbers.+-}+module AERN2.Real.Elementary+(+ pi+)+where++import MixedTypesNumPrelude+import qualified Prelude as P++import AERN2.MP.Ball+import AERN2.MP.Dyadic++import AERN2.Real.Type+import AERN2.Real.Field ()++{- Examples of use:++*AERN2.Real MixedTypesNumPrelude> sin 1+{?(prec 36): [0.841470984814804978668689727783203125 ± ~1.5621e-10 ~2^(-32)]}+(0.06 secs, 722,440 bytes)+*AERN2.Real MixedTypesNumPrelude> sin 1 ? (bits 1000)+[0.8414709848078965066525023216302989996225630607... ± ~0.0000 ~2^(-1222)]++*AERN2.Real MixedTypesNumPrelude> exp 2 ? (prec 100)+[7.3890560989306502272304274605750078131770241145... ± ~4.7020e-38 ~2^(-124)]+(0.01 secs, 691,448 bytes)+*AERN2.Real MixedTypesNumPrelude> exp 2 ? (prec 1000)+[7.3890560989306502272304274605750078131803155705... ± ~0.0000 ~2^(-1422)]+(0.01 secs, 1,402,832 bytes)+*AERN2.Real MixedTypesNumPrelude> exp 2 ? (prec 10000)+[7.3890560989306502272304274605750078131803155705... ± ~0.0000 ~2^(-16086)]+(0.02 secs, 17,478,648 bytes)+*AERN2.Real MixedTypesNumPrelude> exp 2 ? (prec 100000)+[7.3890560989306502272304274605750078131803155705... ± ~0.0000 ~2^(-179557)]+(0.61 secs, 576,337,656 bytes)+*AERN2.Real MixedTypesNumPrelude> exp 2 ? (prec 1000000)+[7.3890560989306502272304274605750078131803155705... ± ~0.0000 ~2^(-1232830)]+(14.98 secs, 10,234,710,976 bytes)++*AERN2.Real MixedTypesNumPrelude> 2^0.5 ? (prec 100)+[1.4142135623730950488016887242096980779395106418... ± ~1.3299e-36 ~2^(-119)]+(0.01 secs, 1,128,824 bytes)+*AERN2.Real MixedTypesNumPrelude> 2^0.5 ? (prec 1000)+[1.4142135623730950488016887242096980785696718753... ± ~0.0000 ~2^(-1229)]+(0.02 secs, 6,903,360 bytes)+*AERN2.Real MixedTypesNumPrelude> 2^0.5 ? (prec 10000)+[1.4142135623730950488016887242096980785696718753... ± ~0.0000 ~2^(-13539)]+(0.38 secs, 282,175,336 bytes)++*AERN2.Real MixedTypesNumPrelude> 2^(1/3) ? (prec 1000)+[1.2599210498948731647672106072782283505702514647... ± ~0.0000 ~2^(-1229)]+(0.01 secs, 6,946,896 bytes)+*AERN2.Real MixedTypesNumPrelude> 2^(1/3) ? (prec 10000)+[1.2599210498948731647672106072782283505702514647... ± ~0.0000 ~2^(-13539)]+(0.40 secs, 281,994,312 bytes)++-}++{- common elementary operations -}++pi :: CReal+pi = CSequence $ map (cn . piBallP) cseqPrecisions++{- sine, cosine -}++instance CanSinCos CReal where+ cos = lift1 cos+ sin = lift1 sin++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance CanSinCos $t where+ type SinCosType $t = CReal+ cos = cos . creal+ sin = sin . creal++ |]))++{- sqrt -}++instance CanSqrt CReal where+ sqrt = lift1 sqrt++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance CanSqrt $t where+ type SqrtType $t = CReal+ sqrt = sqrt . creal++ |]))++{- exp -}++instance CanExp CReal where+ exp = lift1 exp++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance CanExp $t where+ type ExpType $t = CReal+ exp = exp . creal++ |]))++{- log -}++instance CanLog CReal where+ log = lift1 log++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance CanLog $t where+ type LogType $t = CReal+ log = log . creal++ |]))++{- power -}++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance CanPow $t Dyadic where+ type PowType $t Dyadic = CReal+ pow b e = pow (creal b) (creal e)++ |]))++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance CanPow $t Rational where+ type PowType $t Rational = CReal+ pow b e = pow (creal b) (creal e)++ |]))++-- {- reals mixed with Double -}++-- instance Convertible CReal Double where+-- safeConvert r =+-- safeConvert (centre (r ? (bitsS 53)))++-- binaryWithDouble :: (Double -> Double -> Double) -> CReal -> Double -> Double+-- binaryWithDouble op r d =+-- op (convert r) d++-- instance CanAddAsymmetric CReal Double where+-- type AddType CReal Double = Double+-- add = binaryWithDouble add++-- instance CanAddAsymmetric Double CReal where+-- type AddType Double CReal = Double+-- add = flip add++-- instance CanSub CReal Double where+-- type SubType CReal Double = Double+-- sub = binaryWithDouble sub++-- instance CanSub Double CReal where+-- type SubType Double CReal = Double+-- sub = flip $ binaryWithDouble (flip sub)++-- instance CanMulAsymmetric CReal Double where+-- type MulType CReal Double = Double+-- mul = binaryWithDouble mul++-- instance CanMulAsymmetric Double CReal where+-- type MulType Double CReal = Double+-- mul = flip mul++-- instance CanDiv CReal Double where+-- type DivType CReal Double = Double+-- divide = binaryWithDouble divide++-- instance CanDiv Double CReal where+-- type DivType Double CReal = Double+-- divide = flip $ binaryWithDouble (flip divide)++-- instance CanPow CReal Double where+-- type PowType CReal Double = Double+-- pow = binaryWithDouble pow++-- instance CanPow Double CReal where+-- type PowType Double CReal = Double+-- pow = flip $ binaryWithDouble (flip pow)++instance P.Floating CReal where+ pi = pi+ sqrt = sqrt+ exp = exp+ sin = sin+ cos = cos+ log = log+ -- (**) = (^)+ atan = error "CReal: atan not implemented yet"+ atanh = error "CReal: atanh not implemented yet"+ asin = error "CReal: asin not implemented yet"+ acos = error "CReal: acos not implemented yet"+ sinh = error "CReal: sinh not implemented yet"+ cosh = error "CReal: cosh not implemented yet"+ asinh = error "CReal: asinh not implemented yet"+ acosh = error "CReal: acosh not implemented yet"
+ src/AERN2/Real/Field.hs view
@@ -0,0 +1,399 @@+{-# LANGUAGE TemplateHaskell #-}+{-# OPTIONS_GHC -Wno-orphans #-}+{-|+ Module : AERN2.Real.Field+ Description : field operations on CReal+ Copyright : (c) Michal Konecny+ License : BSD3++ Maintainer : mikkonecny@gmail.com+ Stability : experimental+ Portability : portable++ Field operations on Cauchy Real numbers.+-}+module AERN2.Real.Field+(+-- * field ops (`add`, `sub`, `mul`, `div`) for `CReal -> CReal -> CReal`+-- * field ops for `CReal -> t -> CReal` and `t -> CReal -> CReal` where `t` is `Int`, `Integer`, `Rational`, `Dyadic`+-- * field ops for `CReal -> MPBall -> MPBall` and `CReal -> CN MPBall -> CN MPBall`+)+where++import MixedTypesNumPrelude+import qualified Prelude as P++import AERN2.MP.Ball+import AERN2.MP.Dyadic++import AERN2.Real.Type+import AERN2.Real.Comparisons ()++{- field operations -}++instance Ring CReal+instance OrderedRing CReal+instance Field CReal+instance OrderedField CReal++instance+ (CanAddAsymmetric t1 t2)+ => + CanAddAsymmetric (CSequence t1) (CSequence t2) + where+ type AddType (CSequence t1) (CSequence t2) = CSequence (AddType t1 t2)+ add = lift2 add++instance+ (CanSub t1 t2)+ => + CanSub (CSequence t1) (CSequence t2) + where+ type SubType (CSequence t1) (CSequence t2) = CSequence (SubType t1 t2)+ sub = lift2 sub++instance+ (CanMulAsymmetric t1 t2, CanGiveUpIfVeryInaccurate (MulType t1 t2))+ => + CanMulAsymmetric (CSequence t1) (CSequence t2) + where+ type MulType (CSequence t1) (CSequence t2) = CSequence (MulType t1 t2)+ mul = lift2 mul++instance+ (CanDiv t1 t2, CanTestZero t2)+ => + CanDiv (CSequence t1) (CSequence t2) + where+ type DivType (CSequence t1) (CSequence t2) = CSequence (DivType t1 t2)+ divide = lift2 divide++instance+ (CanPow b e, HasOrderCertainly b Integer, HasOrderCertainly e Integer,+ HasEqCertainly b Integer, CanTestInteger e) + =>+ CanPow (CSequence b) (CSequence e) + where+ type PowType (CSequence b) (CSequence e) = CSequence (PowType b e)+ pow = lift2 pow++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |]]+ (\ e -> [d|++ instance + (CanPow b $e, HasOrderCertainly b Integer, HasEqCertainly b Integer)+ =>+ CanPow (CSequence b) $e + where+ type PowType (CSequence b) $e = CSequence (PowType b $e)+ pow = lift1T pow++ |]))++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |]]+ (\ b -> [d|++ instance + (CanPow $b e, HasOrderCertainly e Integer, CanTestInteger e)+ =>+ CanPow $b (CSequence e) + where+ type PowType $b (CSequence e) = CSequence (PowType $b e)+ pow = liftT1 pow+ |]))++---------------------------------------------------+---------------------------------------------------+-- MPBall and CN MPBall mixed-type arithmetic+---------------------------------------------------+---------------------------------------------------++instance+ (CanAddAsymmetric MPBall b)+ => + CanAddAsymmetric MPBall (CSequence b)+ where+ type AddType MPBall (CSequence b) = AddType MPBall b+ add a s = add a (unCN $ s ? (getPrecision a))++instance+ (CanAddAsymmetric b MPBall)+ => + CanAddAsymmetric (CSequence b) MPBall+ where+ type AddType (CSequence b) MPBall = AddType b MPBall+ add s b = add (unCN $ s ? (getPrecision b)) b++instance+ (CanAddAsymmetric MPBall b)+ => + CanAddAsymmetric (CN MPBall) (CSequence b)+ where+ type AddType (CN MPBall) (CSequence b) = AddType (CN MPBall) (CN b)+ add a s = add a (s ? (getPrecision a))++instance+ (CanAddAsymmetric b MPBall)+ => + CanAddAsymmetric (CSequence b) (CN MPBall)+ where+ type AddType (CSequence b) (CN MPBall) = AddType (CN b) (CN MPBall)+ add s b = add (s ? (getPrecision b)) b++instance+ (CanSub MPBall b)+ => + CanSub MPBall (CSequence b)+ where+ type SubType MPBall (CSequence b) = SubType MPBall b+ sub a s = sub a (unCN $ s ? (getPrecision a))++instance+ (CanSub b MPBall)+ => + CanSub (CSequence b) MPBall+ where+ type SubType (CSequence b) MPBall = SubType b MPBall+ sub s b = sub (unCN $ s ? (getPrecision b)) b++instance+ (CanSub MPBall b)+ => + CanSub (CN MPBall) (CSequence b)+ where+ type SubType (CN MPBall) (CSequence b) = SubType (CN MPBall) (CN b)+ sub a s = sub a (s ? (getPrecision a))++instance+ (CanSub b MPBall)+ => + CanSub (CSequence b) (CN MPBall)+ where+ type SubType (CSequence b) (CN MPBall) = SubType (CN b) (CN MPBall)+ sub s b = sub (s ? (getPrecision b)) b++instance+ (CanMulAsymmetric MPBall b)+ => + CanMulAsymmetric MPBall (CSequence b)+ where+ type MulType MPBall (CSequence b) = MulType MPBall b+ mul a s = mul a (unCN $ s ? (getPrecision a))++instance+ (CanMulAsymmetric b MPBall)+ => + CanMulAsymmetric (CSequence b) MPBall+ where+ type MulType (CSequence b) MPBall = MulType b MPBall+ mul s b = mul (unCN $ s ? (getPrecision b)) b++instance+ (CanMulAsymmetric MPBall b, CanGiveUpIfVeryInaccurate (MulType MPBall b))+ => + CanMulAsymmetric (CN MPBall) (CSequence b)+ where+ type MulType (CN MPBall) (CSequence b) = MulType (CN MPBall) (CN b)+ mul a s = mul a (s ? (getPrecision a))++instance+ (CanMulAsymmetric b MPBall, CanGiveUpIfVeryInaccurate (MulType b MPBall))+ => + CanMulAsymmetric (CSequence b) (CN MPBall)+ where+ type MulType (CSequence b) (CN MPBall) = MulType (CN b) (CN MPBall)+ mul s b = mul (s ? (getPrecision b)) b++instance+ (CanDiv MPBall b, CanTestZero b)+ => + CanDiv MPBall (CSequence b)+ where+ type DivType MPBall (CSequence b) = DivType MPBall b+ divide a s = divide a (unCN $ s ? (getPrecision a))++instance+ (CanDiv b MPBall)+ => + CanDiv (CSequence b) MPBall+ where+ type DivType (CSequence b) MPBall = DivType b MPBall+ divide s b = divide (unCN $ s ? (getPrecision b)) b++instance+ (CanDiv MPBall b, CanTestZero b)+ => + CanDiv (CN MPBall) (CSequence b)+ where+ type DivType (CN MPBall) (CSequence b) = DivType (CN MPBall) (CN b)+ divide a s = divide a (s ? (getPrecision a))++instance+ (CanDiv b MPBall)+ => + CanDiv (CSequence b) (CN MPBall)+ where+ type DivType (CSequence b) (CN MPBall) = DivType (CN b) (CN MPBall)+ divide s b = divide (s ? (getPrecision b)) b++---------------------------------------------------+---------------------------------------------------+-- Integer, Rational etc. mixed-type arithmetic+---------------------------------------------------+---------------------------------------------------+++$(declForTypes+ [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]+ (\ t -> [d|++ instance+ (CanAddAsymmetric a $t)+ => + CanAddAsymmetric (CSequence a) $t+ where+ type AddType (CSequence a) $t = CSequence (AddType a $t)+ add = lift1T add++ instance+ (CanAddAsymmetric a $t)+ => + CanAddAsymmetric (CSequence a) (CN $t)+ where+ type AddType (CSequence a) (CN $t) = CSequence (AddType a $t)+ add = lift1T add++ instance+ (CanAddAsymmetric $t a)+ => + CanAddAsymmetric $t (CSequence a)+ where+ type AddType $t (CSequence a) = CSequence (AddType $t a)+ add = liftT1 add++ instance+ (CanAddAsymmetric $t a)+ => + CanAddAsymmetric (CN $t) (CSequence a)+ where+ type AddType (CN $t) (CSequence a) = CSequence (AddType $t a)+ add = liftT1 add++ instance+ (CanSub a $t)+ => + CanSub (CSequence a) $t+ where+ type SubType (CSequence a) $t = CSequence (SubType a $t)+ sub = lift1T sub++ instance+ (CanSub a $t)+ => + CanSub (CSequence a) (CN $t)+ where+ type SubType (CSequence a) (CN $t) = CSequence (SubType a $t)+ sub = lift1T sub++ instance+ (CanSub $t a)+ => + CanSub $t (CSequence a)+ where+ type SubType $t (CSequence a) = CSequence (SubType $t a)+ sub = liftT1 sub++ instance+ (CanSub $t a)+ => + CanSub (CN $t) (CSequence a)+ where+ type SubType (CN $t) (CSequence a) = CSequence (SubType $t a)+ sub = liftT1 sub++ instance+ (CanMulAsymmetric a $t, CanGiveUpIfVeryInaccurate (MulType a $t))+ => + CanMulAsymmetric (CSequence a) $t+ where+ type MulType (CSequence a) $t = CSequence (MulType a $t)+ mul = lift1T mul++ instance+ (CanMulAsymmetric a $t, CanGiveUpIfVeryInaccurate (MulType a $t))+ => + CanMulAsymmetric (CSequence a) (CN $t)+ where+ type MulType (CSequence a) (CN $t) = CSequence (MulType a $t)+ mul = lift1T mul++ instance+ (CanMulAsymmetric $t a, CanGiveUpIfVeryInaccurate (MulType $t a))+ => + CanMulAsymmetric $t (CSequence a)+ where+ type MulType $t (CSequence a) = CSequence (MulType $t a)+ mul = liftT1 mul++ instance+ (CanMulAsymmetric $t a, CanGiveUpIfVeryInaccurate (MulType $t a))+ => + CanMulAsymmetric (CN $t) (CSequence a)+ where+ type MulType (CN $t) (CSequence a) = CSequence (MulType $t a)+ mul = liftT1 mul++ instance+ (CanDiv a $t)+ => + CanDiv (CSequence a) $t+ where+ type DivType (CSequence a) $t = CSequence (DivType a $t)+ divide = lift1T divide++ instance+ (CanDiv a $t)+ => + CanDiv (CSequence a) (CN $t)+ where+ type DivType (CSequence a) (CN $t) = CSequence (DivType a $t)+ divide = lift1T divide++ instance+ (CanDiv $t a, CanTestZero a)+ => + CanDiv $t (CSequence a)+ where+ type DivType $t (CSequence a) = CSequence (DivType $t a)+ divide = liftT1 divide++ instance+ (CanDiv $t a, CanTestZero a)+ => + CanDiv (CN $t) (CSequence a)+ where+ type DivType (CN $t) (CSequence a) = CSequence (DivType $t a)+ divide = liftT1 divide++ |]))++{- Prelude Num, Real, Fractional instance -}++instance+ P.Num CReal+ where+ fromInteger = convertExactly+ negate = negate+ (+) = (+)+ (*) = (*)+ abs = abs+ signum = error "Prelude.signum not implemented for Sequence"++instance+ P.Fractional CReal+ where+ fromRational = convertExactly+ recip = recip+ (/) = (/)
+ src/AERN2/Real/Limit.hs view
@@ -0,0 +1,60 @@+{-# OPTIONS_GHC -Wno-orphans #-}+{-# LANGUAGE PartialTypeSignatures #-}+{-|+ Module : AERN2.Real.Limit+ Description : limits of CReal sequences+ Copyright : (c) Michal Konecny+ License : BSD3++ Maintainer : mikkonecny@gmail.com+ Stability : experimental+ Portability : portable++ Limits of Cauchy Real sequences.+-}+module AERN2.Real.Limit where++import MixedTypesNumPrelude++-- import qualified Numeric.CollectErrors as CN++-- import Math.NumberTheory.Logarithms (integerLog2)++import AERN2.Real.Type+import AERN2.Limit+import AERN2.MP ( (+-) )++---------+-- limit+---------++instance HasLimits Rational CReal where+ type LimitType Rational CReal = CReal+ limit s = crealFromPrecFunction withPrec+ where+ withPrec p = ((s epsilon) ? p) +- epsilon+ where+ epsilon = 0.5 ^ (integer p)+ +instance HasLimits Integer CReal where+ type LimitType Integer CReal = CReal+ limit s = crealFromPrecFunction withPrec+ where+ withPrec p = ((s (integer p)) ? p) +- epsilon+ where+ epsilon = 0.5 ^ (integer p)++instance HasLimits Int CReal where+ type LimitType Int CReal = CReal+ limit s = limit (s . c)+ where+ c :: Integer -> Int+ c = int++instance HasLimits Rational (CReal -> CReal) where+ type LimitType Rational (CReal -> CReal) = (CReal -> CReal)+ limit fs x = crealFromPrecFunction withPrec+ where+ withPrec p = ((fs epsilon x) ? p) +- epsilon+ where+ epsilon = 0.5 ^ (integer p)
src/AERN2/Real/Tests.hs view
@@ -1,6 +1,7 @@+{-# OPTIONS_GHC -Wno-orphans #-} {-| Module : AERN2.Real.Tests- Description : Tests for operations on cauchy real numbers+ Description : Tests for operations on Cauchy real numbers Copyright : (c) Michal Konecny License : BSD3 @@ -8,7 +9,7 @@ Stability : experimental Portability : portable - Tests for operations on cauchy real numbers.+ Tests for operations on Cauchy real numbers. To run the tests using stack, execute: @@ -16,10 +17,9 @@ stack test aern2-real --test-arguments "-a 1000 -m Real" @ -}- module AERN2.Real.Tests (- specCauchyReal, tCauchyReal, tCauchyRealAtAccuracy+ -- specCauchyReal, tCReal ) where @@ -28,6 +28,8 @@ -- import Data.Ratio -- import Text.Printf +import qualified Numeric.CollectErrors as CN+ import Test.Hspec import Test.QuickCheck -- import qualified Test.Hspec.SmallCheck as SC@@ -38,33 +40,21 @@ import AERN2.MP import AERN2.MP.Dyadic -import AERN2.QA.Protocol-import AERN2.AccuracySG- import AERN2.Real.Type--instance Arbitrary CauchyRealAtAccuracy where- arbitrary =- cauchyRealAtAccuracy <$>- arbitrary <*>- ((accuracySG . bits) <$> (arbitrarySmall 1000 :: Gen Integer))+import AERN2.Real.Field () -instance Arbitrary CauchyReal where+instance Arbitrary CReal where arbitrary = frequency- [(int 1, real <$> (arbitrarySmall 1000000 :: Gen Integer)),- (int 1, real <$> (arbitrarySmall 1000000 :: Gen Rational)),+ [(int 1, creal <$> (arbitrarySmall 1000000 :: Gen Integer)),+ (int 1, creal <$> (arbitrarySmall 1000000 :: Gen Rational)), (int 2, (*) <$> (arbitrarySmall 1000000 :: Gen Integer) <*> arbitrarySignedBinary) ] where arbitrarySignedBinary = signedBinary2Real <$> infiniteListOf (elements [-1,0,1]) signedBinary2Real sbits =- newCR "random" [] $ \ _ (AccuracySG _ acG) ->- case acG of- NoInformation -> balls !! 0- Exact -> error "signedBinary2Real: cannot request the number Exactly"- _ -> balls !! (fromAccuracy acG + 1)+ crealFromPrecFunction $ \ p -> cn $ balls !! p where balls = nextBit (mpBall (0,1)) $ zip sbits (map prec [10..]) nextBit ball ((sbit, p):rest) =@@ -72,17 +62,17 @@ where newBall = case sbit of- (-1) -> fromEndpoints l m- 0 -> fromEndpoints l2 r2- 1 -> fromEndpoints m r- _ -> error "in Arbitrary CauchyReal"- (l_,r_) = endpoints ball :: (MPBall, MPBall)+ (-1) -> fromEndpointsAsIntervals l m+ 0 -> fromEndpointsAsIntervals l2 r2+ 1 -> fromEndpointsAsIntervals m r+ _ -> error "in Arbitrary CReal"+ (l_,r_) = endpointsAsIntervals ball l = setPrecision p l_ r = setPrecision p r_ m = (l + r) * (dyadic 0.5) l2 = (l + m) * (dyadic 0.5) r2 = (r + m) * (dyadic 0.5)- nextBit _ _ = error "in Arbitrary CauchyReal"+ nextBit _ _ = error "in Arbitrary CReal" arbitrarySmall :: (Arbitrary a, HasOrderCertainly a Integer) => Integer -> Gen a arbitrarySmall limit = aux@@ -96,110 +86,101 @@ {-|- A runtime representative of type @CauchyReal@.+ A runtime representative of type @CReal@. Used for specialising polymorphic tests to concrete types. -}-tCauchyReal :: T CauchyReal-tCauchyReal = T "CauchyReal"+tCReal :: T CReal+tCReal = T "CReal" -tCauchyRealAtAccuracy :: T CauchyRealAtAccuracy-tCauchyRealAtAccuracy = T "CauchyReal(ac)"+-- tCauchyRealAtAccuracy :: T CauchyRealAtAccuracy+-- tCauchyRealAtAccuracy = T "CReal(ac)" specCRrespectsAccuracy1 :: String ->- (CauchyReal -> CauchyReal) ->- (CauchyReal -> AccuracySG -> Bool) ->- Spec-specCRrespectsAccuracy1 opName op =- specCRrespectsAccuracy1CN opName (\ a -> cn (op a))--specCRrespectsAccuracy1CN ::- String ->- (CauchyReal -> CauchyRealCN) ->- (CauchyReal -> AccuracySG -> Bool) ->+ (CReal -> CReal) ->+ (CReal -> Accuracy -> Bool) -> Spec-specCRrespectsAccuracy1CN opName op precond =+specCRrespectsAccuracy1 opName op precond = it (opName ++ " respects accuracy requests") $ do property $- \ (x :: CauchyReal) (ac :: Accuracy) ->- let acSG = accuracySG ac in- ac < (bits 1000) && precond x acSG ==>- case getMaybeValueCN ((op x) ? acSG) of- Just v -> getAccuracy v >=$ ac+ \ (x :: CReal) (ac :: Accuracy) ->+ ac < (bits 1000) && precond x ac ==>+ case CN.toEither ((op x) ? ac) of+ Right v -> getAccuracy v >=$ ac _ -> property True (>=$) :: Accuracy -> Accuracy -> Property (>=$) = printArgsIfFails2 ">=" (>=) -precondAnyReal :: CauchyReal -> AccuracySG -> Bool+precondAnyReal :: CReal -> Accuracy -> Bool precondAnyReal _x _ac = True -precondPositiveReal :: CauchyReal -> AccuracySG -> Bool+precondPositiveReal :: CReal -> Accuracy -> Bool precondPositiveReal x ac = (x ? ac) !>! 0 -precondNonZeroReal :: CauchyReal -> AccuracySG -> Bool+precondNonZeroReal :: CReal -> Accuracy -> Bool precondNonZeroReal x ac = (x ? ac) !/=! 0 -precondSmallReal :: CauchyReal -> AccuracySG -> Bool+precondSmallReal :: CReal -> Accuracy -> Bool precondSmallReal x ac = abs (x ? ac) !<! 1000 -precondPositiveSmallReal :: CauchyReal -> AccuracySG -> Bool+precondPositiveSmallReal :: CReal -> Accuracy -> Bool precondPositiveSmallReal x ac = 0 !<! b && b !<! 1000 where b = x ? ac -specCRrespectsAccuracy2 ::- String ->- (CauchyReal -> CauchyReal -> CauchyReal) ->- (CauchyReal -> AccuracySG -> Bool) ->- (CauchyReal -> AccuracySG -> Bool) ->- Spec-specCRrespectsAccuracy2 opName op =- specCRrespectsAccuracy2CN opName (\ a b -> cn (op a b))+-- specCRrespectsAccuracy2 ::+-- String ->+-- (CReal -> CReal -> CReal) ->+-- (CReal -> Accuracy -> Bool) ->+-- (CReal -> Accuracy -> Bool) ->+-- Spec+-- specCRrespectsAccuracy2 opName op =+-- specCRrespectsAccuracy2CN opName (\ a b -> cn (op a b)) -specCRrespectsAccuracy2CN ::- String ->- (CauchyReal -> CauchyReal -> CauchyRealCN) ->- (CauchyReal -> AccuracySG -> Bool) ->- (CauchyReal -> AccuracySG -> Bool) ->- Spec-specCRrespectsAccuracy2CN opName op precond1 precond2 =- it (opName ++ " respects accuracy requests") $ do- property $- \ (x :: CauchyReal) (y :: CauchyReal) (ac :: Accuracy) ->- let acSG = accuracySG ac in- ac < (bits 1000) && precond1 x acSG && precond2 y acSG ==>- case getMaybeValueCN ((op x y) ? acSG) of- Just v -> getAccuracy v >=$ ac- _ -> property True+-- specCRrespectsAccuracy2CN ::+-- String ->+-- (CReal -> CReal -> CauchyRealCN) ->+-- (CReal -> Accuracy -> Bool) ->+-- (CReal -> Accuracy -> Bool) ->+-- Spec+-- specCRrespectsAccuracy2CN opName op precond1 precond2 =+-- it (opName ++ " respects accuracy requests") $ do+-- property $+-- \ (x :: CReal) (y :: CReal) (ac :: Accuracy) ->+-- let acSG = accuracySG ac in+-- ac < (bits 1000) && precond1 x acSG && precond2 y acSG ==>+-- case getMaybeValueCN ((op x y) ? acSG) of+-- Just v -> getAccuracy v >=$ ac+ -- _ -> property True -specCRrespectsAccuracy2T ::- (Arbitrary t, Show t) =>- T t ->- String ->- (CauchyReal -> t -> CauchyReal) ->- (CauchyReal -> AccuracySG -> Bool) ->- (t -> Bool) ->- Spec-specCRrespectsAccuracy2T tt opName op =- specCRrespectsAccuracy2TCN tt opName (\ a b -> cn (op a b))+-- specCRrespectsAccuracy2T ::+-- (Arbitrary t, Show t) =>+-- T t ->+-- String ->+-- (CReal -> t -> CReal) ->+-- (CReal -> Accuracy -> Bool) ->+-- (t -> Bool) ->+-- Spec+-- specCRrespectsAccuracy2T tt opName op =+-- specCRrespectsAccuracy2TCN tt opName (\ a b -> cn (op a b)) -specCRrespectsAccuracy2TCN ::- (Arbitrary t, Show t) =>- T t ->- String ->- (CauchyReal -> t -> CauchyRealCN) ->- (CauchyReal -> AccuracySG -> Bool) ->- (t -> Bool) ->- Spec-specCRrespectsAccuracy2TCN (T tName :: T t) opName op precond1 precond2 =- it (opName ++ " with " ++ tName ++ " respects accuracy requests") $ do- property $- \ (x :: CauchyReal) (t :: t) (ac :: Accuracy) ->- let acSG = accuracySG ac in- ac < (bits 1000) && precond1 x acSG && precond2 t ==>- case getMaybeValueCN ((op x t) ? acSG) of- Just v -> getAccuracy v >=$ ac- _ -> property True+-- specCRrespectsAccuracy2TCN ::+-- (Arbitrary t, Show t) =>+-- T t ->+-- String ->+-- (CReal -> t -> CauchyRealCN) ->+-- (CReal -> Accuracy -> Bool) ->+-- (t -> Bool) ->+-- Spec+-- specCRrespectsAccuracy2TCN (T tName :: T t) opName op precond1 precond2 =+-- it (opName ++ " with " ++ tName ++ " respects accuracy requests") $ do+-- property $+-- \ (x :: CReal) (t :: t) (ac :: Accuracy) ->+-- let acSG = accuracySG ac in+-- ac < (bits 1000) && precond1 x acSG && precond2 t ==>+-- case getMaybeValueCN ((op x t) ? acSG) of+-- Just v -> getAccuracy v >=$ ac+-- _ -> property True precondAnyT :: t -> Bool precondAnyT _t = True@@ -210,46 +191,46 @@ precondSmallT :: (HasOrderCertainly t Integer) => t -> Bool precondSmallT t = -1000 !<=! t && t !<=! 1000 -specCauchyReal :: Spec-specCauchyReal =- describe ("CauchyReal") $ do- -- specConversion tInteger tCauchyReal real (fst . integerBounds)- describe "order" $ do- specHasEqNotMixed tCauchyRealAtAccuracy- -- specHasEq tInt tCauchyRealAtAccuracy tRational- -- specCanPickNonZero tCauchyRealAtAccuracy- specHasOrderNotMixed tCauchyRealAtAccuracy- -- specHasOrder tInt tCauchyRealAtAccuracy tRational- describe "min/max/abs" $ do- specCRrespectsAccuracy1 "abs" abs precondAnyReal- specCRrespectsAccuracy2 "max" max precondAnyReal precondAnyReal- specCRrespectsAccuracy2 "min" min precondAnyReal precondAnyReal- describe "ring" $ do- specCRrespectsAccuracy1 "negate" negate precondAnyReal- specCRrespectsAccuracy2 "+" add precondAnyReal precondAnyReal- specCRrespectsAccuracy2T tInteger "+" add precondAnyReal precondAnyT- specCRrespectsAccuracy2T tRational "+" add precondAnyReal precondAnyT- specCRrespectsAccuracy2T tDyadic "+" add precondAnyReal precondAnyT- specCRrespectsAccuracy2 "a-b" sub precondAnyReal precondAnyReal- specCRrespectsAccuracy2T tInteger "a-b" sub precondAnyReal precondAnyT- specCRrespectsAccuracy2T tRational "a-b" sub precondAnyReal precondAnyT- specCRrespectsAccuracy2T tDyadic "a-b" sub precondAnyReal precondAnyT- specCRrespectsAccuracy2 "*" mul precondAnyReal precondAnyReal- specCRrespectsAccuracy2T tInteger "*" mul precondAnyReal precondAnyT- specCRrespectsAccuracy2T tRational "*" mul precondAnyReal precondAnyT- specCRrespectsAccuracy2T tDyadic "*" mul precondAnyReal precondAnyT- describe "field" $ do- specCRrespectsAccuracy2CN "/" divide precondAnyReal precondNonZeroReal- specCRrespectsAccuracy2TCN tInteger "/" divide precondAnyReal precondNonZeroT- specCRrespectsAccuracy2TCN tRational "/" divide precondAnyReal precondNonZeroT- specCRrespectsAccuracy2TCN tDyadic "/" divide precondAnyReal precondNonZeroT- describe "elementary" $ do- specCRrespectsAccuracy1CN "sqrt" sqrt precondPositiveReal- specCRrespectsAccuracy1 "exp" exp precondSmallReal- specCRrespectsAccuracy1CN "log" log precondPositiveSmallReal- specCRrespectsAccuracy2CN "pow" pow precondPositiveSmallReal precondSmallReal- specCRrespectsAccuracy2TCN tInteger "pow" pow precondNonZeroReal precondSmallT- specCRrespectsAccuracy2TCN tRational "pow" pow precondPositiveSmallReal precondSmallT- specCRrespectsAccuracy2TCN tDyadic "pow" pow precondPositiveSmallReal precondSmallT- specCRrespectsAccuracy1 "cos" cos precondAnyReal- specCRrespectsAccuracy1 "sine" sin precondAnyReal+-- specCauchyReal :: Spec+-- specCauchyReal =+-- describe ("CReal") $ do+-- -- specConversion tInteger tCauchyReal real (fst . integerBounds)+-- describe "order" $ do+-- specHasEqNotMixed tCReal+-- -- specHasEq tInt tCReal tRational+-- -- specCanPickNonZero tCReal+-- specHasOrderNotMixed tCReal+-- -- specHasOrder tInt tCReal tRational+ -- describe "min/max/abs" $ do+ -- specCRrespectsAccuracy1 "abs" abs precondAnyReal+ -- specCRrespectsAccuracy2 "max" max precondAnyReal precondAnyReal+ -- specCRrespectsAccuracy2 "min" min precondAnyReal precondAnyReal+ -- describe "ring" $ do+ -- specCRrespectsAccuracy1 "negate" negate precondAnyReal+ -- specCRrespectsAccuracy2 "+" add precondAnyReal precondAnyReal+ -- specCRrespectsAccuracy2T tInteger "+" add precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2T tRational "+" add precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2T tDyadic "+" add precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2 "a-b" sub precondAnyReal precondAnyReal+ -- specCRrespectsAccuracy2T tInteger "a-b" sub precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2T tRational "a-b" sub precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2T tDyadic "a-b" sub precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2 "*" mul precondAnyReal precondAnyReal+ -- specCRrespectsAccuracy2T tInteger "*" mul precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2T tRational "*" mul precondAnyReal precondAnyT+ -- specCRrespectsAccuracy2T tDyadic "*" mul precondAnyReal precondAnyT+ -- describe "field" $ do+ -- specCRrespectsAccuracy2CN "/" divide precondAnyReal precondNonZeroReal+ -- specCRrespectsAccuracy2TCN tInteger "/" divide precondAnyReal precondNonZeroT+ -- specCRrespectsAccuracy2TCN tRational "/" divide precondAnyReal precondNonZeroT+ -- specCRrespectsAccuracy2TCN tDyadic "/" divide precondAnyReal precondNonZeroT+ -- describe "elementary" $ do+ -- specCRrespectsAccuracy1CN "sqrt" sqrt precondPositiveReal+ -- specCRrespectsAccuracy1 "exp" exp precondSmallReal+ -- specCRrespectsAccuracy1CN "log" log precondPositiveSmallReal+ -- specCRrespectsAccuracy2CN "pow" pow precondPositiveSmallReal precondSmallReal+ -- specCRrespectsAccuracy2TCN tInteger "pow" pow precondNonZeroReal precondSmallT+ -- specCRrespectsAccuracy2TCN tRational "pow" pow precondPositiveSmallReal precondSmallT+ -- specCRrespectsAccuracy2TCN tDyadic "pow" pow precondPositiveSmallReal precondSmallT+ -- specCRrespectsAccuracy1 "cos" cos precondAnyReal+ -- specCRrespectsAccuracy1 "sine" sin precondAnyReal
src/AERN2/Real/Type.hs view
@@ -1,3 +1,7 @@+{-# OPTIONS_GHC -Wno-orphans #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE RankNTypes #-} {-| Module : AERN2.Real.Type Description : The type of Cauchy real numbers@@ -10,123 +14,143 @@ The type of Cauchy real numbers -}-module AERN2.Real.Type-(- CauchyRealP, pCR, CauchyRealCNP, pCRCN- , CauchyRealA, CauchyReal, newCR- , CauchyRealCNA, CauchyRealCN, newCRCN- , CauchyRealAtAccuracy, cauchyRealAtAccuracy- , realName, realId, realSources, realRename- , realWithAccuracy, realWithAccuracyA, realsWithAccuracyA- , convergentList2CauchyRealA- , seqByPrecision2CauchyRealA- , CanBeReal, real, CanBeRealA, realA- , CanBeComplex, complex, CanBeComplexA, complexA-)-where+module AERN2.Real.Type where import MixedTypesNumPrelude -- import qualified Prelude as P --- import qualified Control.CollectErrors as CE-import Control.Arrow--- import Text.Printf+import qualified Numeric.CollectErrors as CN -import Data.Complex+import qualified Data.List as List import AERN2.MP+import AERN2.MP.Dyadic -import AERN2.QA.Protocol-import AERN2.QA.Strategy.CachedUnsafe ()+import AERN2.MP.WithCurrentPrec+import GHC.TypeNats -import AERN2.AccuracySG+-- import AERN2.MP.Accuracy -import AERN2.Sequence+{- Convergent partial sequences -} -{- Cauchy real numbers -}+newtype CSequence t = CSequence [CN t] -type CauchyRealP = SequenceP MPBall-type CauchyRealCNP = SequenceP (CN MPBall)+instance Show t => Show (CSequence t) where+ show (CSequence s) = + "{?(prec " <> (show $ integer p) <> "): " + <> (show $ s !! cseqShowDefaultIndex) <> "}"+ where+ p = cseqPrecisions !! cseqShowDefaultIndex -pCR :: CauchyRealP-pCR = SequenceP (mpBall 0)+cseqShowDefaultIndex :: Integer+cseqShowDefaultIndex = 7 -pCRCN :: CauchyRealCNP-pCRCN = SequenceP (cn $ mpBall 0)+lift1 :: (CN t1 -> CN t2) -> CSequence t1 -> CSequence t2+lift1 f (CSequence a1) = CSequence (map f a1) -type CauchyRealA to = SequenceA to MPBall-type CauchyReal = CauchyRealA (->)+lift2 :: (CN t1 -> CN t2 -> CN t3) -> CSequence t1 -> CSequence t2 -> CSequence t3+lift2 f (CSequence a1) (CSequence a2) = CSequence (zipWith f a1 a2) -type CauchyRealCNA to = SequenceA to (CN MPBall)-type CauchyRealCN = CauchyRealCNA (->)+lift1T :: (CN t1 -> t2 -> CN t3) -> CSequence t1 -> t2 -> CSequence t3+lift1T f (CSequence a1) a2 = CSequence (map (flip f a2) a1) -type CauchyRealAtAccuracy = SequenceAtAccuracy MPBall-cauchyRealAtAccuracy :: CauchyReal -> AccuracySG -> CauchyRealAtAccuracy-cauchyRealAtAccuracy = SequenceAtAccuracy+liftT1 :: (t1 -> CN t2 -> CN t3) -> t1 -> CSequence t2 -> CSequence t3+liftT1 f a1 (CSequence a2) = CSequence (map (f a1) a2) -realName :: SequenceA to a -> String-realName = seqName+cseqPrecisions :: [Precision]+cseqPrecisions = standardPrecisions (prec 10) -realRename :: (String -> String) -> SequenceA to a -> SequenceA to a-realRename = seqRename+cseqIndexForPrecision :: Precision -> Integer+cseqIndexForPrecision p =+ case List.findIndex (>= p) cseqPrecisions of+ Nothing -> error $ "unable to find index for precision " ++ show p+ Just i -> integer i -realId :: QA to p -> Maybe (QAId to)-realId = qaId+cseqFromPrecFunction :: (Precision -> CN b) -> CSequence b+cseqFromPrecFunction withP = CSequence $ map withP cseqPrecisions -realSources :: QA to p -> [QAId to]-realSources = qaSources+cseqFromWithCurrentPrec :: (forall p. (KnownNat p) => WithCurrentPrec (CN b) p) -> CSequence b+cseqFromWithCurrentPrec (withCurrentP :: (forall p. (KnownNat p) => WithCurrentPrec (CN b) p)) = + CSequence $ map withP cseqPrecisions+ where+ withP p = runWithPrec p withCurrentP :: CN b -{-| Get a ball approximation of the real number with at least the specified accuracy.- (A specialisation of 'qaMakeQuery' for Cauchy reals.) -}-realWithAccuracy :: (QAArrow to) => CauchyRealA to -> AccuracySG `to` MPBall-realWithAccuracy = (?)+crealFromWithCurrentPrec :: (forall p. (KnownNat p) => WithCurrentPrec (CN MPBall) p) -> CReal+crealFromWithCurrentPrec = cseqFromWithCurrentPrec -realWithAccuracyA :: (QAArrow to) => (Maybe (QAId to)) -> (CauchyRealA to, AccuracySG) `to` MPBall-realWithAccuracyA = qaMakeQueryA+{- Cauchy real numbers -} -realsWithAccuracyA :: (QAArrow to) => (Maybe (QAId to)) -> ([CauchyRealA to], AccuracySG) `to` [MPBall]-realsWithAccuracyA = qaMakeQueryOnManyA+type CReal = CSequence MPBall -{- constructions -}+type HasCReals t = ConvertibleExactly CReal t -newCR :: (QAArrow to) => String -> [AnyProtocolQA to] -> ((Maybe (QAId to), Maybe (QAId to)) -> AccuracySG `to` MPBall) -> CauchyRealA to-newCR = newSeq (mpBall 0)+type CanBeCReal t = ConvertibleExactly t CReal -newCRCN :: (QAArrow to) => String -> [AnyProtocolQA to] -> ((Maybe (QAId to), Maybe (QAId to)) -> AccuracySG `to` CN MPBall) -> CauchyRealCNA to-newCRCN = newSeq (cn $ mpBall 0)+creal :: (CanBeCReal t) => t -> CReal+creal = convertExactly -convergentList2CauchyRealA :: (QAArrow to) => String -> [MPBall] -> (CauchyRealA to)-convergentList2CauchyRealA = convergentList2SequenceA+crealFromPrecFunction :: (Precision -> CN MPBall) -> CReal+crealFromPrecFunction = cseqFromPrecFunction -seqByPrecision2CauchyRealA :: (QAArrow to) => String -> (Precision -> MPBall) -> (CauchyRealA to)-seqByPrecision2CauchyRealA = seqByPrecision2SequenceA+{- Extracting approximations -} -{- conversions -}+class CanExtractApproximation e q where+ type ExtractedApproximation e q+ {-| Get an approximation of an exact value using the given query -}+ extractApproximation :: e {-^ exact value -} -> q {-^ query -} -> ExtractedApproximation e q -type CanBeRealA to t = ConvertibleExactly t (CauchyRealA to)-type CanBeReal t = CanBeRealA (->) t+infix 1 ? -real :: (CanBeRealA (->) t) => t -> CauchyReal-real = convertExactly+(?) :: CanExtractApproximation e q => e -> q -> ExtractedApproximation e q+(?) = extractApproximation -realA :: (CanBeRealA to t) => t -> CauchyRealA to-realA = convertExactly+instance (HasAccuracy t) => CanExtractApproximation (CSequence t) Accuracy where+ type ExtractedApproximation (CSequence t) Accuracy = CN t+ extractApproximation (CSequence s) ac = aux s+ where+ aux (bCN : rest) + | CN.hasCertainError bCN = bCN+ | getAccuracy bCN >= ac = bCN+ | otherwise = aux rest+ aux [] =+ CN.noValueNumErrorPotential $ + CN.NumError "failed to find an approximation with sufficient accuracy"+ +{-| Get a ball approximation of the real number with at least the specified accuracy -}+realWithAccuracy :: CReal -> Accuracy -> CN MPBall+realWithAccuracy = extractApproximation -type CanBeComplexA to t = ConvertibleExactly t (Complex (CauchyRealA to))-type CanBeComplex t = CanBeComplexA (->) t+instance CanExtractApproximation (CSequence t) Precision where+ type ExtractedApproximation (CSequence t) Precision = CN t+ extractApproximation (CSequence s) p =+ s !! (cseqIndexForPrecision p) -complex :: (CanBeComplexA (->) t) => t -> Complex CauchyReal-complex = convertExactly+instance ConvertibleWithPrecision CReal (CN MPBall) where+ safeConvertP p r = Right $ r ? p -complexA :: (CanBeComplexA to t) => t -> Complex (CauchyRealA to)-complexA = convertExactly+-- {- exact conversions -} --- instance (QAArrow to) => ConvertibleExactly Rational (CauchyRealA to) where--- safeConvertExactly x =--- Right $ newCR (show x) [] (\me_src -> arr (makeQ me_src))--- where--- makeQ _ = seqByPrecision2CauchySeq (flip mpBallP x) . bits+instance ConvertibleExactly CReal CReal where+ safeConvertExactly = Right -instance ConvertibleWithPrecision CauchyReal MPBall where- safeConvertP p r =- Right $ setPrecision p $ r ? (accuracySG $ bits p + 10)+instance ConvertibleExactly Rational CReal where+ safeConvertExactly x =+ Right $ crealFromPrecFunction (cn . flip mpBallP x)++instance ConvertibleExactly Integer CReal where+ safeConvertExactly = safeConvertExactly . rational++instance ConvertibleExactly Int CReal where+ safeConvertExactly = safeConvertExactly . rational++instance ConvertibleExactly Dyadic CReal where+ safeConvertExactly = safeConvertExactly . rational++_example1 :: CReal+_example1 = creal 1.0++_example2 :: CN MPBall+_example2 = (creal $ 1/3) ? (bits 100)++_example3 :: CN MPBall+_example3 = convertP (prec 100) (creal $ 1/3)
− src/AERN2/Sequence.hs
@@ -1,67 +0,0 @@-{-|- Module : AERN2.Sequence- Description : fast convergent sequences- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- A type of fast convergent sequences parametrised by the arrow in which the elements of the- sequence are queried--}-module AERN2.Sequence-(- module AERN2.AccuracySG- -- * The protocol and type of fast converging sequences- , SequenceP(..), pSeq- , SuitableForSeq- , SequenceA, Sequence, newSeq, newSeqSimple- , fmapSeq- , seqName, seqId, seqSources, seqRename- , seqWithAccuracy, (?), seqWithAccuracyA, seqsWithAccuracyA- , (-:-), (-:-||), (-:-|)- , SequenceAtAccuracy(..)- , convergentList2SequenceA- , seqByPrecision2SequenceA- -- * selecting one of several staged computations- , pick- -- * auxiliary functions for making new sequence operations- , unaryOp, binaryOp, binaryOpWithPureArg- , getSeqFnNormLog- , getInitQ1FromSimple, getInitQ1TFromSimple, getInitQ1Q2FromSimple- -- , binaryWithBall-)-where--import MixedTypesNumPrelude--- import qualified Prelude as P---- import Control.Arrow---- import AERN2.Norm--- import AERN2.MP.Precision--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence.Type-import AERN2.Sequence.Helpers-import AERN2.Sequence.Comparison-import AERN2.Sequence.Branching-import AERN2.Sequence.Ring ()-import AERN2.Sequence.Field ()-import AERN2.Sequence.Elementary ()-import AERN2.Sequence.PreludeOps ()---- instance--- (QAArrow to--- , OrderedRing a--- , SuitableForSeq a--- , SuitableForSeq (EqCompareType a a)--- , SuitableForSeq (EqCompareType a Int)--- , SuitableForSeq (EqCompareType a Integer)--- , HasNorm (EnsureNoCN a)--- , CanSetPrecision a, CanSetPrecision (EnsureCN a))--- =>--- Ring (SequenceA to a)
− src/AERN2/Sequence/Branching.hs
@@ -1,161 +0,0 @@-{-|- Module : AERN2.Sequence.Branching- Description : branching operations for sequences- Copyright : (c) Michal Konecny, Eike Neumann- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Branching operations for sequences--}-module AERN2.Sequence.Branching-(- SeqBoolP, SeqBoolA, SeqBool, pBool- , SequenceAtAccuracy(..)- , pickNonZeroSeqA, pick-)-where--import MixedTypesNumPrelude hiding (id)--- import qualified Prelude as P--import Control.Arrow--import Data.Maybe (catMaybes)--import AERN2.MP--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence.Type--- import AERN2.Sequence.Helpers (ensureAccuracyA)-import AERN2.Sequence.Comparison--{- non-zero picking -}--{-|- Given a list @[(a1,b1),(a2,b2),...]@ and assuming that- at least one of @a1,a2,...@ is non-zero, pick one of them- and return the corresponding pair @(ai,bi)@.-- If none of @a1,a2,...@ is zero, either throw an exception- or loop forever.- -}-pickNonZeroSeqA ::- (QAArrow to, CanPickNonZero a)- =>- Maybe (QAId to) ->- [(SequenceA to a, s)] `to` Maybe (SequenceA to a, s)-pickNonZeroSeqA src =- startFromAccuracy (bits 0)- where- startFromAccuracy ac =- proc seqsAndS -> do- balls <- seqsWithAccuracyA src -< (map fst seqsAndS, accuracySG ac)- let maybeNonZero = pickNonZero $ zip balls seqsAndS- case maybeNonZero of- Just (_,result) -> returnA -< Just result- _ -> startFromAccuracy (ac + 1) -< seqsAndS--instance (CanPickNonZero a) => CanPickNonZero (Sequence a) where- pickNonZero = pickNonZeroSeqA Nothing--{-| "parallel if" -}-instance- (QAArrow to, ArrowApply to- , HasIfThenElse b t- , HasIfThenElse b (to AccuracySG t)- , IfThenElseType b (to AccuracySG t) ~ to AccuracySG (IfThenElseType b t)- , SuitableForSeq b, SuitableForSeq t, SuitableForSeq (IfThenElseType b t))- =>- HasIfThenElse (SequenceA to b) (SequenceA to t)- where- type IfThenElseType (SequenceA to b) (SequenceA to t) = (SequenceA to (IfThenElseType b t))- ifThenElse (b::SequenceA to b) (e1::SequenceA to t) e2 =- newSeq sampleT "pif" [AnyProtocolQA b, AnyProtocolQA e1, AnyProtocolQA e2] makeQ- where- sampleT = undefined :: (IfThenElseType b t)- makeQ (me,_src) =- proc ac ->- do- bAC <- (-?<-) me -< (b, ac)- app -< (if bAC then (e1 ?<- me) else (e2 ?<- me), (ac+1))---- -- "parallel if" for lists of sequences:--- instance--- (QAArrow to, ArrowApply to--- , HasIfThenElse b t--- , HasIfThenElse b (to AccuracySG t)--- -- , IfThenElseType b (to AccuracySG t) ~ to AccuracySG (IfThenElseType b t)--- , IfThenElseType b (([Maybe (QAId to)], [t])) ~ (([Maybe (QAId to)], [IfThenElseType b t]))--- , IfThenElseType b (to AccuracySG ([Maybe (QAId to)], [t])) ~ to AccuracySG (IfThenElseType b ([Maybe (QAId to)], [t]))--- , SuitableForSeq b, SuitableForSeq t, SuitableForSeq (IfThenElseType b t))--- =>--- HasIfThenElse (SequenceA to b) [(SequenceA to t)]--- where--- type IfThenElseType (SequenceA to b) [(SequenceA to t)] = () `to` [(SequenceA to (IfThenElseType b t))]--- ifThenElse (b::SequenceA to b) (e1::[SequenceA to t]) e2 =--- sequence2list $--- newSeq sampleT "pifList" [AnyProtocolQA b] makeQ--- where--- sampleT = undefined :: ([Maybe (QAId to)], [IfThenElseType b t])--- makeQ (me,_src) =--- proc ac ->--- do--- bAC <- (-?-) -< (b, ac)--- let eS = if bAC--- then (list2sequence e1 ?<- me)--- else (list2sequence e2 ?<- me)--- app -< (eS, (ac+1))------ list2sequence ::--- (QAArrow to, SuitableForSeq ([Maybe (QAId to)], [t]))--- =>--- [SequenceA to t] -> SequenceA to ([Maybe (QAId to)], [t])--- list2sequence (list :: [SequenceA to t]) =--- newSeq sampleT "list" [] makeQ--- where--- sampleT = undefined :: ([Maybe (QAId to)], [t])--- makeQ (me,_src) =--- proc ac ->--- do--- ts <- qaMakeQueryOnManyA me -< (list,ac)--- returnA -< (map seqId list, ts)------ sequence2list ::--- (QAArrow to, SuitableForSeq t)--- =>--- SequenceA to ([Maybe (QAId to)], [t]) -> () `to` [SequenceA to t]--- sequence2list (s :: SequenceA to ([Maybe (QAId to)], [t])) =--- proc () ->--- do--- (sources, _) <- (-?-) -< (s, acSG0)--- returnA -< (map forSource $ zip [0..] sources)--- where--- forSource (i,_src) =--- -- newSeq sampleT "list" [AnyProtocolQA src] makeQ--- newSeq sampleT "list" [] makeQ--- where--- sampleT = undefined :: t--- makeQ (me, _src) =--- proc ac ->--- do--- (_, ts) <- (-?<-) me -< (s, ac)--- returnA -< ts !! i--pick ::- (QAArrow to)- =>- (Maybe (QAId to)) ->- [(SequenceA to (Maybe a))] `to` a-pick src = aux (bitsS 0)- where- aux ac =- proc options ->- do- mas <- qaMakeQueryOnManyA src -< (options, ac)- case catMaybes mas of- [] -> aux (ac + 1) -< options- (a : _) -> returnA -< a
− src/AERN2/Sequence/Comparison.hs
@@ -1,360 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.Sequence.Comparison- Description : comparison operations on sequences- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Comparison operations on convergent sequences.--}-module AERN2.Sequence.Comparison-(- SeqBoolP, SeqBoolA, SeqBool, pBool- , SequenceAtAccuracy(..)-)-where--import MixedTypesNumPrelude hiding (id)--- import qualified Prelude as P--import Control.Category (id)-import Control.Arrow--import Control.CollectErrors--import AERN2.MP.Ball-import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence.Type-import AERN2.Sequence.Helpers--{- "Sequenced/Staged" Boolean -}--type SeqBoolP = SequenceP (Maybe Bool)--pBool :: SeqBoolP-pBool = SequenceP Nothing--type SeqBoolA to = SequenceA to (Maybe Bool)-type SeqBool = SeqBoolA (->)--{- Boolean ops on sequences -}--instance (QAArrow to, HasBools b, SuitableForSeq b) => ConvertibleExactly Bool (SequenceA to b) where- safeConvertExactly bool =- do- b <- safeConvertExactly bool- Right $ newSeq b (show b) [] $ \_me_src -> arr $ const b--instance- (QAArrow to, CanNeg a, SuitableForSeq a, SuitableForSeq (NegType a))- =>- CanNeg (SequenceA to a)- where- type NegType (SequenceA to a) = SequenceA to (NegType a)- negate = unaryOp "neg" negate (getInitQ1FromSimple $ arr id)--instance- (QAArrow to, CanAndOrAsymmetric a b- , SuitableForSeq a, SuitableForSeq b, SuitableForSeq (AndOrType a b))- =>- CanAndOrAsymmetric (SequenceA to a) (SequenceA to b)- where- type AndOrType (SequenceA to a) (SequenceA to b) = SequenceA to (AndOrType a b)- and2 = binaryOp "and" and2 (getInitQ1Q2FromSimple $ arr $ \q -> (q,q))- or2 = binaryOp "or" or2 (getInitQ1Q2FromSimple $ arr $ \q -> (q,q))--{- equality & order -}--instance- (QAArrow to, HasEqAsymmetric a b- , SuitableForSeq a, SuitableForSeq b, SuitableForSeq (EqCompareType a b))- =>- HasEqAsymmetric (SequenceA to a) (SequenceA to b)- where- type EqCompareType (SequenceA to a) (SequenceA to b) = SequenceA to (EqCompareType a b)- equalTo = lift2 "==" (==)- notEqualTo = lift2 "/=" (/=)--instance- (QAArrow to, HasOrderAsymmetric a b- , SuitableForSeq a, SuitableForSeq b, SuitableForSeq (OrderCompareType a b))- =>- HasOrderAsymmetric (SequenceA to a) (SequenceA to b)- where- type OrderCompareType (SequenceA to a) (SequenceA to b) = SequenceA to (OrderCompareType a b)- lessThan = lift2 "<" (<)- leq = lift2 "<=" (<=)- greaterThan = lift2 ">" (>)- geq = lift2 ">=" (>=)--{- comparing CollectErrors and Sequences -}--instance- (HasEqAsymmetric (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (EqCompareType (SequenceA to a) b)- , IsBool (EnsureCE es (EqCompareType (SequenceA to a) b))- , SuitableForCE es)- =>- HasEqAsymmetric (SequenceA to a) (CollectErrors es b)- where- type EqCompareType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (EqCompareType (SequenceA to a) b)- equalTo = lift2TLCE equalTo--instance- (HasEqAsymmetric a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (EqCompareType a (SequenceA to b))- , IsBool (EnsureCE es (EqCompareType a (SequenceA to b)))- , SuitableForCE es)- =>- HasEqAsymmetric (CollectErrors es a) (SequenceA to b)- where- type EqCompareType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (EqCompareType a (SequenceA to b))- equalTo = lift2TCE equalTo--instance- (HasOrderAsymmetric (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (OrderCompareType (SequenceA to a) b)- , IsBool (EnsureCE es (OrderCompareType (SequenceA to a) b))- , SuitableForCE es)- =>- HasOrderAsymmetric (SequenceA to a) (CollectErrors es b)- where- type OrderCompareType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (OrderCompareType (SequenceA to a) b)- lessThan = lift2TLCE lessThan- leq = lift2TLCE leq- greaterThan = lift2TLCE greaterThan- geq = lift2TLCE geq--instance- (HasOrderAsymmetric a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (OrderCompareType a (SequenceA to b))- , IsBool (EnsureCE es (OrderCompareType a (SequenceA to b)))- , SuitableForCE es)- =>- HasOrderAsymmetric (CollectErrors es a) (SequenceA to b)- where- type OrderCompareType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (OrderCompareType a (SequenceA to b))- lessThan = lift2TCE lessThan- leq = lift2TCE leq- greaterThan = lift2TCE greaterThan- geq = lift2TCE geq---{- comparisons of SequenceAtAccuracy -}--{-| SequenceAtAccuracy exists only so that we can QuickCheck that- Sequence satisfies properties whose statement relies on an instance of HasEqCertainly.- Sequence is not an instance but SequenceAtAccuracy is.--}-data SequenceAtAccuracy a = SequenceAtAccuracy (Sequence a) AccuracySG- deriving (Show)--instance- (HasEqAsymmetric a b, SuitableForSeq a, SuitableForSeq b, SuitableForSeq (EqCompareType a b))- =>- HasEqAsymmetric (SequenceAtAccuracy a) (SequenceAtAccuracy b)- where- type EqCompareType (SequenceAtAccuracy a) (SequenceAtAccuracy b) = EqCompareType a b- equalTo = delift2 (==)--instance- (HasOrderAsymmetric a b, SuitableForSeq a, SuitableForSeq b, SuitableForSeq (OrderCompareType a b))- =>- HasOrderAsymmetric (SequenceAtAccuracy a) (SequenceAtAccuracy b)- where- type OrderCompareType (SequenceAtAccuracy a) (SequenceAtAccuracy b) = OrderCompareType a b- lessThan = delift2 (<)- leq = delift2 (<=)- greaterThan = delift2 (>)- geq = delift2 (>=)----delift2 ::- (Sequence a -> Sequence b -> Sequence c) ->- SequenceAtAccuracy a -> SequenceAtAccuracy b -> c-delift2 rel (SequenceAtAccuracy x1 ac1) (SequenceAtAccuracy x2 ac2) =- (rel x1 x2) ? (max ac1 ac2)--{- abs -}--instance- (QAArrow to, CanAbs a, SuitableForSeq a, SuitableForSeq (AbsType a))- =>- CanAbs (SequenceA to a)- where- type AbsType (SequenceA to a) = SequenceA to (AbsType a)- abs = unaryOp "abs" abs (getInitQ1FromSimple $ arr id)--{- min/max -}--instance- (QAArrow to- , CanMinMaxAsymmetric a b, SuitableForSeq a, SuitableForSeq b, SuitableForSeq (MinMaxType a b))- =>- CanMinMaxAsymmetric (SequenceA to a) (SequenceA to b)- where- type MinMaxType (SequenceA to a) (SequenceA to b) = SequenceA to (MinMaxType a b)- min = lift2 "min" min- max = lift2 "max" max---instance- (CanMinMaxAsymmetric a MPBall, SuitableForSeq a- , CanSetPrecision (MinMaxType a MPBall))- =>- CanMinMaxAsymmetric (Sequence a) MPBall- where- type MinMaxType (Sequence a) MPBall = MinMaxType a MPBall- min = binaryWithEncl min- max = binaryWithEncl max----instance- (CanMinMaxAsymmetric MPBall b, SuitableForSeq b- , CanSetPrecision (MinMaxType MPBall b))- =>- CanMinMaxAsymmetric MPBall (Sequence b)- where- type MinMaxType MPBall (Sequence b) = MinMaxType MPBall b- min = flip $ binaryWithEncl (flip min)- max = flip $ binaryWithEncl (flip max)--instance- (CanMinMaxAsymmetric (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (MinMaxType (SequenceA to a) b)- , SuitableForCE es)- =>- CanMinMaxAsymmetric (SequenceA to a) (CollectErrors es b)- where- type MinMaxType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (MinMaxType (SequenceA to a) b)- min = lift2TLCE min- max = lift2TLCE max--instance- (CanMinMaxAsymmetric a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (MinMaxType a (SequenceA to b))- , SuitableForCE es)- =>- CanMinMaxAsymmetric (CollectErrors es a) (SequenceA to b)- where- type MinMaxType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (MinMaxType a (SequenceA to b))- min = lift2TCE min- max = lift2TCE max---lift2 ::- (QAArrow to, SuitableForSeq a, SuitableForSeq b, SuitableForSeq c)- =>- String -> (a -> b -> c) -> SequenceA to a -> SequenceA to b -> SequenceA to c-lift2 name op aSeq bSeq =- newSeq (op sampleA sampleB) name [AnyProtocolQA aSeq, AnyProtocolQA bSeq] makeQ- where- SequenceP sampleA = qaProtocol aSeq- SequenceP sampleB = qaProtocol bSeq- makeQ (me, _src) =- proc ac ->- do- a <- seqWithAccuracy aSeq me -< ac- b <- seqWithAccuracy bSeq me -< ac- returnA -< op a b--lift2T ::- (QAArrow to, SuitableForSeq a, SuitableForSeq c)- =>- String -> (a -> t -> c) -> SequenceA to a -> t -> SequenceA to c-lift2T name op aSeq b =- newSeq (op sampleA b) name [AnyProtocolQA aSeq] makeQ- where- SequenceP sampleA = qaProtocol aSeq- makeQ (me, _src) =- proc ac ->- do- a <- seqWithAccuracy aSeq me -< ac- returnA -< op a b--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to- , CanMinMaxAsymmetric a $t, SuitableForSeq a, SuitableForSeq (MinMaxType a $t))- =>- CanMinMaxAsymmetric (SequenceA to a) $t- where- type MinMaxType (SequenceA to a) $t = SequenceA to (MinMaxType a $t)- min = binaryOpWithPureArg "min" min (getInitQ1TFromSimple id)- max = binaryOpWithPureArg "max" max (getInitQ1TFromSimple id)-- instance- (QAArrow to- , CanMinMaxAsymmetric $t b, SuitableForSeq b, SuitableForSeq (MinMaxType $t b))- =>- CanMinMaxAsymmetric $t (SequenceA to b)- where- type MinMaxType $t (SequenceA to b) = SequenceA to (MinMaxType $t b)- min = flip $ binaryOpWithPureArg "min" (flip min) (getInitQ1TFromSimple id)- max = flip $ binaryOpWithPureArg "max" (flip max) (getInitQ1TFromSimple id)-- instance- (QAArrow to, HasEqAsymmetric a $t- , SuitableForSeq a, SuitableForSeq (EqCompareType a $t))- =>- HasEqAsymmetric (SequenceA to a) $t- where- type EqCompareType (SequenceA to a) $t = SequenceA to (EqCompareType a $t)- equalTo = lift2T "==" (==)- notEqualTo = lift2T "/=" (/=)-- instance- (QAArrow to, HasEqAsymmetric $t a- , SuitableForSeq a, SuitableForSeq (EqCompareType $t a))- =>- HasEqAsymmetric $t (SequenceA to a)- where- type EqCompareType $t (SequenceA to a) = SequenceA to (EqCompareType $t a)- equalTo = flip $ lift2T "==" (flip (==))- notEqualTo = flip $ lift2T "/=" (flip (/=))-- instance- (QAArrow to, HasOrderAsymmetric a $t- , SuitableForSeq a, SuitableForSeq (OrderCompareType a $t))- =>- HasOrderAsymmetric (SequenceA to a) $t- where- type OrderCompareType (SequenceA to a) $t = SequenceA to (OrderCompareType a $t)- lessThan = lift2T "<" (<)- leq = lift2T "<=" (<=)- greaterThan = lift2T ">" (>)- geq = lift2T ">=" (>=)-- instance- (QAArrow to, HasOrderAsymmetric $t a- , SuitableForSeq a, SuitableForSeq (OrderCompareType $t a))- =>- HasOrderAsymmetric $t (SequenceA to a)- where- type OrderCompareType $t (SequenceA to a) = SequenceA to (OrderCompareType $t a)- lessThan = flip $ lift2T "<" (flip (<))- leq = flip $ lift2T "<=" (flip (<=))- greaterThan = flip $ lift2T ">" (flip (>))- geq = flip $ lift2T ">=" (flip (>=))-- |]))
− src/AERN2/Sequence/Elementary.hs
@@ -1,307 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.Sequence.Elementary- Description : elementary functions on sequences- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Elementary functions on fast converging sequences.--}-module AERN2.Sequence.Elementary-()-where--import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow--import Control.CollectErrors--import AERN2.MP.Ball-import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence.Type-import AERN2.Sequence.Helpers-import AERN2.Sequence.Ring ()-import AERN2.Sequence.Field ()--{- exp -}--instance- (QAArrow to, CanExp a- , CanEnsureCN (ExpType a), HasNorm (EnsureNoCN (ExpType a))- , SuitableForSeq a, SuitableForSeq (ExpType a))- =>- CanExp (SequenceA to a)- where- type ExpType (SequenceA to a) = SequenceA to (ExpType a)- exp = unaryOp "exp" exp expGetInitQ1- where- expGetInitQ1 me a1 =- proc q ->- do- (m_a1NormLog, b) <- getSeqFnNormLog me a1 exp -< q- let jInit = case m_a1NormLog of- Just expNL -> q + expNL- _ -> q- returnA -< (jInit, Just b)--{- log -}--instance- (QAArrow to, CanLog a, CanSetPrecision a- , CanEnsureCN a, HasNorm (EnsureNoCN a)- , SuitableForSeq a, SuitableForSeq (LogType a))- =>- CanLog (SequenceA to a)- where- type LogType (SequenceA to a) = SequenceA to (LogType a)- log = unaryOp "log" log logGetInitQ1- where- logGetInitQ1 me a1 =- proc q ->- do- (m_a1NormLog, b) <- getSeqFnNormLog me a1 id -< q- let jInit = case m_a1NormLog of- Just a1normLog -> q - a1normLog- _ -> q- returnA -< (jInit, Just $ setPrecisionAtLeastAccuracy ((_acGuide q)+5) b)- -- the @setPrecisionAtLeastAccuracy (q+5)@ above improves- -- efficiency for exact low-precision arguments--{- power -}--instance- (QAArrow to, CanPow a e- , CanEnsureCN a, HasNorm (EnsureNoCN a)- , HasIntegerBounds e- , SuitableForSeq a, SuitableForSeq e- , SuitableForSeq (PowTypeNoCN a e)- , SuitableForSeq (PowType a e))- =>- CanPow (SequenceA to a) (SequenceA to e)- where- type PowTypeNoCN (SequenceA to a) (SequenceA to e) = SequenceA to (PowTypeNoCN a e)- powNoCN = binaryOp "^" powNoCN powGetInitQ1Q2- type PowType (SequenceA to a) (SequenceA to e) = SequenceA to (PowType a e)- pow = binaryOp "^" pow powGetInitQ1Q2--powGetInitQ1Q2 ::- (QAArrow to- , HasNorm (EnsureNoCN b), CanEnsureCN b, HasIntegerBounds e)- =>- Maybe (QAId to) -> SequenceA to b -> SequenceA to e ->- AccuracySG `to` ((AccuracySG, Maybe b), (AccuracySG, Maybe e))-powGetInitQ1Q2 me base e =- proc q ->- do- baseB <- seqWithAccuracy base me -< q- eB <- seqWithAccuracy e me -< q- let jInit1 = powGetInitAC1 baseB eB q- let jInit2 = powGetInitAC2 baseB eB q- returnA -< ((jInit1, Just baseB), (jInit2, Just eB))--powGetInitAC1 ::- (HasNorm (EnsureNoCN base), CanEnsureCN base, HasIntegerBounds e)- =>- base -> e -> AccuracySG -> AccuracySG-powGetInitAC1 base e acSG =- let eI = snd (integerBounds e) + 1 in- case ensureNoCN base of- (Just baseNoCN, _) ->- case getNormLog baseNoCN of- NormBits baseNL -> acSG + (baseNL * (eI - 1))- NormZero -> acSG0 -- base == 0, the query does not matter- _ -> acSG0--powGetInitAC2 ::- (HasNorm (EnsureNoCN base), CanEnsureCN base, HasIntegerBounds e)- =>- base -> e -> AccuracySG -> AccuracySG-powGetInitAC2 base e acSG =- let eI = snd (integerBounds e) + 1 in- case ensureNoCN base of- (Just baseNoCN, _) ->- case getNormLog baseNoCN of- NormBits baseNL -> acSG + baseNL * eI- NormZero -> acSG0 -- base == 0, the query does not matter- _ -> acSG0---powGetInitQ1T ::- (QAArrow to, HasNorm (EnsureNoCN base), CanEnsureCN base, HasIntegerBounds e)- =>- (Maybe (QAId to)) -> SequenceA to base -> e -> AccuracySG `to` (AccuracySG, Maybe base)-powGetInitQ1T me baseSeq e =- proc q ->- do- base <- seqWithAccuracy baseSeq me -< q- returnA -< (powGetInitAC1 base e q, Just base)--powGetInitQ2T ::- (QAArrow to, HasNorm (EnsureNoCN base), CanEnsureCN base, HasIntegerBounds e)- =>- (Maybe (QAId to)) -> base -> SequenceA to e -> AccuracySG `to` (AccuracySG, Maybe e)-powGetInitQ2T me base eSeq =- proc q ->- do- e <- seqWithAccuracy eSeq me -< q- returnA -< (powGetInitAC1 base e q, Just e)--instance- (CanPow a MPBall, SuitableForSeq a- , HasNorm (EnsureNoCN a), CanEnsureCN a- , CanSetPrecision (PowTypeNoCN a MPBall)- , CanSetPrecision (PowType a MPBall))- =>- CanPow (Sequence a) MPBall- where- type PowTypeNoCN (Sequence a) MPBall = PowTypeNoCN a MPBall- powNoCN base e = binaryWithEnclTranslateAC powGetInitAC1 powNoCN base e- type PowType (Sequence a) MPBall = PowType a MPBall- pow base e = binaryWithEnclTranslateAC powGetInitAC1 pow base e--instance- (CanPow MPBall e, SuitableForSeq e- , HasIntegerBounds e- , CanSetPrecision (PowTypeNoCN MPBall e)- , CanSetPrecision (PowType MPBall e))- =>- CanPow MPBall (Sequence e)- where- type PowTypeNoCN MPBall (Sequence e) = PowTypeNoCN MPBall e- powNoCN =- flip (binaryWithEnclTranslateAC (flip powGetInitAC2) (flip powNoCN))- type PowType MPBall (Sequence e) = PowType MPBall e- pow =- flip (binaryWithEnclTranslateAC (flip powGetInitAC2) (flip pow))--instance- (CanPow (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (PowTypeNoCN (SequenceA to a) b)- , CanEnsureCE es (PowType (SequenceA to a) b)- , SuitableForCE es)- =>- CanPow (SequenceA to a) (CollectErrors es b)- where- type PowTypeNoCN (SequenceA to a) (CollectErrors es b) =- EnsureCE es (PowTypeNoCN (SequenceA to a) b)- powNoCN = lift2TLCE powNoCN- type PowType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (PowType (SequenceA to a) b)- pow = lift2TLCE pow--instance- (CanPow a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (PowType a (SequenceA to b))- , CanEnsureCE es (PowTypeNoCN a (SequenceA to b))- , SuitableForCE es)- =>- CanPow (CollectErrors es a) (SequenceA to b)- where- type PowTypeNoCN (CollectErrors es a) (SequenceA to b) =- EnsureCE es (PowTypeNoCN a (SequenceA to b))- powNoCN = lift2TCE powNoCN- type PowType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (PowType a (SequenceA to b))- pow = lift2TCE pow--$(declForTypes- [[t| Integer |], [t| Int |], [t| Dyadic |], [t| Rational |]]- (\ t -> [d|-- instance- (QAArrow to, CanPow a $t- , CanSetPrecision a- , CanEnsureCN a, HasNorm (EnsureNoCN a)- , SuitableForSeq a- , SuitableForSeq (PowTypeNoCN a $t)- , SuitableForSeq (PowType a $t))- =>- CanPow (SequenceA to a) $t where- type PowTypeNoCN (SequenceA to a) $t = SequenceA to (PowTypeNoCN a $t)- powNoCN = binaryOpWithPureArg "^" powNoCN powGetInitQ1T- type PowType (SequenceA to a) $t = SequenceA to (PowType a $t)- pow = binaryOpWithPureArg "^" pow powGetInitQ1T-- instance- (QAArrow to, CanPow $t a- , CanSetPrecision a- , HasIntegerBounds a- , SuitableForSeq a- , SuitableForSeq (PowType $t a)- , SuitableForSeq (PowTypeNoCN $t a))- =>- CanPow $t (SequenceA to a) where- type PowTypeNoCN $t (SequenceA to a) = SequenceA to (PowTypeNoCN $t a)- powNoCN = flip $ binaryOpWithPureArg "^" (flip powNoCN) (\me -> flip (powGetInitQ2T me))- type PowType $t (SequenceA to a) = SequenceA to (PowType $t a)- pow = flip $ binaryOpWithPureArg "^" (flip pow) (\me -> flip (powGetInitQ2T me))-- |]))--{- sqrt -}--instance- (QAArrow to, CanSqrt a- , CanMinMaxThis a Integer- , CanEnsureCN (SqrtType a), HasNorm (EnsureNoCN (SqrtType a))- , SuitableForSeq a, SuitableForSeq (SqrtType a))- =>- CanSqrt (SequenceA to a)- where- type SqrtType (SequenceA to a) = SequenceA to (SqrtType a)- sqrt = unaryOp "sqrt" sqrt sqrtGetInitQ1- where- sqrtGetInitQ1 me a1 =- proc q ->- do- (m_a1NormLog, b) <- getSeqFnNormLog me a1 sqrtSafe -< q- let jInit = case m_a1NormLog of- Just sqrtNormLog- | sqrtNormLog < 0 -> max acSG0 (q - 1 - 2*sqrtNormLog) -- nearer 0- | otherwise -> max acSG0 (q - 1 - sqrtNormLog)- _ -> acSG0- returnA -< (jInit, Just b)- sqrtSafe x =- sqrt (max 0 x)--{- sine, cosine -}--instance- (QAArrow to, CanSinCos a- , CanEnsureCN (SinCosType a), HasNorm (EnsureNoCN (SinCosType a))- , SuitableForSeq a, SuitableForSeq (SinCosType a))- =>- CanSinCos (SequenceA to a)- where- type SinCosType (SequenceA to a) = SequenceA to (SinCosType a)- cos = unaryOp "cos" cos cosGetInitQ1- where- cosGetInitQ1 me a1 =- proc q ->- do- (m_a1NormLog, b) <- getSeqFnNormLog me a1 sin -< q- let jInit = case m_a1NormLog of- Just sinNormLog -> q + sinNormLog- _ -> acSG0 -- this should never happen- returnA -< (jInit, Just b)- sin = unaryOp "sin" sin sinGetInitQ1- where- sinGetInitQ1 me a1 =- proc q ->- do- (m_a1NormLog, b) <- getSeqFnNormLog me a1 cos -< q- let jInit = case m_a1NormLog of- Just cosNormLog -> q + cosNormLog- _ -> acSG0 -- this should never happen- returnA -< (jInit, Just b)
− src/AERN2/Sequence/Field.hs
@@ -1,197 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.Sequence.Field- Description : field operations on sequences- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Field operations on convergent sequences.--}-module AERN2.Sequence.Field-(-)-where--import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow--import Control.CollectErrors--import AERN2.MP.Ball-import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence.Type-import AERN2.Sequence.Helpers-import AERN2.Sequence.Ring (mulGetInitAC)--{- division -}--instance- (QAArrow to, CanDiv a b, HasNorm (EnsureNoCN a), HasNorm (EnsureNoCN b)- , SuitableForSeq a, SuitableForSeq b- , SuitableForSeq (DivType a b), SuitableForSeq (DivTypeNoCN a b))- =>- CanDiv (SequenceA to a) (SequenceA to b)- where- type DivType (SequenceA to a) (SequenceA to b) = SequenceA to (DivType a b)- divide = binaryOp "/" divide divGetInitQ1Q2- type DivTypeNoCN (SequenceA to a) (SequenceA to b) = SequenceA to (DivTypeNoCN a b)- divideNoCN = binaryOp "/" divideNoCN divGetInitQ1Q2--divGetInitQ1Q2 ::- (QAArrow to- , HasNorm (EnsureNoCN a), HasNorm (EnsureNoCN b)- , SuitableForSeq a, SuitableForSeq b)- =>- Maybe (QAId to) -> SequenceA to a -> SequenceA to b -> AccuracySG `to` ((AccuracySG, Maybe a), (AccuracySG, Maybe b))-divGetInitQ1Q2 me a1 a2 =- proc q ->- do- -- In a Fractional instance, optimising 3/x and not optimising x/3 etc.- -- In a Fractional instance, x/3 should be replaced by (1/3)*x etc.- b1 <- seqWithAccuracy a1 me -< q- let jPre2 = mulGetInitAC b1 q- b2 <- seqWithAccuracy a2 me -< jPre2- let jInit1 = divGetInitAC1 b2 q- let jInit2 = divGetInitAC2 b1 b2 q- returnA -< ((jInit1, Just b1), (jInit2, Just b2))--divGetInitAC1 ::- (HasNorm (EnsureNoCN denom), CanEnsureCN denom)- =>- denom -> AccuracySG -> AccuracySG-divGetInitAC1 denom acSG =- case ensureNoCN denom of- (Just denomNoCN, _) ->- case getNormLog denomNoCN of- NormBits denomNL -> max acSG0 (acSG - denomNL)- NormZero -> acSG0 -- denominator == 0, we have no chance...- _ -> acSG0--divGetInitAC2 ::- (HasNorm (EnsureNoCN numer), CanEnsureCN numer- , HasNorm (EnsureNoCN denom), CanEnsureCN denom)- =>- numer -> denom -> AccuracySG -> AccuracySG-divGetInitAC2 numer denom acSG =- case (ensureNoCN numer, ensureNoCN denom) of- ((Just numerNoCN, _), (Just denomNoCN, _)) ->- case (getNormLog numerNoCN, getNormLog denomNoCN) of- (_, NormZero) -> acSG0 -- denominator == 0, we have no chance...- (NormZero, _) -> acSG0 -- numerator == 0, it does not matter- (NormBits numerNL, NormBits denomNL) -> max acSG0 (acSG + numerNL - 2 * denomNL)- _ -> acSG0---instance- (CanDiv a MPBall, SuitableForSeq a- , CanSetPrecision (DivType a MPBall), CanSetPrecision (DivTypeNoCN a MPBall))- =>- CanDiv (Sequence a) MPBall- where- type DivType (Sequence a) MPBall = DivType a MPBall- divide = binaryWithEnclTranslateAC (\ _ -> divGetInitAC1) divide- type DivTypeNoCN (Sequence a) MPBall = DivTypeNoCN a MPBall- divideNoCN = binaryWithEnclTranslateAC (\ _ -> divGetInitAC1) divideNoCN--instance- (CanDiv MPBall b, SuitableForSeq b- , HasNorm (EnsureNoCN b), CanEnsureCN b- , CanSetPrecision (DivType MPBall b)- , CanSetPrecision (DivTypeNoCN MPBall b))- =>- CanDiv MPBall (Sequence b)- where- type DivType MPBall (Sequence b) = DivType MPBall b- divide = flip (binaryWithEnclTranslateAC (flip divGetInitAC2) (flip divide))- type DivTypeNoCN MPBall (Sequence b) = DivTypeNoCN MPBall b- divideNoCN = flip (binaryWithEnclTranslateAC (flip divGetInitAC2) (flip divideNoCN))--instance- (CanDiv (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (DivType (SequenceA to a) b)- , CanEnsureCE es (DivTypeNoCN (SequenceA to a) b)- , SuitableForCE es)- =>- CanDiv (SequenceA to a) (CollectErrors es b)- where- type DivType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (DivType (SequenceA to a) b)- divide = lift2TLCE divide- type DivTypeNoCN (SequenceA to a) (CollectErrors es b) =- EnsureCE es (DivTypeNoCN (SequenceA to a) b)- divideNoCN = lift2TLCE divideNoCN--instance- (CanDiv a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (DivType a (SequenceA to b))- , CanEnsureCE es (DivTypeNoCN a (SequenceA to b))- , SuitableForCE es)- =>- CanDiv (CollectErrors es a) (SequenceA to b)- where- type DivType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (DivType a (SequenceA to b))- divide = lift2TCE divide- type DivTypeNoCN (CollectErrors es a) (SequenceA to b) =- EnsureCE es (DivTypeNoCN a (SequenceA to b))- divideNoCN = lift2TCE divideNoCN--divGetInitQ1T ::- (Arrow to, HasNorm (EnsureNoCN denom), CanEnsureCN denom)- =>- Maybe (QAId to) -> SequenceA to numer -> denom -> AccuracySG `to` (AccuracySG, Maybe numer)-divGetInitQ1T _me _numerSeq denom =- arr $ \q -> (divGetInitAC1 denom q, Nothing)--divGetInitQ2T ::- (QAArrow to- , HasNorm (EnsureNoCN numer), CanEnsureCN numer- , HasNorm (EnsureNoCN denom), CanEnsureCN denom)- =>- Maybe (QAId to) -> numer -> SequenceA to denom -> AccuracySG `to` (AccuracySG, Maybe denom)-divGetInitQ2T me numer denomSeq =- proc q ->- do- denom <- seqWithAccuracy denomSeq me -< q- returnA -< (divGetInitAC2 numer denom q, Just denom)--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanDiv a $t, SuitableForSeq a- , SuitableForSeq (DivType a $t), SuitableForSeq (DivTypeNoCN a $t))- =>- CanDiv (SequenceA to a) $t- where- type DivType (SequenceA to a) $t = SequenceA to (DivType a $t)- divide = binaryOpWithPureArg "/" divide divGetInitQ1T- type DivTypeNoCN (SequenceA to a) $t = SequenceA to (DivTypeNoCN a $t)- divideNoCN = binaryOpWithPureArg "/" divideNoCN divGetInitQ1T-- instance- (QAArrow to, CanDiv $t b, SuitableForSeq b- , SuitableForSeq (DivType $t b)- , SuitableForSeq (DivTypeNoCN $t b)- , HasNorm (EnsureNoCN b))- =>- CanDiv $t (SequenceA to b)- where- type DivType $t (SequenceA to b) = SequenceA to (DivType $t b)- divide = flip $ binaryOpWithPureArg "/" (flip divide) (\ me -> flip (divGetInitQ2T me))- type DivTypeNoCN $t (SequenceA to b) = SequenceA to (DivTypeNoCN $t b)- divideNoCN = flip $ binaryOpWithPureArg "/" (flip divideNoCN) (\ me -> flip (divGetInitQ2T me))-- |]))
− src/AERN2/Sequence/Helpers.hs
@@ -1,246 +0,0 @@-{-# LANGUAGE CPP #-}--- #define DEBUG-{-|- Module : AERN2.Sequence.Helpers- Description : helper functions for sequence operations- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Helper functions for sequence operations.--}-module AERN2.Sequence.Helpers-(- -- Operations returning Seq- unaryOp, binaryOp, binaryOpWithPureArg- -- Construction of initial queries- , getInitQ1FromSimple, getInitQ1TFromSimple, getInitQ1Q2FromSimple- -- Operations returning an enclosure (eg MPBall)- , binaryWithEncl, binaryWithEnclTranslateAC- , seqElementSimilarToEncl- -- misc- ,getSeqFnNormLog- ,ensureAccuracyA-)-where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#define maybeTraceIO putStrLn-#else-#define maybeTrace (\ (_ :: String) t -> t)-#define maybeTraceIO (\ (_ :: String) -> return ())-#endif--import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow--import AERN2.MP--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence.Type--{- generic implementations of operations of different arity -}--unaryOp ::- (QAArrow to, SuitableForSeq a, SuitableForSeq b)- =>- String ->- (a -> b) ->- (Maybe (QAId to) {- my id -} -> SequenceA to a -> (AccuracySG `to` (AccuracySG, Maybe a))) ->- SequenceA to a -> SequenceA to b-unaryOp name op getInitQ1 r1 =- newSeq (op sampleA1) name [AnyProtocolQA r1] makeQ- where- SequenceP sampleA1 = qaProtocol r1- makeQ (me, _src) =- proc ac ->- do- (q1Init, mb1) <- getInitQ1 me r1 -< ac- ensureAccuracyA (proc [q1] -> (r1 ?<- me) -< q1) op -< (ac, ([q1Init], mb1))--binaryOpWithPureArg ::- (QAArrow to, SuitableForSeq a, SuitableForSeq b)- =>- String ->- (a -> t -> b) ->- (Maybe (QAId to) {- my id -} -> SequenceA to a -> t -> (AccuracySG `to` (AccuracySG, Maybe a))) ->- SequenceA to a -> t -> SequenceA to b-binaryOpWithPureArg name op getInitQ1T r1 t =- newSeq (op sampleA t) name [AnyProtocolQA r1] makeQ- where- SequenceP sampleA = qaProtocol r1- makeQ (me, _src) =- proc ac ->- do- (q1Init, mb1) <- getInitQ1T me r1 t -< ac- ensureAccuracyA (proc [q1] -> (r1 ?<- me) -< q1) (flip op t) -< (ac, ([q1Init], mb1))--binaryOp ::- (QAArrow to, SuitableForSeq a, SuitableForSeq b, SuitableForSeq c)- =>- String ->- (a -> b -> c) ->- (Maybe (QAId to) {- my id -} -> SequenceA to a -> SequenceA to b ->- (AccuracySG `to` ((AccuracySG, Maybe a), (AccuracySG, Maybe b)))) ->- SequenceA to a -> SequenceA to b -> SequenceA to c-binaryOp name op getInitQ1Q2 r1 r2 =- newSeq (op sampleA sampleB) name [AnyProtocolQA r1, AnyProtocolQA r2] makeQ- where- SequenceP sampleA = qaProtocol r1- SequenceP sampleB = qaProtocol r2- makeQ (me,_src) =- proc ac ->- do- ((q1Init, mb1), (q2Init, mb2)) <- getInitQ1Q2 me r1 r2 -< ac- ensureAccuracyA- (proc [q1,q2] -> ((r1,r2) ??<- me) -< (q1,q2))- (uncurry op)- -< (ac, ([q1Init, q2Init], do {b1<-mb1;b2<-mb2;Just (b1,b2)}))--{- functions to help determine initial queries -}--getInitQ1FromSimple ::- (Arrow to)- =>- AccuracySG `to` q ->- Maybe (QAId to) {-^ my id -} -> r1 -> AccuracySG `to` (q, Maybe a)-getInitQ1FromSimple simpleA _ _ =- proc q ->- do- initQ1 <- simpleA -< q- returnA -< (initQ1, Nothing)--getInitQ1TFromSimple ::- (Arrow to)- =>- AccuracySG `to` q ->- Maybe (QAId to) {-^ my id -} -> r1 -> t -> AccuracySG `to` (q, Maybe a)-getInitQ1TFromSimple simpleA _ _ _ =- proc q ->- do- initQ1 <- simpleA -< q- returnA -< (initQ1, Nothing)--getInitQ1Q2FromSimple ::- (Arrow to)- =>- AccuracySG `to` (q,q) ->- Maybe (QAId to) {-^ my id -} -> r1 -> r2 -> AccuracySG `to` ((q, Maybe a), (q, Maybe b))-getInitQ1Q2FromSimple simpleA _ _ _ =- proc q ->- do- (initQ1, initQ2) <- simpleA -< q- returnA -< ((initQ1, Nothing), (initQ2, Nothing))--{-- functions for iterative querying of operands- until the result is of a sufficient accuracy--}--ensureAccuracyA ::- (ArrowChoice to, Show a, Show b- , HasAccuracy b- , CanEnsureCN b, HasAccuracy (EnsureNoCN b), Show (EnsureNoCN b))- =>- ([AccuracySG] `to` a) ->- (a -> b) ->- ((AccuracySG, ([AccuracySG], Maybe a)) `to` b)-ensureAccuracyA getA op =- proc (q,(js, aPrelim)) ->- case fmap op aPrelim of- Just resultPrelim | getAccuracy resultPrelim >= q ->- returnA -<- maybeTrace (- "ensureAccuracyA: Pre-computed result sufficient. (q = " ++ show q ++- "; js = " ++ show js ++- "; result accuracy = " ++ (show $ getAccuracy resultPrelim) ++ ")"- ) $- resultPrelim- _ ->- aux -< (q,js)- where- aux =- proc (q,js) ->- do- a <- getA -< js- let result =- -- maybeTrace ("op a = " ++ show (op a)) $- -- maybeTrace ("ac (op a) = " ++ show (getAccuracy (op a))) $- op a- case ensureNoCN result of- (Just _resultNoCN, es) | not (hasCertainError es) ->- if getAccuracy result >= _acStrict q- then- returnA -<- maybeTrace (- "ensureAccuracyA: Succeeded. (q = " ++ show q ++- "; js = " ++ show js ++- "; result accuracy = " ++ (show $ getAccuracy result) ++ ")"- ) $- result- else- aux -<- maybeTrace (- "ensureAccuracyA: Not enough ... (q = " ++ show q ++- "; js = " ++ show js ++- "; a = " ++ show a ++- "; result = " ++ show result ++- "; result accuracy = " ++ (show $ getAccuracy result) ++ ")"- ) $- (q, map (+1) js)- _ -> returnA -< result -- certain error, give up improving---{- MPBall + CauchyReal = MPBall, only allowed in the (->) arrow -}--binaryWithEncl ::- (HasAccuracy b, HasPrecision b, CanSetPrecision t)- =>- (a -> b -> t) -> Sequence a -> b -> t-binaryWithEncl = binaryWithEnclTranslateAC (\ _ _ -> id)--binaryWithEnclTranslateAC ::- (HasAccuracy b, HasPrecision b, CanSetPrecision t)- =>- (a -> b -> AccuracySG -> AccuracySG) ->- (a -> b -> t) -> Sequence a -> b -> t-binaryWithEnclTranslateAC accuracyTranslationForB op sa b =- lowerPrecisionIfAbove (getPrecision b) $- op (seqElementSimilarToEncl (flip accuracyTranslationForB b) b sa) b--seqElementSimilarToEncl ::- (HasAccuracy b, HasPrecision b) =>- (a -> AccuracySG -> AccuracySG) ->- b -> Sequence a -> a-seqElementSimilarToEncl accuracyTranslation b sa =- sa ? (accuracyTranslation a $ accuracySG $ getFiniteAccuracy b)- where- a = sa ? acSG0--{- miscellaneous -}--getSeqFnNormLog ::- (QAArrow to, CanEnsureCN v, HasNorm (EnsureNoCN v))- =>- Maybe (QAId to) -> SequenceA to a -> (a -> v) -> AccuracySG `to` (Maybe Integer, a)-getSeqFnNormLog src a f =- proc q ->- do- aq <- seqWithAccuracy a src -< q- returnA -< (aux aq, aq)- where- aux aq =- case ensureNoCN (f aq) of- (Just faqNoCN, es) | not (hasCertainError es) ->- case getNormLog faqNoCN of- NormBits faqNL -> Just faqNL- NormZero -> Nothing- _ -> Nothing
− src/AERN2/Sequence/PreludeOps.hs
@@ -1,95 +0,0 @@-{-# LANGUAGE CPP #-}-{-|- Module : AERN2.Sequence.PreludeOps- Description : Instances of Prelude.Num etc- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Instances of Prelude classes Eq, Ord, Num etc--}-module AERN2.Sequence.PreludeOps-(-)-where--import MixedTypesNumPrelude-import qualified Prelude as P--import AERN2.Norm--import AERN2.MP.Precision-import AERN2.MP.Enclosure-import AERN2.MP.Dyadic--import AERN2.QA.Protocol--import AERN2.AccuracySG-import AERN2.Sequence.Type-import AERN2.Sequence.Comparison ()-import AERN2.Sequence.Ring ()-import AERN2.Sequence.Field ()-import AERN2.Sequence.Elementary ()--{- Instances of Prelude numerical classes provided for convenient use outside AERN2- and also because Template Haskell translates (-x) to (Prelude.negate x) -}--instance- (HasEqCertainly a a)- =>- P.Eq (Sequence a)- where- a == b- | aD !==! bD = True- | aD !/=! bD = False- | otherwise =- error "Failed to decide equality of Sequences. If you switch to MixedTypesNumPrelude instead of Prelude, comparison of Sequences returns Sequence (Maybe Bool) or similar instead of Bool."- where- aD = a ? default_acSG- bD = b ? default_acSG--instance- (HasEqCertainly a a, HasOrderCertainly a a)- =>- P.Ord (Sequence a)- where- compare a b- | aD !==! bD = P.EQ- | aD !<! bD = P.LT- | aD !>! bD = P.GT- | otherwise =- error "Failed to decide order of Sequences. If you switch to MixedTypesNumPrelude instead of Prelude, comparison of Sequences returns Sequence (Maybe Bool) or similar instead of Bool."- where- aD = a ? default_acSG- bD = b ? default_acSG--instance- (Ring a, CanAbsSameType a- , SuitableForSeq a, CanSetPrecision a, HasNorm (EnsureNoCN a), CanEnsureCN a)- =>- P.Num (Sequence a)- where- fromInteger = convertExactly- negate = negate- (+) = (+)- (*) = (*)- abs = abs- signum = error "Prelude.signum not implemented for Sequence"--instance- (Field a, CanAbsSameType a, ConvertibleWithPrecision Rational a- , SuitableForSeq a, SuitableForSeq (EnsureCN a), CanSetPrecision a- , HasNorm (EnsureNoCN a), CanEnsureCN a- , CanIntersectCNSameType a)- =>- P.Fractional (Sequence a)- where- fromRational = convertExactly- recip a =- case deEnsureCN (recip a) of- Right r -> r- Left es -> error $ show es- (/) = (/!)
− src/AERN2/Sequence/Ring.hs
@@ -1,289 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.Sequence.Ring- Description : ring operations on sequences- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Ring operations on convergent sequences--}-module AERN2.Sequence.Ring-(- mulGetInitAC-)-where--import MixedTypesNumPrelude hiding (id)--- import qualified Prelude as P--import Control.Category (id)-import Control.Arrow--import Control.CollectErrors--import AERN2.MP.Ball-import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.AccuracySG-import AERN2.Sequence.Type-import AERN2.Sequence.Helpers--{- addition -}--instance- (QAArrow to, CanAddAsymmetric a b, SuitableForSeq a, SuitableForSeq b, SuitableForSeq (AddType a b))- =>- CanAddAsymmetric (SequenceA to a) (SequenceA to b)- where- type AddType (SequenceA to a) (SequenceA to b) = SequenceA to (AddType a b)- add = binaryOp "+" add (getInitQ1Q2FromSimple $ proc q -> returnA -< (q,q))--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanAddAsymmetric a $t, SuitableForSeq a, SuitableForSeq (AddType a $t))- =>- CanAddAsymmetric (SequenceA to a) $t- where- type AddType (SequenceA to a) $t = SequenceA to (AddType a $t)- add = binaryOpWithPureArg "+" add (getInitQ1TFromSimple id)-- instance- (QAArrow to, CanAddAsymmetric $t b, SuitableForSeq b, SuitableForSeq (AddType $t b))- =>- CanAddAsymmetric $t (SequenceA to b)- where- type AddType $t (SequenceA to b) = SequenceA to (AddType $t b)- add = flip $ binaryOpWithPureArg "+" (flip add) (getInitQ1TFromSimple id)-- |]))--instance- (CanAddAsymmetric a MPBall, SuitableForSeq a- , CanSetPrecision (AddType a MPBall))- =>- CanAddAsymmetric (Sequence a) MPBall- where- type AddType (Sequence a) MPBall = AddType a MPBall- add = binaryWithEncl add--instance- (CanAddAsymmetric MPBall b, SuitableForSeq b- , CanSetPrecision (AddType MPBall b))- =>- CanAddAsymmetric MPBall (Sequence b)- where- type AddType MPBall (Sequence b) = AddType MPBall b- add = flip $ binaryWithEncl (flip add)--instance- (CanAddAsymmetric (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (AddType (SequenceA to a) b)- , SuitableForCE es)- =>- CanAddAsymmetric (SequenceA to a) (CollectErrors es b)- where- type AddType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (AddType (SequenceA to a) b)- add = lift2TLCE add--instance- (CanAddAsymmetric a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (AddType a (SequenceA to b))- , SuitableForCE es)- =>- CanAddAsymmetric (CollectErrors es a) (SequenceA to b)- where- type AddType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (AddType a (SequenceA to b))- add = lift2TCE add---{- subtraction -}--instance- (QAArrow to, CanSub a b, SuitableForSeq a, SuitableForSeq b, SuitableForSeq (SubType a b))- =>- CanSub (SequenceA to a) (SequenceA to b)- where- type SubType (SequenceA to a) (SequenceA to b) = SequenceA to (SubType a b)- sub = binaryOp "-" sub (getInitQ1Q2FromSimple $ proc q -> returnA -< (q,q))---$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanSub a $t, SuitableForSeq a, SuitableForSeq (SubType a $t))- =>- CanSub (SequenceA to a) $t- where- type SubType (SequenceA to a) $t = SequenceA to (SubType a $t)- sub = binaryOpWithPureArg "-" sub (getInitQ1TFromSimple id)-- instance- (QAArrow to, CanSub $t b, SuitableForSeq b, SuitableForSeq (SubType $t b))- =>- CanSub $t (SequenceA to b)- where- type SubType $t (SequenceA to b) = SequenceA to (SubType $t b)- sub = flip $ binaryOpWithPureArg "-" (flip sub) (getInitQ1TFromSimple id)-- |]))--instance- (CanSub a MPBall, SuitableForSeq a, CanSetPrecision (SubType a MPBall))- =>- CanSub (Sequence a) MPBall- where- type SubType (Sequence a) MPBall = SubType a MPBall- sub = binaryWithEncl sub--instance- (CanSub MPBall b, SuitableForSeq b, CanSetPrecision (SubType MPBall b))- =>- CanSub MPBall (Sequence b)- where- type SubType MPBall (Sequence b) = SubType MPBall b- sub = flip $ binaryWithEncl (flip sub)--instance- (CanSub (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (SubType (SequenceA to a) b)- , SuitableForCE es)- =>- CanSub (SequenceA to a) (CollectErrors es b)- where- type SubType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (SubType (SequenceA to a) b)- sub = lift2TLCE sub--instance- (CanSub a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (SubType a (SequenceA to b))- , SuitableForCE es)- =>- CanSub (CollectErrors es a) (SequenceA to b)- where- type SubType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (SubType a (SequenceA to b))- sub = lift2TCE sub---{- multiplication -}--instance- (QAArrow to, CanMulAsymmetric a b, HasNorm (EnsureNoCN a), HasNorm (EnsureNoCN b)- , SuitableForSeq a, SuitableForSeq b, SuitableForSeq (MulType a b))- =>- CanMulAsymmetric (SequenceA to a) (SequenceA to b)- where- type MulType (SequenceA to a) (SequenceA to b) = SequenceA to (MulType a b)- mul =- binaryOp "*" mul getInitQ1Q2- where- getInitQ1Q2 me a1 a2 =- proc q ->- do- b1 <- seqWithAccuracy a1 me -< q- let jInit2 = mulGetInitAC b1 q- -- favouring 2*x over x*2 in a Num instance- b2 <- seqWithAccuracy a2 me -< jInit2- let jInit1 = mulGetInitAC b2 q- returnA -< ((jInit1, Just b1), (jInit2, Just b2))--mulGetInitAC ::- (HasNorm (EnsureNoCN other), CanEnsureCN other)- =>- other -> AccuracySG -> AccuracySG-mulGetInitAC other acSG =- case ensureNoCN other of- (Just otherNoCN, _) ->- case getNormLog otherNoCN of- NormBits otherNL -> max acSG0 (acSG + otherNL)- NormZero -> acSG0- _ -> acSG--instance- (CanMulAsymmetric a MPBall, SuitableForSeq a- , CanSetPrecision (MulType a MPBall))- =>- CanMulAsymmetric (Sequence a) MPBall- where- type MulType (Sequence a) MPBall = MulType a MPBall- mul = binaryWithEnclTranslateAC (\_ -> mulGetInitAC) mul--instance- (CanMulAsymmetric MPBall b, SuitableForSeq b- , CanSetPrecision (MulType MPBall b))- =>- CanMulAsymmetric MPBall (Sequence b)- where- type MulType MPBall (Sequence b) = MulType MPBall b- mul = flip $ binaryWithEnclTranslateAC (\ _ -> mulGetInitAC) (flip mul)--instance- (CanMulAsymmetric (SequenceA to a) b- , CanEnsureCE es b- , CanEnsureCE es (MulType (SequenceA to a) b)- , SuitableForCE es)- =>- CanMulAsymmetric (SequenceA to a) (CollectErrors es b)- where- type MulType (SequenceA to a) (CollectErrors es b) =- EnsureCE es (MulType (SequenceA to a) b)- mul = lift2TLCE mul--instance- (CanMulAsymmetric a (SequenceA to b)- , CanEnsureCE es a- , CanEnsureCE es (MulType a (SequenceA to b))- , SuitableForCE es)- =>- CanMulAsymmetric (CollectErrors es a) (SequenceA to b)- where- type MulType (CollectErrors es a) (SequenceA to b) =- EnsureCE es (MulType a (SequenceA to b))- mul = lift2TCE mul---mulGetInitQ1T ::- (Arrow to, HasNorm (EnsureNoCN other), CanEnsureCN other)- =>- Maybe (QAId to) {-^ my id -} -> SequenceA to t -> other -> AccuracySG `to` (AccuracySG, Maybe t)-mulGetInitQ1T _me _seq other =- arr $ \q -> (mulGetInitAC other q, Nothing)--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanMulAsymmetric a $t, SuitableForSeq a, SuitableForSeq (MulType a $t))- =>- CanMulAsymmetric (SequenceA to a) $t- where- type MulType (SequenceA to a) $t = SequenceA to (MulType a $t)- mul = binaryOpWithPureArg "*" mul mulGetInitQ1T-- instance- (QAArrow to, CanMulAsymmetric $t b, SuitableForSeq b, SuitableForSeq (MulType $t b))- =>- CanMulAsymmetric $t (SequenceA to b)- where- type MulType $t (SequenceA to b) = SequenceA to (MulType $t b)- mul = flip $ binaryOpWithPureArg "*" (flip mul) mulGetInitQ1T-- |]))
− src/AERN2/Sequence/Type.hs
@@ -1,265 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE TemplateHaskell #-}--- #define DEBUG-{-|- Module : AERN2.Sequence.Type- Description : The type of fast convergent sequences- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- The type of fast convergent sequences--}-module AERN2.Sequence.Type-(- SequenceP(..), pSeq- , FastConvSeqP, EffortConvSeqP- , SuitableForSeq- , seqName, seqId, seqSources, seqRename- , seqWithAccuracy, seqWithAccuracyA, seqsWithAccuracyA- , SequenceA, Sequence- , FastConvSeqA, EffortConvSeqA, FastConvSeq, EffortConvSeq- , newSeq, newSeqSimple- , convergentList2SequenceA- , seqByPrecision2SequenceA- , fmapSeq-)-where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#define maybeTraceIO putStrLn-#else-#define maybeTrace (\ (_ :: String) t -> t)-#define maybeTraceIO (\ (_ :: String) -> return ())-#endif--import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow--import Text.Printf--import Control.CollectErrors--import AERN2.MP-import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.QA.Strategy.CachedUnsafe ()--import AERN2.AccuracySG--{- QA protocol -}--data SequenceP a = SequenceP { unSequenceP :: a} deriving (Show)-type FastConvSeqP a = SequenceP a -- synonym, emphasising stric accuracy requirement-type EffortConvSeqP a = SequenceP a -- synonym, emphasising accuracy guide--pSeq :: a -> SequenceP a-pSeq a = SequenceP a--instance (Show a) => QAProtocol (SequenceP a) where- type Q (SequenceP a) = AccuracySG- type A (SequenceP a) = a- -- sampleQ _ = AccuracySG NoInformation NoInformation--class- (Show a, Show (EnsureNoCN a), Show (EnsureCN a), HasAccuracy a, CanAdjustToAccuracySG a- , CanEnsureCN a, CanEnsureCN (EnsureCN a), HasAccuracy (EnsureNoCN a), CanIntersectCNSameType a)- =>- SuitableForSeq a--instance SuitableForSeq MPBall-instance SuitableForSeq (CN MPBall)-instance SuitableForSeq Bool-instance SuitableForSeq (CN Bool)-instance SuitableForSeq t => SuitableForSeq (Maybe t)--instance- SuitableForSeq a- =>- QAProtocolCacheable (SequenceP a)- where- type QACache (SequenceP a) = (Maybe (a, AccuracySG))- newQACache _ = Nothing- lookupQACache _ cache acSG@(AccuracySG acS acG) =- case cache of- Just (b, AccuracySG _ bAG)- | getAccuracy b >= acS && (getAccuracy b >= acG || bAG >= acG - tol) ->- (Just (adjustToAccuracySG acSG b),- Just (logMsg b))- Just (b, _) -> (Nothing, Just (logMsg b))- Nothing -> (Nothing, Just ("cache empty"))- where- tol = accuracySGdefaultTolerance- logMsg b = printf "query: %s; cache: (ac=%s) %s" (show acSG) (show (getAccuracy b)) (show cache)- updateQACache _ q b Nothing = Just (b,q)- updateQACache _ q2 b2 (Just (b1,q1)) =- Just (b, q1 `max` q2)- where- b12 = b1 `intersect` b2- b =- case deEnsureCN b12 of- Right b' -> b'- Left es ->- error $- printf "Sequence: updateQACache: problem computing intersection: %s /\\ %s: %s"- (show b1) (show b2) (show es)--instance Functor SequenceP where- fmap f (SequenceP a) = SequenceP (f a)--{- Seqeuences -}--type SequenceA to a = QA to (SequenceP a)-type Sequence a = SequenceA (->) a--type FastConvSeqA to a = SequenceA to a -- synonym, emphasising stric accuracy requirement-type EffortConvSeqA to a = SequenceA to a -- synonym, emphasising accuracy guide-type FastConvSeq a = Sequence a -- synonym, emphasising stric accuracy requirement-type EffortConvSeq a = Sequence a -- synonym, emphasising accuracy guide--instance (Show a) => Show (Sequence a) where- show r = show $ r ? default_acSG--fmapSeq ::- (Arrow to) =>- (a -> b) -> (SequenceA to a) -> (SequenceA to b)-fmapSeq f = mapQAsameQ (fmap f) f--seqName :: SequenceA to a -> String-seqName = qaName----seqRename :: (String -> String) -> SequenceA to a -> SequenceA to a-seqRename = qaRename--seqId :: SequenceA to a -> Maybe (QAId to)-seqId = qaId--seqSources :: SequenceA to a -> [QAId to]-seqSources = qaSources--{-| Get an approximation of the limit with at least the specified accuracy.- (A specialisation of 'qaMakeQuery' for Cauchy sequences.) -}-seqWithAccuracy :: (QAArrow to) => SequenceA to a -> Maybe (QAId to) -> AccuracySG `to` a-seqWithAccuracy = (?<-)--seqWithAccuracyA :: (QAArrow to) => (Maybe (QAId to)) -> (SequenceA to a, AccuracySG) `to` a-seqWithAccuracyA = qaMakeQueryA--seqsWithAccuracyA :: (QAArrow to) => (Maybe (QAId to)) -> ([SequenceA to a], AccuracySG) `to` [a]-seqsWithAccuracyA = qaMakeQueryOnManyA--{- constructions -}--newSeq ::- (QAArrow to, SuitableForSeq a)- =>- a -> String -> [AnyProtocolQA to] -> ((Maybe (QAId to), Maybe (QAId to)) -> AccuracySG `to` a) -> SequenceA to a-newSeq sampleA name sources makeQ =- newQA name sources (pSeq sampleA) Nothing makeQ--newSeqSimple ::- (QAArrow to, SuitableForSeq a)- =>- a -> ((Maybe (QAId to), Maybe (QAId to)) -> AccuracySG `to` a) -> SequenceA to a-newSeqSimple sampleA = newSeq sampleA "simple" []--convergentList2SequenceA ::- (QAArrow to, SuitableForSeq a) =>- String -> [a] -> (SequenceA to a)-convergentList2SequenceA name balls@(sampleA : _) =- newSeq sampleA name [] (\_src -> arr $ convergentList2CauchySeq balls . bits)-convergentList2SequenceA name [] =- error $ "convergentList2SequenceA: empty sequence " ++ name--seqByPrecision2SequenceA :: (QAArrow to, SuitableForSeq a) => String -> (Precision -> a) -> (SequenceA to a)-seqByPrecision2SequenceA name byPrec =- newSeq sampleA name [] (\_src -> arr $ seqByPrecision2CauchySeq byPrec . bits)- where- sampleA = byPrec (prec 0)--{- CollectErrors instances -}--instance- (SuitableForCE es, CanEnsureCE es a)- =>- CanEnsureCE es (SequenceP a)- where- type EnsureCE es (SequenceP a) = SequenceP (EnsureCE es a)- type EnsureNoCE es (SequenceP a) = SequenceP (EnsureNoCE es a)-- ensureCE sample_es = fmap (ensureCE sample_es)- deEnsureCE sample_es (SequenceP a) = fmap SequenceP (deEnsureCE sample_es a)- ensureNoCE sample_es (SequenceP a) =- (\(ma,es) -> (fmap SequenceP ma, es)) (ensureNoCE sample_es a)-- noValueECE sample_vCE es = SequenceP (noValueECE (fmap unSequenceP sample_vCE) es)- prependErrorsECE sample_vCE es1 = fmap (prependErrorsECE (fmap unSequenceP sample_vCE) es1)-- -- getMaybeValueECE sample_es (SequenceP a) = fmap SequenceP (getMaybeValueECE sample_es a)- -- getErrorsECE sample_vCE (SequenceP a) = getErrorsECE (fmap unSequenceP sample_vCE) a--instance- (Arrow to, SuitableForCE es, CanEnsureCE es a)- =>- CanEnsureCE es (SequenceA to a)- where- type EnsureCE es (SequenceA to a) = SequenceA to (EnsureCE es a)- type EnsureNoCE es (SequenceA to a) = SequenceA to (EnsureNoCE es a)-- ensureCE sample_es = fmapSeq (ensureCE sample_es)- deEnsureCE sample_es = Right . fmapSeq (removeEither . deEnsureCE sample_es)- where- removeEither (Right a) = a- removeEither (Left es) = error $ "Sequence deEnsureCE: " ++ show es- ensureNoCE sample_es = (\v -> (Just v, mempty)) . fmapSeq (removeES . ensureNoCE sample_es)- where- removeES (Just a, es) | not (hasCertainError es) = a- removeES (_, es) = error $ "WithGlobalParam ensureNoCE: " ++ show es- -- es =-- noValueECE _sample_vCE _es =- error "noValueECE not implemented for Sequence yet"-- prependErrorsECE (_sample_vCE :: Maybe (SequenceA to a)) es1 =- fmapSeq (prependErrorsECE (Nothing :: Maybe a) es1)-- -- getMaybeValueECE sample_es = Just . fmapSeq (removeJust . getMaybeValueECE sample_es)- -- where- -- removeJust (Just a) = a- -- removeJust _ = error "getMaybeValueECE failed for a Sequence"- -- getErrorsECE _sample_mv _s =- -- error "getErrorsECE not implemented for Sequence yet"--instance- (QAArrow to, ConvertibleWithPrecision Rational a, CanSetPrecision a, SuitableForSeq a)- =>- ConvertibleExactly Rational (SequenceA to a)- where- safeConvertExactly x =- Right $ newSeq a (show x) [] (\_src -> arr $ seqByPrecision2CauchySeq (flip convertP x) . bits)- where- a = convertP (prec 2) x--$(declForTypes- [[t| Integer |], [t| Int |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, ConvertibleExactly $t a, CanSetPrecision a, SuitableForSeq a)- =>- ConvertibleExactly $t (SequenceA to a)- where- safeConvertExactly x =- Right $ newSeq a (show x) [] (\_src -> arr $ flip setPrecisionAtLeastAccuracy a . bits)- where- a = convertExactly x-- |]))
− src/AERN2/Utils/Arrows.hs
@@ -1,58 +0,0 @@-{-|- Module : AERN2.Utils.Arrows- Description : Miscellaneous arrow-generic functions- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Miscellaneous arrow-generic functions--}-module AERN2.Utils.Arrows-(- mapA, mapWithIndexA- , CanSwitchArrow(..)-)-where--import MixedTypesNumPrelude--- import qualified Prelude as P--- import Text.Printf--import Control.Arrow--{- Arrow swiching mechanism and application to QA arrow conversion -}--class CanSwitchArrow to1 to2 where- switchArrow :: (a `to1` b) -> (a `to2` b)- -- switchArrow2 :: (a `to1` (b `to1` c)) -> (a `to2` (b `to2` c))--instance (Arrow to) => CanSwitchArrow (->) to where- switchArrow = arr- -- switchArrow2 = arr . (arr .)--{-| Apply an arrow morphism on all elements of a list -}-mapA :: (ArrowChoice to) => (t1 `to` t2) -> ([t1] `to` [t2])-mapA fA =- proc list -> do- case list of- [] -> returnA -< []- (x : xs) -> do- y <- fA -< x- ys <-mapA fA -< xs- returnA -< y : ys--{-| Apply an arrow morphism on all elements of a list -}-mapWithIndexA :: (ArrowChoice to) => (Integer -> t1 `to` t2) -> ([t1] `to` [t2])-mapWithIndexA fA = aux 0- where- aux i =- proc list -> do- case list of- [] -> returnA -< []- (x : xs) -> do- y <- fA i -< x- ys <- aux (i+1) -< xs- returnA -< y : ys
− src/AERN2/WithGlobalParam.hs
@@ -1,40 +0,0 @@-{-|- Module : AERN2.WithGlobalParam- Description : adding a global parameter to a type- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable----}-module AERN2.WithGlobalParam-(- -- * The protocol and type of objects depending on a global parameter- WithGlobalParamP(..), pWGParam- , SuitableForWGParam- , wgprmName, wgprmId, wgprmSources, wgprmRename- , wgprmQuery, (?), wgprmQueryA, wgprmListQueryA- , WithGlobalParamA, WithGlobalParam- , newWGParam, newWGParamSimple- , fmapWGParam- -- * auxiliary functions for making new operations- , unaryOp, binaryOp, binaryOpWithPureArg-)-where---- import MixedTypesNumPrelude--- import qualified Prelude as P---- import Control.Arrow--import AERN2.QA.Protocol-import AERN2.WithGlobalParam.Type-import AERN2.WithGlobalParam.Helpers-import AERN2.WithGlobalParam.Comparison ()-import AERN2.WithGlobalParam.Branching ()-import AERN2.WithGlobalParam.Ring ()-import AERN2.WithGlobalParam.Field ()-import AERN2.WithGlobalParam.Elementary ()
− src/AERN2/WithGlobalParam/Branching.hs
@@ -1,73 +0,0 @@-{-|- Module : AERN2.WithGlobalParam.Branching- Description : branching operations- Copyright : (c) Michal Konecny, Eike Neumann- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Branching operations for WithGlobalParam objects.--}-module AERN2.WithGlobalParam.Branching-(- -- pickNonZeroWGParamA-)-where--import MixedTypesNumPrelude hiding (id)--- import qualified Prelude as P--import Control.Arrow--import AERN2.QA.Protocol-import AERN2.WithGlobalParam.Type--- import AERN2.WithGlobalParam.Comparison ()---- {- non-zero picking -}------ {-|--- Given a list @[(a1,b1),(a2,b2),...]@ and assuming that--- at least one of @a1,a2,...@ is non-zero, pick one of them--- and return the corresponding pair @(ai,bi)@.------ If none of @a1,a2,...@ is zero, either throw an exception--- or loop forever.--- -}--- pickNonZeroWGParamA ::--- (QAArrow to, CanPickNonZero a)--- =>--- Maybe (QAId to) ->--- [(WithGlobalParamA to prm a, s)] `to` Maybe (WithGlobalParamA to prm a, s)--- pickNonZeroWGParamA src =--- proc seqsAndS -> do--- balls <- wgprmQueryA src -< (map fst seqsAndS, prm)--- let maybeNonZero = pickNonZero $ zip balls seqsAndS--- case maybeNonZero of--- Just (_,result) -> returnA -< Just result--- _ -> startFromAccuracy (ac + 1) -< seqsAndS------ instance (CanPickNonZero a) => CanPickNonZero (WithGlobalParam prm a) where--- pickNonZero = pickNonZeroWGParamA Nothing--{-| lifted if-then-else -}-instance- (QAArrow to, HasIfThenElse b t- , SuitableForWGParam prm b, SuitableForWGParam prm t, SuitableForWGParam prm (IfThenElseType b t))- =>- HasIfThenElse (WithGlobalParamA to prm b) (WithGlobalParamA to prm t)- where- type IfThenElseType (WithGlobalParamA to prm b) (WithGlobalParamA to prm t) = (WithGlobalParamA to prm (IfThenElseType b t))- ifThenElse (b::WithGlobalParamA to prm b) (e1::WithGlobalParamA to prm t) e2 =- newWGParam samplePrm sampleT "pif" [AnyProtocolQA b, AnyProtocolQA e1, AnyProtocolQA e2] makeQ- where- sampleT = undefined :: (IfThenElseType b t)- samplePrm = undefined :: Maybe prm- makeQ (me,_src) =- proc prm ->- do- bP <- wgprmQueryA me -< (b, prm)- e1P <- wgprmQueryA me -< (e1, prm)- e2P <- wgprmQueryA me -< (e2, prm)- returnA -< if bP then e1P else e2P
− src/AERN2/WithGlobalParam/Comparison.hs
@@ -1,261 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.WithGlobalParam.Comparison- Description : comparison operations- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Comparison operations on WithGlobalParam objects.--}-module AERN2.WithGlobalParam.Comparison-(-)-where--import MixedTypesNumPrelude hiding (id)--- import qualified Prelude as P---- import Control.Category (id)-import Control.Arrow--import Control.CollectErrors---- import AERN2.MP.Ball-import AERN2.MP.Dyadic--import AERN2.QA.Protocol--import AERN2.WithGlobalParam.Type-import AERN2.WithGlobalParam.Helpers--{- Boolean ops -}--instance (QAArrow to, HasBools b, SuitableForWGParam prm b) => ConvertibleExactly Bool (WithGlobalParamA to prm b) where- safeConvertExactly bool =- do- b <- safeConvertExactly bool- Right $ newWGParam Nothing b (show b) [] $ \_me_src -> arr $ const b--instance- (QAArrow to, CanNeg a, SuitableForWGParam prm a, SuitableForWGParam prm (NegType a))- =>- CanNeg (WithGlobalParamA to prm a)- where- type NegType (WithGlobalParamA to prm a) = WithGlobalParamA to prm (NegType a)- negate = unaryOp "neg" negate--instance- (QAArrow to, CanAndOrAsymmetric a b- , SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm (AndOrType a b))- =>- CanAndOrAsymmetric (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type AndOrType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (AndOrType a b)- and2 = binaryOp "and" and2- or2 = binaryOp "or" or2--{- equality & order -}--instance- (QAArrow to, HasEqAsymmetric a b- , SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm (EqCompareType a b))- =>- HasEqAsymmetric (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type EqCompareType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (EqCompareType a b)- equalTo = binaryOp "==" (==)- notEqualTo = binaryOp "/=" (/=)--instance- (QAArrow to, HasOrderAsymmetric a b- , SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm (OrderCompareType a b))- =>- HasOrderAsymmetric (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type OrderCompareType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (OrderCompareType a b)- lessThan = binaryOp "<" (<)- leq = binaryOp "<=" (<=)- greaterThan = binaryOp ">" (>)- geq = binaryOp ">=" (>=)--{- comparing CollectErrors and WithGlobalParams -}--instance- (HasEqAsymmetric (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (EqCompareType (WithGlobalParamA to prm a) b)- , IsBool (EnsureCE es (EqCompareType (WithGlobalParamA to prm a) b))- , SuitableForCE es)- =>- HasEqAsymmetric (WithGlobalParamA to prm a) (CollectErrors es b)- where- type EqCompareType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (EqCompareType (WithGlobalParamA to prm a) b)- equalTo = lift2TLCE equalTo--instance- (HasEqAsymmetric a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (EqCompareType a (WithGlobalParamA to prm b))- , IsBool (EnsureCE es (EqCompareType a (WithGlobalParamA to prm b)))- , SuitableForCE es)- =>- HasEqAsymmetric (CollectErrors es a) (WithGlobalParamA to prm b)- where- type EqCompareType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (EqCompareType a (WithGlobalParamA to prm b))- equalTo = lift2TCE equalTo--instance- (HasOrderAsymmetric (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (OrderCompareType (WithGlobalParamA to prm a) b)- , IsBool (EnsureCE es (OrderCompareType (WithGlobalParamA to prm a) b))- , SuitableForCE es)- =>- HasOrderAsymmetric (WithGlobalParamA to prm a) (CollectErrors es b)- where- type OrderCompareType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (OrderCompareType (WithGlobalParamA to prm a) b)- lessThan = lift2TLCE lessThan- leq = lift2TLCE leq- greaterThan = lift2TLCE greaterThan- geq = lift2TLCE geq--instance- (HasOrderAsymmetric a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (OrderCompareType a (WithGlobalParamA to prm b))- , IsBool (EnsureCE es (OrderCompareType a (WithGlobalParamA to prm b)))- , SuitableForCE es)- =>- HasOrderAsymmetric (CollectErrors es a) (WithGlobalParamA to prm b)- where- type OrderCompareType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (OrderCompareType a (WithGlobalParamA to prm b))- lessThan = lift2TCE lessThan- leq = lift2TCE leq- greaterThan = lift2TCE greaterThan- geq = lift2TCE geq--{- abs -}--instance- (QAArrow to, CanAbs a, SuitableForWGParam prm a, SuitableForWGParam prm (AbsType a))- =>- CanAbs (WithGlobalParamA to prm a)- where- type AbsType (WithGlobalParamA to prm a) = WithGlobalParamA to prm (AbsType a)- abs = unaryOp "abs" abs--{- min/max -}--instance- (QAArrow to- , CanMinMaxAsymmetric a b, SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm (MinMaxType a b))- =>- CanMinMaxAsymmetric (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type MinMaxType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (MinMaxType a b)- min = binaryOp "min" min- max = binaryOp "max" max--instance- (CanMinMaxAsymmetric (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (MinMaxType (WithGlobalParamA to prm a) b)- , SuitableForCE es)- =>- CanMinMaxAsymmetric (WithGlobalParamA to prm a) (CollectErrors es b)- where- type MinMaxType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (MinMaxType (WithGlobalParamA to prm a) b)- min = lift2TLCE min- max = lift2TLCE max--instance- (CanMinMaxAsymmetric a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (MinMaxType a (WithGlobalParamA to prm b))- , SuitableForCE es)- =>- CanMinMaxAsymmetric (CollectErrors es a) (WithGlobalParamA to prm b)- where- type MinMaxType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (MinMaxType a (WithGlobalParamA to prm b))- min = lift2TCE min- max = lift2TCE max--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to- , CanMinMaxAsymmetric a $t, SuitableForWGParam prm a, SuitableForWGParam prm (MinMaxType a $t))- =>- CanMinMaxAsymmetric (WithGlobalParamA to prm a) $t- where- type MinMaxType (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (MinMaxType a $t)- min = binaryOpWithPureArg "min" min- max = binaryOpWithPureArg "max" max-- instance- (QAArrow to- , CanMinMaxAsymmetric $t b, SuitableForWGParam prm b, SuitableForWGParam prm (MinMaxType $t b))- =>- CanMinMaxAsymmetric $t (WithGlobalParamA to prm b)- where- type MinMaxType $t (WithGlobalParamA to prm b) = WithGlobalParamA to prm (MinMaxType $t b)- min = flip $ binaryOpWithPureArg "min" (flip min)- max = flip $ binaryOpWithPureArg "max" (flip max)-- instance- (QAArrow to, HasEqAsymmetric a $t- , SuitableForWGParam prm a, SuitableForWGParam prm (EqCompareType a $t))- =>- HasEqAsymmetric (WithGlobalParamA to prm a) $t- where- type EqCompareType (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (EqCompareType a $t)- equalTo = binaryOpWithPureArg "==" (==)- notEqualTo = binaryOpWithPureArg "/=" (/=)-- instance- (QAArrow to, HasEqAsymmetric $t a- , SuitableForWGParam prm a, SuitableForWGParam prm (EqCompareType $t a))- =>- HasEqAsymmetric $t (WithGlobalParamA to prm a)- where- type EqCompareType $t (WithGlobalParamA to prm a) = WithGlobalParamA to prm (EqCompareType $t a)- equalTo = flip $ binaryOpWithPureArg "==" (flip (==))- notEqualTo = flip $ binaryOpWithPureArg "/=" (flip (/=))-- instance- (QAArrow to, HasOrderAsymmetric a $t- , SuitableForWGParam prm a, SuitableForWGParam prm (OrderCompareType a $t))- =>- HasOrderAsymmetric (WithGlobalParamA to prm a) $t- where- type OrderCompareType (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (OrderCompareType a $t)- lessThan = binaryOpWithPureArg "<" (<)- leq = binaryOpWithPureArg "<=" (<=)- greaterThan = binaryOpWithPureArg ">" (>)- geq = binaryOpWithPureArg ">=" (>=)-- instance- (QAArrow to, HasOrderAsymmetric $t a- , SuitableForWGParam prm a, SuitableForWGParam prm (OrderCompareType $t a))- =>- HasOrderAsymmetric $t (WithGlobalParamA to prm a)- where- type OrderCompareType $t (WithGlobalParamA to prm a) = WithGlobalParamA to prm (OrderCompareType $t a)- lessThan = flip $ binaryOpWithPureArg "<" (flip (<))- leq = flip $ binaryOpWithPureArg "<=" (flip (<=))- greaterThan = flip $ binaryOpWithPureArg ">" (flip (>))- geq = flip $ binaryOpWithPureArg ">=" (flip (>=))-- |]))
− src/AERN2/WithGlobalParam/Elementary.hs
@@ -1,158 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.WithGlobalParam.Elementary- Description : elementary functions on sequences- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Elementary functions on fast converging sequences.--}-module AERN2.WithGlobalParam.Elementary-()-where--import MixedTypesNumPrelude--- import qualified Prelude as P---- import Control.Arrow--import Control.CollectErrors--import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.WithGlobalParam.Type-import AERN2.WithGlobalParam.Helpers-import AERN2.WithGlobalParam.Ring ()-import AERN2.WithGlobalParam.Field ()--{- exp -}--instance- (QAArrow to, CanExp a- , SuitableForWGParam prm a, SuitableForWGParam prm (ExpType a))- =>- CanExp (WithGlobalParamA to prm a)- where- type ExpType (WithGlobalParamA to prm a) = WithGlobalParamA to prm (ExpType a)- exp = unaryOp "exp" exp--{- log -}--instance- (QAArrow to, CanLog a- , SuitableForWGParam prm a, SuitableForWGParam prm (LogType a))- =>- CanLog (WithGlobalParamA to prm a)- where- type LogType (WithGlobalParamA to prm a) = WithGlobalParamA to prm (LogType a)- log = unaryOp "log" log--{- power -}--instance- (QAArrow to, CanPow a e- , SuitableForWGParam prm a, SuitableForWGParam prm e- , SuitableForWGParam prm (PowTypeNoCN a e)- , SuitableForWGParam prm (PowType a e))- =>- CanPow (WithGlobalParamA to prm a) (WithGlobalParamA to prm e)- where- type PowTypeNoCN (WithGlobalParamA to prm a) (WithGlobalParamA to prm e) = WithGlobalParamA to prm (PowTypeNoCN a e)- powNoCN = binaryOp "^!" powNoCN- type PowType (WithGlobalParamA to prm a) (WithGlobalParamA to prm e) = WithGlobalParamA to prm (PowType a e)- pow = binaryOp "^" pow--instance- (CanPow (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (PowTypeNoCN (WithGlobalParamA to prm a) b)- , CanEnsureCE es (PowType (WithGlobalParamA to prm a) b)- , SuitableForCE es)- =>- CanPow (WithGlobalParamA to prm a) (CollectErrors es b)- where- type PowTypeNoCN (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (PowTypeNoCN (WithGlobalParamA to prm a) b)- powNoCN = lift2TLCE powNoCN- type PowType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (PowType (WithGlobalParamA to prm a) b)- pow = lift2TLCE pow--instance- (CanPow a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (PowType a (WithGlobalParamA to prm b))- , CanEnsureCE es (PowTypeNoCN a (WithGlobalParamA to prm b))- , SuitableForCE es)- =>- CanPow (CollectErrors es a) (WithGlobalParamA to prm b)- where- type PowTypeNoCN (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (PowTypeNoCN a (WithGlobalParamA to prm b))- powNoCN = lift2TCE powNoCN- type PowType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (PowType a (WithGlobalParamA to prm b))- pow = lift2TCE pow--$(declForTypes- [[t| Integer |], [t| Int |], [t| Dyadic |], [t| Rational |]]- (\ t -> [d|-- instance- (QAArrow to, CanPow a $t- , SuitableForWGParam prm a- , SuitableForWGParam prm (PowTypeNoCN a $t)- , SuitableForWGParam prm (PowType a $t))- =>- CanPow (WithGlobalParamA to prm a) $t where- type PowTypeNoCN (WithGlobalParamA to prm a) $t =- WithGlobalParamA to prm (PowTypeNoCN a $t)- powNoCN = binaryOpWithPureArg "^" powNoCN- type PowType (WithGlobalParamA to prm a) $t =- WithGlobalParamA to prm (PowType a $t)- pow = binaryOpWithPureArg "^" pow-- instance- (QAArrow to, CanPow $t a- , SuitableForWGParam prm a- , SuitableForWGParam prm (PowTypeNoCN $t a)- , SuitableForWGParam prm (PowType $t a))- =>- CanPow $t (WithGlobalParamA to prm a) where- type PowTypeNoCN $t (WithGlobalParamA to prm a) =- WithGlobalParamA to prm (PowTypeNoCN $t a)- powNoCN = flip $ binaryOpWithPureArg "^" (flip powNoCN)- type PowType $t (WithGlobalParamA to prm a) =- WithGlobalParamA to prm (PowType $t a)- pow = flip $ binaryOpWithPureArg "^" (flip pow)-- |]))--{- sqrt -}--instance- (QAArrow to, CanSqrt a- , CanMinMaxThis a Integer- , SuitableForWGParam prm a, SuitableForWGParam prm (SqrtType a))- =>- CanSqrt (WithGlobalParamA to prm a)- where- type SqrtType (WithGlobalParamA to prm a) = WithGlobalParamA to prm (SqrtType a)- sqrt = unaryOp "sqrt" sqrt--{- sine, cosine -}--instance- (QAArrow to, CanSinCos a- , SuitableForWGParam prm a, SuitableForWGParam prm (SinCosType a))- =>- CanSinCos (WithGlobalParamA to prm a)- where- type SinCosType (WithGlobalParamA to prm a) = WithGlobalParamA to prm (SinCosType a)- cos = unaryOp "cos" cos- sin = unaryOp "sin" sin
− src/AERN2/WithGlobalParam/Field.hs
@@ -1,106 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.WithGlobalParam.Field- Description : field operations- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Field operations on WithGlobalParam objects.--}-module AERN2.WithGlobalParam.Field-(-)-where--import MixedTypesNumPrelude--- import qualified Prelude as P---- import Control.Arrow--import Control.CollectErrors--import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.WithGlobalParam.Type-import AERN2.WithGlobalParam.Helpers--- import AERN2.WithGlobalParam.Ring--{- division -}--instance- (QAArrow to, CanDiv a b- , SuitableForWGParam prm a, SuitableForWGParam prm b- , SuitableForWGParam prm (DivType a b), SuitableForWGParam prm (DivTypeNoCN a b))- =>- CanDiv (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type DivType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (DivType a b)- divide = binaryOp "/" divide- type DivTypeNoCN (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (DivTypeNoCN a b)- divideNoCN = binaryOp "/" divideNoCN--instance- (CanDiv (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (DivType (WithGlobalParamA to prm a) b)- , CanEnsureCE es (DivTypeNoCN (WithGlobalParamA to prm a) b)- , SuitableForCE es)- =>- CanDiv (WithGlobalParamA to prm a) (CollectErrors es b)- where- type DivType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (DivType (WithGlobalParamA to prm a) b)- divide = lift2TLCE divide- type DivTypeNoCN (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (DivTypeNoCN (WithGlobalParamA to prm a) b)- divideNoCN = lift2TLCE divideNoCN--instance- (CanDiv a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (DivType a (WithGlobalParamA to prm b))- , CanEnsureCE es (DivTypeNoCN a (WithGlobalParamA to prm b))- , SuitableForCE es)- =>- CanDiv (CollectErrors es a) (WithGlobalParamA to prm b)- where- type DivType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (DivType a (WithGlobalParamA to prm b))- divide = lift2TCE divide- type DivTypeNoCN (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (DivTypeNoCN a (WithGlobalParamA to prm b))- divideNoCN = lift2TCE divideNoCN--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanDiv a $t, SuitableForWGParam prm a- , SuitableForWGParam prm (DivType a $t), SuitableForWGParam prm (DivTypeNoCN a $t))- =>- CanDiv (WithGlobalParamA to prm a) $t- where- type DivType (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (DivType a $t)- divide = binaryOpWithPureArg "/" divide- type DivTypeNoCN (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (DivTypeNoCN a $t)- divideNoCN = binaryOpWithPureArg "/" divideNoCN-- instance- (QAArrow to, CanDiv $t b, SuitableForWGParam prm b- , SuitableForWGParam prm (DivType $t b)- , SuitableForWGParam prm (DivTypeNoCN $t b))- =>- CanDiv $t (WithGlobalParamA to prm b)- where- type DivType $t (WithGlobalParamA to prm b) = WithGlobalParamA to prm (DivType $t b)- divide = flip $ binaryOpWithPureArg "/" (flip divide)- type DivTypeNoCN $t (WithGlobalParamA to prm b) = WithGlobalParamA to prm (DivTypeNoCN $t b)- divideNoCN = flip $ binaryOpWithPureArg "/" (flip divideNoCN)-- |]))
− src/AERN2/WithGlobalParam/Helpers.hs
@@ -1,85 +0,0 @@-{-# LANGUAGE CPP #-}--- #define DEBUG-{-|- Module : AERN2.WithGlobalParam.Helpers- Description : helper functions for operations- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Helper functions for defining operations over WithGlobalParam objects.--}-module AERN2.WithGlobalParam.Helpers-(- -- Operations returning WithGlobalParam- unaryOp, binaryOp, binaryOpWithPureArg-)-where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#define maybeTraceIO putStrLn-#else-#define maybeTrace (\ (_ :: String) t -> t)-#define maybeTraceIO (\ (_ :: String) -> return ())-#endif--import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow--import AERN2.QA.Protocol-import AERN2.WithGlobalParam.Type--{- generic implementations of operations of different arity -}--unaryOp ::- (QAArrow to, SuitableForWGParam prm a, SuitableForWGParam prm b)- =>- String ->- (a -> b) ->- WithGlobalParamA to prm a -> WithGlobalParamA to prm b-unaryOp name op aWGPrm =- newWGParam samplePrm (op sampleA) name [AnyProtocolQA aWGPrm] makeQ- where- WithGlobalParamP samplePrm sampleA = qaProtocol aWGPrm- makeQ (me, _src) =- proc ac ->- do- a <- wgprmQuery aWGPrm me -< ac- returnA -< op a--binaryOpWithPureArg ::- (QAArrow to, SuitableForWGParam prm a, SuitableForWGParam prm c)- =>- String -> (a -> t -> c) -> WithGlobalParamA to prm a -> t -> WithGlobalParamA to prm c-binaryOpWithPureArg name op aWGPrm b =- newWGParam samplePrm (op sampleA b) name [AnyProtocolQA aWGPrm] makeQ- where- WithGlobalParamP samplePrm sampleA = qaProtocol aWGPrm- makeQ (me, _src) =- proc ac ->- do- a <- wgprmQuery aWGPrm me -< ac- returnA -< op a b--binaryOp ::- (QAArrow to, SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm c)- =>- String -> (a -> b -> c) -> WithGlobalParamA to prm a -> WithGlobalParamA to prm b -> WithGlobalParamA to prm c-binaryOp name op aWGPrm bWGPrm =- newWGParam samplePrm (op sampleA sampleB) name [AnyProtocolQA aWGPrm, AnyProtocolQA bWGPrm] makeQ- where- WithGlobalParamP samplePrm sampleA = qaProtocol aWGPrm- WithGlobalParamP _ sampleB = qaProtocol bWGPrm- makeQ (me, _src) =- proc ac ->- do- a <- wgprmQuery aWGPrm me -< ac- b <- wgprmQuery bWGPrm me -< ac- returnA -< op a b
− src/AERN2/WithGlobalParam/Ring.hs
@@ -1,203 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-|- Module : AERN2.WithGlobalParam.Ring- Description : ring operations- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- Ring operations on WithGlobalParam objects.--}-module AERN2.WithGlobalParam.Ring-(-)-where--import MixedTypesNumPrelude hiding (id)--- import qualified Prelude as P---- import Control.Arrow--import Control.CollectErrors--import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.WithGlobalParam.Type-import AERN2.WithGlobalParam.Helpers--{- addition -}--instance- (QAArrow to, CanAddAsymmetric a b, SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm (AddType a b))- =>- CanAddAsymmetric (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type AddType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (AddType a b)- add = binaryOp "+" add--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanAddAsymmetric a $t, SuitableForWGParam prm a, SuitableForWGParam prm (AddType a $t))- =>- CanAddAsymmetric (WithGlobalParamA to prm a) $t- where- type AddType (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (AddType a $t)- add = binaryOpWithPureArg "+" add-- instance- (QAArrow to, CanAddAsymmetric $t b, SuitableForWGParam prm b, SuitableForWGParam prm (AddType $t b))- =>- CanAddAsymmetric $t (WithGlobalParamA to prm b)- where- type AddType $t (WithGlobalParamA to prm b) = WithGlobalParamA to prm (AddType $t b)- add = flip $ binaryOpWithPureArg "+" (flip add)-- |]))--instance- (CanAddAsymmetric (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (AddType (WithGlobalParamA to prm a) b)- , SuitableForCE es)- =>- CanAddAsymmetric (WithGlobalParamA to prm a) (CollectErrors es b)- where- type AddType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (AddType (WithGlobalParamA to prm a) b)- add = lift2TLCE add--instance- (CanAddAsymmetric a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (AddType a (WithGlobalParamA to prm b))- , SuitableForCE es)- =>- CanAddAsymmetric (CollectErrors es a) (WithGlobalParamA to prm b)- where- type AddType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (AddType a (WithGlobalParamA to prm b))- add = lift2TCE add---{- subtraction -}--instance- (QAArrow to, CanSub a b, SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm (SubType a b))- =>- CanSub (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type SubType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (SubType a b)- sub = binaryOp "-" sub---$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanSub a $t, SuitableForWGParam prm a, SuitableForWGParam prm (SubType a $t))- =>- CanSub (WithGlobalParamA to prm a) $t- where- type SubType (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (SubType a $t)- sub = binaryOpWithPureArg "-" sub-- instance- (QAArrow to, CanSub $t b, SuitableForWGParam prm b, SuitableForWGParam prm (SubType $t b))- =>- CanSub $t (WithGlobalParamA to prm b)- where- type SubType $t (WithGlobalParamA to prm b) = WithGlobalParamA to prm (SubType $t b)- sub = flip $ binaryOpWithPureArg "-" (flip sub)-- |]))--instance- (CanSub (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (SubType (WithGlobalParamA to prm a) b)- , SuitableForCE es)- =>- CanSub (WithGlobalParamA to prm a) (CollectErrors es b)- where- type SubType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (SubType (WithGlobalParamA to prm a) b)- sub = lift2TLCE sub--instance- (CanSub a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (SubType a (WithGlobalParamA to prm b))- , SuitableForCE es)- =>- CanSub (CollectErrors es a) (WithGlobalParamA to prm b)- where- type SubType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (SubType a (WithGlobalParamA to prm b))- sub = lift2TCE sub---{- multiplication -}--instance- (QAArrow to, CanMulAsymmetric a b- , SuitableForWGParam prm a, SuitableForWGParam prm b, SuitableForWGParam prm (MulType a b))- =>- CanMulAsymmetric (WithGlobalParamA to prm a) (WithGlobalParamA to prm b)- where- type MulType (WithGlobalParamA to prm a) (WithGlobalParamA to prm b) = WithGlobalParamA to prm (MulType a b)- mul =- binaryOp "*" mul--instance- (CanMulAsymmetric (WithGlobalParamA to prm a) b- , CanEnsureCE es b- , CanEnsureCE es (MulType (WithGlobalParamA to prm a) b)- , SuitableForCE es)- =>- CanMulAsymmetric (WithGlobalParamA to prm a) (CollectErrors es b)- where- type MulType (WithGlobalParamA to prm a) (CollectErrors es b) =- EnsureCE es (MulType (WithGlobalParamA to prm a) b)- mul = lift2TLCE mul--instance- (CanMulAsymmetric a (WithGlobalParamA to prm b)- , CanEnsureCE es a- , CanEnsureCE es (MulType a (WithGlobalParamA to prm b))- , SuitableForCE es)- =>- CanMulAsymmetric (CollectErrors es a) (WithGlobalParamA to prm b)- where- type MulType (CollectErrors es a) (WithGlobalParamA to prm b) =- EnsureCE es (MulType a (WithGlobalParamA to prm b))- mul = lift2TCE mul--$(declForTypes- [[t| Integer |], [t| Int |], [t| Rational |], [t| Dyadic |]]- (\ t -> [d|-- instance- (QAArrow to, CanMulAsymmetric a $t, SuitableForWGParam prm a, SuitableForWGParam prm (MulType a $t))- =>- CanMulAsymmetric (WithGlobalParamA to prm a) $t- where- type MulType (WithGlobalParamA to prm a) $t = WithGlobalParamA to prm (MulType a $t)- mul = binaryOpWithPureArg "*" mul-- instance- (QAArrow to, CanMulAsymmetric $t b, SuitableForWGParam prm b, SuitableForWGParam prm (MulType $t b))- =>- CanMulAsymmetric $t (WithGlobalParamA to prm b)- where- type MulType $t (WithGlobalParamA to prm b) = WithGlobalParamA to prm (MulType $t b)- mul = flip $ binaryOpWithPureArg "*" (flip mul)-- |]))
− src/AERN2/WithGlobalParam/Type.hs
@@ -1,200 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE TemplateHaskell #-}--- #define DEBUG-{-|- Module : AERN2.WithGlobalParam.Type- Description : Values that depend on a globale state- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable-- The type of values that depends on an immutable gloabal parameter,- such as FP precision.--}-module AERN2.WithGlobalParam.Type-(- -- * The protocol and type of fast converging sequences- WithGlobalParamP(..), pWGParam- , SuitableForWGParam- , wgprmName, wgprmId, wgprmSources, wgprmRename- , wgprmQuery, wgprmQueryA, wgprmListQueryA- , WithGlobalParamA, WithGlobalParam- , newWGParam, newWGParamSimple- , fmapWGParam-)-where--#ifdef DEBUG-import Debug.Trace (trace)-#define maybeTrace trace-#define maybeTraceIO putStrLn-#else-#define maybeTrace (\ (_ :: String) t -> t)-#define maybeTraceIO (\ (_ :: String) -> return ())-#endif--import MixedTypesNumPrelude--- import qualified Prelude as P--import Control.Arrow-import Control.Monad (join)--import Text.Printf--import Control.CollectErrors---- import AERN2.MP--- import AERN2.MP.Dyadic--import AERN2.QA.Protocol-import AERN2.QA.Strategy.CachedUnsafe ()--{- QA protocol -}--data WithGlobalParamP prm a =- WithGlobalParamP { withGlobalState_s :: Maybe prm, withGlobalState_a :: a} deriving (Show)--pWGParam :: Maybe prm -> a -> WithGlobalParamP prm a-pWGParam prm a = WithGlobalParamP prm a--instance (Show a, Show prm) => QAProtocol (WithGlobalParamP prm a) where- type Q (WithGlobalParamP prm a) = prm- type A (WithGlobalParamP prm a) = a--type SuitableForWGParam prm a = (Show a, Show prm, HasOrderCertainly prm prm)--instance- SuitableForWGParam prm a- =>- QAProtocolCacheable (WithGlobalParamP prm a)- where- type QACache (WithGlobalParamP prm a) = Maybe (a, prm)- newQACache _ = Nothing- lookupQACache _ cache prm =- case cache of- Just (b, prmC) | prm !<=! prmC -> (Just b, Just (logMsg b))- Just (b, _) -> (Nothing, Just (logMsg b))- Nothing -> (Nothing, Just ("cache empty"))- where- logMsg _b = printf "query: %s; cache: %s" (show prm) (show cache)- updateQACache _ prm b _ = Just (b, prm)--instance Functor (WithGlobalParamP prm) where- fmap f (WithGlobalParamP prm a) = WithGlobalParamP prm (f a)--{- Objects -}--type WithGlobalParamA to prm a = QA to (WithGlobalParamP prm a)-type WithGlobalParam prm a = WithGlobalParamA (->) prm a--fmapWGParam ::- (Arrow to) =>- (a -> b) -> (WithGlobalParamA to prm a) -> (WithGlobalParamA to prm b)-fmapWGParam f = mapQAsameQ (fmap f) f--wgprmName :: WithGlobalParamA to prm a -> String-wgprmName = qaName----wgprmRename :: (String -> String) -> WithGlobalParamA to prm a -> WithGlobalParamA to prm a-wgprmRename = qaRename--wgprmId :: WithGlobalParamA to prm a -> Maybe (QAId to)-wgprmId = qaId--wgprmSources :: WithGlobalParamA to prm a -> [QAId to]-wgprmSources = qaSources--{-| Get an approximation of the limit with at least the specified accuracy.- (A specialisation of 'qaMakeQuery' for values with global state.) -}-wgprmQuery :: (QAArrow to) => WithGlobalParamA to prm a -> Maybe (QAId to) -> prm `to` a-wgprmQuery = (?<-)--wgprmQueryA :: (QAArrow to) => (Maybe (QAId to)) -> (WithGlobalParamA to prm a, prm) `to` a-wgprmQueryA = qaMakeQueryA--wgprmListQueryA :: (QAArrow to) => (Maybe (QAId to)) -> ([WithGlobalParamA to prm a], prm) `to` [a]-wgprmListQueryA = qaMakeQueryOnManyA--{- constructions -}--newWGParam ::- (QAArrow to, SuitableForWGParam prm a)- =>- Maybe prm -> a -> String -> [AnyProtocolQA to] -> ((Maybe (QAId to), Maybe (QAId to)) -> prm `to` a) -> WithGlobalParamA to prm a-newWGParam samplePrm sampleA name sources makeQ =- newQA name sources (pWGParam samplePrm sampleA) samplePrm makeQ--newWGParamSimple ::- (QAArrow to, SuitableForWGParam prm a)- =>- Maybe prm -> a -> ((Maybe (QAId to), Maybe (QAId to)) -> prm `to` a) -> WithGlobalParamA to prm a-newWGParamSimple samplePrm sampleA = newWGParam samplePrm sampleA "simple" []--{- CollectErrors instances -}--instance- (SuitableForCE es, CanEnsureCE es a)- =>- CanEnsureCE es (WithGlobalParamP prm a)- where- type EnsureCE es (WithGlobalParamP prm a) = WithGlobalParamP prm (EnsureCE es a)- type EnsureNoCE es (WithGlobalParamP prm a) = WithGlobalParamP prm (EnsureNoCE es a)-- ensureCE sample_es = fmap (ensureCE sample_es)- deEnsureCE sample_es (WithGlobalParamP prm a) = fmap (WithGlobalParamP prm) (deEnsureCE sample_es a)- ensureNoCE sample_es (WithGlobalParamP prm a) =- (\(ma,es) -> (fmap (WithGlobalParamP prm) ma, es)) (ensureNoCE sample_es a)-- noValueECE sample_vCE es =- WithGlobalParamP (join $ fmap withGlobalState_s sample_vCE)- (noValueECE (fmap withGlobalState_a sample_vCE) es)-- prependErrorsECE sample_vCE es (WithGlobalParamP prm aCE) =- (WithGlobalParamP prm (prependErrorsECE (fmap withGlobalState_a sample_vCE) es aCE))--instance- (Arrow to, SuitableForCE es, CanEnsureCE es a)- =>- CanEnsureCE es (WithGlobalParamA to prm a)- where- type EnsureCE es (WithGlobalParamA to prm a) = WithGlobalParamA to prm (EnsureCE es a)- type EnsureNoCE es (WithGlobalParamA to prm a) = WithGlobalParamA to prm (EnsureNoCE es a)-- ensureCE sample_es = fmapWGParam (ensureCE sample_es)- deEnsureCE sample_es = Right . fmapWGParam (removeEither . deEnsureCE sample_es)- where- removeEither (Right a) = a- removeEither (Left es) = error $ "WithGlobalParam deEnsureCE: " ++ show es- ensureNoCE sample_es = (\v -> (Just v, mempty)) . fmapWGParam (removeES . ensureNoCE sample_es)- where- removeES (Just a, es) | not (hasCertainError es) = a- removeES (_, es) = error $ "WithGlobalParam ensureNoCE: " ++ show es- -- es =-- noValueECE _sample_vCE _es =- error "noValueECE not implemented for WithGlobalParam yet"-- prependErrorsECE (_sample_vCE :: Maybe (WithGlobalParamA to prm a)) es =- fmapWGParam (prependErrorsECE (Nothing :: Maybe a) es)---- The following has to be made specific to specific prm and a types--- so that the dependency on the parameter can be expressed------ $(declForTypes--- [[t| Integer |], [t| Int |], [t| Dyadic |]]--- (\ t -> [d|------ instance--- (QAArrow to, ConvertibleExactly $t a, CanSetPrecision a, SuitableForWGParam prm a)--- =>--- ConvertibleExactly $t (WithGlobalParamA to prm a)--- where--- safeConvertExactly x =--- Right $ newWGParam Nothing a (show x) [] (\_src -> arr $ \_prm -> a)--- where--- a = convertExactly x------ |]))
− test/AERN2/RealSpec.hs
@@ -1,20 +0,0 @@-{-|- Module : AERN2.RealSpec- Description : hspec tests for CauchyReal- Copyright : (c) Michal Konecny- License : BSD3-- Maintainer : mikkonecny@gmail.com- Stability : experimental- Portability : portable--}--module AERN2.RealSpec (spec) where---- import MixedTypesNumPrelude-import AERN2.Real.Tests--import Test.Hspec--spec :: Spec-spec = specCauchyReal
− test/Spec.hs
@@ -1,1 +0,0 @@-{-# OPTIONS_GHC -F -pgmF hspec-discover #-}