Skip to content

timweiland/GPFiniteVolume.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

Watchers

Forks

Releases

Packages

Contributors

Languages