attribute [ForwardDerivative]
Description
[ForwardDerivative(fwdFn)] attribute can be used to provide a forward-mode derivative implementation. Invoking fwd_diff(decoratedFn) will place a call to fwdFn instead of synthesizing a derivative implementation. The same behavior holds if decoratedFn is used in a differentiable context.
Signature
[ForwardDerivative(function)]
Parameters
function
Remarks
- The signature of fwdFn must match the expected signature of fwd_diff(decoratedFn).
- See the reference for fwd_diff for a full list of signature rules.
-
See the user guide’s section on custom derivatives for an introduction to this approach.
- This attribute can be used on generic functions, member functions and accessors.
-
For generic functions, the generic signatures (parameters + constraints) of both functions must match exactly.
- The decorated function will be considered forward-differentiable. There is no need for a [Differentiable] tag. If the [Differentiable] tag is present, and no custom backward derivative is specified with [BackwardDerivative], then the Slang will use auto-diff to generate the backward=mode derivative, but will use the provided derivative for forward-mode.
Example:
[ForwardDerivative(foo_fwd)]
T foo<T : IFloat, P : IArray<T>>(T x, P xarr) { /* ... */ }
DifferentialPair<T> foo_fwd<T : IFloat, P : IArray<T>>( // Use the same generic signature for a match.
DifferentialPair<T> x, P dp_xarr) { /* ... */ }
For member functions, or functions nested inside namespaces, fwdFn may need a fully qualified name.
Example:
namespace A
{
DifferentialPair<float> foo(DifferentialPair<float> x) { /* ... */ }
}
[ForwardDerivative(A.foo)] // Use namespace and/or parent struct names
float bar(float x) { /* ... */ }