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.

vardax Tutorial Master List

A reconciled, exhaustive curriculum for learning data assimilation through vardax β€” JAX-native variational DA shipping seven peer pipekit_cycle.AnalysisStep methods (OI / 3DVar / strong / weak / incremental 4DVar / FourDVarNet / AmortizedPosterior) on a single set of eqx.Module primitives.

Ensemble-DA tutorials live in the sister list TUTORIAL_MASTER_LIST_FILTER.md; GP / SVI tutorials live in ../../gaussian_processes/TUTORIAL_MASTER_LIST.md. Cross-listed items (Bayesian update, structured covariances, sigma points, validation gates, latent-space generative priors) are flagged πŸ”.

Legend β€” Source columns:

Scope tag: 🧱 fundamental Β· πŸ”¬ research Β· πŸŒ‰ bridge Β· πŸ” cross-listed (filterax / GP master list)

Refs column: gh#N = open GitHub issue Β· dd:path = vardax docs/design/<path> Β· math:N = vardax docs/0N_<chapter>.md Β· api:foo = vardax exported symbol.

Math policy: every section’s first notebook (00_*) ports the relevant math chapter from vardax/docs/ directly into the tutorial, so each part is self-contained for someone learning DA from scratch. Subsequent notebooks in the section are API-driven.


Curriculum at a glanceΒΆ


Part 0 β€” FoundationsΒΆ

0.A β€” The Bayesian updateΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
0.1The DA problem from scratch β€” prior + likelihood β†’ posteriorβ€”πŸ§± πŸ”math:01_problem_setting; graphical-model diagram; pairs with filterax 0.1 / GP 0.6
0.2The Gaussian-Gaussian closure β€” covariance form vs information formβ€”πŸ§± πŸ”math:04_oi_blue Β§1; cross-listed with filterax 0.9

0.B β€” Linear-Gaussian closed form (BLUE)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
0.3BLUE from scratch β€” the Kalman update derivationβ€”πŸ§± πŸ”math:04_oi_blue; pairs with filterax 0.3; covariance-ellipse diagram

0.C β€” Variational reformulation (cost ⇄ posterior)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
0.4The variational reformulation β€” argmin = posterior mean in the LG caseβ€”πŸ§±math:05_threedvar Β§1; show 3DVar reduces to BLUE on linear H

0.D β€” pipekit-cycle protocols (the vardax shape)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
0.5The pipekit-cycle protocol family β€” ForwardModel / ObservationOperator / AnalysisStepβ€”πŸ§±dd:pipekit_composition.md; api:vardax.protocols; class-diagram with conformance examples

0.E β€” Your first assimilationΒΆ

#TutorialSourceScopeRefs / Notes
0.6Five-line BLUE on a 1-D toy β€” vdx.OptimalInterpolation end-to-endβ€”πŸ§±api:OptimalInterpolation; minimal Batch1D; bridge to Part 5

Part 1 β€” Observation operatorsΒΆ

Every method in vardax accepts an ObservationOperator. This part walks through the shipped catalogue and the protocol.

1.A β€” MaskedIdentity and the symmetric-masking invariantΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
1.1MaskedIdentity β€” the dense-but-sparse-observed primitiveβ€”πŸ§±api:MaskedIdentity; math:11_observation_operators Β§2; symmetric-masking gotcha

1.B β€” LinearObs with explicit HΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
1.2LinearObs β€” explicit H, structured H, computational dispatchβ€”πŸ§± πŸ”api:LinearObs; cross-listed with filterax 1.5 (structured R)

1.C β€” AveragingKernel (satellite footprints, RTM intuition)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
1.3AveragingKernel β€” satellite retrievals, AA + prior contributionβ€”πŸ§±api:AveragingKernel; math:02_observation_model Β§3; adjoint sanity-check pattern

