Higher order functions are difficult in general, and it would be fantastic to have core patterns or tools for breaking them open.
Higher order functions are difficult in general, and it would be fantastic to have core patterns or tools for breaking them open.
If so, then allow me to make my usual advert here for Equinox:
https://github.com/patrick-kidger/equinox
This actually works with JAX's native transformations. (There's no `equinox.vmap` for example.)
On higher-order functions more generally, Equinox offers a way to control these quite carefully, by making ubiquitous use of callables that are also pytrees. E.g. a neural network is both a callable in that it has a forward pass, and a pytree in that it records its parameters in its tree structure.
1. as you say, exposing patterns and tools for library authors to implement transformations/higher-order primitives using JAX's machinery rather than requiring each library to introduce bespoke magic to do the same;
2. adding JAX core infrastructure which directly solves the common problems that libraries tend to solve independently (and with bespoke magic).