downhill-0.4.0.0: Reverse mode automatic differentiation
Safe HaskellSafe-Inferred
LanguageHaskell2010

Downhill.Linear.Expr

Synopsis

Expression

data Expr a v where Source #

Expr a v represents a linear expression of type v, containing some free variables of type a.

Constructors

ExprVar :: Expr a a 
ExprSum :: BasicVector v => [Term a v] -> Expr a v 

data Term a v where Source #

Argument f in Term f x must be linear function. That's a law.

Constructors

Term :: (v -> VecBuilder u) -> Expr a u -> Term a v 

Vectors

class Monoid (VecBuilder v) => BasicVector v where Source #

Minimal complete definition

Nothing

Associated Types

type VecBuilder v :: Type Source #

VecBuilder v is a sparse representation of vector v. Edges of a computational graph produce builders, which are then summed into vectors in nodes. Monoid operation <> means addition of vectors, but it doesn't need to compute the sum immediately - it might defer computation until sumBuilder is evaluated.

sumBuilder mempty = zeroV
sumBuilder (x <> y) = sumBuilder x ^+^ sumBuilder y

mempty must be cheap. <> must be O(1).

Methods

sumBuilder :: VecBuilder v -> v Source #

default sumBuilder :: forall b. (VecBuilder v ~ Maybe b, Generic b, Generic v, GBasicVector (Rep b) (Rep v), AdditiveGroup v) => VecBuilder v -> v Source #

identityBuilder :: v -> VecBuilder v Source #

default identityBuilder :: forall b. (VecBuilder v ~ Maybe b, Generic b, Generic v, GBasicVector (Rep b) (Rep v), AdditiveGroup v) => v -> VecBuilder v Source #

Instances

Instances details
BasicVector Integer Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder Integer Source #

BasicVector Double Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder Double Source #

BasicVector Float Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder Float Source #

Num a => BasicVector (AsNum a) Source # 
Instance details

Defined in Downhill.BVar.Num

Associated Types

type VecBuilder (AsNum a) Source #

AdditiveGroup v => BasicVector (DenseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder (DenseVector v) Source #

Monoid (VecBuilder v) => BasicVector (SparseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder (SparseVector v) Source #

(BasicVector a, BasicVector b) => BasicVector (a, b) Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder (a, b) Source #

Methods

sumBuilder :: VecBuilder (a, b) -> (a, b) Source #

identityBuilder :: (a, b) -> VecBuilder (a, b) Source #

(BasicVector a, BasicVector b, BasicVector c) => BasicVector (a, b, c) Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder (a, b, c) Source #

Methods

sumBuilder :: VecBuilder (a, b, c) -> (a, b, c) Source #

identityBuilder :: (a, b, c) -> VecBuilder (a, b, c) Source #

newtype SparseVector v Source #

Normally graph node would compute the sum of gradients and then propagate it to ancestor nodes. That's the best strategy when some computation needs to be performed for backpropagation. Some operations, like constructing/deconstructing tuples or wrapping/unwrapping, don't need to compute the sum. Doing so only destroys sparsity. A node of type SparseVector v won't sum the gradients, it will simply forward builders to its parents.

Constructors

SparseVector 

Instances

Instances details
Semigroup (VecBuilder v) => Semigroup (SparseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

Monoid (VecBuilder v) => BasicVector (SparseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder (SparseVector v) Source #

type VecBuilder (SparseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

newtype DenseVector v Source #

When sparsity is not needed, we can use vector v as a builder of itself. DenseVector takes care of that.

Constructors

DenseVector v 

Instances

Instances details
AdditiveGroup v => BasicVector (DenseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type VecBuilder (DenseVector v) Source #

AdditiveGroup v => AdditiveGroup (DenseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

VectorSpace v => VectorSpace (DenseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

Associated Types

type Scalar (DenseVector v) #

type VecBuilder (DenseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

type Scalar (DenseVector v) Source # 
Instance details

Defined in Downhill.Linear.Expr

newtype DenseBuilder v Source #

Constructors

DenseBuilder (Maybe v) 

Instances

Instances details
AdditiveGroup v => Monoid (DenseBuilder v) Source # 
Instance details

Defined in Downhill.Linear.Expr

AdditiveGroup v => Semigroup (DenseBuilder v) Source # 
Instance details

Defined in Downhill.Linear.Expr

Generics

genericSumBuilder :: forall b v. (Generic b, Generic v, GBasicVector (Rep b) (Rep v)) => b -> v Source #

genericIdentityBuilder :: forall b v. (Generic b, Generic v, GBasicVector (Rep b) (Rep v)) => v -> b Source #

genericSumMaybeBuilder :: forall b v. (Generic b, Generic v, AdditiveGroup v, GBasicVector (Rep b) (Rep v)) => Maybe b -> v Source #

genericIdentityMaybeBuilder :: forall b v. (Generic b, Generic v, GBasicVector (Rep b) (Rep v)) => v -> Maybe b Source #

Misc