Bundled datasets
KD ships a catalog of benchmark datasets with known equations, so you can try an algorithm out before pointing it at data of your own, and two sets of laboratory measurements to run against real data.
Load a dataset
Each dataset has a convenience loader that hands back an object fit() accepts directly:
import kd
dataset = kd.load_burgers()
print(dataset.name, dataset.get_shape())
burgers (256, 201)
You can also go through the catalog by id. kd.list_datasets() returns every entry, and
kd.get_dataset(id) returns one entry's metadata: the equation, the axes, the left-hand side,
the file format, the source, the license, and a pointer to its loader. The data itself arrives only
when you call spec.loader().
import kd
spec = kd.get_dataset("kdv")
print(spec.id, spec.tier, spec.axes, spec.lhs)
dataset = spec.loader()
print(dataset.name, dataset.get_shape())
kdv builtin ('x', 't') u_t
kdv (256, 201)
Bundled and downloaded datasets
Entries come in two kinds, recorded in the tier field:
builtin: the data file is installed with the package, and loading it touches no network.remote: the file is fetched from the Hugging Face Hub the first time you load it. The fetch is pinned to a fixed file at a fixed revision and verified against a recorded sha256; a mismatch deletes the cached copy and raises. Once verified, the file stays in the local cache and later loads read it from there. This path needs the optional dependency:pip install kd[hub].
kd.list_remote_datasets() lists only the remote ones.
kd.load_from_hub(dataset_id, cache_dir=..., offline=...) loads a remote dataset by id, with
cache_dir choosing where the cache lives and offline=True restricting it to files already
cached.
For the shape requirements and the left-hand-side spec, see data requirements.
Dataset catalog
| Dataset | Equation | Axes | Left-hand side | Availability | Source |
|---|---|---|---|---|---|
allen-cahn |
u_t = 0.003 * u_xx + u - u^3 |
x, t |
u_t |
bundled | EqGPT benchmark data (Xu et al. 2025) |
burgers |
u_t = -u * u_x + 0.1 * u_xx |
x, t |
u_t |
bundled | SGA-PDE benchmark data (Chen et al. 2022) |
burgers-2d |
u_t = -u*u_x - u*u_y + 0.01*u_xx + 0.01*u_yy |
x, y, t |
u_t |
bundled | EqGPT benchmark data (Xu et al. 2025) |
chafee-infante |
u_t = u_xx - u + u^3 |
x, t |
u_t |
bundled | SGA-PDE benchmark data (Chen et al. 2022) |
convection-diffusion |
u_t = -u_x + 0.25 * u_xx |
x, t |
u_t |
bundled | EqGPT benchmark data (Xu et al. 2025) |
eq-6-2-12 |
u_t = -0.1*u_x_t - 0.1*u_x |
x, t |
u_t |
bundled | EqGPT benchmark data (Xu et al. 2025) |
eqgpt-laplacian-eitech |
u_xx + u_yy + 1 = 0 |
x, y |
none (steady problem) | bundled | EqGPT benchmark data (Xu et al. 2025) |
eqgpt-laplacian-smile |
u_xx + u_yy = 0 |
x, y |
none (steady problem) | bundled | EqGPT benchmark data (Xu et al. 2025) |
eqgpt-poisson-disk |
u_xx + u_yy = 0 |
x, y |
none (steady problem) | bundled | EqGPT benchmark data (Xu et al. 2025) |
kdv |
u_t = -u * u_x - 0.0025 * u_xxx |
x, t |
u_t |
bundled | SGA-PDE benchmark data (Chen et al. 2022) |
klein-gordon |
u_tt = 0.5 * u_xx - 5 * u |
x, t |
u_tt |
bundled | EqGPT benchmark data (Xu et al. 2025) |
llm4ed-fisher |
u_t = 0.02*u_xx + 10*u*(1-u) |
x, t |
u_t |
downloaded on first use | LLM4ED benchmark data (Du et al. 2024) |
llm4ed-fisher-nonlinear |
u_t = 0.02*(u*u_xx + u_x^2) + 10*u*(1-u) |
x, t |
u_t |
downloaded on first use | LLM4ED benchmark data (Du et al. 2024) |
llm4ed-heat |
u_t = 0.05*u_xx |
x, t |
u_t |
downloaded on first use | Heat case; coefficient fitted from the data |
pde-compound |
u_t = u * u_xx + u_x^2 |
x, t |
u_t |
bundled | SGA-PDE benchmark data (Chen et al. 2022) |
pde-divide |
u_t = -u_x / x + 0.25 * u_xx |
x, t |
u_t |
bundled | SGA-PDE benchmark data (Chen et al. 2022) |
wave |
u_tt = u_xx |
x, t |
u_tt |
bundled | EqGPT benchmark data (Xu et al. 2025) |
Real-world measurements
Two datasets of laboratory measurements ship alongside the benchmarks. Both are tables of
observations rather than fields on a regular grid, so they load as kd.TabularDataset and are not
entries of the catalog above.
kd.load_tlc_cc() holds 74 rows from an automated column-chromatography platform, which separated
192 organic compounds on 4 g silica columns with thin-layer chromatography giving the retardation
factor of each compound and eluent pair. Each row is one experimental condition rather than one
compound: the features are the retardation factor R_F and the petroleum-ether fraction r of the
eluent, and the target is the retention volume averaged over the compounds run at that condition,
either the volume at which a compound is first detected (target="start") or the volume at which it
has fully eluted (target="end").
kd.load_wave_breaking() holds surface-elevation measurements from the 27.2 m glass-walled wave tank
at Imperial College London: focused wave groups propagating toward breaking, with the air-water
interface reconstructed frame by frame from three cameras running at 20 Hz. The features are the time
t and the position x along the tank; the target is the surface elevation eta. The points are
scattered rather than gridded, and the three camera windows do not overlap, so x covers three
disjoint intervals. One experiment of the campaign is bundled, 314,478 points, and data_dir= points
the loader at the others.
Both datasets are published measurements, used with the permission of the authors: the chromatography platform in Xu, Wu, Chen, Zhang and Mo, Nat Commun 16, 832 (2025), and the wave-tank campaigns in Xu, Chen, Cao, Tang, Du, Li, Callaghan and Zhang, Nat Commun 16, 10255 (2025). Breaking waves is a worked run on the wave data.