Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Neural fields across the stack: what exists, what is missing, and the plan

Design · geonnax, pyrox-nn and vardax as one neural-field toolkit

1Motivation

Report 18 reviews neural fields in the geosciences for 2025 and 2026. Its conclusion for GeoStack is that neural fields are worth building for 1) gridless reconstruction (fitting tracks, swaths and pixels directly), 2) uncertainty-aware gap-filling, and 3) differentiable state parameterizations in variational assimilation. However, they are not worth building as an archival compression format, where SZ3 still wins.

We surveyed geonnax (v0.0.9), pyrox (pyrox-nn, pyrox-gp, pyrox-lgm) and vardax (v0.1.9) on 23 October 2026 and found that the stack already has most of the parts, and what it lacks is the plumbing between them. So this page records what exists, what is missing, where each missing piece belongs under the dependency rules, and the order in which we build it. The work is Wave 6.

2Decision

  1. Deterministic neural-field parts go in geonnax: encoders, architectures and coordinate-derivative operators. geonnax keeps its rules (no numpyro, no kernels, no losses, one example per call).

  2. Probabilistic parts go in pyrox-nn, as wrappers which swap named geonnax fields for NumPyro sites, plus an estimator whose likelihood takes per-observation noise and an observation operator.

  3. Assimilation parts go in vardax: a point-observation batch, a nonlinear StateParameterization, an optax minimiser, a PDE residual cost and a space-time neural-field 4D-Var model.

  4. Acceptance tests are existing case studies: case 9 (SSH mapping, with DUACS/OI as the oracle), case 11 (SST gap-filling, with the GP as the oracle) and overview stage 3 (methane L2 → L3, with kriging as the oracle).

  5. Compression is a research bet, which we score against SZ3/ZFP at matched maximum error before anything is built for it.

3Where a neural field flows

  observations  y ∈ ℝ^{N_obs}  (tracks, swaths, pixels)
  geostack: GeoPoints / GeoTracks, to_jax(pad_to=N) + valid mask   (CS-F3)
        │
        ▼
  geonnax · encode         γ(s, t), s = (λ, φ)
    SphericalHarmonicEncoder, SlepianEncoder, Cartesian3DEncoder,
    CyclicEncoder, GeoContextEncoder
    ✗ Gaussian Fourier features, HEALPix grid / feature grid
        │
        ▼
  geonnax · represent      x(s, t; θ) = g_net(γ(s, t); θ)
    SIREN, MultiScaleSIREN, FourierNet, GaborNet,
    ConditionedINR + FiLM / HyperLinear, HyperSIREN
    ✗ separable, latent table + shift modulation, LIIF, BNF core
        │
        ├── ✗ geonnax · differentiate   ∇x, ∇²x; on S²: ∇_S² x, ∇²_S² x
        │
        ▼
  pyrox-nn · make Bayesian  θ ~ p_prior(θ)
    BayesianSIREN, BayesianFourierNet, BayesianNeuralField,
    EnsembleMAP, EnsembleVI, BNFEstimator
        │
        ▼
  vardax · observe          ŷ = ℋ[x(·; θ)]
    AveragingKernel, MultiInstrumentFusion
    ✗ point evaluation at observation coordinates
        │
        ▼
  likelihood / loss         p_lik(y | ŷ; Σ_ε)  or  ℒ(θ)
    ✗ pyrox-nn: per-observation σ, ℋ inside the likelihood
    ✗ vardax: θ as the 4D-Var control, PDE residual term
        │
        ▼
  geostack · score          case 9, case 11, methane stage 3

4What exists, and the gap

