KPZ latent evolution block / kpz_track.py

✓✓ Beats tuned baseline

Raw ⬇ ZIP
 1import numpy as np
 2
 3META = {'name': 'kpz_field_forecast', 'domain': 'pde', 'description': 'One-step forecasting of a periodic 3-D KPZ field.'}
 4
 5def _step(h, nu=0.22, lam=1.8, dt=0.025):
 6    lap = np.zeros_like(h)
 7    grad2 = np.zeros_like(h)
 8    for ax in (2, 3, 4):
 9        hp, hm = np.roll(h, -1, ax), np.roll(h, 1, ax)
10        lap += hp - 2*h + hm
11        grad2 += ((hp-hm)/2.0)**2
12    return h + dt*(nu*lap + 0.5*lam*grad2)
13
14def get_dataset(seed, n_train, n_test):
15    rng = np.random.default_rng(seed)
16    n = n_train + n_test
17    h = rng.normal(size=(n,1,8,8,8)).astype(np.float32)
18    for ax in (2,3,4):
19        h = 0.55*h + 0.15*(np.roll(h,1,ax)+np.roll(h,-1,ax))
20    h /= h.std(axis=(2,3,4), keepdims=True) + 1e-6
21    y = _step(h).astype(np.float32)
22    return {'xtr':h[:n_train], 'ytr':y[:n_train], 'xte':h[n_train:], 'yte':y[n_train:], 'task':'regression', 'metric':'mse', 'out_dim':1}