Interactive

The convolution filter, factorised

NequIP constrains its convolution filters to be $S^{(l)}_{m}(\vec r_{ij}) = R(\lVert\vec r_{ij}\rVert)\, Y^{(l)}_{m}(\hat r_{ij})$ — a learnable function of the bond length times a fixed spherical harmonic of the bond direction. This page is that constraint, made draggable.

A filter is a function of a full three-dimensional displacement, which carries both a length and a direction. The constraint says: factorise it, and put every free parameter on the length side. $R$ receives one number and returns one number, so it is structurally incapable of knowing which way the bond points — a rotation is invisible to it. $Y^{(l)}$ sees only the unit vector and has no parameters at all.

Under a rotation $g$ the two factors therefore do completely different things:

$$S^{(l)}(g\,\vec r) = R(\lVert g\,\vec r\rVert)\,Y^{(l)}(g\,\hat r) = R(\lVert \vec r\rVert)\,D^{(l)}(g)\,Y^{(l)}(\hat r) = D^{(l)}(g)\,S^{(l)}(\vec r).$$

A rotation preserves length, so $R$ comes through untouched; the harmonic picks up exactly the Wigner matrix. The filter is equivariant for any $R$ whatsoever, which is why training cannot break it — training only moves $R$.

Try it. Drag the radial coefficients anywhere you like, invert them, zero them, and watch the equivariance residual at the bottom stay at machine precision. Then raise the last slider, which lets $R$ peek at direction, and watch it break at once.

Explorer

Left: the learnable half. Right: how a rotation mixes the 2ℓ+1 components. Below: their product, the filter itself, on a plane through the origin.

← chapter 4 of the tutorial, where this sits in context, or the repository.