Research themeAlready in the stackGapHome
Sphere encodingsgeonnax SphericalHarmonicEncoder (tested to L = 150), SlepianEncoder, HybridSphericalSlepianEncoder, needlet_basis, SphericalWaveletTransform, fibonacci_sphere, icosphereHEALPix grid; sphere-native multiresolution feature grid; stratified (coast / island) evaluationgeonnax
Spectral bias and multiscaleMultiScaleSIREN, log_spaced_omegas, GaborNet, basis.fourier_features (dyadic)Gaussian Fourier-feature encodergeonnax
CompressionSIREN, ConditionedINR; CPTensor, TuckerTensor, TTTensorA fair benchmark firstgeostack
Gridless reconstructionencoders + INRs; GeoFNO(x_out=…); GeoPoints with paddingA point-observation operator; vardax batches assume observation shape = state shapevardax
Bayesian / UQ fieldspyrox-nn BayesianNeuralField + BNFEstimator (BayesNF port), BayesianSIREN, BayesianFourierNet, EnsembleMAP, EnsembleVI; SNGPBNF noise fixed at σ = 0.1; Gaussian only; BNF-only, pandas-only estimator; no sphere encoder in BNFpyrox-nn
Amortized fieldsFiLM AffineModulation, HyperLinear, HyperSIREN, BayesianAffineModulationLatent table, shift modulation, MFN conditioninggeonnax
Physics constraintsvardax DynIncrements, DynTrajectory (ODE residuals); geonnax divfree_basis, vector_spherical_harmonicsCoordinate-derivative operators; PDE residual at collocation pointsgeonnax, vardax
Neural-field 4D-Varvardax strong / weak / incremental 4D-Var; linear ReducedBasis (only in Incremental4DVar, only at t = 0)Nonlinear parameterization; first-order minimiser; space-time field modelvardax
Trace gasesvardax AveragingKernel; geonnax README XCH₄ demoAveraging kernel inside a pyrox likelihoodpyrox-nn
Foundation-model decodersGeoFNO point queries, SpectralConv.to_pointsLIIF-style local decodergeonnax

5The plan by library

geonnax (theme 1, theme 2)

IssueWhatStage
geonnax#132geonnax.diffops: gradient, divergence, Laplacian, surface gradient, Laplace–BeltramiA
geonnax#133GaussianFourierEncoderB
geonnax#134NeuralFieldMLP: the BayesNF architecture as a deterministic coreB
geonnax#135Notebook: neural fields on the Western Mediterranean SSH tracksB
geonnax#136SeparableINR (SPINN)C
geonnax#137FourierNet / GaborNet inside ConditionedINRD
geonnax#138LatentTable and ShiftModulationD
geonnax#139LocalImplicitDecoder (LIIF)D
geonnax#140healpix_gridD
geonnax#141Research: HEALPixFeatureGridD

The derivative operators are operators and not losses, so they keep geonnax’s “no losses” rule, and the residual costs live in vardax. The BayesNF core moves down from pyrox-nn for two reasons: 1) so that pyrox-nn’s BNF becomes a wrapped core like every other Bayesian network there, and 2) so that it can take spherical-harmonic features.

pyrox-nn (theme)

IssueWhatStage
pyrox#316Learned and per-observation noise in the BNF likelihoodA
pyrox#317NeuralFieldEstimator for any PyroxModule, on arrays or xarrayB
pyrox#318Observation operator inside the likelihood (averaging kernels, footprints)B
pyrox#319BayesianNeuralField wraps geonnax.NeuralFieldMLPB
pyrox#320Regression heteroscedastic headB
pyrox#321SphericalHarmonicFeatures: a weight-space GP on S² (the OI-equivalent baseline)B
pyrox#322Last-layer GGN Laplace for any PyroxModuleC
pyrox#323[Design] neural-field mean plus GP residualC

pyrox (GeoML tier 2) may not import vardax (tier 3), so the likelihood takes the observation operator as a plain callable, which vardax’s AveragingKernel satisfies.

vardax (theme)

IssueWhatStage
vardax#83PointObsBatch and FieldPointObs; observation shape no longer tied to state shapeA
vardax#84StateParameterization, generalizing ReducedBasisC
vardax#85OptaxMinimiserC
vardax#86ResidualPenalty: PDE residual at collocation pointsC
vardax#87SpaceTimeFieldVar: neural-field 4D-Var (Oh 2025)C
vardax#88Notebook: neural-field 4D-Var on 2-D Kolmogorov flowC

The point-observation batch also fixes the classical models on along-track data, so it pays off without any neural field. somax stays a forbidden import, so the PDE residuals enter as callables, as the forward models do today.

The space-time neural-field 4D-Var loss is written over the network weights θ∈RDθ\gvect{\theta} \in \mathbb{R}^{D_\theta}, with the field x(s,t;θ)∈Rx(\vect{s}, t; \gvect{\theta}) \in \mathbb{R} at the coordinates s=(λ,ϕ)\vect{s} = (\lambda, \phi) and time tt. Each observation yn∈Ry_n \in \mathbb{R}, n=1,…,Nobsn = 1, \ldots, N_\text{obs}, sits at (sn,tn)(\vect{s}_n, t_n) with error standard deviation σn∈R>0\sigma_n \in \mathbb{R}_{>0}. The PDE residual operator R[x]\mathcal{R}[x] vanishes on the true flow and is evaluated at the collocation points (sj,tj)(\vect{s}_j, t_j), j=1,…,Ncj = 1, \ldots, N_c, and βPDE,βθ∈R≥0\beta_\text{PDE}, \beta_\theta \in \mathbb{R}_{\ge 0} are the weights of the two penalties:

