This repository accompanies the pre-print "Multproposal Elliptical Slice Sampling".
- Elliptical Slice Sampling (ESS) is recovered by setting M = 1.
- MESS proposes M candidate angles per subiteration and accepts one uniformly or based on a transition matrix.
- All algorithms require: sampling from a Gaussian prior and evaluating a log-likelihood.
-
Algorithms are model-agnostic
- Samplers only need a prior sampler and a log-likelihood.
-
Each problem constructs its own prior
- Prior mean and covariance are derived in the problem class.
- Problems considered: examples 1 (GP) and 2 (LR) in Murray et. al (2010), Semi-Blind Deconvolution from Senn et al. (2025, 2026), toy model for solute transport from Glatt-Holtz et al. (2024).
-
Gaussian priors only
- All problems inherit from GaussianPriorProblem.
- Gaussian sampling is performed via Cholesky decomposition.
- ess.py: ESS (equivalent to MESS with M = 1)
- mess.py: MESS with optional LP-based transition matrices
- utils.py: angle sampling, bracket logic, and helper routines
All problems implement log_likelihood(x) and provide prior construction.
- gp_regression.py: Gaussian process regression
- logistic_regression.py: Bayesian logistic regression
- sbd.py: semi-blind deconvolution inverse problem
- advection_diffusion.py: toy solute transport inverse problem
- stationary.py: RBF and exponential kernels for GP priors
- Synthetic data generators used by the notebooks and tests
The notebooks/ directory reproduces the experiments and figures used in the paper.
- gp_regression.ipynb: baseline ESS/MESS comparison on GP regression.
- logistic_regression_ess_mess.ipynb: Bayesian logistic regression with multiple distance metrics.
- sbd_ess_mess.ipynb: semi-blind deconvolution.
- solute_transport_d10_mess_ellipse_iter10000.ipynb: solute transport toy problem at fixed dimension.
- solute_transport_dim_sweep_shared_draws.ipynb: solute transport dimension sweep with shared draws.
- solute_transport_dim_sweep_shared_draws_lp_compare.ipynb: LP-based transition comparison for the dimension sweep.
import numpy as np
from mess.data.gp_regression import generate_gp_regression_data
from mess.problems.gp_regression import GaussianProcessRegression
from mess.algorithms.ess import ess_step
data = generate_gp_regression_data(seed=0)
problem = GaussianProcessRegression(
X=data["X"],
y=data["y"],
length_scale=1.0,
noise_variance=0.09,
)
x = data["f_init"]
rng = np.random.default_rng(0)
for _ in range(1000):
x, _, _ = ess_step(x, problem, rng)