1.D β€” MultiInstrumentFusion and heterogeneous obsΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
1.4MultiInstrumentFusion β€” combining heterogeneous instrumentsβ€”πŸŒ‰api:MultiInstrumentFusion, InstrumentRegistry, InstrumentSpec; design D9

1.E β€” Writing a custom ObservationOperatorΒΆ

#TutorialSourceScopeRefs / Notes
1.5Writing a custom obs op β€” protocol conformance + adjoint testβ€”πŸ§±dd:pipekit_composition.md Β§ObservationOperator; reuses tests/test_pipekit_protocols.py pattern

Part 2 β€” Forward modelsΒΆ

2.A β€” The pipekit_cycle.ForwardModel protocolΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
2.1ForwardModel protocol β€” what makes a forward and how vardax uses itβ€”πŸ§±dd:pipekit_composition.md Β§ForwardModel; identity / linear / nonlinear examples

2.B β€” Lorenz family wrappers (L63, L96, L96-2L)ΒΆ

#TutorialSourceScopeRefs / Notes
2.2Lorenz wrappers β€” RK4 + ForwardModel interfaceR🧱source: projects/assimilation/src/assimilation/{lorenz63,lorenz96,lorenz96_2l}.py; one-paragraph derivation per system

2.C β€” Shallow water (somax)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
2.3Shallow water on a sphere β€” somax.ShallowWaterModel as a ForwardModelβ€”πŸŒ‰external: somax; pair with strong-4DVar in Part 7

2.D β€” Quasi-geostrophic (somax)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
2.4Quasi-geostrophic β€” classic oceanographic DA testbedβ€”πŸŒ‰external: somax; pair with IncrementalFourDVar in Part 9

2.E β€” Plume models (plumax)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
2.5Gaussian-puff atmospheric dispersion as a ForwardModelβ€”πŸŒ‰external: plumax; pair with AmortizedPosterior in Part 11 (methane single-overpass)

2.F β€” Writing your own forwardΒΆ

#TutorialSourceScopeRefs / Notes
2.6Writing a custom ForwardModel β€” 1-D advection-diffusion worked exampleβ€”πŸ§±dd:pipekit_composition.md Β§ForwardModel; diffrax integration recipes

Part 3 β€” Static priors & covariancesΒΆ

3.A β€” Diagonal B (the simplest case)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
3.1Diagonal B β€” the simplest case, with the tagged-operator gotchaβ€”πŸ§±math:01_problem_setting Β§3; api:lx.DiagonalLinearOperator; positive_semidefinite_tag

3.B β€” Structured priors via gaussx (MatΓ©rn, Kronecker)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
3.2Structured B via gaussx β€” MatΓ©rn, Kronecker, B\sqrt{B}G🧱 πŸ”external: gaussx; cross-listed with GP 1.B / filterax 1.5

3.C β€” Dynamical priors (forward-as-Ο†)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
3.3Dynamical priors β€” forward as Ο†, gradient flow choiceβ€”πŸŒ‰api:DynamicalPrior; dd:pipekit_composition.md; bridge to Part 10

Part 4 β€” Encoders & decoders (latent-space DA)ΒΆ

The β€œlatent-space” angle on vardax β€” autoencoder priors as a regulariser, latent-space assimilation, and observation encoders for the amortized head.

4.A β€” AE priors overview (BilinAE, ConvAE, MLP)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
4.1AE prior architectures β€” BilinAEPrior, ConvAEPrior, MLPAEPriorβ€”πŸ§± πŸ”api:BilinAEPrior1D, ConvAEPrior1D, MLPAEPrior1D, BilinAEPrior2D, BilinAEPrior2DMultivar; cross-listed with GP 6.A (deep kernels)

4.B β€” Pretraining an AE priorΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
4.2Pretraining an AE prior on simulated trajectoriesβ€”πŸ§±api:train_step; pre-training schedule for L96