L(θ)=12∑n=1Nobs(yn−x(sn,tn;θ))2σn2+βPDE2Nc∑j=1Nc∥R[x(⋅;θ)](sj,tj)∥2+βθ2∥θ∥2\mathcal{L}(\gvect{\theta}) = \frac{1}{2} \sum_{n=1}^{N_\text{obs}} \frac{(y_n - x(\vect{s}_n, t_n; \gvect{\theta}))^2}{\sigma_n^2} + \frac{\beta_\text{PDE}}{2 N_c} \sum_{j=1}^{N_c} \Vert \mathcal{R}[x(\cdot; \gvect{\theta})](\vect{s}_j, t_j) \Vert^2 + \frac{\beta_\theta}{2} \Vert \gvect{\theta} \Vert^2

There is no background term (the Σx\gmat{\Sigma}_x term of classical 4D-Var), as the network’s spectral bias plays its role. We write it as a loss L\mathcal{L} rather than a cost J\mathcal{J} because the control is the parameters θ\gvect{\theta} and not a state.

geostack (theme)

IssueWhatStage
geostack#84[Design] the stat / moment dim for uncertainty outputs (CS-F15)A
geostack#85Neural-field entries and gates for case 9, case 11 and methane stage 3A–C
geostack#86Research: neural-field compression vs SZ3 / ZFP at matched maximum errorD

Carrier wrappers stay out of geonnax (L1 only). The GeoTracks → field operator for case 9 goes behind vardax[geo], and those for case 11 and stage 3 go behind pyrox.adapters.pipekit.

6Stages and gates

  A · plumbing
    vardax#83 point obs · pyrox#316 per-obs σ · geonnax#132 diffops · geostack#84 stat dim
    ── GATE: SH-SIREN on case 9 tracks matches OI RMSE;
             BNF + σₙ on case 11 ≤ GP CRPS
        │
        ▼
  B · uncertainty + methane
    pyrox#317, #318, #319, #320, #321 · geonnax#133, #134, #135
    ── GATE: stage-3 XCH₄ gap-fill beats kriging;
             90% intervals cover 85–95%
        │
        ▼
  C · physics
    vardax#84, #85, #86, #87, #88 · geonnax#136 · pyrox#322, #323
    ── GATE: reproduce Oh (2025) on 2-D Kolmogorov flow;
             case 9 with a QG residual beats the stage-A field
        │
        ▼
  D · research bets
    geonnax#137–#141 · geostack#86
    ── GATE: each beats its stage A–C baseline on one anchor,
             or it stays a notebook

The gates are scored in geostack#85. Stage A is low risk to start now, as every item in it also helps models without neural fields.

7Open questions

IDQuestionRecommendation
NF-O1A column averaging kernel needs the field on pressure levels, x(λ,ϕ,t,p;θ)x(\lambda, \phi, t, p; \gvect{\theta}), or a single collapsed weight per pixelSupport both (pyrox#318); start with the collapsed column, measure the profile version on synthetic data
NF-O2pyrox’s Parameterized registry lives outside the pytree, so eqx.tree_at or filter_jit rebuilds lose it; BayesianSlepianEncoder uses itTest composition inside wrapped cores early; move it to the pyrox_sample pattern if it breaks
NF-O3pyrox-nn swaps geonnax fields by name (W, b, Omega, phi, layers, …)Wave 6 adds fields, never renames them
NF-O4Spectral bias as a prior gives no calibrated error barsReport ensemble spread from the start in neural-field 4D-Var (vardax#87)
NF-O5SWOT KaRIn noise below 30–50 km is wave-correlated and a high-ω₀ SIREN will fit it as signalHold out SWOT swaths in case 9 and use a correlated-noise Σε\gmat{\Sigma}_\varepsilon
NF-O6Who owns field derivatives: geonnax diffops (autodiff on continuous fields), xrtoolz xrgrad (grids) or spectraldiffx (spectral)?Different objects; keep diffops a submodule so the capability index shows no clash
NF-O7Is compression worth building?Only if geostack#86 shows a win at matched maximum error, or for random-access and derivative queries

8Relationships