module AERN2.BoxFun.Type where

import MixedTypesNumPrelude

import AERN2.Linear.Vector.Type (Vector, (!))
import qualified AERN2.Linear.Vector.Type as V
import AERN2.MP.Ball
import AERN2.AD.Differential
import qualified AERN2.Linear.Matrix.Type as M
import AERN2.Util.Util
import AERN2.BoxFun.Box
import Numeric.CollectErrors

data BoxFun =
    BoxFun
    {
            BoxFun -> Integer
dimension :: Integer
        ,   BoxFun
-> Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
bf_eval   :: Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
        ,   BoxFun -> Vector (CN MPBall)
domain    :: Vector (CN MPBall)
    }

instance Show BoxFun where
    show :: BoxFun -> String
show (BoxFun Integer
d Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
_f Vector (CN MPBall)
b) = Integer -> String
forall a. Show a => a -> String
show Integer
d String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" dimensional BoxFun, domain: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Vector (CN MPBall) -> String
forall a. Show a => a -> String
show Vector (CN MPBall)
b

boundaryRestrictions :: BoxFun -> [BoxFun]
boundaryRestrictions :: BoxFun -> [BoxFun]
boundaryRestrictions (BoxFun Integer
d Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
ev Vector (CN MPBall)
dom) =
    [[BoxFun]] -> [BoxFun]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [
        [
            Integer
-> (Vector (Differential (CN MPBall)) -> Differential (CN MPBall))
-> Vector (CN MPBall)
-> BoxFun
BoxFun 
                (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)
                (
                \Vector (Differential (CN MPBall))
v ->
                    Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
ev (Vector (Differential (CN MPBall)) -> Differential (CN MPBall))
-> Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ (Integer -> Differential (CN MPBall))
-> Vector Integer -> Vector (Differential (CN MPBall))
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\Integer
j -> if Integer
j Integer -> Integer -> EqCompareType Integer Integer
forall a b. HasEqAsymmetric a b => a -> b -> EqCompareType a b
== Integer
i then (Precision -> Differential (CN MPBall) -> Differential (CN MPBall)
forall t. CanSetPrecision t => Precision -> t -> t
setPrecision (Precision -> Differential (CN MPBall) -> Differential (CN MPBall))
-> Precision
-> Differential (CN MPBall)
-> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Vector (Differential (CN MPBall)) -> Precision
forall t. HasPrecision t => t -> Precision
getPrecision Vector (Differential (CN MPBall))
v) (Differential (CN MPBall) -> Differential (CN MPBall))
-> Differential (CN MPBall) -> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Integer -> CN MPBall -> Differential (CN MPBall)
forall a. CanBeDifferential a => Integer -> a -> Differential a
differential Integer
2 (CN MPBall -> Differential (CN MPBall))
-> CN MPBall -> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ CN MPBall -> CN MPBall
forall i. IsInterval i => i -> i
upperBound (Vector (CN MPBall)
dom Vector (CN MPBall) -> Integer -> CN MPBall
forall a. Vector a -> Integer -> a
! Integer
i) else if Integer
j Integer -> Integer -> OrderCompareType Integer Integer
forall a b.
HasOrderAsymmetric a b =>
a -> b -> OrderCompareType a b
< Integer
i then Vector (Differential (CN MPBall))
v Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! Integer
j else Vector (Differential (CN MPBall))
v Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! (Integer
j Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)) (Vector Integer -> Vector (Differential (CN MPBall)))
-> Vector Integer -> Vector (Differential (CN MPBall))
forall a b. (a -> b) -> a -> b
$ Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
V.enumFromTo Integer
0 (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)
                ) 
                ((Integer -> CN MPBall) -> Vector Integer -> Vector (CN MPBall)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\Integer
j -> if Integer
j Integer -> Integer -> OrderCompareType Integer Integer
forall a b.
HasOrderAsymmetric a b =>
a -> b -> OrderCompareType a b
>= Integer
i then Vector (CN MPBall)
dom Vector (CN MPBall) -> Integer -> CN MPBall
forall a. Vector a -> Integer -> a
! (Integer
j Integer -> Integer -> AddType Integer Integer
forall t1 t2. CanAddAsymmetric t1 t2 => t1 -> t2 -> AddType t1 t2
+ Integer
1) else Vector (CN MPBall)
dom Vector (CN MPBall) -> Integer -> CN MPBall
forall a. Vector a -> Integer -> a
! Integer
j) (Vector Integer -> Vector (CN MPBall))
-> Vector Integer -> Vector (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
V.enumFromTo Integer
0 (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
2))
            ,
            Integer
-> (Vector (Differential (CN MPBall)) -> Differential (CN MPBall))
-> Vector (CN MPBall)
-> BoxFun
BoxFun 
                (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)
                (
                    \Vector (Differential (CN MPBall))
v ->
                        Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
ev (Vector (Differential (CN MPBall)) -> Differential (CN MPBall))
-> Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ (Integer -> Differential (CN MPBall))
-> Vector Integer -> Vector (Differential (CN MPBall))
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\Integer
j -> if Integer
j Integer -> Integer -> EqCompareType Integer Integer
forall a b. HasEqAsymmetric a b => a -> b -> EqCompareType a b
== Integer
i then (Precision -> Differential (CN MPBall) -> Differential (CN MPBall)
forall t. CanSetPrecision t => Precision -> t -> t
setPrecision (Precision -> Differential (CN MPBall) -> Differential (CN MPBall))
-> Precision
-> Differential (CN MPBall)
-> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Vector (Differential (CN MPBall)) -> Precision
forall t. HasPrecision t => t -> Precision
getPrecision Vector (Differential (CN MPBall))
v) (Differential (CN MPBall) -> Differential (CN MPBall))
-> Differential (CN MPBall) -> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Integer -> CN MPBall -> Differential (CN MPBall)
forall a. CanBeDifferential a => Integer -> a -> Differential a
differential Integer
2 (CN MPBall -> Differential (CN MPBall))
-> CN MPBall -> Differential (CN MPBall)
forall a b. (a -> b) -> a -> b
$ CN MPBall -> CN MPBall
forall i. IsInterval i => i -> i
lowerBound (Vector (CN MPBall)
dom Vector (CN MPBall) -> Integer -> CN MPBall
forall a. Vector a -> Integer -> a
! Integer
i) else if Integer
j Integer -> Integer -> OrderCompareType Integer Integer
forall a b.
HasOrderAsymmetric a b =>
a -> b -> OrderCompareType a b
< Integer
i then Vector (Differential (CN MPBall))
v Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! Integer
j else Vector (Differential (CN MPBall))
v Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! (Integer
j Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)) (Vector Integer -> Vector (Differential (CN MPBall)))
-> Vector Integer -> Vector (Differential (CN MPBall))
forall a b. (a -> b) -> a -> b
$ Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
V.enumFromTo Integer
0 (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)
                )
                ((Integer -> CN MPBall) -> Vector Integer -> Vector (CN MPBall)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\Integer
j -> if Integer
j Integer -> Integer -> OrderCompareType Integer Integer
forall a b.
HasOrderAsymmetric a b =>
a -> b -> OrderCompareType a b
>= Integer
i then Vector (CN MPBall)
dom Vector (CN MPBall) -> Integer -> CN MPBall
forall a. Vector a -> Integer -> a
! (Integer
j Integer -> Integer -> AddType Integer Integer
forall t1 t2. CanAddAsymmetric t1 t2 => t1 -> t2 -> AddType t1 t2
+ Integer
1) else Vector (CN MPBall)
dom Vector (CN MPBall) -> Integer -> CN MPBall
forall a. Vector a -> Integer -> a
! Integer
j) (Vector Integer -> Vector (CN MPBall))
-> Vector Integer -> Vector (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
V.enumFromTo Integer
0 (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
2))
        ]
        |
        Integer
