Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GPFiniteVolume.jl

Build Status arXiv

Scalable Bayesian inference for nonlinear conservation laws via Gaussian process finite volume methods (GP-FVM) with sparse Cholesky approximation.

This is the reference implementation for:

Scalable Bayesian Inference for Nonlinear Conservation Laws
Tim Weiland and Philipp Hennig.
International Conference on Machine Learning (ICML), 2026.
arXiv:2605.31127

What this package does

GPFiniteVolume.jl casts the finite volume method as Bayesian inference under a structured Gaussian process prior. The posterior provides not just a numerical solution to a PDE but a calibrated uncertainty estimate over solution, fluxes, and (in inverse problems) unknown source fields. The key ideas are:

  • Mixed linear functionals. Cell integrals, point evaluations, and derivatives are all linear functionals of the GP and can be conditioned jointly.
  • The Finite Volume Method is inference on a joint state over linear functionals. See the paper for details.
  • Sparse Cholesky via Vecchia approximation. A KL-minimizing sparse approximation of the prior precision yields O(N_s^{3/2}) factorization in 2D.
  • Marginal moment-matching in time. A linear-in-time-steps filter that preserves spatial sparsity through moment-matching, avoiding the dense fill-in of standard Kalman prediction.

Installation

GPFiniteVolume.jl depends on GaussianMarkovRandomFields.jl (registered) and FunctionalGPs.jl (unregistered). Install via:

using Pkg
Pkg.add(url="https://github.com/timweiland/FunctionalGPs.jl")
Pkg.add(url="https://github.com/timweiland/GPFiniteVolume.jl")

Or, to develop locally and reproduce the paper figures, clone this repository and instantiate:

git clone https://github.com/timweiland/GPFiniteVolume.jl
cd GPFiniteVolume.jl
julia --project=. -e 'using Pkg; Pkg.add(url="https://github.com/timweiland/FunctionalGPs.jl"); Pkg.instantiate()'

Minimal API example

using GPFiniteVolume
using FunctionalGPs, GaussianMarkovRandomFields

# Matérn 5/2 kernel
k = HalfIntegerMaternKernel(2, [0.15])
endpoints = collect(range(0, 1, length=51))
intervals = intervals_from_endpoints(endpoints)

# Build a sparse GMRF over function values, derivatives, and cell integrals
x0, layout, approx = sparse_gmrf([
    :f       => EvaluationFunctional(endpoints),
    :f_dx    => EvaluationFunctional(endpoints) ∘ PartialDerivative((1,)),
    :f_int   => VectorizedLebesgueIntegral(intervals),
], k; ρ=2.0, ordering=:integrals_coarsest)

# Condition on a subset of function-value observations
obs_indices = indices(layout, :f)[1:10:end]
x_cond = prescribe_indices(x0, obs_indices, observations; noise_std=1e-3)

See experiments/ for full forward and inverse problem examples.

Reproducing the paper figures

All paper figures can be regenerated from the scripts under experiments/. Default parameters reproduce the camera-ready figures. Most scripts use ArgParse and accept --help.

Figure Script Notes
Fig. 1 — Source identification overview (§1) experiments/source_identification/figure_upstream_downstream.jl Requires running run_gpfvm.jl on the relevant problems/*.toml configs first
Fig. 2 — Posterior adaptation under added observations (§4.1) experiments/source_identification/figure_posterior_adaptation.jl
Fig. 3 — Burgers benchmark accuracy + runtime (§4.2) experiments/accuracy_vs_compute/run.jl then paper_plots.jl
Fig. 4 — Poisson kernel-smoothness convergence (§4.3) experiments/poisson_convergence.jl
Fig. 5 — Nonlinear shallow water simulation (§4.4) experiments/nonlinear_shallow_water/run_showcase.jl Followed by plot_results.jl
Fig. 6 — Ordering comparison Pareto frontier (App. A.3) experiments/sparsity_accuracy_experiment.jl
Fig. 7 — Exact precision Cholesky factor (App. A.3) experiments/sparsity_pattern_2d.jl
Figs. 8, 9 — Calibration plot + spatial coverage map (App. C) experiments/source_identification/calibration_experiment.jl 200 random instances; long-running (hours)
Fig. 10 — Scalability timing (App. D) experiments/source_identification/scalability_study.jl Sweeps N = 11..101
Figs. 11, 12 — Nonlinear Burgers source identification (App. E) experiments/burgers_source_identification/run.jl --log-source
Fig. 13 — Gauss--Newton ablation (App. F) experiments/accuracy_vs_compute/gn_ablation.jl

Typical invocation:

julia --project=. experiments/source_identification/run_gpfvm.jl --help
julia --project=. experiments/burgers_source_identification/run.jl -N 16 --n-timesteps 11 --log-source

The calibration and scalability studies are long-running (hours on a single CPU). Other figures complete in seconds to minutes.

Repository layout

src/                            Package source
test/                           Unit tests (julia --project=. -e 'using Pkg; Pkg.test()')
experiments/                    Paper-reproducing experiments
  source_identification/        §4.1 + Apps C, D
  burgers_source_identification/  App. E (nonlinear inverse problem)
  accuracy_vs_compute/          §4.2 + App. F
  nonlinear_shallow_water/      §4.3 shallow water demo
  poisson_convergence.jl        §4.3 + App. B.3
  sparsity_accuracy_experiment.jl  App. A.3 ordering comparison
  sparse_burgers_*.jl           §1, §4.2 forward Burgers demos

Citation

If you use this work, please cite the paper. The arXiv preprint is available at arXiv:2605.31127; this entry will be updated with the PMLR reference once the ICML 2026 proceedings are published.

@misc{weiland2026scalable,
  title         = {Scalable Bayesian Inference for Nonlinear Conservation Laws},
  author        = {Weiland, Tim and Hennig, Philipp},
  year          = {2026},
  eprint        = {2605.31127},
  archivePrefix = {arXiv},
  primaryClass  = {cs.LG},
}

License

MIT. See LICENSE.

About

Code for the paper "Scalable Bayesian Inference for Nonlinear Conservation Laws" [ICML '26]

Resources

Stars

14 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages