GeoBrain is an open, modular, and extensible platform for Geoscientific Bayesian Reasoning with Artificial Intelligence, designed specifically for integrated subsurface modeling.
By combining differentiable physics, Bayesian inference, and deep learning, GeoBrain enables end-to-end workflows for subsurface characterization, from geomodeling and rock physics to geophysical simulation and inversion. Every forward model is a composable operator, every operator declares how it differentiates, and the same problem object serves a deterministic optimiser and a posterior sampler alike.
Four contracts make that possible. Everything else, from the physics families to the samplers to the neural parameterizations, is something you can add without touching them.
- An operator is a contract, not a function. Every forward model is a
ForwardOperatorthat declares aDifferentiabilitySpec: its trainable inputs, its outputs, and how its gradient is obtained (full autograd, an implicit adjoint, or a hand-written VJP). The declaration is machine-checked against finite differences, so "this is differentiable" is a statement the platform can be held to rather than a promise in a docstring. - Physics composes with
@. Chain operators in series (Gravity2D(survey) @ GardnerOperator()), run them in parallel as anOperatorBundle, and the composition's contract is derived from its links: trainable inputs from the entry link, outputs from the terminal link, differentiability level the weakest of the members. A chain that cannot be honoured is refused when you build it, not when you run it. - A mesh declares capabilities; physics declares requirements.
TensorMesh(uniform or graded),OctreeMeshandUnstructuredMesheach satisfy a set of named protocols (UniformMesh,StructuredMesh,GeometryMesh,PrismGeometryMesh,ConnectivityMesh), and each physics declares which it needs, so "this kernel cannot run on that mesh" is caught by the type system rather than by a wrong answer. A differentiableMeshProjectionbridges them, which is what lets a joint inversion run the wave equation on a structured grid and gravity straight on triangles, and still return one gradient from one backward pass. - One problem, two doors. The same
InverseProblemserves a deterministic optimiser (create_inverter().run()) and a posterior sampler (as_posterior().sample("nuts")). Uncertainty quantification is a method call on the object you already built, not a second pipeline that has to be kept in step with the first.
- Differentiable Multiphysics Modeling: geostatistics, rock physics, seismic, electromagnetics, potential fields and reservoir flow in one computational graph.
- Automatic Differentiation: inversion without hand-crafted gradients. Where autograd is the wrong tool, an implicit adjoint or a custom VJP is declared and checked against finite differences.
- Mesh Taxonomy with Capability Contracts: tensor, graded, octree and unstructured meshes; physics runs where it is allowed to run.
- Deep Neural Network Integration: Deep Image Prior and latent-space reparameterizations that compose onto a physics chain like any other operator.
- Bayesian Gradient-Informed Samplers: HMC, NUTS, Langevin and SVGD behind one
Posterior, with change-of-variable transforms and R-hat / ESS diagnostics. - Geostatistics: the kriging family, sequential and indicator simulation, variogram fitting with diagnostics, declustering and transforms.
- Decision Under Uncertainty: the efficacy of information of a proposed measurement, scored cell by cell from a prior ensemble. What to measure next, costed before it is measured.
- Plug-and-Play Architecture: each physics module is self-contained and composable, so new physics goes in without rewriting core logic.
git clone https://github.com/GeoBrain-Project/GeoBrain.git
cd GeoBrain
pip install -e ".[examples]"See the documentation for tutorials and API reference.
