Differentiation¶
Module Differentiation.
The functions defined here wrap the tangent and adjoint derivative computations and return them as lambda functions.
The tangent/forward computation is wrapped as derfor, the adjoint/reverse computation as derrev. For convenience also the functions derivative, gradient and hessian are implemented, but they simply call derfor/derrev.
-
pyADiff.differentiation.
derfor
(f)¶ Forward Differentiation.
Wraps the calculation of the derivative of f with respect to its inputs via tangent mode differentiation. The signature of f is assumed to be:
{scalar, list, array} = f({scalar, list, array})
Assuming the mathematical signature of \(f\) to be
\[f: \mathbb{R}^{i \times j \times ...} \to \mathbb{R}^{m \times n \times ...}\]the mathematical signature of the derivative \(f'\) will be
\[f': \mathbb{R}^{i \times j \times ...} \to \mathbb{R}^{m \times n \times ... \times i \times j \times ...}\]Parameters: f (function_type) – The function to be differentiated. Returns: A function which returns the derivative of f. Return type: function_type See also
pyADiff.tangent.dfdx()
- The function which actually computes the derivative.
pyADiff.tangent.ADTypeT()
- The overloaded scalar ADType which is used for the computation.
-
pyADiff.differentiation.
derrev
(f)¶ Adjoint Differentiation.
Wraps the calculation of the derivative of f with respect to its inputs via adjoint mode differentiation. The signature of f is assumed to be:
{scalar, list, array} = f({scalar, list, array})
Assuming the mathematical signature of \(f\) to be
\[f: \mathbb{R}^{i \times j \times ...} \to \mathbb{R}^{m \times n \times ...}\]the mathematical signature of the derivative \(f'\) will be
\[f': \mathbb{R}^{i \times j \times ...} \to \mathbb{R}^{m \times n \times ... \times i \times j \times ...}\]Parameters: f (function_type) – The function to be differentiated. Returns: A function which returns the derivative of f. Return type: function_type See also
pyADiff.adjoint.dfdx()
- Function actually computes the derivative.
pyADiff.adjoint.ADTypeA()
- The overloaded scalar ADType which holds the derivtives.
pyADiff.adjoint.ADRecord()
- The object which holds the “record” of single assignment operations.
-
pyADiff.differentiation.
derivative
(f)¶ Derivative Computation
Uses tangent mode differentiation to calculate the derivative. Mathematically one speaks of a derivative for functions \(f:\mathbb{R} \to \mathbb{R}\), then the derivative is \(f': \mathbb{R} \to \mathbb{R}\).
Nevertheless f is not assumed to have this signature.
Parameters: f (function_type) – The function to be differentiated. Returns: A function which returns the derivative of f. Return type: function_type See also
pyADiff.differentiation.derfor()
- Wrapper for the comutation of the derivative via tangent mode.
-
pyADiff.differentiation.
gradient
(f)¶ Gradient Computation
Uses adjoint mode differentiation to calculate the gradient. Mathematically one speaks of a gradient for functions \(f:\mathbb{R}^n \to \mathbb{R}\), then the gradient is \(\nabla f: \mathbb{R}^n \to \mathbb{R}^n\).
Nevertheless f is not assumed to have this signature.
Parameters: f (function_type) – The function to be differentiated. Returns: A function which returns the gradient of f. Return type: function_type See also
pyADiff.differentiation.derrev()
- Wrapper for the comutation of the derivative via adjoint mode.
-
pyADiff.differentiation.
hessian
(f)¶ Hessian Computation
Uses tangent and adjoint mode differentiation to calculate the hessian. Mathematically one speaks of a hessian for functions \(f:\mathbb{R}^n \to \mathbb{R}\), then the hessian is \(Hf: \mathbb{R}^n \to \mathbb{R}^{n \times n}\).
Nevertheless f is not assumed to have this signature.
Parameters: f (function_type) – The function to be differentiated. Returns: A function which returns the hessian of f. Return type: function_type See also
pyADiff.differentiation.derfor()
- Wrapper for the comutation of the derivative via tangent mode.
pyADiff.differentiation.derrev()
- Wrapper for the comutation of the derivative via adjoint mode.