Symmetry-Block Neural PDE Solver / poisson_symmetry_track.py
Beats tuned baseline
1import numpy as np
2META = {"name":"symmetric_periodic_poisson","domain":"pde","description":"2-D periodic Poisson inverse on an 8x8 square grid; source fields and exact zero-mean solutions."}
3
4def _lap_eigs(n):
5 k=np.arange(n)
6 return (4-2*np.cos(2*np.pi*k/n)[:,None]-2*np.cos(2*np.pi*k/n)[None,:]).astype(np.float32)
7
8def get_dataset(seed, n_train, n_test):
9 def sample(n, s):
10 rng=np.random.RandomState(s); N=8
11 # Random Fourier sources with no constant mode, ensuring solvability.
12 f=rng.normal(size=(n,N,N)).astype(np.float32)
13 fh=np.fft.fft2(f,axes=(-2,-1)); fh[:,0,0]=0
14 lam=_lap_eigs(N); uh=fh/(lam[None]+1e-5); uh[:,0,0]=0
15 u=np.fft.ifft2(uh,axes=(-2,-1)).real.astype(np.float32)
16 # Normalize each sample to avoid scale-driven triviality.
17 f=f/(f.std(axis=(1,2),keepdims=True)+1e-4); u=u/(u.std(axis=(1,2),keepdims=True)+1e-4)
18 return f.reshape(n,-1),u.reshape(n,-1)
19 xtr,ytr=sample(n_train,seed); xte,yte=sample(n_test,seed+5000)
20 return {"xtr":xtr,"ytr":ytr,"xte":xte,"yte":yte,"task":"regression","metric":"mse","out_dim":64}