backprop-0.2.6.2: Heterogeneous automatic differentation

Copyright(c) Justin Le 2018
LicenseBSD3
Maintainerjustin@jle.im
Stabilityexperimental
Portabilitynon-portable
Safe HaskellNone
LanguageHaskell2010

Prelude.Backprop

Contents

Description

Some lifted versions of common functions found in Prelude (or base in general).

This module is intended to be a catch-all one, so feel free to suggest other functions or submit a PR if you think one would make sense.

See Prelude.Backprop.Num for a version with Num constraints instead of Backprop constraints, and Prelude.Backprop.Explicit for a version allowing you to provide zero, add, and one explicitly.

Since: 0.1.3.0

Synopsis

Foldable and Traversable

sum :: (Foldable t, Functor t, Backprop (t a), Num a, Reifies s W) => BVar s (t a) -> BVar s a Source #

Lifted sum. More efficient than going through toList.

product :: (Foldable t, Functor t, Backprop (t a), Fractional a, Reifies s W) => BVar s (t a) -> BVar s a Source #

Lifted product. More efficient than going through toList.

length :: (Foldable t, Backprop (t a), Num b, Reifies s W) => BVar s (t a) -> BVar s b Source #

Lifted length. More efficient than going through toList.

minimum :: (Foldable t, Functor t, Backprop a, Ord a, Backprop (t a), Reifies s W) => BVar s (t a) -> BVar s a Source #

Lifted minimum. Undefined for situations where minimum would be undefined. More efficient than going through toList.

maximum :: (Foldable t, Functor t, Backprop a, Ord a, Backprop (t a), Reifies s W) => BVar s (t a) -> BVar s a Source #

Lifted maximum. Undefined for situations where maximum would be undefined. More efficient than going through toList.

traverse :: (Traversable t, Applicative f, Foldable f, Backprop a, Backprop b, Backprop (t b), Reifies s W) => (BVar s a -> f (BVar s b)) -> BVar s (t a) -> BVar s (f (t b)) Source #

Lifted traverse. Lifts backpropagatable functions to be backpropagatable functions on Traversable Functors.

toList :: (Traversable t, Backprop a, Reifies s W) => BVar s (t a) -> [BVar s a] Source #

Lifted version of toList. Takes a BVar of a Traversable of items and returns a list of BVars for each item.

You can use this to implement "lifted" versions of Foldable methods like foldr, foldl', etc.; however, sum, product, length, minimum, and maximum have more efficient implementations than simply minimum . toList.

Since: 0.2.2.0

mapAccumL :: (Traversable t, Backprop b, Backprop c, Reifies s W) => (BVar s a -> BVar s b -> (BVar s a, BVar s c)) -> BVar s a -> BVar s (t b) -> (BVar s a, BVar s (t c)) Source #

Lifted version of mapAccumL.

Prior to v0.2.3, required a Backprop constraint on t b.

Since: 0.2.2.0

mapAccumR :: (Traversable t, Backprop b, Backprop c, Reifies s W) => (BVar s a -> BVar s b -> (BVar s a, BVar s c)) -> BVar s a -> BVar s (t b) -> (BVar s a, BVar s (t c)) Source #

Lifted version of mapAccumR.

Prior to v0.2.3, required a Backprop constraint on t b.

Since: 0.2.2.0

foldr :: (Traversable t, Backprop a, Reifies s W) => (BVar s a -> BVar s b -> BVar s b) -> BVar s b -> BVar s (t a) -> BVar s b Source #

Lifed foldr. Essentially just toList composed with a normal list foldr, and is only here for convenience.

Since: 0.2.3.0

foldl' :: (Traversable t, Backprop a, Reifies s W) => (BVar s b -> BVar s a -> BVar s b) -> BVar s b -> BVar s (t a) -> BVar s b Source #

Lifed foldl'. Essentially just toList composed with a normal list foldl', and is only here for convenience.

Since: 0.2.3.0

Functor and Applicative

fmap :: (Traversable f, Backprop a, Backprop b, Reifies s W) => (BVar s a -> BVar s b) -> BVar s (f a) -> BVar s (f b) Source #

Lifted fmap. Lifts backpropagatable functions to be backpropagatable functions on Traversable Functors.

fmapConst :: (Functor f, Foldable f, Backprop b, Backprop (f a), Reifies s W) => BVar s b -> BVar s (f a) -> BVar s (f b) Source #

Efficient version of fmap when used to "replace" all values in a Functor value.

fmapConst x = fmap (const x)

but much more efficient.

Since: 0.2.4.0

(<$>) :: (Traversable f, Backprop a, Backprop b, Reifies s W) => (BVar s a -> BVar s b) -> BVar s (f a) -> BVar s (f b) infixl 4 Source #

Alias for fmap.

(<$) :: (Traversable f, Backprop b, Backprop (f a), Reifies s W) => BVar s b -> BVar s (f a) -> BVar s (f b) infixl 4 Source #

Alias for fmapConst.

Since: 0.2.4.0

($>) :: (Traversable f, Backprop b, Backprop (f a), Reifies s W) => BVar s (f a) -> BVar s b -> BVar s (f b) infixl 4 Source #

Alias for flip fmapConst.

Since: 0.2.4.0

pure :: (Foldable t, Applicative t, Backprop a, Reifies s W) => BVar s a -> BVar s (t a) Source #

Lifted pure.

liftA2 :: (Traversable f, Applicative f, Backprop a, Backprop b, Backprop c, Reifies s W) => (BVar s a -> BVar s b -> BVar s c) -> BVar s (f a) -> BVar s (f b) -> BVar s (f c) Source #

Lifted liftA2. Lifts backpropagatable functions to be backpropagatable functions on Traversable Applicatives.

liftA3 :: (Traversable f, Applicative f, Backprop a, Backprop b, Backprop c, Backprop d, Reifies s W) => (BVar s a -> BVar s b -> BVar s c -> BVar s d) -> BVar s (f a) -> BVar s (f b) -> BVar s (f c) -> BVar s (f d) Source #

Lifted liftA3. Lifts backpropagatable functions to be backpropagatable functions on Traversable Applicatives.

Numeric

fromIntegral :: (Backprop a, Integral a, Integral b, Reifies s W) => BVar s a -> BVar s b Source #

Lifted conversion between two Integral instances.

Since: 0.2.1.0

realToFrac :: (Backprop a, Fractional a, Real a, Fractional b, Real b, Reifies s W) => BVar s a -> BVar s b Source #

Lifted conversion between two Fractional and Real instances.

Since: 0.2.1.0

round :: (RealFrac a, Integral b, Reifies s W) => BVar s a -> BVar s b Source #

Lifted version of round.

Gradient should technically diverge whenever the fractional part is 0.5, but does not do this for convenience reasons.

Since: 0.2.3.0

fromIntegral' :: (Integral a, RealFrac b, Reifies s W) => BVar s a -> BVar s b Source #

Lifted version of fromIntegral, defined to let you return RealFrac instances as targets, instead of only other Integrals. Essentially the opposite of round.

The gradient should technically diverge whenever the fractional part of the downstream gradient is 0.5, but does not do this for convenience reasons.

Since: 0.2.3.0

Misc

coerce :: Coercible a b => BVar s a -> BVar s b Source #

Coerce items inside a BVar.