Differentiable

Trait Differentiable 

Source
pub trait Differentiable<T: Identifier>: Node {
    type Adjoint: Node;

    // Required method
    fn adjoint(&self, target: T) -> Self::Adjoint;

    // Provided methods
    fn evaluate_adjoint<C: Context, CR: AsRef<C>>(
        &self,
        target: T,
        ctx: CR,
    ) -> AegirResult<Self::Adjoint, C>
       where Self: Function<C>,
             Self::Adjoint: Function<C> { ... }
    fn evaluate_dual<C: Context, CR: AsRef<C>>(
        &self,
        target: T,
        ctx: CR,
    ) -> Result<DualOf<Self, C, T>, BinaryError<Self::Error, <AdjointOf<Self, T> as Function<C>>::Error, NoError>>
       where Self: Function<C>,
             Self::Adjoint: Function<C> { ... }
}
Expand description

Trait for operator Nodes with a well-defined adjoint.

Required Associated Types§

Source

type Adjoint: Node

The adjoint operator; i.e. the gradient.

Required Methods§

Source

fn adjoint(&self, target: T) -> Self::Adjoint

Transform the node into its Adjoint operator tree.

This is the key method used to perform differentiation in aegir. For a given node, the derivative can be found by first computing the adjoint tree and then evaluating against a database as per Function.

§Examples
let c = 2.0f64.into_constant();
let grad = X.into_var().mul(c).adjoint(X);

assert_eq!(grad.evaluate(ctx!{X = 10.0}).unwrap(), 2.0);

Provided Methods§

Source

fn evaluate_adjoint<C: Context, CR: AsRef<C>>( &self, target: T, ctx: CR, ) -> AegirResult<Self::Adjoint, C>
where Self: Function<C>, Self::Adjoint: Function<C>,

Helper method that computes the adjoint and evaluates its value.

Note: this method can be more efficient than explicitly solving for the adjoint tree. In particular, this method can be implemented using direct numerical calculations.

Source

fn evaluate_dual<C: Context, CR: AsRef<C>>( &self, target: T, ctx: CR, ) -> Result<DualOf<Self, C, T>, BinaryError<Self::Error, <AdjointOf<Self, T> as Function<C>>::Error, NoError>>
where Self: Function<C>, Self::Adjoint: Function<C>,

Helper method that evaluates the function and its adjoint, wrapping up in a Dual.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

Source§

impl<I, T> Differentiable<T> for Variable<I>
where I: Identifier + PartialEq<T>, T: Identifier,

Source§

impl<I, T, A> Differentiable<A> for VariableAdjoint<I, T>
where I: PartialEq<T>, A: Identifier, Self: Clone,

Source§

impl<N, I> Differentiable<I> for Gamma<N>
where N: Clone + Differentiable<I>, I: Identifier,

Source§

impl<N, I> Differentiable<I> for LogGamma<N>
where N: Clone + Differentiable<I>, I: Identifier,

Source§

impl<N, I> Differentiable<I> for Rabbit<N>
where N: Clone + Differentiable<I>, I: Identifier,

Source§

impl<T, B> Differentiable<T> for Constant<B>
where T: Identifier, B: Buffer, FieldOf<B>: Zero,

Source§

impl<T, L, R> Differentiable<T> for Add<L, R>
where T: Identifier, L: Differentiable<T>, R: Differentiable<T>,

Source§

impl<T, L, R> Differentiable<T> for Div<L, R>
where T: Identifier, L: Differentiable<T> + Clone, R: Differentiable<T> + Clone,

Source§

type Adjoint = Div<Sub<Mul<R, <L as Differentiable<T>>::Adjoint>, Mul<L, <R as Differentiable<T>>::Adjoint>>, Square<R>>

Source§

impl<T, L, R> Differentiable<T> for Mul<L, R>
where T: Identifier, L: Differentiable<T> + Clone, R: Differentiable<T> + Clone,

Source§

type Adjoint = Add<Mul<<L as Differentiable<T>>::Adjoint, R>, Mul<<R as Differentiable<T>>::Adjoint, L>>

Source§

impl<T, L, R> Differentiable<T> for Sub<L, R>
where T: Identifier, L: Differentiable<T>, R: Differentiable<T>,

Source§

impl<T, L, R, const AXES: usize> Differentiable<T> for Contract<AXES, L, R>
where T: Identifier, L: Differentiable<T> + Clone, R: Differentiable<T> + Clone,

Source§

type Adjoint = Add<Contract<AXES, L, <R as Differentiable<T>>::Adjoint>, Contract<AXES, <L as Differentiable<T>>::Adjoint, R>>

Source§

impl<T, N> Differentiable<T> for Abs<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for AddOne<N>
where T: Identifier, N: Differentiable<T>,

Source§

impl<T, N> Differentiable<T> for Double<N>
where T: Identifier, N: Differentiable<T>,

Source§

impl<T, N> Differentiable<T> for Exp<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for Ln<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for Negate<N>
where T: Identifier, N: Differentiable<T>,

Source§

impl<T, N> Differentiable<T> for OneSub<N>
where T: Identifier, N: Differentiable<T>,

Source§

impl<T, N> Differentiable<T> for Sigmoid<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for Sign<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for Square<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for SubOne<N>
where T: Identifier, N: Differentiable<T>,

Source§

impl<T, N> Differentiable<T> for Sum<N>
where T: Identifier, N: Differentiable<T>,

Source§

impl<T, N> Differentiable<T> for XLnX<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for Cos<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N> Differentiable<T> for Sin<N>
where T: Identifier, N: Differentiable<T> + Clone,

Source§

impl<T, N, E> Differentiable<T> for Power<N, E>
where T: Identifier, N: Differentiable<T> + Clone, E: Differentiable<T> + Clone,

Source§

type Adjoint = Mul<Power<N, SubOne<E>>, Add<Mul<E, <N as Differentiable<T>>::Adjoint>, Mul<XLnX<N>, <E as Differentiable<T>>::Adjoint>>>