Skip to content

Gallery

The figures are generated by docs/figures/make_figures.py.

A geodesic

![A geodesic from a blob to a ring](assets/hero-light.gif#only-light){ width="320" } ![A geodesic from a blob to a ring](assets/hero-dark.gif#only-dark){ width="320" }
From a blob in one corner to a ring, on the 16×16 grid graph, by shooting. The mass spreads as it travels, then settles into the ring (display smoothed between nodes).

Barycenters of digits

![Barycenters of four digit images](assets/digits-light.png#only-light){ width="420" } ![Barycenters of four digit images](assets/digits-dark.png#only-dark){ width="420" }
The corners are four 16×16 digit images, densities on the pixel grid. Every other panel is their barycenter, for weights bilinear in the panel's position, by the SOCP. The digits are centered on top of one another, so mass only moves locally, and the in-between panels look more like a cross-fade than a slide.

Three methods, one transport

![The three methods at time 1/2](assets/methods-light.png#only-light) ![The three methods at time 1/2](assets/methods-dark.png#only-dark)
The blob-to-ring geodesic at time ½, one square per node: shooting and the SOCP agree; Sinkhorn's entropic interpolation blurs.

Gradient descent on a density

![Gradient descent moves a uniform density onto a bump](assets/gradient-light.png#only-light) ![Gradient descent moves a uniform density onto a bump](assets/gradient-dark.png#only-dark)
Minimizing the transport distance to a target with Adam; see differentiable geodesics.