{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE PatternGuards #-}
module Numeric.AD.Double
( AD
, Mode(auto)
, Scalar
, grad
, grad'
, gradWith
, gradWith'
, grads
, Grad , vgrad, vgrad'
, Grads, vgrads
, jacobian
, jacobian'
, jacobianWith
, jacobianWith'
, jacobians
, jacobianT
, jacobianWithT
, hessian
, hessian'
, hessianF
, hessianF'
, hessianProduct
, hessianProduct'
, diff
, diffF
, diff'
, diffF'
, diffs
, diffsF
, diffs0
, diffs0F
, du
, du'
, duF
, duF'
, dus
, dus0
, dusF
, dus0F
, taylor
, taylor0
, maclaurin
, maclaurin0
, conjugateGradientDescent
, conjugateGradientAscent
, Jet(..)
, headJet
, tailJet
, jet
) where
import Data.Functor.Compose
import Data.Reflection (Reifies)
import Data.Typeable
import Numeric.AD.Internal.Forward.Double (ForwardDouble)
import Numeric.AD.Internal.Kahn.Double (Grad, vgrad, vgrad')
import Numeric.AD.Internal.On
import Numeric.AD.Internal.Reverse (Reverse, Tape)
import Numeric.AD.Internal.Sparse.Double (SparseDouble, Grads, vgrads)
import Numeric.AD.Internal.Type
import Numeric.AD.Jet
import Numeric.AD.Mode
import qualified Numeric.AD.Rank1.Forward.Double as ForwardDouble1
import Numeric.AD.Mode.Forward.Double
( diff, diff', diffF, diffF'
, du, du', duF, duF'
, jacobianT, jacobianWithT
)
import Numeric.AD.Mode.Tower.Double
( diffsF, diffs0F, diffs, diffs0
, taylor, taylor0, maclaurin, maclaurin0
, dus, dus0, dusF, dus0F
)
import qualified Numeric.AD.Mode.Reverse as Reverse
import Numeric.AD.Mode.Reverse.Double
( grad, grad', gradWith, gradWith'
, jacobian, jacobian', jacobianWith, jacobianWith'
)
import qualified Numeric.AD.Rank1.Sparse.Double as SparseDouble1
import Numeric.AD.Mode.Sparse.Double
( grads, jacobians, hessian', hessianF'
)
import Numeric.AD.Newton.Double
hessianProduct
:: Traversable f
=> ( forall s. (Reifies s Tape, Typeable s)
=> f (On (Reverse s ForwardDouble))
-> On (Reverse s ForwardDouble)
)
-> f (Double, Double)
-> f Double
hessianProduct :: forall (f :: * -> *).
Traversable f =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s ForwardDouble)) -> On (Reverse s ForwardDouble))
-> f (Double, Double) -> f Double
hessianProduct forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s ForwardDouble)) -> On (Reverse s ForwardDouble)
f = forall (f :: * -> *) (g :: * -> *).
(Functor f, Functor g) =>
(f ForwardDouble -> g ForwardDouble)
-> f (Double, Double) -> g Double
ForwardDouble1.duF (forall (f :: * -> *) a.
(Traversable f, Num a) =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (Reverse s a) -> Reverse s a)
-> f a -> f a
Reverse.grad (forall t. On t -> t
off forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s ForwardDouble)) -> On (Reverse s ForwardDouble)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall t. t -> On t
On))
hessianProduct'
:: Traversable f
=> ( forall s. (Reifies s Tape, Typeable s)
=> f (On (Reverse s ForwardDouble))
-> On (Reverse s ForwardDouble)
)
-> f (Double, Double)
-> f (Double, Double)
hessianProduct' :: forall (f :: * -> *).
Traversable f =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s ForwardDouble)) -> On (Reverse s ForwardDouble))
-> f (Double, Double) -> f (Double, Double)
hessianProduct' forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s ForwardDouble)) -> On (Reverse s ForwardDouble)
f = forall (f :: * -> *) (g :: * -> *).
(Functor f, Functor g) =>
(f ForwardDouble -> g ForwardDouble)
-> f (Double, Double) -> g (Double, Double)
ForwardDouble1.duF' (forall (f :: * -> *) a.
(Traversable f, Num a) =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (Reverse s a) -> Reverse s a)
-> f a -> f a
Reverse.grad (forall t. On t -> t
off forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s ForwardDouble)) -> On (Reverse s ForwardDouble)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall t. t -> On t
On))
hessian
:: Traversable f
=> ( forall s. (Reifies s Tape, Typeable s)
=> f (On (Reverse s SparseDouble))
-> On (Reverse s SparseDouble)
)
-> f Double
-> f (f Double)
hessian :: forall (f :: * -> *).
Traversable f =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s SparseDouble)) -> On (Reverse s SparseDouble))
-> f Double -> f (f Double)
hessian forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s SparseDouble)) -> On (Reverse s SparseDouble)
f = forall (f :: * -> *) (g :: * -> *).
(Traversable f, Functor g) =>
(f SparseDouble -> g SparseDouble) -> f Double -> g (f Double)
SparseDouble1.jacobian (forall (f :: * -> *) a.
(Traversable f, Num a) =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (Reverse s a) -> Reverse s a)
-> f a -> f a
Reverse.grad (forall t. On t -> t
off forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s SparseDouble)) -> On (Reverse s SparseDouble)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall t. t -> On t
On))
hessianF
:: (Traversable f, Functor g)
=> ( forall s. (Reifies s Tape, Typeable s)
=> f (On (Reverse s SparseDouble))
-> g (On (Reverse s SparseDouble))
)
-> f Double
-> g (f (f Double))
hessianF :: forall (f :: * -> *) (g :: * -> *).
(Traversable f, Functor g) =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s SparseDouble)) -> g (On (Reverse s SparseDouble)))
-> f Double -> g (f (f Double))
hessianF forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s SparseDouble)) -> g (On (Reverse s SparseDouble))
f f Double
as = forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) (g :: * -> *).
(Traversable f, Functor g) =>
(f SparseDouble -> g SparseDouble) -> f Double -> g (f Double)
SparseDouble1.jacobian (forall {k} {k1} (f :: k -> *) (g :: k1 -> k) (a :: k1).
f (g a) -> Compose f g a
Compose forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) (g :: * -> *) a.
(Traversable f, Functor g, Num a) =>
(forall s.
(Reifies s Tape, Typeable s) =>
f (Reverse s a) -> g (Reverse s a))
-> f a -> g (f a)
Reverse.jacobian (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall t. On t -> t
off forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s.
(Reifies s Tape, Typeable s) =>
f (On (Reverse s SparseDouble)) -> g (On (Reverse s SparseDouble))
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall t. t -> On t
On)) f Double
as