Source code for pypose.func.jac
import torch
from .. import retain_ltype
from typing import Callable, Union, Tuple, Optional
[docs]def jacrev(func: Callable, argnums: Union[int, Tuple[int]] = 0, *, has_aux=False,
chunk_size: Optional[int] = None,
_preallocate_and_copy=False):
r"""
This function provides the exact same functionality as `torch.func.jacrev()
<https://pytorch.org/docs/stable/generated/torch.func.jacrev.html#torch.func.jacrev>`_,
except that it allows LieTensor to be used as input when calculating the jacobian.
Args:
func (function): A Python function that takes one or more arguments,
one of which must be a Tensor, and returns one or more Tensors
argnums (int or Tuple[int]): Optional, integer or tuple of integers,
saying which arguments to get the Jacobian with respect to.
Default: 0.
has_aux (bool): Flag indicating that ``func`` returns a
``(output, aux)`` tuple where the first element is the output of
the function to be differentiated and the second element is
auxiliary objects that will not be differentiated.
Default: False.
chunk_size (None or int): If None (default), use the maximum chunk size
(equivalent to doing a single vmap over vjp to compute the jacobian).
If 1, then compute the jacobian row-by-row with a for-loop.
If not None, then compute the jacobian :attr:`chunk_size` rows at a time
(equivalent to doing multiple vmap over vjp). If you run into memory issues
computing the jacobian, please try to specify a non-None chunk_size.
Returns:
Returns a function that takes in the same inputs as ``func`` and
returns the Jacobian of ``func`` with respect to the arg(s) at
``argnums``. If ``has_aux is True``, then the returned function
instead returns a ``(jacobian, aux)`` tuple where ``jacobian``
is the Jacobian and ``aux`` is auxiliary objects returned by ``func``.
A basic usage with our LieTensor type would be the transformation function.
>>> import pypose as pp
>>> import torch
>>> def func(pose, points):
... return pose @ points
>>> pose = pp.randn_SE3(1)
>>> points = torch.randn(1, 3)
>>> jacobian = pp.func.jacrev(func)(pose, points)
>>> jacobian
tensor([[[[ 1.0000, 0.0000, 0.0000, 0.0000, 1.5874, -0.2061, 0.0000]],
[[ 0.0000, 1.0000, 0.0000, -1.5874, 0.0000, -1.4273, 0.0000]],
[[ 0.0000, 0.0000, 1.0000, 0.2061, 1.4273, 0.0000, 0.0000]]]])
"""
jac_func = torch.func.jacrev(func, argnums, has_aux=has_aux, chunk_size=chunk_size,
_preallocate_and_copy=_preallocate_and_copy)
@retain_ltype()
def wrapper_fn(*args, **kwargs):
return jac_func(*args, **kwargs)
return wrapper_fn