4.C β€” Latent-space DA (assimilate in z, decode to x)ΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
4.3Latent-space DA β€” assimilate in zz, decode to xxβ€”πŸ”¬ πŸ”math:09_4dvarnet Β§4; cross-listed with GP latent-variable models; ill-conditioning recipe

4.D β€” Observation encoders for amortized inferenceΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
4.4Observation encoders for AmortizedPosteriorβ€”πŸ§±api:IdentityObsEncoder, MLPObsEncoder; bridge to Part 11

Part 5 β€” Optimal Interpolation (BLUE)ΒΆ

5.A β€” BLUE derivation (closed-form Kalman update)ΒΆ

#TutorialSourceScopeRefs / Notes
5.1BLUE β€” closed-form Kalman update derivation, ported from math:04_oi_blueβ€”πŸ§± πŸ”math:04_oi_blue; cross-listed with filterax 0.3

5.B β€” OptimalInterpolation API walkthroughΒΆ

#TutorialSourceScopeRefs / Notes
5.2OptimalInterpolation API β€” lineax.CG inner solve, mask_aware dispatchR🧱api:OptimalInterpolation; source: projects/assimilation/notebooks/01_optimal_interpolation.ipynb

5.C β€” OI with structured BΒΆ

#TutorialSourceScopeRefs / Notes
5.3OI with a MatΓ©rn B β€” observed β†’ unobserved coupling via prior cross-covβ€”πŸ”¬ πŸ”api:OptimalInterpolation; uses gaussx-backed B; cross-listed with GP 1.B

Part 6 β€” 3DVarΒΆ

6.A β€” The 3DVar costΒΆ

#TutorialSourceScopeRefs / Notes
6.1The 3DVar cost β€” derivation + ⇄ BLUE equivalence (Decision D14)β€”πŸ§±math:05_threedvar; D14 invariant verified empirically

6.B β€” ThreeDVar API + minimiser choiceΒΆ

#TutorialSourceScopeRefs / Notes
6.2ThreeDVar β€” choosing the minimiser (BFGS / NonlinearCG / GaussNewton)R🧱api:ThreeDVar; optimistix.AbstractMinimiser choice; source: projects/assimilation/notebooks/02_threedvar.ipynb

6.C β€” Nonlinear H with 3DVarΒΆ

#TutorialSourceScopeRefs / Notes
6.33DVar with AveragingKernel β€” when iterative pays offβ€”πŸŒ‰api:ThreeDVar, AveragingKernel; satellite-retrieval example

Part 7 β€” Strong-constraint 4DVarΒΆ

7.A β€” The 4DVar cost (adjoint of M)ΒΆ

#TutorialSourceScopeRefs / Notes
7.1The 4DVar cost β€” control = x0x_0, perfect-model assumptionβ€”πŸ§± πŸ”math:06_strong_4dvar; cross-listed with filterax 0.8 (4D-Var contrast)

7.B β€” StrongFourDVar APIΒΆ

#TutorialSourceScopeRefs / Notes
7.2StrongFourDVar end-to-end β€” Lorenz-63 long-window forecastR🧱api:StrongFourDVar; source: projects/assimilation/notebooks/03_strong_4dvar.ipynb

7.C β€” forward_adjoint choices (diffrax variants)ΒΆ

#TutorialSourceScopeRefs / Notes
7.3forward_adjoint β€” RecursiveCheckpointAdjoint vs BacksolveAdjoint vs ForwardModeβ€”πŸ§±dd:decisions.md (D15); memory / time table; sets up Part 12
#TutorialSourceScopeRefs / Notes
7.4L96 strong-4DVar β€” partial obs, what dynamics buy youR🧱source: projects/assimilation/notebooks/10_lorenz96_benchmark.ipynb

Part 8 β€” Weak-constraint 4DVarΒΆ

8.A β€” Model-error termΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
8.1Weak-4DVar cost β€” the model-error term, QQ vs BB vs RRβ€”πŸ§±math:07_weak_4dvar

8.B β€” WeakFourDVar APIΒΆ