i <- [Integer
0 .. Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1]
    ]

valueGradientHessian :: BoxFun -> Vector (CN MPBall) -> (CN MPBall, Vector (CN MPBall), M.Matrix (CN MPBall))
valueGradientHessian :: BoxFun
-> Vector (CN MPBall)
-> (CN MPBall, Vector (CN MPBall), Matrix (CN MPBall))
valueGradientHessian (BoxFun Integer
d Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e Vector (CN MPBall)
_) Vector (CN MPBall)
v =
    (CN MPBall
value, Vector (CN MPBall)
grad, Matrix (CN MPBall)
hess)
    where
    vgh :: Integer -> Integer -> Differential (CN MPBall)
vgh Integer
i Integer
j = Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e (Integer -> Integer -> Vector (Differential (CN MPBall))
w Integer
i Integer
j)

    triangle :: Vector (Vector (Differential (CN MPBall)))
triangle =  
        (Integer -> Vector (Differential (CN MPBall)))
-> Vector Integer -> Vector (Vector (Differential (CN MPBall)))
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\Integer
i-> (Integer -> Differential (CN MPBall))
-> Vector Integer -> Vector (Differential (CN MPBall))
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\Integer
j -> Integer -> Integer -> Differential (CN MPBall)
vgh Integer
i Integer
j) (Vector Integer -> Vector (Differential (CN MPBall)))
-> Vector Integer -> Vector (Differential (CN MPBall))
forall a b. (a -> b) -> a -> b
$ Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
V.enumFromTo Integer
0 Integer
i) (Vector Integer -> Vector (Vector (Differential (CN MPBall))))
-> Vector Integer -> Vector (Vector (Differential (CN MPBall)))
forall a b. (a -> b) -> a -> b
$ Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
V.enumFromTo Integer
0 (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)

    value :: CN MPBall
value = Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_x (Differential (CN MPBall) -> CN MPBall)
-> Differential (CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ (Vector (Vector (Differential (CN MPBall)))
triangle Vector (Vector (Differential (CN MPBall)))
-> Integer -> Vector (Differential (CN MPBall))
forall a. Vector a -> Integer -> a
! Integer
0) Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! Integer
0
    grad :: Vector (CN MPBall)
grad  = (Integer -> CN MPBall) -> Vector Integer -> Vector (CN MPBall)
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\Integer
i -> Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_dx (Differential (CN MPBall) -> CN MPBall)
-> Differential (CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ (Vector (Vector (Differential (CN MPBall)))
triangle Vector (Vector (Differential (CN MPBall)))
-> Integer -> Vector (Differential (CN MPBall))
forall a. Vector a -> Integer -> a
! Integer
i) Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! Integer
0) (Vector Integer -> Vector (CN MPBall))
-> Vector Integer -> Vector (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Integer -> Integer -> Vector Integer
forall a. Enum a => a -> a -> Vector a
V.enumFromTo Integer
0 (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1)
    hess :: Matrix (CN MPBall)
hess  = Integer
-> Integer
-> (Integer -> Integer -> CN MPBall)
-> Matrix (CN MPBall)
forall a.
Integer -> Integer -> (Integer -> Integer -> a) -> Matrix a
M.create Integer
d Integer
d (\Integer
i Integer
j -> Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_d2x (Differential (CN MPBall) -> CN MPBall)
-> Differential (CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ if Integer
i Integer -> Integer -> OrderCompareType Integer Integer
forall a b.
HasOrderAsymmetric a b =>
a -> b -> OrderCompareType a b
> Integer
j then (Vector (Vector (Differential (CN MPBall)))
triangle Vector (Vector (Differential (CN MPBall)))
-> Integer -> Vector (Differential (CN MPBall))
forall a. Vector a -> Integer -> a
! Integer
i) Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! Integer
j else (Vector (Vector (Differential (CN MPBall)))
triangle Vector (Vector (Differential (CN MPBall)))
-> Integer -> Vector (Differential (CN MPBall))
forall a. Vector a -> Integer -> a
! Integer
j) Vector (Differential (CN MPBall))
-> Integer -> Differential (CN MPBall)
forall a. Vector a -> Integer -> a
! Integer
i)

    w :: Integer -> Integer -> Vector (Differential (CN MPBall))
w Integer
i Integer
j = (Integer -> CN MPBall -> Differential (CN MPBall))
-> Vector (CN MPBall) -> Vector (Differential (CN MPBall))
forall a b. (Integer -> a -> b) -> Vector a -> Vector b
V.imap (\Integer
k CN MPBall
x -> CN MPBall
-> CN MPBall -> CN MPBall -> CN MPBall -> Differential (CN MPBall)
forall a. a -> a -> a -> a -> Differential a
OrderTwo CN MPBall
x (Integer -> Integer -> CN MPBall
delta Integer
i Integer
k) (Integer -> Integer -> CN MPBall
delta Integer
j Integer
k) (MPBall -> CN MPBall
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)) Vector (CN MPBall)
v
    delta :: Integer -> Integer -> CN MPBall
    delta :: Integer -> Integer -> CN MPBall
delta Integer
i Integer
k = if Integer
i Integer -> Integer -> EqCompareType Integer Integer
forall a b. HasEqAsymmetric a b => a -> b -> EqCompareType a b
== Integer
k then (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
1) else (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)

valueGradient :: BoxFun -> Vector (CN MPBall) -> (CN MPBall, Vector (CN MPBall))
valueGradient :: BoxFun -> Vector (CN MPBall) -> (CN MPBall, Vector (CN MPBall))
valueGradient (BoxFun Integer
d Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e Vector (CN MPBall)
_) Vector (CN MPBall)
v =
    Integer
-> [CN MPBall] -> CN MPBall -> (CN MPBall, Vector (CN MPBall))
aux (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1) [] (MPBall -> CN MPBall
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)
    where
    tangent :: Integer -> Vector (Differential (CN MPBall))
tangent Integer
k = 
        (Integer -> CN MPBall -> Differential (CN MPBall))
-> Vector (CN MPBall) -> Vector (Differential (CN MPBall))
forall a b. (Integer -> a -> b) -> Vector a -> Vector b
V.imap (\Integer
i CN MPBall
x -> CN MPBall -> CN MPBall -> Differential (CN MPBall)
forall a. a -> a -> Differential a
OrderOne CN MPBall
x (Integer -> Integer -> CN MPBall
delta Integer
i Integer
k)) Vector (CN MPBall)
v
    valgrad :: Integer -> (CN MPBall, CN MPBall)
valgrad Integer
k =
        let
            etk :: Differential (CN MPBall)
etk = Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e (Integer -> Vector (Differential (CN MPBall))
tangent Integer
k)
        in 
            (Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_x Differential (CN MPBall)
etk, Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_dx Differential (CN MPBall)
etk)
    aux :: Integer
-> [CN MPBall] -> CN MPBall -> (CN MPBall, Vector (CN MPBall))
aux Integer
k [CN MPBall]
ret CN MPBall
val =
        if Integer
k Integer -> Integer -> OrderCompareType Integer Integer
forall a b.
HasOrderAsymmetric a b =>
a -> b -> OrderCompareType a b
< Integer
0 then
            (CN MPBall
val, [CN MPBall] -> Vector (CN MPBall)
forall a. [a] -> Vector a
V.fromList [CN MPBall]
ret)
        else 
            let
                (CN MPBall
val2,CN MPBall
g) = Integer -> (CN MPBall, CN MPBall)
valgrad Integer
k
            in
            Integer
-> [CN MPBall] -> CN MPBall -> (CN MPBall, Vector (CN MPBall))
aux (Integer
k Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1) (CN MPBall
g CN MPBall -> [CN MPBall] -> [CN MPBall]
forall a. a -> [a] -> [a]
: [CN MPBall]
ret) CN MPBall
val2
    delta :: Integer -> Integer -> CN MPBall
    delta :: Integer -> Integer -> CN MPBall
delta Integer
i Integer
k = if Integer
i Integer -> Integer -> EqCompareType Integer Integer
forall a b. HasEqAsymmetric a b => a -> b -> EqCompareType a b
== Integer
k then (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
1) else (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)

apply :: BoxFun -> Vector (CN MPBall) -> CN MPBall
apply :: BoxFun -> Vector (CN MPBall) -> CN MPBall
apply (BoxFun Integer
_d Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e Vector (CN MPBall)
_) Vector (CN MPBall)
v = 
    Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_x (Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e Vector (Differential (CN MPBall))
v')
    where
    v' :: Vector (Differential (CN MPBall))
v' = (CN MPBall -> Differential (CN MPBall))
-> Vector (CN MPBall) -> Vector (Differential (CN MPBall))
forall a b. (a -> b) -> Vector a -> Vector b
V.map (\CN MPBall
x -> Integer -> CN MPBall -> Differential (CN MPBall)
forall a. CanBeDifferential a => Integer -> a -> Differential a
differential Integer
0 CN MPBall
x) Vector (CN MPBall)
v

applyMinimum :: BoxFun -> CN MPBall
applyMinimum :: BoxFun -> CN MPBall
applyMinimum BoxFun
h = (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a, b) -> a
fst ((CN MPBall, CN MPBall) -> CN MPBall)
-> (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ CN MPBall -> (CN MPBall, CN MPBall)
forall i. IsInterval i => i -> (i, i)
endpointsAsIntervals (BoxFun -> Vector (CN MPBall) -> CN MPBall
apply BoxFun
h (BoxFun -> Vector (CN MPBall)
domain BoxFun
h))

applyMinimumOnBox :: BoxFun -> Vector (CN MPBall) -> CN MPBall
applyMinimumOnBox :: BoxFun -> Vector (CN MPBall) -> CN MPBall
applyMinimumOnBox BoxFun
h Vector (CN MPBall)
hbox = (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a, b) -> a
fst ((CN MPBall, CN MPBall) -> CN MPBall)
-> (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ CN MPBall -> (CN MPBall, CN MPBall)
forall i. IsInterval i => i -> (i, i)
endpointsAsIntervals (BoxFun -> Vector (CN MPBall) -> CN MPBall
apply BoxFun
h Vector (CN MPBall)
hbox)

applyMaximum :: BoxFun -> CN MPBall
applyMaximum :: BoxFun -> CN MPBall
applyMaximum BoxFun
h = (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a, b) -> b
snd ((CN MPBall, CN MPBall) -> CN MPBall)
-> (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ CN MPBall -> (CN MPBall, CN MPBall)
forall i. IsInterval i => i -> (i, i)
endpointsAsIntervals (BoxFun -> Vector (CN MPBall) -> CN MPBall
apply BoxFun
h (BoxFun -> Vector (CN MPBall)
domain BoxFun
h))

applyMaximumOnBox :: BoxFun -> Vector (CN MPBall) -> CN MPBall
applyMaximumOnBox :: BoxFun -> Vector (CN MPBall) -> CN MPBall
applyMaximumOnBox BoxFun
h Vector (CN MPBall)
hbox = (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a, b) -> b
snd ((CN MPBall, CN MPBall) -> CN MPBall)
-> (CN MPBall, CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ CN MPBall -> (CN MPBall, CN MPBall)
forall i. IsInterval i => i -> (i, i)
endpointsAsIntervals (BoxFun -> Vector (CN MPBall) -> CN MPBall
apply BoxFun
h Vector (CN MPBall)
hbox)

gradient :: BoxFun -> Vector (CN MPBall) -> Vector (CN MPBall)
gradient :: BoxFun -> Vector (CN MPBall) -> Vector (CN MPBall)
gradient (BoxFun Integer
d Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e Vector (CN MPBall)
_) Vector (CN MPBall)
v =
    Integer -> [CN MPBall] -> Vector (CN MPBall)
aux (Integer
d Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1) []
    where
    tangent :: Integer -> Vector (Differential (CN MPBall))
tangent Integer
k = 
        (Integer -> CN MPBall -> Differential (CN MPBall))
-> Vector (CN MPBall) -> Vector (Differential (CN MPBall))
forall a b. (Integer -> a -> b) -> Vector a -> Vector b
V.imap (\Integer
i CN MPBall
x -> CN MPBall -> CN MPBall -> Differential (CN MPBall)
forall a. a -> a -> Differential a
OrderOne CN MPBall
x (Integer -> Integer -> CN MPBall
delta Integer
i Integer
k)) Vector (CN MPBall)
v
    grad :: Integer -> CN MPBall
grad Integer
k =
        -- diff_dx $ e (tangent k)
        case Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e (Integer -> Vector (Differential (CN MPBall))
tangent Integer
k) of
            OrderZero CN MPBall
_ -> NumError -> CN MPBall
forall v. NumError -> CN v
noValueNumErrorCertain (String -> NumError
NumError String
"details")
            Differential (CN MPBall)
val -> Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_dx (Differential (CN MPBall) -> CN MPBall)
-> Differential (CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Differential (CN MPBall)
val
    aux :: Integer -> [CN MPBall] -> Vector (CN MPBall)
aux Integer
k [CN MPBall]
ret =
        if Integer
k Integer -> Integer -> OrderCompareType Integer Integer
forall a b.
HasOrderAsymmetric a b =>
a -> b -> OrderCompareType a b
< Integer
0 then
            [CN MPBall] -> Vector (CN MPBall)
forall a. [a] -> Vector a
V.fromList [CN MPBall]
ret
        else 
            Integer -> [CN MPBall] -> Vector (CN MPBall)
aux (Integer
k Integer -> Integer -> SubType Integer Integer
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Integer
1) (Integer -> CN MPBall
grad Integer
k CN MPBall -> [CN MPBall] -> [CN MPBall]
forall a. a -> [a] -> [a]
: [CN MPBall]
ret)
    delta :: Integer -> Integer -> CN MPBall
    delta :: Integer -> Integer -> CN MPBall
delta Integer
i Integer
k = if Integer
i Integer -> Integer -> EqCompareType Integer Integer
forall a b. HasEqAsymmetric a b => a -> b -> EqCompareType a b
== Integer
k then (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
1) else (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)

hessian :: BoxFun -> Vector (CN MPBall) -> M.Matrix (CN MPBall)
hessian :: BoxFun -> Vector (CN MPBall) -> Matrix (CN MPBall)
hessian (BoxFun Integer
d Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e Vector (CN MPBall)
_) Vector (CN MPBall)
v = 
    Integer
-> Integer
-> (Integer -> Integer -> CN MPBall)
-> Matrix (CN MPBall)
forall a.
Integer -> Integer -> (Integer -> Integer -> a) -> Matrix a
M.create Integer
d Integer
d Integer -> Integer -> CN MPBall
a
    where
    a :: Integer -> Integer -> CN MPBall
a Integer
i Integer
j = Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_d2x (Differential (CN MPBall) -> CN MPBall)
-> Differential (CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
e (Integer -> Integer -> Vector (Differential (CN MPBall))
w Integer
i Integer
j)
    w :: Integer -> Integer -> Vector (Differential (CN MPBall))
w Integer
i Integer
j = (Integer -> CN MPBall -> Differential (CN MPBall))
-> Vector (CN MPBall) -> Vector (Differential (CN MPBall))
forall a b. (Integer -> a -> b) -> Vector a -> Vector b
V.imap (\Integer
k CN MPBall
x -> CN MPBall
-> CN MPBall -> CN MPBall -> CN MPBall -> Differential (CN MPBall)
forall a. a -> a -> a -> a -> Differential a
OrderTwo CN MPBall
x (Integer -> Integer -> CN MPBall
delta Integer
i Integer
k) (Integer -> Integer -> CN MPBall
delta Integer
j Integer
k) (MPBall -> CN MPBall
forall (f :: * -> *) a. Applicative f => a -> f a
pure (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)) Vector (CN MPBall)
v
    delta :: Integer -> Integer -> CN MPBall
    delta :: Integer -> Integer -> CN MPBall
delta Integer
i Integer
k = if Integer
i Integer -> Integer -> EqCompareType Integer Integer
forall a b. HasEqAsymmetric a b => a -> b -> EqCompareType a b
== Integer
k then (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
1) else (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)

jacobian :: [BoxFun] -> Vector (CN MPBall) -> M.Matrix (CN MPBall)
jacobian :: [BoxFun] -> Vector (CN MPBall) -> Matrix (CN MPBall)
jacobian [BoxFun]
fs Vector (CN MPBall)
v =
    Integer
-> Integer
-> (Integer -> Integer -> CN MPBall)
-> Matrix (CN MPBall)
forall a.
Integer -> Integer -> (Integer -> Integer -> a) -> Matrix a
M.create ([BoxFun] -> Integer
forall (t :: * -> *) a. Foldable t => t a -> Integer
length [BoxFun]
fs) Integer
highestDiminseionInFs Integer -> Integer -> CN MPBall
a
    where
    highestDiminseionInFs :: Integer
highestDiminseionInFs = [Integer] -> Integer
forall t. CanMinMaxSameType t => [t] -> t
maximum ((BoxFun -> Integer) -> [BoxFun] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
map BoxFun -> Integer
dimension [BoxFun]
fs)

    a :: Integer -> Integer -> CN MPBall
a Integer
i Integer
j = Differential (CN MPBall) -> CN MPBall
forall a. Differential a -> a
diff_dx (Differential (CN MPBall) -> CN MPBall)
-> Differential (CN MPBall) -> CN MPBall
forall a b. (a -> b) -> a -> b
$ BoxFun
-> Vector (Differential (CN MPBall)) -> Differential (CN MPBall)
bf_eval ([BoxFun]
fs[BoxFun] -> Integer -> BoxFun
forall n a. CanBeInteger n => [a] -> n -> a
!!Integer
i) (Integer -> Vector (Differential (CN MPBall))
w Integer
j)
    w :: Integer -> Vector (Differential (CN MPBall))
w Integer
j = (Integer -> CN MPBall -> Differential (CN MPBall))
-> Vector (CN MPBall) -> Vector (Differential (CN MPBall))
forall a b. (Integer -> a -> b) -> Vector a -> Vector b
V.imap (\Integer
k CN MPBall
x -> CN MPBall -> CN MPBall -> Differential (CN MPBall)
forall a. a -> a -> Differential a
OrderOne CN MPBall
x (Integer -> Integer -> CN MPBall
delta Integer
j Integer
k)) Vector (CN MPBall)
v
    delta :: Integer -> Integer -> CN MPBall
    delta :: Integer -> Integer -> CN MPBall
delta Integer
i Integer
k = if Integer
i Integer -> Integer -> EqCompareType Integer Integer
forall a b. HasEqAsymmetric a b => a -> b -> EqCompareType a b
== Integer
k then (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
1) else (MPBall -> CN MPBall
forall v. v -> CN v
cn (MPBall -> CN MPBall) -> MPBall -> CN MPBall
forall a b. (a -> b) -> a -> b
$ Integer -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall Integer
0)

gradientUsingGradient :: BoxFun -> Box -> Box
gradientUsingGradient :: BoxFun -> Vector (CN MPBall) -> Vector (CN MPBall)
gradientUsingGradient BoxFun
f Vector (CN MPBall)
v =
    (CN MPBall -> CN MPBall -> CN MPBall)
-> Vector (CN MPBall) -> Vector (CN MPBall) -> Vector (CN MPBall)
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
V.zipWith CN MPBall -> CN MPBall -> CN MPBall
forall i.
(IsInterval i, CanMinMaxSameType (IntervalEndpoint i)) =>
i -> i -> i
fromEndpointsAsIntervals SubType (Vector (CN MPBall)) (Vector (CN MPBall))
Vector (CN MPBall)
lowerBounds AddType (Vector (CN MPBall)) (Vector (CN MPBall))
Vector (CN MPBall)
upperBounds
    where
        lowerBounds :: SubType (Vector (CN MPBall)) (Vector (CN MPBall))
lowerBounds = Vector (CN MPBall)
firstDerivatives Vector (CN MPBall)
-> Vector (CN MPBall)
-> SubType (Vector (CN MPBall)) (Vector (CN MPBall))
forall t1 t2. CanSub t1 t2 => t1 -> t2 -> SubType t1 t2
- Matrix (CN MPBall)
secondDerivatives Matrix (CN MPBall)
-> Vector (CN MPBall)
-> MulType (Matrix (CN MPBall)) (Vector (CN MPBall))
forall t1 t2. CanMulAsymmetric t1 t2 => t1 -> t2 -> MulType t1 t2
* (CN MPBall -> CN MPBall)
-> Vector (CN MPBall) -> Vector (CN MPBall)
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((MPBall -> MPBall) -> CN MPBall -> CN MPBall
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ErrorBound -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall (ErrorBound -> MPBall)
-> (MPBall -> ErrorBound) -> MPBall -> MPBall
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MPBall -> ErrorBound
forall t. IsBall t => t -> ErrorBound
radius)) Vector (CN MPBall)
v
        upperBounds :: AddType (Vector (CN MPBall)) (Vector (CN MPBall))
upperBounds = Vector (CN MPBall)
firstDerivatives Vector (CN MPBall)
-> Vector (CN MPBall)
-> AddType (Vector (CN MPBall)) (Vector (CN MPBall))
forall t1 t2. CanAddAsymmetric t1 t2 => t1 -> t2 -> AddType t1 t2
+ Matrix (CN MPBall)
secondDerivatives Matrix (CN MPBall)
-> Vector (CN MPBall)
-> MulType (Matrix (CN MPBall)) (Vector (CN MPBall))
forall t1 t2. CanMulAsymmetric t1 t2 => t1 -> t2 -> MulType t1 t2
* (CN MPBall -> CN MPBall)
-> Vector (CN MPBall) -> Vector (CN MPBall)
forall a b. (a -> b) -> Vector a -> Vector b
V.map ((MPBall -> MPBall) -> CN MPBall -> CN MPBall
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ErrorBound -> MPBall
forall t. CanBeMPBall t => t -> MPBall
mpBall (ErrorBound -> MPBall)
-> (MPBall -> ErrorBound) -> MPBall -> MPBall
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MPBall -> ErrorBound
forall t. IsBall t => t -> ErrorBound
radius)) Vector (CN MPBall)
v
        firstDerivatives :: Vector (CN MPBall)
firstDerivatives  = [Vector (CN MPBall)] -> Vector (CN MPBall)
forall a. [a] -> a
head ([Vector (CN MPBall)] -> Vector (CN MPBall))
-> [Vector (CN MPBall)] -> Vector (CN MPBall)
forall a b. (a -> b) -> a -> b
$ Matrix (CN MPBall) -> [Vector (CN MPBall)]
forall a. Matrix a -> [Vector a]
M.rows (Matrix (CN MPBall) -> [Vector (CN MPBall)])
-> Matrix (CN MPBall) -> [Vector (CN MPBall)]
forall a b. (a -> b) -> a -> b
$ [BoxFun] -> Vector (CN MPBall) -> Matrix (CN MPBall)
jacobian [BoxFun
f] (Vector (CN MPBall) -> CentreType (Vector (CN MPBall))
forall t. IsBall t => t -> CentreType t
centre Vector (CN MPBall)
v)
        secondDerivatives :: Matrix (CN MPBall)
secondDerivatives = (CN MPBall -> CN MPBall)
-> Matrix (CN MPBall) -> Matrix (CN MPBall)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CN MPBall -> CN MPBall
forall t. CanAbs t => t -> AbsType t
abs (Matrix (CN MPBall) -> Matrix (CN MPBall))
-> Matrix (CN MPBall) -> Matrix (CN MPBall)
forall a b. (a -> b) -> a -> b
$ BoxFun -> Vector (CN MPBall) -> Matrix (CN MPBall)
hessian BoxFun
f Vector (CN MPBall)
v
        p :: Precision
p = Vector (CN MPBall) -> Precision
forall t. HasPrecision t => t -> Precision
getPrecision Vector (CN MPBall)
v