Portability GHC only experimental ekmett@gmail.com None

Description

This module provides reverse-mode Automatic Differentiation implementation using linear time topological sorting after the fact.

For this form of reverse-mode AD we use `StableName` to recover sharing information from the tape to avoid combinatorial explosion, and thus run asymptotically faster than it could without such sharing information, but the use of side-effects contained herein is benign.

Synopsis

# Documentation

newtype Kahn a Source

`Kahn` is a `Mode` using reverse-mode automatic differentiation that provides fast `diffFU`, `diff2FU`, `grad`, `grad2` and a fast `jacobian` when you have a significantly smaller number of outputs than inputs.

Constructors

 Kahn (Tape a (Kahn a))

Instances

 Typeable1 Kahn (Num a, Bounded a) => Bounded (Kahn a) (Num a, Enum a) => Enum (Kahn a) (Num a, Eq a) => Eq (Kahn a) Floating a => Floating (Kahn a) Fractional a => Fractional (Kahn a) Num a => Num (Kahn a) (Num a, Ord a) => Ord (Kahn a) Real a => Real (Kahn a) RealFloat a => RealFloat (Kahn a) RealFrac a => RealFrac (Kahn a) Show a => Show (Kahn a) MuRef (Kahn a) Erf a => Erf (Kahn a) InvErf a => InvErf (Kahn a) Num a => Mode (Kahn a) Num a => Jacobian (Kahn a) Num a => Grad (Kahn a) [a] (a, [a]) a Grad i o o' a => Grad (Kahn a -> i) (a -> o) (a -> o') a

data Tape a t Source

A `Tape` records the information needed back propagate from the output to each input during reverse `Mode` AD.

Constructors

 Zero Lift !a Var !a !Int Binary !a a a t t Unary !a a t

Instances

 Typeable2 Tape (Data a, Data t) => Data (Tape a t) (Show a, Show t) => Show (Tape a t)

partials :: forall a. Num a => Kahn a -> [(Int, a)]Source

This returns a list of contributions to the partials. The variable ids returned in the list are likely not unique!

partialArray :: Num a => (Int, Int) -> Kahn a -> Array Int aSource

Return an `Array` of `partials` given bounds for the variable IDs.

partialMap :: Num a => Kahn a -> IntMap aSource

Return an `IntMap` of sparse partials

derivative :: Num a => Kahn a -> aSource

derivative' :: Num a => Kahn a -> (a, a)Source

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

Methods

pack :: i -> [Kahn a] -> Kahn aSource

unpack :: ([a] -> [a]) -> oSource

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

Instances

 Num a => Grad (Kahn a) [a] (a, [a]) a Grad i o o' a => Grad (Kahn a -> i) (a -> o) (a -> o') a

bind :: Traversable f => f a -> (f (Kahn a), (Int, Int))Source

unbind :: Functor f => f (Kahn a) -> Array Int a -> f aSource

unbindMap :: (Functor f, Num a) => f (Kahn a) -> IntMap a -> f aSource

unbindWith :: (Functor f, Num a) => (a -> b -> c) -> f (Kahn a) -> Array Int b -> f cSource

unbindMapWithDefault :: (Functor f, Num a) => b -> (a -> b -> c) -> f (Kahn a) -> IntMap b -> f cSource

primal :: Num a => Kahn a -> aSource

var :: a -> Int -> Kahn aSource