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

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) # Methods (Num a, Enum a) => Enum (Sparse a) # Methodssucc :: Sparse a -> Sparse a #pred :: Sparse a -> Sparse a #toEnum :: Int -> Sparse a #fromEnum :: Sparse a -> Int #enumFrom :: Sparse a -> [Sparse a] #enumFromThen :: Sparse a -> Sparse a -> [Sparse a] #enumFromTo :: Sparse a -> Sparse a -> [Sparse a] #enumFromThenTo :: Sparse a -> Sparse a -> Sparse a -> [Sparse a] # (Num a, Eq a) => Eq (Sparse a) # Methods(==) :: Sparse a -> Sparse a -> Bool #(/=) :: Sparse a -> Sparse a -> Bool # Floating a => Floating (Sparse a) # Methodspi :: Sparse a #exp :: Sparse a -> Sparse a #log :: Sparse a -> Sparse a #sqrt :: Sparse a -> Sparse a #(**) :: Sparse a -> Sparse a -> Sparse a #logBase :: Sparse a -> Sparse a -> Sparse a #sin :: Sparse a -> Sparse a #cos :: Sparse a -> Sparse a #tan :: Sparse a -> Sparse a #asin :: Sparse a -> Sparse a #acos :: Sparse a -> Sparse a #atan :: Sparse a -> Sparse a #sinh :: Sparse a -> Sparse a #cosh :: Sparse a -> Sparse a #tanh :: Sparse a -> Sparse a #asinh :: Sparse a -> Sparse a #acosh :: Sparse a -> Sparse a #atanh :: Sparse a -> Sparse a #log1p :: Sparse a -> Sparse a #expm1 :: Sparse a -> Sparse a #log1pexp :: Sparse a -> Sparse a #log1mexp :: Sparse a -> Sparse a # Fractional a => Fractional (Sparse a) # Methods(/) :: Sparse a -> Sparse a -> Sparse a #recip :: Sparse a -> Sparse a # Data a => Data (Sparse a) Source # Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Sparse a -> c (Sparse a) #gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Sparse a) #toConstr :: Sparse a -> Constr #dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c (Sparse a)) #dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Sparse a)) #gmapT :: (forall b. Data b => b -> b) -> Sparse a -> Sparse a #gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Sparse a -> r #gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Sparse a -> r #gmapQ :: (forall d. Data d => d -> u) -> Sparse a -> [u] #gmapQi :: Int -> (forall d. Data d => d -> u) -> Sparse a -> u #gmapM :: Monad m => (forall d. Data d => d -> m d) -> Sparse a -> m (Sparse a) #gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Sparse a -> m (Sparse a) #gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Sparse a -> m (Sparse a) # Num a => Num (Sparse a) # Methods(+) :: Sparse a -> Sparse a -> Sparse a #(-) :: Sparse a -> Sparse a -> Sparse a #(*) :: Sparse a -> Sparse a -> Sparse a #negate :: Sparse a -> Sparse a #abs :: Sparse a -> Sparse a #signum :: Sparse a -> Sparse a # (Num a, Ord a) => Ord (Sparse a) # Methodscompare :: Sparse a -> Sparse a -> Ordering #(<) :: Sparse a -> Sparse a -> Bool #(<=) :: Sparse a -> Sparse a -> Bool #(>) :: Sparse a -> Sparse a -> Bool #(>=) :: Sparse a -> Sparse a -> Bool #max :: Sparse a -> Sparse a -> Sparse a #min :: Sparse a -> Sparse a -> Sparse a # Real a => Real (Sparse a) # Methods RealFloat a => RealFloat (Sparse a) # MethodsfloatRadix :: Sparse a -> Integer #floatDigits :: Sparse a -> Int #floatRange :: Sparse a -> (Int, Int) #decodeFloat :: Sparse a -> (Integer, Int) #encodeFloat :: Integer -> Int -> Sparse a #exponent :: Sparse a -> Int #significand :: Sparse a -> Sparse a #scaleFloat :: Int -> Sparse a -> Sparse a #isNaN :: Sparse a -> Bool #isInfinite :: Sparse a -> Bool #isIEEE :: Sparse a -> Bool #atan2 :: Sparse a -> Sparse a -> Sparse a # RealFrac a => RealFrac (Sparse a) # MethodsproperFraction :: Integral b => Sparse a -> (b, Sparse a) #truncate :: Integral b => Sparse a -> b #round :: Integral b => Sparse a -> b #ceiling :: Integral b => Sparse a -> b #floor :: Integral b => Sparse a -> b # Show a => Show (Sparse a) Source # MethodsshowsPrec :: Int -> Sparse a -> ShowS #show :: Sparse a -> String #showList :: [Sparse a] -> ShowS # Erf a => Erf (Sparse a) # Methodserf :: Sparse a -> Sparse a #erfc :: Sparse a -> Sparse a #erfcx :: Sparse a -> Sparse a #normcdf :: Sparse a -> Sparse a # InvErf a => InvErf (Sparse a) # Methodsinverf :: Sparse a -> Sparse a #inverfc :: Sparse a -> Sparse a #invnormcdf :: Sparse a -> Sparse a # Num a => Mode (Sparse a) Source # Associated Typestype Scalar (Sparse a) :: * Source # Methodsauto :: Scalar (Sparse a) -> Sparse a Source #(*^) :: Scalar (Sparse a) -> Sparse a -> Sparse a Source #(^*) :: Sparse a -> Scalar (Sparse a) -> Sparse a Source #(^/) :: Sparse a -> Scalar (Sparse a) -> Sparse a Source # Num a => Jacobian (Sparse a) Source # Associated Typestype D (Sparse a) :: * Source # Methodsunary :: (Scalar (Sparse a) -> Scalar (Sparse a)) -> D (Sparse a) -> Sparse a -> Sparse a Source #lift1 :: (Scalar (Sparse a) -> Scalar (Sparse a)) -> (D (Sparse a) -> D (Sparse a)) -> Sparse a -> Sparse a Source #lift1_ :: (Scalar (Sparse a) -> Scalar (Sparse a)) -> (D (Sparse a) -> D (Sparse a) -> D (Sparse a)) -> Sparse a -> Sparse a Source #binary :: (Scalar (Sparse a) -> Scalar (Sparse a) -> Scalar (Sparse a)) -> D (Sparse a) -> D (Sparse a) -> Sparse a -> Sparse a -> Sparse a Source #lift2 :: (Scalar (Sparse a) -> Scalar (Sparse a) -> Scalar (Sparse a)) -> (D (Sparse a) -> D (Sparse a) -> (D (Sparse a), D (Sparse a))) -> Sparse a -> Sparse a -> Sparse a Source #lift2_ :: (Scalar (Sparse a) -> Scalar (Sparse a) -> Scalar (Sparse a)) -> (D (Sparse a) -> D (Sparse a) -> D (Sparse a) -> (D (Sparse a), D (Sparse a))) -> Sparse a -> Sparse a -> Sparse a Source # Num a => Grad (Sparse a) [a] (a, [a]) a Source # Methodspack :: Sparse a -> [Sparse a] -> Sparse a Source #unpack :: ([a] -> [a]) -> [a] Source #unpack' :: ([a] -> (a, [a])) -> (a, [a]) Source # Num a => Grads (Sparse a) (Cofree [] a) a Source # Methodspacks :: Sparse a -> [Sparse a] -> Sparse a Source #unpacks :: ([a] -> Cofree [] a) -> Cofree [] a Source # Grads i o a => Grads (Sparse a -> i) (a -> o) a Source # Methodspacks :: (Sparse a -> i) -> [Sparse a] -> Sparse a Source #unpacks :: ([a] -> Cofree [] a) -> a -> o Source # Grad i o o' a => Grad (Sparse a -> i) (a -> o) (a -> o') a Source # Methodspack :: (Sparse a -> i) -> [Sparse a] -> Sparse a Source #unpack :: ([a] -> [a]) -> a -> o Source #unpack' :: ([a] -> (a, [a])) -> a -> o' Source # type Scalar (Sparse a) Source # type Scalar (Sparse a) = a type D (Sparse a) Source # type D (Sparse a) = Sparse a

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

Embed a constant

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 #

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 # Methodspack :: Sparse a -> [Sparse a] -> Sparse a Source #unpack :: ([a] -> [a]) -> [a] Source #unpack' :: ([a] -> (a, [a])) -> (a, [a]) Source # Grad i o o' a => Grad (Sparse a -> i) (a -> o) (a -> o') a Source # Methodspack :: (Sparse a -> i) -> [Sparse a] -> Sparse a Source #unpack :: ([a] -> [a]) -> a -> o Source #unpack' :: ([a] -> (a, [a])) -> a -> o' Source #

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

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

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 # Methodspacks :: Sparse a -> [Sparse a] -> Sparse a Source #unpacks :: ([a] -> Cofree [] a) -> Cofree [] a Source # Grads i o a => Grads (Sparse a -> i) (a -> o) a Source # Methodspacks :: (Sparse a -> i) -> [Sparse a] -> Sparse a Source #unpacks :: ([a] -> Cofree [] a) -> a -> o 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 #