GeoBrain#
GeoBrain is an open, modular platform for Geoscientific Bayesian Reasoning with Artificial Intelligence, built for integrated subsurface modeling.
It combines differentiable physics, Bayesian inference and deep learning so that a whole workflow, from a geostatistical earth model through rock physics to a geophysical forward model and back out as an inversion, is one computational graph. 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.
Where to start
New here? Installation then Quick start is ten minutes. If you would rather see it work first, every figure in the examples gallery is the unedited output of a script you can run.
The whole platform on one screen: a density model, the gravity it produces,
and the model recovered back out of that data. From
examples/00_showcase/01_gravity_inversion.py.#
The four ideas#
Everything else in GeoBrain, from the physics families to the samplers to the neural parameterizations, is something you can add without touching these.
Every forward model is a ForwardOperator that declares a
DifferentiabilitySpec: its trainable inputs, its outputs, and how its
gradient is obtained: full autograd, an implicit adjoint, or a hand-written
VJP. The declaration is checked against finite differences, so “this is
differentiable” is something the platform can be held to rather than a promise
in a docstring.
@Chain operators in series, run them in parallel as an OperatorBundle, 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.
TensorMesh, OctreeMesh and UnstructuredMesh each
satisfy named protocols, and each physics says which it needs, so “this kernel
cannot run on that mesh” is a type error rather than a wrong answer. A
differentiable MeshProjection bridges them, which is what lets one joint
inversion run the wave equation on a structured grid and gravity straight on
triangles.
The same InverseProblem serves 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 to keep in step with the
first.
Read the architecture in full, or see all four at once in
examples/00_showcase/.
What is in the box#
Geological modeling |
kriging family, sequential and indicator simulation, variograms with fitting diagnostics, differentiable implicit modelling |
Rock physics |
effective medium, granular media, fluid substitution, empirical relations, petrophysics |
Wave |
acoustic / elastic / visco time-domain, Helmholtz with an implicit adjoint, AVO reflectivity, wavelets |
Electromagnetics |
DC, IP, SIP, MT, FDEM, TEM, CSEM, airborne, SP |
Potential fields |
gravity 2-D/3-D, magnetics with remanence, Euler deconvolution |
Flow |
differentiable two-phase reservoir simulation with wells |
Inversion |
regularizers, bounds, IRLS, gradient processors, Adam and L-BFGS |
Bayesian |
HMC, NUTS, Langevin, SVGD behind one |
Neural networks |
Deep Image Prior and latent-space reparameterizations |
Decision |
efficacy of information, scored cell by cell from a prior ensemble |