Troubleshooting

The errors below are raised on purpose, at the point where Tesseract-Torch can still say what went wrong. Each entry lists the message you will see, why it happens, and what to do about it.

apply_tesseract inside a torch.func transform

RuntimeError: apply_tesseract does not support torch.func transforms (torch.func.vjp, torch.func.jvp, torch.func.grad, etc.). Use the standard autograd API instead:
  - Reverse mode: result['y'].backward() or torch.autograd.grad()
  - Forward mode: torch.autograd.forward_ad (dual tensors)

torch.func.vmap reports the same limitation in PyTorch’s own words:

RuntimeError: You tried to vmap over _TesseractFunction, but it does not have vmap support. Please override and implement the vmap staticmethod or set generate_vmap_rule=True.

Cause. torch.func transforms (torch.func.vjp, torch.func.jvp, torch.func.grad) trace your function with functionalized tensors that have no backing storage. A Tesseract endpoint receives NumPy arrays, and such a tensor cannot be converted into one. torch.func.vmap is refused a step earlier, by PyTorch itself, because the underlying autograd.Function defines no batching rule.

Fix. Use PyTorch’s standard autograd API, which apply_tesseract supports in both modes:

# Reverse mode
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
result = apply_tesseract(tess, inputs={"x": x})
(grad_x,) = torch.autograd.grad(result["y"].sum(), x)

# Forward mode
import torch.autograd.forward_ad as fwAD

with fwAD.dual_level():
    x_dual = fwAD.make_dual(torch.tensor([1.0, 2.0, 3.0]), torch.ones(3))
    result = apply_tesseract(tess, inputs={"x": x_dual})
    _, jvp = fwAD.unpack_dual(result["y"])

Reverse-mode AD against a Tesseract without vector_jacobian_product

NotImplementedError: Vector Jacobian Product (VJP) not implemented for this Tesseract.

Cause. .backward() and torch.autograd.grad are dispatched to the Tesseract’s vector_jacobian_product endpoint. The Tesseract you called only defines apply, so there is nothing to dispatch to. The forward pass itself succeeds; the error appears when the backward pass runs.

Fix. Either implement vector_jacobian_product in the Tesseract, or do not ask for gradients through it: pass inputs without requires_grad=True and it behaves as a plain, non-differentiable operation.

Forward-mode AD against a Tesseract without jacobian_vector_product

NotImplementedError: Jacobian Vector Product (JVP) not implemented for this Tesseract.

Cause. The forward-mode counterpart of the previous entry: a call inside torch.autograd.forward_ad.dual_level() with dual tensors as inputs is dispatched to the Tesseract’s jacobian_vector_product endpoint, which this Tesseract does not define.

Fix. Implement jacobian_vector_product in the Tesseract, or pass plain (non-dual) tensors.

List-valued differentiable fields

NotImplementedError: List-valued differentiable inputs are not supported yet: xs.[]. Use a dict-valued field, or keep the list entries as separate schema fields.

Cause. Tesseract-Torch walks nested dictionaries and sub-models to find differentiable leaves, but a list[Differentiable[...]] field arrives as a single opaque value, so its tensors cannot be registered with autograd. The same applies to list-valued differentiable outputs.

Fix. Change the schema to a dict-valued field, or to one field per entry:

class InputSchema(BaseModel):
    xs: dict[str, Differentiable[Array[(3,), Float32]]]

and call it with {"xs": {"first": x0, "second": x1}}.

Forward-mode AD with an in-process PyTorch Tesseract

RuntimeError: Error running Tesseract API jacobian_vector_product: Nested forward mode AD is not supported at the moment

Cause. Tesseract.from_tesseract_api(...) runs the Tesseract in your own Python process. If its jacobian_vector_product is itself implemented with torch.func.jvp (as the Tesseracts in examples/ are), that call opens a second forward-AD level inside your dual_level() block, which PyTorch refuses.

Fix. Serve the Tesseract in a container (Tesseract.from_image(...) followed by .serve(), or a with block), which is how the examples run it. Reverse-mode AD is unaffected either way.