A minimal implementation of preconditioned Crank-Nicolson MCMC sampling.
minipcn can be installed using from PyPI using pip:
pip install minipcnThe basic usage is:
from minipcn import Sampler
import numpy as np
log_prob_fn = ... # Log-probability function - must be vectorized
dims = ... # The number of dimensions
rng = np.random.default_rng(42)
sampler = Sampler(
log_prob_fn=log_prob_fn,
dims=dims,
step_fn="pcn", # Or tpcn
rng=rng,
)
# Generate initial samples
x0 = rng.randn(size=(100, dims))
# Run the sampler
chain, history = sampler.run(x0, n_steps=500)For a complete example, see the examples directory.
minipcn also supports different array API backends via array-api-compat
and orng for random number generation. These can be installed by running
pip install minicpn[array-api]
Usage is then similar to when using numpy, except one must use the RNG from
orng and specify the backend via xp:
from minipcn import Sampler
from orng import ArrayRNG
import torch
log_prob_fn = ... # Log-probability function - must be vectorized
dims = ... # The number of dimensions
rng = ArrayRNG(backend="torch", seed=42)
sampler = Sampler(
log_prob_fn=log_prob_fn,
dims=dims,
step_fn="pcn", # Or tpcn
rng=rng,
xp=torch,
)
# Generate initial samples
x0 = rng.randn(size=(100, dims))
# Run the sampler
chain, history = sampler.run(x0, n_steps=500)Note: this still uses numpy when initializing the tpcn kernel.
If you use minipcn in your work, please cite our DOI
If using the tpcn kernel, please also cite Grumitt et al