Skip to content
View jejjohnson's full-sized avatar
👨‍💻
Coding…
👨‍💻
Coding…

Highlights

  • Pro

Organizations

@IPL-UV @spaceml-org

Block or report jejjohnson

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
jejjohnson/README.md

J. Emmanuel Johnson

Research scientist and scientific software engineer · differentiable Earth observation in JAX
UNEP IMEO · Methane Alert and Response System (MARS) · Valencia, Spain

GeoStack docs · Research notebook · LinkedIn · X / Twitter


I build the software that turns satellite and in-situ observations into numbers someone can act on, each with an honest error bar. The physics is differentiable, the inference is Bayesian, and every step is checked against a trusted oracle. All of it lives in one open-source JAX stack: GeoStack.

From observations to decisions: sensors feed GeoStack, which feeds differentiable physics (GeoModels) and inference (GeoML) on top of GeoNumerics; outputs are decisions with uncertainty, and gradients flow back end to end. Methane and sea surface height are two case studies.

The stack

Earth observation code usually means gluing together a reader, a regridder, a physics model, an inverse method and an ML model that were never designed to meet. GeoStack is the opposite: small libraries with one contract each, laid out along the data-maturity axis from raw instrument output (L0) to decisions (L5). The science axis says what each level means. The compute between two levels is where physics and inference live. The engineering axis underneath says how the data is stored, carried and composed at every level.

GeoStack along the data-maturity axis: the science axis from L0 unstructured observations to L5 derived products, with methane and sea-surface-height case studies running along it; the compute step between each pair of levels, all following the same oracle-first ladder on GeoNumerics; and the engineering axis of store, index, read, carry, patch, transform and compose, with the carrier switching from geoarray to xarray at L3.

How the packages layer: imports only point down, and CI proves the graph has no cycles

GeoStack's four layers: GeoModels on top, GeoML below it, and GeoNumerics and GeoStack side by side at the base, all on JAX, Equinox, lineax, NumPyro and xarray.

Layer Library What it does
GeoStack geotoolz Raster operators, STAC catalog and patching; geoarray, one geo-carrier for NumPy and JAX, with a differentiable affine transform
xrtoolz The same operator model on xarray: indices, temporal statistics, CF output
pipekit Composable Operator and pipeline protocols shared by every package
GeoNumerics gaussx Structured linear algebra: Kalman filters, GP primitives, block operators on lineax
finitevolX Finite-volume operators on staggered grids
spectraldiffx Spectral derivatives and solvers
GeoML vardax Variational data assimilation: 3D-Var, 4D-Var, optimal estimation
filterax Ensemble and Kalman filtering
pyrox · kernellib Gaussian processes and probabilistic NNs for NumPyro; kernels
geonnax Neural fields and basis functions for geoscience
gauss_flows Normalizing flows and SurVAE
optax_bayes The Bayesian learning rule as Optax optimizers
xtremax Extreme values with JAX and NumPyro
GeoModels radtrax Differentiable radiative transfer, matched filters, retrievals
plumax Plume physics: masks, integrated mass enhancement, flux, emission rates
somax Simple ocean models: quasi-geostrophic, shallow water

The method

Every problem in the stack follows the same ladder. Step 2, a slow but trusted physics-based inversion, is the oracle that every faster learned method must match before it ships.

Six steps: a simple generative model; model-based inference as the trusted oracle; an emulator; emulator-based inference; amortized inference; and an outer loop that improves each step against the one before it.

Case studies

Methane: from radiance to emission rate

Detecting and quantifying methane plumes from EMIT, Sentinel-2 and Landsat 8/9. A layered Beer–Lambert forward model in radtrax gives the matched-filter target and every Jacobian by autodiff. The pipeline then runs matched filter, plume vetting and optimal estimation through vardax. plumax turns the column enhancement into an emission rate in kg/h.

The full methane walkthrough, from scene catalog to served model

Eight steps: catalog EMIT scenes, retrieve methane, match with TCCON, grid and gap-fill with a GP, assimilate hourly with an ensemble Kalman filter and a plume model, then index, evaluate and serve.

Sea surface height: from altimetry tracks to gap-free maps

Mapping the ocean's mesoscale from sparse along-track altimetry. OceanBench: The Sea Surface Height Edition (NeurIPS 2023, Datasets and Benchmarks) is a benchmark and toolkit for SSH interpolation (docs, code). The methods range from optimal interpolation and neural fields (ml4ssh, knerf, functa4eo) to quasi-geostrophic models in somax inside 4D-Var.

How it came together

GeoStack is not a fresh start; it is ten years of research code, rebuilt so the pieces fit.

Swimlane timeline 2017–2026: manipy, kernellib, rbig, ml4ssh and jbayesevt became GeoML; the 2023 ocean solvers became GeoModels and GeoNumerics; OceanBench became the benchmarks; plumax and radtrax carry the methane work.

Older work still worth a look: rbig (Rotation-Based Iterative Gaussianization and information measures), jbayesevt (Bayesian extreme value models), manipy (semi-supervised manifold learning), keras-fairkl (fair kernel learning), and my research notebook of notes and tutorials.

How I work

  • JAX all the way down. Equinox modules, with jit, vmap and grad through the physics, and float64 where the maths needs it.
  • Tested against the truth. Every refactor merges behind numeric gates: parity with the code it replaces, autodiff against finite differences, closed-form oracles.
  • Small packages, explicit seams. Heavy dependencies sit behind optional extras, and everything is MIT-licensed.

Interests: atmospheric retrievals · data assimilation · Gaussian processes and uncertainty quantification · neural fields · extremes · ML for dynamical systems.

Built on

GeoStack stands on the shoulders of these open-source projects, and the packages above are designed to compose with them rather than replace them.

JAX numerics · JAX · Equinox · jaxtyping · lineax · diffrax · optimistix · matfree · finitediffx · interpax · einx · einops

Probabilistic ML and training · NumPyro · Optax · FlowJAX · BlackJAX · Grain · Orbax

Geospatial data · xarray · georeader (GeoTensor) · rasterio · rioxarray · GeoPandas · Shapely · pyproj · xvec · regionmask · xrft

Cloud-native storage and catalogs · obstore · async-geotiff · Zarr · fsspec · Dask · DuckDB · PyArrow · pystac · pystac-client

Data access · earthaccess · Planetary Computer · Earth Engine · Copernicus Marine · CDS API · HITRAN

The scientific Python base · NumPy · SciPy · scikit-learn · scikit-image · pandas

A special thanks to Patrick Kidger's JAX ecosystem: Equinox, lineax, diffrax, optimistix and jaxtyping are the backbone of nearly every package here.

Figures generated with GeoStack's own figure code · Python · JAX · Equinox · NumPyro · xarray

Pinned Loading

  1. gp_model_zoo gp_model_zoo Public

    Literature and light wrappers for gaussian process models.

    Jupyter Notebook 48 2

  2. oceanbench oceanbench Public

    OceanBench - SSH edition

    Jupyter Notebook 23 1

  3. IPL-UV/rbig_jax IPL-UV/rbig_jax Public

    Iterative and Parametric Gaussianization with JAX.

    Jupyter Notebook 5 1

  4. uncertain_gps uncertain_gps Public

    Exploring how to to deal with uncertain inputs with gaussian process regression models.

    Jupyter Notebook 27 2

  5. research_notebook research_notebook Public

    My personal research notebook with notes, tutorials, and resources written in Jupyterbook.

    Jupyter Notebook 21 1

  6. jejeqx jejeqx Public

    My models that I look at to test out JAX.

    Jupyter Notebook 1