ad-4.3.1: Automatic Differentiation

Copyright (c) Edward Kmett 2010-2015 BSD3 ekmett@gmail.com experimental GHC only None Haskell2010

Numeric.AD.Rank1.Sparse

Description

Higher order derivatives via a "dual number tower".

Synopsis

# Documentation

data Sparse a Source

We only store partials in sorted order, so the map contained in a partial will only contain partials with equal or greater keys to that of the map in which it was found. This should be key for efficiently computing sparse hessians. there are only (n + k - 1) choose (k - 1) distinct nth partial derivatives of a function with k inputs.

Instances

 (Num a, Bounded a) => Bounded (Sparse a) (Num a, Enum a) => Enum (Sparse a) (Num a, Eq a) => Eq (Sparse a) Floating a => Floating (Sparse a) Fractional a => Fractional (Sparse a) Data a => Data (Sparse a) Source Num a => Num (Sparse a) (Num a, Ord a) => Ord (Sparse a) Real a => Real (Sparse a) RealFloat a => RealFloat (Sparse a) RealFrac a => RealFrac (Sparse a) Show a => Show (Sparse a) Source Erf a => Erf (Sparse a) InvErf a => InvErf (Sparse a) Num a => Mode (Sparse a) Source Num a => Jacobian (Sparse a) Source Num a => Grad (Sparse a) [a] (a, [a]) a Source Num a => Grads (Sparse a) (Cofree [] a) a Source Grads i o a => Grads (Sparse a -> i) (a -> o) a Source Grad i o o' a => Grad (Sparse a -> i) (a -> o) (a -> o') a Source type Scalar (Sparse a) = a Source type D (Sparse a) = Sparse a Source

auto :: Mode t => Scalar t -> t Source

Embed a constant

# Sparse Gradients

grad :: (Traversable f, Num a) => (f (Sparse a) -> Sparse a) -> f a -> f a Source

grad' :: (Traversable f, Num a) => (f (Sparse a) -> Sparse a) -> f a -> (a, f a) Source

gradWith :: (Traversable f, Num a) => (a -> a -> b) -> (f (Sparse a) -> Sparse a) -> f a -> f b Source

gradWith' :: (Traversable f, Num a) => (a -> a -> b) -> (f (Sparse a) -> Sparse a) -> f a -> (a, f b) Source

# Variadic Gradients

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

Instances

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

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

# Higher-Order Gradients

grads :: (Traversable f, Num a) => (f (Sparse a) -> Sparse a) -> f a -> Cofree f a Source

# Variadic Higher-Order Gradients

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

Minimal complete definition

Instances

 Num a => Grads (Sparse a) (Cofree [] a) a Source Grads i o a => Grads (Sparse a -> i) (a -> o) a Source

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

# Sparse Jacobians (synonyms)

jacobian :: (Traversable f, Functor g, Num a) => (f (Sparse a) -> g (Sparse a)) -> f a -> g (f a) Source

jacobian' :: (Traversable f, Functor g, Num a) => (f (Sparse a) -> g (Sparse a)) -> f a -> g (a, f a) Source

jacobianWith :: (Traversable f, Functor g, Num a) => (a -> a -> b) -> (f (Sparse a) -> g (Sparse a)) -> f a -> g (f b) Source

jacobianWith' :: (Traversable f, Functor g, Num a) => (a -> a -> b) -> (f (Sparse a) -> g (Sparse a)) -> f a -> g (a, f b) Source

jacobians :: (Traversable f, Functor g, Num a) => (f (Sparse a) -> g (Sparse a)) -> f a -> g (Cofree f a) Source

# Sparse Hessians

hessian :: (Traversable f, Num a) => (f (Sparse a) -> Sparse a) -> f a -> f (f a) Source

hessian' :: (Traversable f, Num a) => (f (Sparse a) -> Sparse a) -> f a -> (a, f (a, f a)) Source

hessianF :: (Traversable f, Functor g, Num a) => (f (Sparse a) -> g (Sparse a)) -> f a -> g (f (f a)) Source

hessianF' :: (Traversable f, Functor g, Num a) => (f (Sparse a) -> g (Sparse a)) -> f a -> g (a, f (a, f a)) Source