{-|
    Module      :  Data.Number.ER.Real.TestingDefs
    Description :  definitions useful for testing in ghci
    Copyright   :  (c) 2007-2008 Michal Konecny
    License     :  BSD3

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  non-portable (requires fenv.h)

    A few definitions useful for testing the enclosures code, eg in ghci.
-}
module Data.Number.ER.RnToRm.TestingDefs where

import Data.Number.ER.RnToRm.DefaultRepr
import Data.Number.ER.Real.DefaultRepr

import qualified Data.Number.ER.RnToRm.Approx as FA
import qualified Data.Number.ER.RnToRm.UnitDom.Approx as UFA
import qualified Data.Number.ER.Real.Approx as RA
import qualified Data.Number.ER.Real.Approx.Elementary as RAEL
import qualified Data.Number.ER.BasicTypes.DomainBox as DBox

import Data.Number.ER.Real.Approx.Interval
import Data.Number.ER.Misc

import qualified Data.Map as Map

fapuConst1 = (UFA.const [1]) :: (FAPU B)

fapdConst1 = (FA.const DBox.noinfo [1]) :: (FAPD B)
fapdConstU = (FA.const DBox.noinfo [(-1) RA.\/ 1]) :: (FAPD B)
fapdConst01 = (FA.const DBox.noinfo [0 RA.\/ 1]) :: (FAPD B)
fapd04X0 = (FA.proj (DBox.fromAscList [(0,0 RA.\/ 4)]) 0) :: (FAPD B)
fapd13X0 = (FA.proj (DBox.fromAscList [(0,1 RA.\/ 3)]) 0) :: (FAPD B)
fapd12X1 = (FA.proj (DBox.fromAscList [(1,1 RA.\/ 2)]) 1) :: (FAPD B)
fapdUX0 = FA.setMaxDegree 2 (FA.proj (DBox.fromAscList [(0,(-1) RA.\/ 1)]) 0) :: (FAPD B)
fapdUX1 = FA.setMaxDegree 2 (FA.proj (DBox.fromAscList [(1,(-1) RA.\/ 1)]) 1) :: (FAPD B)
fapdUX2 = FA.setMaxDegree 2 (FA.proj (DBox.fromAscList [(2,(-1) RA.\/ 1)]) 2) :: (FAPD B)

fapdT1 = (1 + fapdUX2) * (1 + fapdUX2)
fapdT2 = fapdUX0 * fapdUX1 
fapdT3 = FA.composeNonDecreasing fapdT1 2 fapdT2

fapeConst1 = (FA.const DBox.noinfo [1]) :: (FAPE B)
fapeConstU = (FA.const DBox.noinfo [(-1) RA.\/ 1]) :: (FAPE B)
fapeConst01 = (FA.const DBox.noinfo [0 RA.\/ 1]) :: (FAPE B)

fape13X0 = (FA.proj (DBox.fromAscList [(0,1 RA.\/ 3)]) 0) :: (FAPE B)
fape12X1 = (FA.proj (DBox.fromAscList [(1,1 RA.\/ 2)]) 1) :: (FAPE B) 
fapeUX0 = (FA.proj (DBox.fromAscList [(0,(-1) RA.\/ 1)]) 0) :: (FAPE B)
fapeUX1 = (FA.proj (DBox.fromAscList [(1,(-1) RA.\/ 1)]) 1) :: (FAPE B)

fapeTestMult = (fapeUX0 + (FA.setMaxDegree 3 fapeConst01)) * (fapeConstU)
fapeMultiVar = (fapeUX0 + fapeUX1 * fapeUX0 + fapeUX1 * fapeUX1)
fapeTestPEval = FA.partialEval (DBox.fromList [(1,2 RA.\/ 3)]) fapeMultiVar

fapeUConst1 = (FA.const (DBox.unary $ (0)RA.\/1) [1]) :: (FAPE B)
fapeUConst13 = (FA.const (DBox.unary $ (0)RA.\/1) [1 RA.\/ 3]) :: (FAPE B)
fapeUConst13InitPt = FA.partialIntersect 1 (DBox.unary 0)  fapeUConst1 fapeUConst13
 
fapwUUX0 = (FA.proj (DBox.fromAscList [(0,(-1) RA.\/ 1)]) 0) :: (FAPWP B)
fapwUUX1 = (FA.proj (DBox.fromAscList [(1,(-1) RA.\/ 1)]) 1) :: (FAPWP B)

fapwUPX0 = (FA.proj (DBox.fromAscList [(0,(0) RA.\/ 1)]) 0) :: (FAPWP B)
fapwUPX1 = (FA.proj (DBox.fromAscList [(1,(0) RA.\/ 1)]) 1) :: (FAPWP B)

fapwUMX0 = (FA.proj (DBox.fromAscList [(0,(-1) RA.\/ 0)]) 0) :: (FAPWP B)
fapwUMX1 = (FA.proj (DBox.fromAscList [(1,(-1) RA.\/ 0)]) 1) :: (FAPWP B)

fapwUConst1 = (FA.const (DBox.noinfo) [1]) :: (FAPWP B)
fapwUConst13 = (FA.const (DBox.unary $ (0)RA.\/1) [1 RA.\/ 3]) :: (FAPWP B)
fapwUConst13InitPt = FA.partialIntersect 1 (DBox.unary 0) fapwUConst1 fapwUConst13 

testIntegrE = 
    FA.integrateMeasureImprovement 1 (FA.setMaxDegree 0 fapeUConst13InitPt) 0 (DBox.noinfo) 0 fapeUConst13InitPt

testIntegrP = 
    FA.integrateMeasureImprovement 1 (FA.setMaxDegree 0 fapwUConst13InitPt) 0 (DBox.unary $ 0 RA.\/ 0.5) 0 fapwUConst13InitPt


jas1 =
	FA.integrate
		0
		f
		0
		DBox.noinfo
		1
		0

f =
	RAEL.exp 100 x

x = 
--    FA.bisectUnbisectDepth 1 $
    FA.setMaxDegree 10
--    fapwUUX10
    fapd13X0
    
y = 
--    FA.bisectUnbisectDepth 1 $
    FA.setMaxDegree 4 
--    fapwUUX1
    fapd12X1
xLR = 
    snd $ FA.bisect 0 Nothing $ fst $ FA.bisect 0 Nothing $ x
    
fn1 = (1 + x) RA.\/ (1 + 3*x)
fn2 = FA.integrateUnary 0 fn1 0 (0 RA.\/ 1) [1]
fn3 = FA.integrateUnary 0 fn2 0 (0 RA.\/ 1) [1] -- this seems wrong!