Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Downhill.Linear.Expr
Contents
Synopsis
- data Expr a v where
- data Term a v where
- Term :: (v -> VecBuilder u) -> Expr a u -> Term a v
- class Monoid (VecBuilder v) => BasicVector v where
- type VecBuilder v :: Type
- sumBuilder :: VecBuilder v -> v
- identityBuilder :: v -> VecBuilder v
- newtype SparseVector v = SparseVector {
- unSparseVector :: VecBuilder v
- newtype DenseVector v = DenseVector v
- newtype DenseBuilder v = DenseBuilder (Maybe v)
- toDenseBuilder :: v -> DenseBuilder v
- genericSumBuilder :: forall b v. (Generic b, Generic v, GBasicVector (Rep b) (Rep v)) => b -> v
- genericIdentityBuilder :: forall b v. (Generic b, Generic v, GBasicVector (Rep b) (Rep v)) => v -> b
- genericSumMaybeBuilder :: forall b v. (Generic b, Generic v, AdditiveGroup v, GBasicVector (Rep b) (Rep v)) => Maybe b -> v
- genericIdentityMaybeBuilder :: forall b v. (Generic b, Generic v, GBasicVector (Rep b) (Rep v)) => v -> Maybe b
- maybeToMonoid :: Monoid m => Maybe m -> m
Expression
Expr a v
represents a linear expression of type v
, containing some free variables of type a
.
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
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
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 | |
Fields
|
Instances
Semigroup (VecBuilder v) => Semigroup (SparseVector v) Source # | |
Defined in Downhill.Linear.Expr Methods (<>) :: SparseVector v -> SparseVector v -> SparseVector v # sconcat :: NonEmpty (SparseVector v) -> SparseVector v # stimes :: Integral b => b -> SparseVector v -> SparseVector v # | |
Monoid (VecBuilder v) => BasicVector (SparseVector v) Source # | |
Defined in Downhill.Linear.Expr Associated Types type VecBuilder (SparseVector v) Source # Methods sumBuilder :: VecBuilder (SparseVector v) -> SparseVector v Source # identityBuilder :: SparseVector v -> VecBuilder (SparseVector v) Source # | |
type VecBuilder (SparseVector v) Source # | |
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
AdditiveGroup v => BasicVector (DenseVector v) Source # | |
Defined in Downhill.Linear.Expr Associated Types type VecBuilder (DenseVector v) Source # Methods sumBuilder :: VecBuilder (DenseVector v) -> DenseVector v Source # identityBuilder :: DenseVector v -> VecBuilder (DenseVector v) Source # | |
AdditiveGroup v => AdditiveGroup (DenseVector v) Source # | |
Defined in Downhill.Linear.Expr Methods zeroV :: DenseVector v # (^+^) :: DenseVector v -> DenseVector v -> DenseVector v # negateV :: DenseVector v -> DenseVector v # (^-^) :: DenseVector v -> DenseVector v -> DenseVector v # | |
VectorSpace v => VectorSpace (DenseVector v) Source # | |
Defined in Downhill.Linear.Expr Associated Types type Scalar (DenseVector v) # Methods (*^) :: Scalar (DenseVector v) -> DenseVector v -> DenseVector v # | |
type VecBuilder (DenseVector v) Source # | |
Defined in Downhill.Linear.Expr | |
type Scalar (DenseVector v) Source # | |
Defined in Downhill.Linear.Expr |
newtype DenseBuilder v Source #
Constructors
DenseBuilder (Maybe v) |
Instances
AdditiveGroup v => Monoid (DenseBuilder v) Source # | |
Defined in Downhill.Linear.Expr Methods mempty :: DenseBuilder v # mappend :: DenseBuilder v -> DenseBuilder v -> DenseBuilder v # mconcat :: [DenseBuilder v] -> DenseBuilder v # | |
AdditiveGroup v => Semigroup (DenseBuilder v) Source # | |
Defined in Downhill.Linear.Expr Methods (<>) :: DenseBuilder v -> DenseBuilder v -> DenseBuilder v # sconcat :: NonEmpty (DenseBuilder v) -> DenseBuilder v # stimes :: Integral b => b -> DenseBuilder v -> DenseBuilder v # |
toDenseBuilder :: v -> DenseBuilder v Source #
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
maybeToMonoid :: Monoid m => Maybe m -> m Source #