ad-4.5.6: Automatic Differentiation
Copyright(c) Edward Kmett 2010-2021
LicenseBSD3
Maintainerekmett@gmail.com
Stabilityexperimental
PortabilityGHC only
Safe HaskellSafe-Inferred
LanguageHaskell2010

Numeric.AD

Description

Mixed-Mode Automatic Differentiation.

Each combinator exported from this module chooses an appropriate AD mode. The following basic operations are supported, modified as appropriate by the suffixes below:

  • grad computes the gradient (partial derivatives) of a function at a point
  • jacobian computes the Jacobian matrix of a function at a point
  • diff computes the derivative of a function at a point
  • du computes a directional derivative of a function at a point
  • hessian compute the Hessian matrix (matrix of second partial derivatives) of a function at a point

The suffixes have the following meanings:

  • ' -- also return the answer
  • With lets the user supply a function to blend the input with the output
  • F is a version of the base function lifted to return a Traversable (or Functor) result
  • s means the function returns all higher derivatives in a list or f-branching Stream
  • T means the result is transposed with respect to the traditional formulation.
  • 0 means that the resulting derivative list is padded with 0s at the end.
Synopsis

Documentation

data AD s a Source #

Instances

Instances details
Mode a => Mode (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Associated Types

type Scalar (AD s a) Source #

Methods

isKnownConstant :: AD s a -> Bool Source #

asKnownConstant :: AD s a -> Maybe (Scalar (AD s a)) Source #

isKnownZero :: AD s a -> Bool Source #

auto :: Scalar (AD s a) -> AD s a Source #

(*^) :: Scalar (AD s a) -> AD s a -> AD s a Source #

(^*) :: AD s a -> Scalar (AD s a) -> AD s a Source #

(^/) :: AD s a -> Scalar (AD s a) -> AD s a Source #

zero :: AD s a Source #

Bounded a => Bounded (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

minBound :: AD s a #

maxBound :: AD s a #

Enum a => Enum (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

succ :: AD s a -> AD s a #

pred :: AD s a -> AD s a #

toEnum :: Int -> AD s a #

fromEnum :: AD s a -> Int #

enumFrom :: AD s a -> [AD s a] #

enumFromThen :: AD s a -> AD s a -> [AD s a] #

enumFromTo :: AD s a -> AD s a -> [AD s a] #

enumFromThenTo :: AD s a -> AD s a -> AD s a -> [AD s a] #

Floating a => Floating (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

pi :: AD s a #

exp :: AD s a -> AD s a #

log :: AD s a -> AD s a #

sqrt :: AD s a -> AD s a #

(**) :: AD s a -> AD s a -> AD s a #

logBase :: AD s a -> AD s a -> AD s a #

sin :: AD s a -> AD s a #

cos :: AD s a -> AD s a #

tan :: AD s a -> AD s a #

asin :: AD s a -> AD s a #

acos :: AD s a -> AD s a #

atan :: AD s a -> AD s a #

sinh :: AD s a -> AD s a #

cosh :: AD s a -> AD s a #

tanh :: AD s a -> AD s a #

asinh :: AD s a -> AD s a #

acosh :: AD s a -> AD s a #

atanh :: AD s a -> AD s a #

log1p :: AD s a -> AD s a #

expm1 :: AD s a -> AD s a #

log1pexp :: AD s a -> AD s a #

log1mexp :: AD s a -> AD s a #

RealFloat a => RealFloat (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

floatRadix :: AD s a -> Integer #

floatDigits :: AD s a -> Int #

floatRange :: AD s a -> (Int, Int) #

decodeFloat :: AD s a -> (Integer, Int) #

encodeFloat :: Integer -> Int -> AD s a #

exponent :: AD s a -> Int #

significand :: AD s a -> AD s a #

scaleFloat :: Int -> AD s a -> AD s a #

isNaN :: AD s a -> Bool #

isInfinite :: AD s a -> Bool #

isDenormalized :: AD s a -> Bool #

isNegativeZero :: AD s a -> Bool #

isIEEE :: AD s a -> Bool #

atan2 :: AD s a -> AD s a -> AD s a #

Num a => Num (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

(+) :: AD s a -> AD s a -> AD s a #

(-) :: AD s a -> AD s a -> AD s a #

(*) :: AD s a -> AD s a -> AD s a #

negate :: AD s a -> AD s a #

abs :: AD s a -> AD s a #

signum :: AD s a -> AD s a #

fromInteger :: Integer -> AD s a #

Read a => Read (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

readsPrec :: Int -> ReadS (AD s a) #

readList :: ReadS [AD s a] #

readPrec :: ReadPrec (AD s a) #

readListPrec :: ReadPrec [AD s a] #

Fractional a => Fractional (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

(/) :: AD s a -> AD s a -> AD s a #

recip :: AD s a -> AD s a #

fromRational :: Rational -> AD s a #

Real a => Real (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

toRational :: AD s a -> Rational #

RealFrac a => RealFrac (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

properFraction :: Integral b => AD s a -> (b, AD s a) #

truncate :: Integral b => AD s a -> b #

round :: Integral b => AD s a -> b #

ceiling :: Integral b => AD s a -> b #

floor :: Integral b => AD s a -> b #

Show a => Show (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

showsPrec :: Int -> AD s a -> ShowS #

show :: AD s a -> String #

showList :: [AD s a] -> ShowS #

Erf a => Erf (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

erf :: AD s a -> AD s a #

erfc :: AD s a -> AD s a #

erfcx :: AD s a -> AD s a #

normcdf :: AD s a -> AD s a #

InvErf a => InvErf (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

inverf :: AD s a -> AD s a #

inverfc :: AD s a -> AD s a #

invnormcdf :: AD s a -> AD s a #

Eq a => Eq (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

(==) :: AD s a -> AD s a -> Bool #

(/=) :: AD s a -> AD s a -> Bool #

Ord a => Ord (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Methods

compare :: AD s a -> AD s a -> Ordering #

(<) :: AD s a -> AD s a -> Bool #

(<=) :: AD s a -> AD s a -> Bool #

(>) :: AD s a -> AD s a -> Bool #

(>=) :: AD s a -> AD s a -> Bool #

max :: AD s a -> AD s a -> AD s a #

min :: AD s a -> AD s a -> AD s a #

type Scalar (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

type Scalar (AD s a) = Scalar a

AD modes

class (Num t, Num (Scalar t)) => Mode t where Source #

Minimal complete definition

Nothing

Methods

auto :: Scalar t -> t Source #

Embed a constant

default auto :: Scalar t ~ t => Scalar t -> t Source #

Instances

Instances details
Mode ForwardDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Forward.Double

Associated Types

type Scalar ForwardDouble Source #

Mode KahnDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn.Double

Associated Types

type Scalar KahnDouble Source #

Mode KahnFloat Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn.Float

Associated Types

type Scalar KahnFloat Source #

Mode SparseDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Sparse.Double

Associated Types

type Scalar SparseDouble Source #

Mode TowerDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Tower.Double

Associated Types

type Scalar TowerDouble Source #

Mode Int16 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Int16 Source #

Mode Int32 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Int32 Source #

Mode Int64 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Int64 Source #

Mode Int8 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Int8 Source #

Mode Word16 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Word16 Source #

Mode Word32 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Word32 Source #

Mode Word64 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Word64 Source #

Mode Word8 Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Word8 Source #

Mode Integer Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Integer Source #

Mode Natural Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Natural Source #

Mode Double Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Double Source #

Mode Float Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Float Source #

Mode Int Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Int Source #

Mode Word Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar Word Source #

Num a => Mode (Forward a) Source # 
Instance details

Defined in Numeric.AD.Internal.Forward

Associated Types

type Scalar (Forward a) Source #

Num a => Mode (Id a) Source # 
Instance details

Defined in Numeric.AD.Internal.Identity

Associated Types

type Scalar (Id a) Source #

Methods

isKnownConstant :: Id a -> Bool Source #

asKnownConstant :: Id a -> Maybe (Scalar (Id a)) Source #

isKnownZero :: Id a -> Bool Source #

auto :: Scalar (Id a) -> Id a Source #

(*^) :: Scalar (Id a) -> Id a -> Id a Source #

(^*) :: Id a -> Scalar (Id a) -> Id a Source #

(^/) :: Id a -> Scalar (Id a) -> Id a Source #

zero :: Id a Source #

Num a => Mode (Kahn a) Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn

Associated Types

type Scalar (Kahn a) Source #

(Mode t, Mode (Scalar t), Num (Scalar (Scalar t))) => Mode (On t) Source # 
Instance details

Defined in Numeric.AD.Internal.On

Associated Types

type Scalar (On t) Source #

Methods

isKnownConstant :: On t -> Bool Source #

asKnownConstant :: On t -> Maybe (Scalar (On t)) Source #

isKnownZero :: On t -> Bool Source #

auto :: Scalar (On t) -> On t Source #

(*^) :: Scalar (On t) -> On t -> On t Source #

(^*) :: On t -> Scalar (On t) -> On t Source #

(^/) :: On t -> Scalar (On t) -> On t Source #

zero :: On t Source #

Reifies s Tape => Mode (ReverseDouble s) Source # 
Instance details

Defined in Numeric.AD.Internal.Reverse.Double

Associated Types

type Scalar (ReverseDouble s) Source #

Num a => Mode (Sparse a) Source # 
Instance details

Defined in Numeric.AD.Internal.Sparse

Associated Types

type Scalar (Sparse a) Source #

Num a => Mode (Tower a) Source # 
Instance details

Defined in Numeric.AD.Internal.Tower

Associated Types

type Scalar (Tower a) Source #

RealFloat a => Mode (Complex a) Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar (Complex a) Source #

Integral a => Mode (Ratio a) Source # 
Instance details

Defined in Numeric.AD.Mode

Associated Types

type Scalar (Ratio a) Source #

(Num a, Traversable f) => Mode (Dense f a) Source # 
Instance details

Defined in Numeric.AD.Internal.Dense

Associated Types

type Scalar (Dense f a) Source #

Methods

isKnownConstant :: Dense f a -> Bool Source #

asKnownConstant :: Dense f a -> Maybe (Scalar (Dense f a)) Source #

isKnownZero :: Dense f a -> Bool Source #

auto :: Scalar (Dense f a) -> Dense f a Source #

(*^) :: Scalar (Dense f a) -> Dense f a -> Dense f a Source #

(^*) :: Dense f a -> Scalar (Dense f a) -> Dense f a Source #

(^/) :: Dense f a -> Scalar (Dense f a) -> Dense f a Source #

zero :: Dense f a Source #

(Representable f, Num a) => Mode (Repr f a) Source # 
Instance details

Defined in Numeric.AD.Internal.Dense.Representable

Associated Types

type Scalar (Repr f a) Source #

Methods

isKnownConstant :: Repr f a -> Bool Source #

asKnownConstant :: Repr f a -> Maybe (Scalar (Repr f a)) Source #

isKnownZero :: Repr f a -> Bool Source #

auto :: Scalar (Repr f a) -> Repr f a Source #

(*^) :: Scalar (Repr f a) -> Repr f a -> Repr f a Source #

(^*) :: Repr f a -> Scalar (Repr f a) -> Repr f a Source #

(^/) :: Repr f a -> Scalar (Repr f a) -> Repr f a Source #

zero :: Repr f a Source #

(Reifies s Tape, Num a) => Mode (Reverse s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Reverse

Associated Types

type Scalar (Reverse s a) Source #

Mode a => Mode (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

Associated Types

type Scalar (AD s a) Source #

Methods

isKnownConstant :: AD s a -> Bool Source #

asKnownConstant :: AD s a -> Maybe (Scalar (AD s a)) Source #

isKnownZero :: AD s a -> Bool Source #

auto :: Scalar (AD s a) -> AD s a Source #

(*^) :: Scalar (AD s a) -> AD s a -> AD s a Source #

(^*) :: AD s a -> Scalar (AD s a) -> AD s a Source #

(^/) :: AD s a -> Scalar (AD s a) -> AD s a Source #

zero :: AD s a Source #

(Mode a, Mode b, Chosen s, Scalar a ~ Scalar b) => Mode (Or s a b) Source # 
Instance details

Defined in Numeric.AD.Internal.Or

Associated Types

type Scalar (Or s a b) Source #

Methods

isKnownConstant :: Or s a b -> Bool Source #

asKnownConstant :: Or s a b -> Maybe (Scalar (Or s a b)) Source #

isKnownZero :: Or s a b -> Bool Source #

auto :: Scalar (Or s a b) -> Or s a b Source #

(*^) :: Scalar (Or s a b) -> Or s a b -> Or s a b Source #

(^*) :: Or s a b -> Scalar (Or s a b) -> Or s a b Source #

(^/) :: Or s a b -> Scalar (Or s a b) -> Or s a b Source #

zero :: Or s a b Source #

type family Scalar t Source #

Instances

Instances details
type Scalar ForwardDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Forward.Double

type Scalar KahnDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn.Double

type Scalar KahnFloat Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn.Float

type Scalar SparseDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Sparse.Double

type Scalar TowerDouble Source # 
Instance details

Defined in Numeric.AD.Internal.Tower.Double

type Scalar Int16 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Int32 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Int64 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Int8 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Word16 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Word32 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Word64 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Word8 Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Integer Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Natural Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Double Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Float Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Int Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar Int = Int
type Scalar Word Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar (Forward a) Source # 
Instance details

Defined in Numeric.AD.Internal.Forward

type Scalar (Forward a) = a
type Scalar (Id a) Source # 
Instance details

Defined in Numeric.AD.Internal.Identity

type Scalar (Id a) = a
type Scalar (Kahn a) Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn

type Scalar (Kahn a) = a
type Scalar (On t) Source # 
Instance details

Defined in Numeric.AD.Internal.On

type Scalar (On t) = Scalar (Scalar t)
type Scalar (ReverseDouble s) Source # 
Instance details

Defined in Numeric.AD.Internal.Reverse.Double

type Scalar (Sparse a) Source # 
Instance details

Defined in Numeric.AD.Internal.Sparse

type Scalar (Sparse a) = a
type Scalar (Tower a) Source # 
Instance details

Defined in Numeric.AD.Internal.Tower

type Scalar (Tower a) = a
type Scalar (Complex a) Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar (Complex a) = Complex a
type Scalar (Ratio a) Source # 
Instance details

Defined in Numeric.AD.Mode

type Scalar (Ratio a) = Ratio a
type Scalar (Dense f a) Source # 
Instance details

Defined in Numeric.AD.Internal.Dense

type Scalar (Dense f a) = a
type Scalar (Repr f a) Source # 
Instance details

Defined in Numeric.AD.Internal.Dense.Representable

type Scalar (Repr f a) = a
type Scalar (Reverse s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Reverse

type Scalar (Reverse s a) = a
type Scalar (AD s a) Source # 
Instance details

Defined in Numeric.AD.Internal.Type

type Scalar (AD s a) = Scalar a
type Scalar (Or s a b) Source # 
Instance details

Defined in Numeric.AD.Internal.Or

type Scalar (Or s a b) = Scalar a

Gradients (Reverse Mode)

grad :: (Traversable f, Num a) => (forall s. (Reifies s Tape, Typeable s) => f (Reverse s a) -> Reverse s a) -> f a -> f a Source #

The grad function calculates the gradient of a non-scalar-to-scalar function with reverse-mode AD in a single pass.

>>> grad (\[x,y,z] -> x*y+z) [1,2,3]
[2,1,1]
>>> grad (\[x,y] -> x**y) [0,2]
[0.0,NaN]

grad' :: (Traversable f, Num a) => (forall s. (Reifies s Tape, Typeable s) => f (Reverse s a) -> Reverse s a) -> f a -> (a, f a) Source #

The grad' function calculates the result and gradient of a non-scalar-to-scalar function with reverse-mode AD in a single pass.

>>> grad' (\[x,y,z] -> x*y+z) [1,2,3]
(5,[2,1,1])

gradWith :: (Traversable f, Num a) => (a -> a -> b) -> (forall s. (Reifies s Tape, Typeable s) => f (Reverse s a) -> Reverse s a) -> f a -> f b Source #

grad g f function calculates the gradient of a non-scalar-to-scalar function f with reverse-mode AD in a single pass. The gradient is combined element-wise with the argument using the function g.

grad == gradWith (_ dx -> dx)
id == gradWith const

gradWith' :: (Traversable f, Num a) => (a -> a -> b) -> (forall s. (Reifies s Tape, Typeable s) => f (Reverse s a) -> Reverse s a) -> f a -> (a, f b) Source #

grad' g f calculates the result and gradient of a non-scalar-to-scalar function f with reverse-mode AD in a single pass the gradient is combined element-wise with the argument using the function g.

grad' == gradWith' (_ dx -> dx)

Higher Order Gradients (Sparse-on-Reverse)

grads :: (Traversable f, Num a) => (forall s. f (AD s (Sparse a)) -> AD s (Sparse a)) -> f a -> Cofree f a Source #

Variadic Gradients (Sparse or Kahn)

Variadic combinators for variadic mixed-mode automatic differentiation.

Unfortunately, variadicity comes at the expense of being able to use quantification to avoid sensitivity confusion, so be careful when counting the number of auto calls you use when taking the gradient of a function that takes gradients!

class Num a => Grad i o o' a | i -> a o o', o -> a i o', o' -> a i o Source #

Minimal complete definition

pack, unpack, unpack'

Instances

Instances details
Num a => Grad (Kahn a) [a] (a, [a]) a Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn

Methods

pack :: Kahn a -> [Kahn a] -> Kahn a Source #

unpack :: ([a] -> [a]) -> [a] Source #

unpack' :: ([a] -> (a, [a])) -> (a, [a]) Source #

Grad i o o' a => Grad (Kahn a -> i) (a -> o) (a -> o') a Source # 
Instance details

Defined in Numeric.AD.Internal.Kahn

Methods

pack :: (Kahn a -> i) -> [Kahn a] -> Kahn a Source #

unpack :: ([a] -> [a]) -> a -> o Source #

unpack' :: ([a] -> (a, [a])) -> a -> o' Source #

vgrad :: Grad i o o' a => i -> o Source #

vgrad' :: Grad i o o' a => i -> o' Source #

class Num a => Grads i o a | i -> a o, o -> a i Source #

Minimal complete definition

packs, unpacks

Instances

Instances details
Num a => Grads (Sparse a) (Cofree List a) a Source # 
Instance details

Defined in Numeric.AD.Internal.Sparse

Methods

packs :: Sparse a -> [Sparse a] -> Sparse a Source #

unpacks :: ([a] -> Cofree List a) -> Cofree List a Source #

Grads i o a => Grads (Sparse a -> i) (a -> o) a Source # 
Instance details

Defined in Numeric.AD.Internal.Sparse

Methods

packs :: (Sparse a -> i) -> [Sparse a] -> Sparse a Source #

unpacks :: ([a] -> Cofree List a) -> a -> o Source #

vgrads :: Grads i o a => i -> o Source #

Jacobians (Sparse or Reverse)

jacobian :: (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) Source #

The jacobian function calculates the jacobian of a non-scalar-to-non-scalar function with reverse AD lazily in m passes for m outputs.

>>> jacobian (\[x,y] -> [y,x,x*y]) [2,1]
[[0,1],[1,0],[1,2]]

jacobian' :: (Traversable f, Functor g, Num a) => (forall s. (Reifies s Tape, Typeable s) => f (Reverse s a) -> g (Reverse s a)) -> f a -> g (a, f a) Source #

The jacobian' function calculates both the result and the Jacobian of a nonscalar-to-nonscalar function, using m invocations of reverse AD, where m is the output dimensionality. Applying fmap snd to the result will recover the result of jacobian | An alias for gradF'

>>> jacobian' (\[x,y] -> [y,x,x*y]) [2,1]
[(1,[0,1]),(2,[1,0]),(2,[1,2])]

jacobianWith :: (Traversable f, Functor g, Num a) => (a -> a -> b) -> (forall s. (Reifies s Tape, Typeable s) => f (Reverse s a) -> g (Reverse s a)) -> f a -> g (f b) Source #

'jacobianWith g f' calculates the Jacobian of a non-scalar-to-non-scalar function f with reverse AD lazily in m passes for m outputs.

Instead of returning the Jacobian matrix, the elements of the matrix are combined with the input using the g.

jacobian == jacobianWith (_ dx -> dx)
jacobianWith const == (f x -> const x <$> f x)

jacobianWith' :: (Traversable f, Functor g, Num a) => (a -> a -> b) -> (forall s. (Reifies s Tape, Typeable s) => f (Reverse s a) -> g (Reverse s a)) -> f a -> g (a, f b) Source #

jacobianWith g f' calculates both the result and the Jacobian of a nonscalar-to-nonscalar function f, using m invocations of reverse AD, where m is the output dimensionality. Applying fmap snd to the result will recover the result of jacobianWith

Instead of returning the Jacobian matrix, the elements of the matrix are combined with the input using the g.

jacobian' == jacobianWith' (_ dx -> dx)

Higher Order Jacobian (Sparse-on-Reverse)

jacobians :: (Traversable f, Functor g, Num a) => (forall s. f (AD s (Sparse a)) -> g (AD s (Sparse a))) -> f a -> g (Cofree f a) Source #

Transposed Jacobians (Forward Mode)

jacobianT :: (Traversable f, Functor g, Num a) => (forall s. f (AD s (Forward a)) -> g (AD s (Forward a))) -> f a -> f (g a) Source #

A fast, simple, transposed Jacobian computed with forward-mode AD.

jacobianWithT :: (Traversable f, Functor g, Num a) => (a -> a -> b) -> (forall s. f (AD s (Forward a)) -> g (AD s (Forward a))) -> f a -> f (g b) Source #

A fast, simple, transposed Jacobian computed with Forward mode AD that combines the output with the input.

Hessian (Sparse-On-Reverse)

hessian :: (Traversable f, Num a) => (forall s. (Reifies s Tape, Typeable s) => f (On (Reverse s (Sparse a))) -> On (Reverse s (Sparse a))) -> f a -> f (f a) Source #

Compute the Hessian via the Jacobian of the gradient. gradient is computed in reverse mode and then the Jacobian is computed in sparse (forward) mode.

>>> hessian (\[x,y] -> x*y) [1,2]
[[0,1],[1,0]]

hessian' :: (Traversable f, Num a) => (forall s. f (AD s (Sparse a)) -> AD s (Sparse a)) -> f a -> (a, f (a, f a)) Source #

Hessian Tensors (Sparse or Sparse-On-Reverse)

hessianF :: (Traversable f, Functor g, Num a) => (forall s. (Reifies s Tape, Typeable s) => f (On (Reverse s (Sparse a))) -> g (On (Reverse s (Sparse a)))) -> f a -> g (f (f a)) Source #

Compute the order 3 Hessian tensor on a non-scalar-to-non-scalar function using Sparse-on-Reverse

>>> hessianF (\[x,y] -> [x*y,x+y,exp x*cos y]) [1,2 :: RDouble]
[[[0.0,1.0],[1.0,0.0]],[[0.0,0.0],[0.0,0.0]],[[-1.131204383757,-2.471726672005],[-2.471726672005,1.131204383757]]]

Hessian Tensors (Sparse)

hessianF' :: (Traversable f, Functor g, Num a) => (forall s. f (AD s (Sparse a)) -> g (AD s (Sparse a))) -> f a -> g (a, f (a, f a)) Source #

Hessian Vector Products (Forward-On-Reverse)

hessianProduct :: (Traversable f, Num a) => (forall s. (Reifies s Tape, Typeable s) => f (On (Reverse s (Forward a))) -> On (Reverse s (Forward a))) -> f (a, a) -> f a Source #

hessianProduct f wv computes the product of the hessian H of a non-scalar-to-scalar function f at w = fst <$> wv with a vector v = snd <$> wv using "Pearlmutter's method" from http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.29.6143, which states:

H v = (d/dr) grad_w (w + r v) | r = 0

Or in other words, we take the directional derivative of the gradient. The gradient is calculated in reverse mode, then the directional derivative is calculated in forward mode.

hessianProduct' :: (Traversable f, Num a) => (forall s. (Reifies s Tape, Typeable s) => f (On (Reverse s (Forward a))) -> On (Reverse s (Forward a))) -> f (a, a) -> f (a, a) Source #

hessianProduct' f wv computes both the gradient of a non-scalar-to-scalar f at w = fst <$> wv and the product of the hessian H at w with a vector v = snd <$> wv using "Pearlmutter's method". The outputs are returned wrapped in the same functor.

H v = (d/dr) grad_w (w + r v) | r = 0

Or in other words, we return the gradient and the directional derivative of the gradient. The gradient is calculated in reverse mode, then the directional derivative is calculated in forward mode.

Derivatives (Forward Mode)

diff :: Num a => (forall s. AD s (Forward a) -> AD s (Forward a)) -> a -> a Source #

The diff function calculates the first derivative of a scalar-to-scalar function by forward-mode AD

>>> diff sin 0
1.0

diffF :: (Functor f, Num a) => (forall s. AD s (Forward a) -> f (AD s (Forward a))) -> a -> f a Source #

The diffF function calculates the first derivatives of scalar-to-nonscalar function by Forward mode AD

>>> diffF (\a -> [sin a, cos a]) 0
[1.0,-0.0]

diff' :: Num a => (forall s. AD s (Forward a) -> AD s (Forward a)) -> a -> (a, a) Source #

The diff' function calculates the result and first derivative of scalar-to-scalar function by Forward mode AD

diff' sin == sin &&& cos
diff' f = f &&& d f
>>> diff' sin 0
(0.0,1.0)
>>> diff' exp 0
(1.0,1.0)

diffF' :: (Functor f, Num a) => (forall s. AD s (Forward a) -> f (AD s (Forward a))) -> a -> f (a, a) Source #

The diffF' function calculates the result and first derivatives of a scalar-to-non-scalar function by Forward mode AD

>>> diffF' (\a -> [sin a, cos a]) 0
[(0.0,1.0),(1.0,-0.0)]

Derivatives (Tower)

diffs :: Num a => (forall s. AD s (Tower a) -> AD s (Tower a)) -> a -> [a] Source #

diffsF :: (Functor f, Num a) => (forall s. AD s (Tower a) -> f (AD s (Tower a))) -> a -> f [a] Source #

diffs0 :: Num a => (forall s. AD s (Tower a) -> AD s (Tower a)) -> a -> [a] Source #

diffs0F :: (Functor f, Num a) => (forall s. AD s (Tower a) -> f (AD s (Tower a))) -> a -> f [a] Source #

Directional Derivatives (Forward Mode)

du :: (Functor f, Num a) => (forall s. f (AD s (Forward a)) -> AD s (Forward a)) -> f (a, a) -> a Source #

Compute the directional derivative of a function given a zipped up Functor of the input values and their derivatives

du' :: (Functor f, Num a) => (forall s. f (AD s (Forward a)) -> AD s (Forward a)) -> f (a, a) -> (a, a) Source #

Compute the answer and directional derivative of a function given a zipped up Functor of the input values and their derivatives

duF :: (Functor f, Functor g, Num a) => (forall s. f (AD s (Forward a)) -> g (AD s (Forward a))) -> f (a, a) -> g a Source #

Compute a vector of directional derivatives for a function given a zipped up Functor of the input values and their derivatives.

duF' :: (Functor f, Functor g, Num a) => (forall s. f (AD s (Forward a)) -> g (AD s (Forward a))) -> f (a, a) -> g (a, a) Source #

Compute a vector of answers and directional derivatives for a function given a zipped up Functor of the input values and their derivatives.

Directional Derivatives (Tower)

dus :: (Functor f, Num a) => (forall s. f (AD s (Tower a)) -> AD s (Tower a)) -> f [a] -> [a] Source #

dus0 :: (Functor f, Num a) => (forall s. f (AD s (Tower a)) -> AD s (Tower a)) -> f [a] -> [a] Source #

dusF :: (Functor f, Functor g, Num a) => (forall s. f (AD s (Tower a)) -> g (AD s (Tower a))) -> f [a] -> g [a] Source #

dus0F :: (Functor f, Functor g, Num a) => (forall s. f (AD s (Tower a)) -> g (AD s (Tower a))) -> f [a] -> g [a] Source #

Taylor Series (Tower)

taylor :: Fractional a => (forall s. AD s (Tower a) -> AD s (Tower a)) -> a -> a -> [a] Source #

taylor0 :: Fractional a => (forall s. AD s (Tower a) -> AD s (Tower a)) -> a -> a -> [a] Source #

Maclaurin Series (Tower)

maclaurin :: Fractional a => (forall s. AD s (Tower a) -> AD s (Tower a)) -> a -> [a] Source #

maclaurin0 :: Fractional a => (forall s. AD s (Tower a) -> AD s (Tower a)) -> a -> [a] Source #

Gradient Descent

gradientDescent :: (Traversable f, Fractional a, Ord a) => (forall s. Reifies s Tape => f (Reverse s a) -> Reverse s a) -> f a -> [f a] Source #

The gradientDescent function performs a multivariate optimization, based on the naive-gradient-descent in the file stalingrad/examples/flow-tests/pre-saddle-1a.vlad from the VLAD compiler Stalingrad sources. Its output is a stream of increasingly accurate results. (Modulo the usual caveats.)

It uses reverse mode automatic differentiation to compute the gradient.

gradientAscent :: (Traversable f, Fractional a, Ord a) => (forall s. Reifies s Tape => f (Reverse s a) -> Reverse s a) -> f a -> [f a] Source #

Perform a gradient descent using reverse mode automatic differentiation to compute the gradient.

conjugateGradientDescent :: (Traversable f, Ord a, Fractional a) => (forall s. Chosen s => f (Or s (On (Forward (Forward a))) (Kahn a)) -> Or s (On (Forward (Forward a))) (Kahn a)) -> f a -> [f a] Source #

Perform a conjugate gradient descent using reverse mode automatic differentiation to compute the gradient, and using forward-on-forward mode for computing extrema.

>>> let sq x = x * x
>>> let rosenbrock [x,y] = sq (1 - x) + 100 * sq (y - sq x)
>>> rosenbrock [0,0]
1
>>> rosenbrock (conjugateGradientDescent rosenbrock [0, 0] !! 5) < 0.1
True

conjugateGradientAscent :: (Traversable f, Ord a, Fractional a) => (forall s. Chosen s => f (Or s (On (Forward (Forward a))) (Kahn a)) -> Or s (On (Forward (Forward a))) (Kahn a)) -> f a -> [f a] Source #

Perform a conjugate gradient ascent using reverse mode automatic differentiation to compute the gradient.

stochasticGradientDescent :: (Traversable f, Fractional a, Ord a) => (forall s. Reifies s Tape => e -> f (Reverse s a) -> Reverse s a) -> [e] -> f a -> [f a] Source #

The stochasticGradientDescent function approximates the true gradient of the constFunction by a gradient at a single example. As the algorithm sweeps through the training set, it performs the update for each training example.

It uses reverse mode automatic differentiation to compute the gradient The learning rate is constant through out, and is set to 0.001

Working with towers

data Jet f a Source #

A Jet is a tower of all (higher order) partial derivatives of a function

At each step, a Jet f is wrapped in another layer worth of f.

a :- f a :- f (f a) :- f (f (f a)) :- ...

Constructors

a :- (Jet f (f a)) infixr 3 

Instances

Instances details
Foldable f => Foldable (Jet f) Source # 
Instance details

Defined in Numeric.AD.Jet

Methods

fold :: Monoid m => Jet f m -> m #

foldMap :: Monoid m => (a -> m) -> Jet f a -> m #

foldMap' :: Monoid m => (a -> m) -> Jet f a -> m #

foldr :: (a -> b -> b) -> b -> Jet f a -> b #

foldr' :: (a -> b -> b) -> b -> Jet f a -> b #

foldl :: (b -> a -> b) -> b -> Jet f a -> b #

foldl' :: (b -> a -> b) -> b -> Jet f a -> b #

foldr1 :: (a -> a -> a) -> Jet f a -> a #

foldl1 :: (a -> a -> a) -> Jet f a -> a #

toList :: Jet f a -> [a] #

null :: Jet f a -> Bool #

length :: Jet f a -> Int #

elem :: Eq a => a -> Jet f a -> Bool #

maximum :: Ord a => Jet f a -> a #

minimum :: Ord a => Jet f a -> a #

sum :: Num a => Jet f a -> a #

product :: Num a => Jet f a -> a #

Traversable f => Traversable (Jet f) Source # 
Instance details

Defined in Numeric.AD.Jet

Methods

traverse :: Applicative f0 => (a -> f0 b) -> Jet f a -> f0 (Jet f b) #

sequenceA :: Applicative f0 => Jet f (f0 a) -> f0 (Jet f a) #

mapM :: Monad m => (a -> m b) -> Jet f a -> m (Jet f b) #

sequence :: Monad m => Jet f (m a) -> m (Jet f a) #

Functor f => Functor (Jet f) Source # 
Instance details

Defined in Numeric.AD.Jet

Methods

fmap :: (a -> b) -> Jet f a -> Jet f b #

(<$) :: a -> Jet f b -> Jet f a #

(Functor f, Show (f Showable), Show a) => Show (Jet f a) Source # 
Instance details

Defined in Numeric.AD.Jet

Methods

showsPrec :: Int -> Jet f a -> ShowS #

show :: Jet f a -> String #

showList :: [Jet f a] -> ShowS #

headJet :: Jet f a -> a Source #

Take the head of a Jet.

tailJet :: Jet f a -> Jet f (f a) Source #

Take the tail of a Jet.

jet :: Functor f => Cofree f a -> Jet f a Source #

Construct a Jet by unzipping the layers of a Cofree Comonad.