| # GPFiniteVolume.jl |
|
|
| [](https://github.com/timweiland/GPFiniteVolume.jl/actions/workflows/CI.yml?query=branch%3Amain) |
| [](https://arxiv.org/abs/2605.31127) |
|
|
| 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](https://arxiv.org/abs/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](https://github.com/timweiland/GaussianMarkovRandomFields.jl) (registered) and [FunctionalGPs.jl](https://github.com/timweiland/FunctionalGPs.jl) (unregistered). Install via: |
|
|
| ```julia |
| 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: |
|
|
| ```bash |
| 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 |
|
|
| ```julia |
| 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: |
|
|
| ```bash |
| 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](https://arxiv.org/abs/2605.31127); this entry will be updated with the PMLR reference once the ICML 2026 proceedings are published. |
|
|
| ```bibtex |
| @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](LICENSE). |
|
|