--- orphan: true og:title: "Playing Catch With Newton: a Beginner's Guide to Tesseracts" og:description: "A hands-on tutorial introducing the Tesseract ecosystem through a physics-based example, covering containerization of computational tools and implementing derivative endpoints." blog_date: "2025-08-03" blog_author: "@jacanchaplais" blog_title: "Playing Catch With Newton: a Beginner's Guide to Tesseracts" blog_description: "A hands-on tutorial introducing the Tesseract ecosystem through a physics-based example." --- # Playing Catch With Newton: a Beginner's Guide to Tesseracts _This post originally appeared on [Pasteur Labs Insights](https://pasteurlabs.ai/insights/beginners-guide-tesseract)._ ## Introduction This tutorial introduces the Tesseract ecosystem through a physics-based example. We'll build a Tesseract from scratch that containerizes a computational tool and implements derivative endpoints for use in differentiable pipelines. This beginner's guide will teach you how to write a custom Tesseract to distribute a computational tool. We assume basic differential calculus knowledge and Python familiarity (including NumPy-style array operations). No prior Tesseract ecosystem experience is required. ## The physics: Projectile motion Researchers regularly use fantastic software tools --- physics simulators, machine learning models, meshers, and more. But these tools often present installation and configuration barriers for new users. With Tesseracts, you can wrap any tool so it's installable locally via a single command or accessible remotely, all sharing a uniform JSON interface. To see how this works, let's start with a simple physics example: projectile motion. ### Newton's challenge
Newton at a low angle
Newton throws a ball at a low angle.
Imagine you're playing catch with Isaac Newton. He throws a ball from a fixed distance away, and it arrives after a certain flight time. Newton points out that given a fixed distance and flight time, "only one path" exists --- a unique combination of speed and angle.
Newton at a high angle
The same distance can be reached at a high angle with a different speed.
### The equations Under constant gravitational acceleration, we can describe the projectile's motion with two key equations.
Projectile trajectory
Projectile trajectory under constant gravitational acceleration.
**Time of flight:** $$t = \frac{2u \sin \theta}{g}$$ **Horizontal distance:** $$s_x = \frac{u^2 \sin 2\theta}{g}$$ Where $u$ is the initial velocity, $\theta$ is the launch angle, and $g = 9.81 \, \text{m/s}^2$ is the gravitational acceleration.
Velocity vector resolution
Resolving the velocity vector into horizontal and vertical components.
These equations establish a one-to-one correspondence between input coordinates $(u, \theta)$ and output coordinates $(s_x, t)$. ## Building the Tesseract ### Project structure Initialize a new Tesseract project: ```bash $ tesseract init ``` This generates three files: `tesseract_api.py`, `tesseract_config.yaml`, and `tesseract_requirements.txt`. ### Configuration Name the Tesseract "projectile" and describe its purpose: ```yaml name: "projectile" version: "0.0.1" description: | Given a projectile with an initial speed and angle, computes the horizontal distance and time-of-flight for it to return to zero vertical displacement. ``` Add JAX as a dependency in `tesseract_requirements.txt`: ``` jax[cuda]==0.5.3 ``` ### Schema definition Define the input and output schemas using Pydantic models with `Differentiable` type annotations: ```python from pydantic import BaseModel from tesseract_core.runtime import Differentiable, Float32 class InputSchema(BaseModel): speed: Differentiable[Float32] angle: Differentiable[Float32] class OutputSchema(BaseModel): distance: Differentiable[Float32] time: Differentiable[Float32] ``` ### Physics functions Implement the core physics using JAX for automatic differentiation support: ```python import jax.numpy as jnp RECIP_GRAV_STRENGTH = 1.0 / 9.81 OUTPUT_FUNCS = { "distance": lambda speed, angle: ( speed * speed * RECIP_GRAV_STRENGTH * jnp.sin(2.0 * angle) ), "time": lambda speed, angle: ( 2.0 * speed * RECIP_GRAV_STRENGTH * jnp.sin(angle) ), } ``` ### Automatic differentiation Using `jax.grad()`, we can automatically compute the Jacobian matrix: $$ J(u, \theta) = \begin{bmatrix} \partial s_x / \partial u & \partial s_x / \partial \theta \\ \partial t / \partial u & \partial t / \partial \theta \end{bmatrix} $$ ```python GRAD_FUNCS = { output_name: { input_name: jax.grad(func, argnums=num) for num, input_name in enumerate(arg_names(func)) } for output_name, func in OUTPUT_FUNCS.items() } ``` ### Endpoints The `apply` endpoint computes forward evaluation: ```python def apply(inputs: InputSchema) -> OutputSchema: return OutputSchema( distance=OUTPUT_FUNCS["distance"]( speed=inputs.speed, angle=inputs.angle ), time=OUTPUT_FUNCS["time"](speed=inputs.speed, angle=inputs.angle), ) ``` The `jacobian` endpoint computes derivatives: ```python def jacobian( inputs: InputSchema, jac_inputs: set[str], jac_outputs: set[str], ) -> dict[str, dict[str, float]]: grads = defaultdict(dict) for output_name, input_name in product(jac_outputs, jac_inputs): grads[output_name][input_name] = GRAD_FUNCS[output_name][input_name]( inputs.speed, inputs.angle ).item() return dict(grads) ``` ## Testing it out Build the Tesseract: ```bash $ tesseract build . ``` Test with the CLI: ```bash $ tesseract run projectile apply '{"inputs": {"speed": 10.0, "angle": 0.75}}' | jq . ``` Verify the Jacobian computation at $u = 10$, $\theta = 0.75$ rad --- the numerical results should match the analytical derivatives. ## What's next By wrapping even a simple physics model in a Tesseract, we get a containerized, self-documenting component with a standard JSON interface and built-in derivative support. Now you're ready to explore gradient-based optimization[ via Tesseract-JAX](https://github.com/pasteurlabs/tesseract-jax) and interactive visualization [via Tesseract-Streamlit](https://github.com/pasteurlabs/tesseract-streamlit) for these differentiable components.
Isaac Newton discovers gravity, 1936
"Isaac Newton discovers gravity", 1936.
--- _Tesseract is a free, open-source framework for differentiable scientific computing. `pip install tesseract-core`. [Docs](https://tesseract.pasteurlabs.ai) · [Demos](https://tesseract.pasteurlabs.ai/content/demo/demo.html) · [GitHub](https://github.com/pasteurlabs/tesseract-core) · [Forum](https://si-tesseract.discourse.group/)_