#TutorialSourceScopeRefs / Notes
8.2WeakFourDVar β€” running it; convergence pitfalls on long windowsR🧱api:WeakFourDVar; source: projects/assimilation/notebooks/04_weak_4dvar.ipynb

8.C β€” Imbalance failure modesΒΆ

#TutorialSourceScopeRefs / Notes
8.3Imbalance failure modes β€” when augmented control divergesβ€”πŸ”¬known L63 long-window failure (PR #73 discussion); when to lower QQ

Part 9 β€” Incremental 4DVarΒΆ

9.A β€” GN outer + CG innerΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
9.1Incremental idea β€” GN outer + CG inner, why the linearised quadraticβ€”πŸ§± πŸ”math:08_incremental_4dvar; cross-listed with filterax 5.3 (GNKI)

9.B β€” IncrementalFourDVar APIΒΆ

#TutorialSourceScopeRefs / Notes
9.2IncrementalFourDVar β€” tuning (n_outer, n_inner, cg_tol)R🧱api:IncrementalFourDVar, IncrementalConfig; source: projects/assimilation/notebooks/05_incremental_4dvar.ipynb

9.C β€” Control-variable transform (gaussx √B preconditioning)ΒΆ

#TutorialSourceScopeRefs / Notes
9.3CVT preconditioning β€” Ο‡=Bβˆ’1/2Ξ΄x\chi = B^{-1/2}\delta x via gaussx.sqrt(B)β€”πŸ”¬ πŸ”math:08_incremental_4dvar Β§4; cross-listed with GP 1.B (root decompositions)

Part 10 β€” FourDVarNet (learned solvers)ΒΆ

10.A β€” Unrolled iteration mathΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
10.1Unrolled-iteration math β€” learned solver as a KK-step netβ€”πŸ§± πŸ”math:09_4dvarnet; bridges to filterax Part 8 (differentiable DA)

10.B β€” FourDVarNet1D / FourDVarNet2D APIΒΆ

#TutorialSourceScopeRefs / Notes
10.2FourDVarNet1D / FourDVarNet2D walkthroughR🧱api:FourDVarNet1D, FourDVarNet2D; source: projects/assimilation/notebooks/06_fourdvarnet.ipynb

10.C β€” Training loop (train_step composition)ΒΆ

#TutorialSourceScopeRefs / Notes
10.3Training a FourDVarNet β€” simulation-based + reconstruction lossβ€”πŸ§±api:train_step, reconstruction_loss; bridge to Part 16

10.D β€” solver_adjoint dispatch (D15)ΒΆ

#TutorialSourceScopeRefs / Notes
10.4solver_adjoint dispatch β€” RecursiveCheckpoint vs OneStep vs Implicitβ€”πŸ”¬dd:decisions.md (D15); api:OneStepAdjoint; bridge to Part 12

Part 11 β€” Amortized posteriorΒΆ

11.A β€” Simulation-based inference framingΒΆ

#TutorialSourceScopeRefs / Notes
11.1SBI framing β€” when amortization winsβ€”πŸ§± πŸ”math:10_amortized_inference Β§1; cross-listed with filterax 10.E (amortised inference)

11.B β€” Regression headΒΆ

#TutorialSourceScopeRefs / Notes
11.2RegressionHead β€” diagonal-Gaussian head, training via NLLR🧱api:AmortizedPosterior, RegressionHead, amortized_train_step; source: projects/assimilation/notebooks/07_amortized_posterior.ipynb

11.C β€” Conditional-flow head (stub β€” pending gauss_flows)ΒΆ

#TutorialSourceScopeRefs / Notes
11.3ConditionalFlowHead β€” exact density via change-of-variables (stub)β€”πŸ”¬ πŸ”api:ConditionalFlowHead; cross-listed with GP normalising-flow tutorials; documents NotImplementedError until gauss_flows lands

11.D β€” Score-diffusion head (stub β€” pending diffrax reverse-SDE)ΒΆ

#TutorialSourceScopeRefs / Notes
11.4ScoreDiffusionHead β€” sampling via reverse SDE (stub)β€”πŸ”¬api:ScoreDiffusionHead; documents NotImplementedError until diffrax reverse-SDE lands

Part 12 β€” Adjoints deep diveΒΆ

12.A β€” What is an adjoint?ΒΆ

#TutorialSourceScopeRefs / Notes
12.1What is an adjoint? β€” VJP vs hand-coded adjoint modelβ€”πŸ§± πŸ”math:12_adjoint_methods; cross-listed with filterax Part 8

12.B β€” diffrax adjoint variantsΒΆ

#TutorialSourceScopeRefs / Notes
12.2diffrax.RecursiveCheckpointAdjoint vs BacksolveAdjoint vs ForwardModeβ€”πŸ§±dd:decisions.md (D15); api:RecursiveCheckpointAdjoint; memory / time table on Lorenz windows

12.C β€” optimistix adjoint variantsΒΆ

#TutorialSourceScopeRefs / Notes
12.3optimistix.ImplicitAdjoint vs RecursiveCheckpointAdjoint for the inner solverβ€”πŸ§±api:ImplicitAdjoint, OneStepAdjoint; when implicit applies (fixed-point)

12.D β€” Writing your own AbstractAdjointΒΆ

#TutorialSourceScopeRefs / Notes
12.4Writing your own optx.AbstractAdjoint β€” OneStepAdjoint as the templateβ€”πŸ”¬api:OneStepAdjoint (Bolte 2023); upstream-contribution arc

Part 13 β€” Posterior uncertaintyΒΆ

13.A β€” Laplace at MAPΒΆ

Key equations / models:

#TutorialSourceScopeRefs / Notes
13.1LaplaceCovariance β€” Gauss-Newton Hessian at MAP, lazy inverseβ€”πŸ§± πŸ”math:13_posterior_covariance Β§2; api:LaplaceCovariance; cross-listed with GP 0.C (variational Laplace)

13.B β€” Gauss-Newton HessianΒΆ

#TutorialSourceScopeRefs / Notes
13.2GaussNewtonHessian β€” reuse the incremental Hessian as posterior covβ€”πŸ”¬api:GaussNewtonHessian; ties to Part 9

13.C β€” Ensemble covariancesΒΆ

#TutorialSourceScopeRefs / Notes
13.3EnsembleCovariance β€” sample covariance from M analysesβ€”πŸŒ‰ πŸ”api:EnsembleCovariance; cross-listed with filterax Part 1 (ensemble stats)

13.D β€” GaussianMarkLikelihood serialisationΒΆ

#TutorialSourceScopeRefs / Notes
13.4GaussianMarkLikelihood β€” Posterior β†’ dict for downstream population modelsβ€”πŸŒ‰api:GaussianMarkLikelihood; dd:posterior.md

Part 14 β€” Validation gates (six-step cycle)ΒΆ

14.A β€” Six-step cycle motivation (D12)ΒΆ

#TutorialSourceScopeRefs / Notes
14.1The six-step cycle β€” why amortized heads need calibration gatesβ€”πŸ§± πŸ”math:14_six_step_cycle; dd:decisions.md (D12); cross-listed with filterax Part 7

14.B β€” assert_posterior_agreementΒΆ

#TutorialSourceScopeRefs / Notes
14.2assert_posterior_agreement β€” marginal z-score check against an oracleβ€”πŸ§±api:assert_posterior_agreement; pair amortized with strong-4DVar oracle

14.C β€” assert_adjoint_calibratedΒΆ

#TutorialSourceScopeRefs / Notes
14.3assert_adjoint_calibrated β€” random-vector JVP probe of βˆ‚xβˆ—/βˆ‚y\partial x^* / \partial yβ€”πŸ”¬api:assert_adjoint_calibrated; Hutchinson-style

14.D β€” simulation_based_calibration (Talts et al.)ΒΆ

#TutorialSourceScopeRefs / Notes
14.4simulation_based_calibration β€” rank histograms (Talts 2018)β€”πŸ§± πŸ”api:simulation_based_calibration; cross-listed with GP / SVI calibration tutorials

Part 15 β€” Orchestration (pipekit composition)ΒΆ

15.A β€” VarDACycle for sequential DAΒΆ

#TutorialSourceScopeRefs / Notes
15.1VarDACycle β€” chaining many forecast β†’ analyse windowsβ€”πŸ§± πŸ”api:VarDACycle; dd:pipekit_composition.md; cross-listed with filterax Part 3

15.B β€” VarSmootherCycle for retrospective windowsΒΆ

#TutorialSourceScopeRefs / Notes
15.2VarSmootherCycle β€” windowed retrospective analysisβ€”πŸ”¬ πŸ”api:VarSmootherCycle; cross-listed with filterax Part 4 (smoothers)

15.C β€” obs_source operatorsΒΆ

#TutorialSourceScopeRefs / Notes
15.3obs_source operators β€” loading obs per cycle from a stream / catalogueβ€”πŸ§±dd:pipekit_composition.md; xarray / georeader recipes

15.D β€” Composing with pipekit.SequentialΒΆ

#TutorialSourceScopeRefs / Notes
15.4Composing vardax in a pipekit.Sequential pipelineβ€”πŸŒ‰dd:pipekit_composition.md Β§5; pk.Lambda wrap; JaxModelOp (when shipped)

Part 16 β€” Training at scale (pipekit-train)ΒΆ

16.A β€” train_step / amortized_train_step primitivesΒΆ

#TutorialSourceScopeRefs / Notes
16.1The train_step primitive β€” eqx.filter_value_and_grad + optaxβ€”πŸ§±api:train_step, amortized_train_step; dd:decisions.md (D5)

16.B β€” pipekit_train.Loss adapterΒΆ

#TutorialSourceScopeRefs / Notes
16.2pipekit_train.Loss adapter β€” VardaxReconLoss over train_stepβ€”πŸ§±api:vardax.adapters.pipekit_train.VardaxReconLoss

16.C β€” TrainingLoop integrationΒΆ

#TutorialSourceScopeRefs / Notes
16.3pipekit_train.TrainingLoop end-to-end for FourDVarNetβ€”πŸŒ‰external: pipekit_train; checkpointing + early stopping

16.D β€” Checkpoints & sweepsΒΆ

#TutorialSourceScopeRefs / Notes
16.4pipekit_train.HyperSweep for FourDVarNet hyperparametersβ€”πŸ”¬external: pipekit_train.HyperSweep; grid over (n_solver_steps, hidden_dim)

Part 17 β€” PerformanceΒΆ

17.A β€” jit basicsΒΆ

#TutorialSourceScopeRefs / Notes
17.1eqx.filter_jit β€” what gets traced, what stays staticβ€”πŸ§±Batch1D shape stability; static=True field pitfalls

17.B β€” eqx.filter_vmap batchingΒΆ

#TutorialSourceScopeRefs / Notes
17.2eqx.filter_vmap over batches and over methodsβ€”πŸ§±source: assimilation/benchmark.py patterns

17.C β€” Memory profiling adjoint variantsΒΆ

#TutorialSourceScopeRefs / Notes
17.3Memory profiling β€” adjoint variant comparison on long L96 windowsβ€”πŸ”¬jax.profiler; ties to Part 12

17.D β€” When to unroll vs scanΒΆ

#TutorialSourceScopeRefs / Notes
17.4Unroll vs jax.lax.scan β€” when each pays offβ€”πŸŒ‰rollout pattern; FourDVarNet n_solver_steps choice

Part 18 β€” DebuggingΒΆ

18.A β€” Cost decomposition (decomposed_loss)ΒΆ

#TutorialSourceScopeRefs / Notes
18.1decomposed_loss β€” splitting prior / obs cost for inspectionβ€”πŸ§±api:decomposed_loss, obs_cost_1d, prior_cost; sanity-check recipes

18.B β€” Inspecting residualsΒΆ

#TutorialSourceScopeRefs / Notes
18.2Residual diagnostics β€” what a healthy assim window looks likeβ€”πŸ§±innovation yβˆ’H(xβˆ—)y - H(x^*), masked-vs-unmasked stats

18.C β€” Common failure modesΒΆ

#TutorialSourceScopeRefs / Notes
18.3Common failure modes β€” Weak div, GN NaN, untagged operators, etc.β€”πŸŒ‰lineax.CG tag requirement; PRs #41 #42 #73 lessons distilled

Part 19 β€” Extending vardaxΒΆ

19.A β€” Writing your own AnalysisStepΒΆ

#TutorialSourceScopeRefs / Notes
19.1Writing your own AnalysisStep β€” protocol conformance + .as_analysis_step()β€”πŸ§±dd:pipekit_composition.md Β§AnalysisStep; eqx.Module template

19.B β€” Protocol-conformance testsΒΆ

#TutorialSourceScopeRefs / Notes
19.2Protocol-conformance tests β€” tests/test_pipekit_protocols.py templateV🧱source: vardax/tests/test_pipekit_protocols.py; isinstance-check pattern

19.C β€” Publishing as a pluginΒΆ

#TutorialSourceScopeRefs / Notes
19.3Publishing your method as a vardax-compatible pluginβ€”πŸ”¬packaging recipe; entry-points pattern

20.A β€” Lorenz benchmarks (β†’ projects/assimilation/)ΒΆ

#TutorialSourceScopeRefs / Notes
20.1Lorenz-63, Lorenz-96 (1L + 2L) benchmarksR🧱source: projects/assimilation/notebooks/; analysis-then-forecast view across all seven methods

20.B β€” SSH satellite interpolationΒΆ

#TutorialSourceScopeRefs / Notes
20.2SSH satellite interpolation β€” FourDVarNet2D on OceanBench-style dataβ€”πŸŒ‰math:16_ssh_example; bridges to oceanography use case

20.C β€” Methane single-overpass retrievalΒΆ

#TutorialSourceScopeRefs / Notes
20.3Methane single-overpass β€” AveragingKernel + plumax Gaussian puffβ€”πŸŒ‰math:17_methane_example; pair with Part 11 amortized head

20.D β€” Multi-instrument atmospheric fusionΒΆ

#TutorialSourceScopeRefs / Notes
20.4Multi-instrument atmospheric fusion β€” TROPOMI + EMIT + GHGSatβ€”πŸ”¬api:MultiInstrumentFusion; design D9; ties to Part 1.D

Status snapshotΒΆ

This is a curriculum scaffold. Each row’s Source column reflects what already exists:

Follow-up PRs will populate projects/assimilation/notebooks/vardax/<section>/<name>.ipynb (a new vardax/ subdirectory under the existing notebooks tree, alongside 00_lorenz63_setup.md and friends) and flip the Source column from β€” to R. Pure-prose chapters that port math may land as .md instead of .ipynb.

v1 priority (~6 sessions, ~35 notebooks): Parts 0–6 + 13 + 14 + 16 + the L63 entries that already exist in projects/assimilation/. Foundations + components + half the seven methods + posterior + validation + training.

v2 priority: Parts 7–12 dynamics + adjoints depth; Parts 15 cycling demo; Part 17 performance; Part 19 extension; Part 20 applied demos.

v3 priority: stub heads (11.C, 11.D) flipped to real when gauss_flows / diffrax reverse-SDE land; Part 9.C CVT depending on gaussx.sqrt; somax / plumax forwards (2.C / 2.D / 2.E).