| Copyright | (c) Edward Kmett 2010-2015 |
|---|---|
| License | BSD3 |
| Maintainer | ekmett@gmail.com |
| Stability | experimental |
| Portability | GHC only |
| Safe Haskell | None |
| Language | Haskell2010 |
Numeric.AD.Internal.Kahn
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.
- newtype Kahn a = Kahn (Tape a (Kahn a))
- data Tape a t
- partials :: forall a. Num a => Kahn a -> [(Int, a)]
- partialArray :: Num a => (Int, Int) -> Kahn a -> Array Int a
- partialMap :: Num a => Kahn a -> IntMap a
- derivative :: Num a => Kahn a -> a
- derivative' :: Num a => Kahn a -> (a, a)
- vgrad :: Grad i o o' a => i -> o
- vgrad' :: Grad i o o' a => i -> o'
- class Num a => Grad i o o' a | i -> a o o', o -> a i o', o' -> a i o where
- bind :: Traversable f => f a -> (f (Kahn a), (Int, Int))
- unbind :: Functor f => f (Kahn a) -> Array Int a -> f a
- unbindMap :: (Functor f, Num a) => f (Kahn a) -> IntMap a -> f a
- unbindWith :: (Functor f, Num a) => (a -> b -> c) -> f (Kahn a) -> Array Int b -> f c
- unbindMapWithDefault :: (Functor f, Num a) => b -> (a -> b -> c) -> f (Kahn a) -> IntMap b -> f c
- primal :: Num a => Kahn a -> a
- var :: a -> Int -> Kahn a
- varId :: Kahn a -> Int
Documentation
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.
Instances
| (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) Source # | |
| MuRef (Kahn a) Source # | |
| Erf a => Erf (Kahn a) # | |
| InvErf a => InvErf (Kahn a) # | |
| Num a => Mode (Kahn a) Source # | |
| Num a => Jacobian (Kahn a) Source # | |
| Num a => Grad (Kahn a) [a] (a, [a]) a Source # | |
| Grad i o o' a => Grad (Kahn a -> i) (a -> o) (a -> o') a Source # | |
| type DeRef (Kahn a) Source # | |
| type Scalar (Kahn a) Source # | |
| type D (Kahn a) Source # | |
A Tape records the information needed back propagate from the output to each input during reverse Mode AD.
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!
derivative :: Num a => Kahn a -> a Source #
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 where Source #