pub enum DiffMode {
Error,
Source,
Forward,
Reverse,
ForwardFirst,
ReverseFirst,
}
Expand description
Forward and Reverse Mode are well known names for automatic differentiation implementations. Enzyme does support both, but with different semantics, see DiffActivity. The First variants are a hack to support higher order derivatives. We need to compute first order derivatives before we compute second order derivatives, otherwise we would differentiate our placeholder functions. The proper solution is to recognize and resolve this DAG of autodiff invocations, as it’s already done in the C++ and Julia frontend of Enzyme.
(FIXME) remove *First variants. Documentation for using reverse and forward mode is available online.
Variants§
Error
No autodiff is applied (used during error handling).
Source
The primal function which we will differentiate.
Forward
The target function, to be created using forward mode AD.
Reverse
The target function, to be created using reverse mode AD.
ForwardFirst
The target function, to be created using forward mode AD. This target function will also be used as a source for higher order derivatives, so compute it before all Forward/Reverse targets and optimize it through llvm.
ReverseFirst
The target function, to be created using reverse mode AD. This target function will also be used as a source for higher order derivatives, so compute it before all Forward/Reverse targets and optimize it through llvm.
Implementations§
Trait Implementations§
source§impl<__D: SpanDecoder> Decodable<__D> for DiffMode
impl<__D: SpanDecoder> Decodable<__D> for DiffMode
source§impl<__E: SpanEncoder> Encodable<__E> for DiffMode
impl<__E: SpanEncoder> Encodable<__E> for DiffMode
source§impl<__CTX> HashStable<__CTX> for DiffModewhere
__CTX: HashStableContext,
impl<__CTX> HashStable<__CTX> for DiffModewhere
__CTX: HashStableContext,
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
impl Copy for DiffMode
impl Eq for DiffMode
impl StructuralPartialEq for DiffMode
Auto Trait Implementations§
impl DynSend for DiffMode
impl DynSync for DiffMode
impl Freeze for DiffMode
impl RefUnwindSafe for DiffMode
impl Send for DiffMode
impl Sync for DiffMode
impl Unpin for DiffMode
impl UnwindSafe for DiffMode
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 1 byte
Size for each variant:
Error
: 0 bytesSource
: 0 bytesForward
: 0 bytesReverse
: 0 bytesForwardFirst
: 0 bytesReverseFirst
: 0 bytes