minipcn
A minimal implementation of preconditioned Crank-Nicolson MCMC sampling.
Installation
minipcn can be installed from PyPI using pip:
pip install minipcn
Usage
The 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"
)
x0 = rng.normal(size=(100, dims))
chain, history = sampler.sample(x0, n_steps=500, rng=rng)
For a complete example, see the examples directory.
Array API support
minipcn also supports different array API backends via array-api-compat
and orng for random number generation.
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 RandomGenerator
import torch
log_prob_fn = ... # Log-probability function - must be vectorized
dims = ... # The number of dimensions
rng = RandomGenerator(backend="torch", seed=42)
sampler = Sampler(
log_prob_fn=log_prob_fn,
dims=dims,
step_fn="pcn", # Or tpcn
xp=torch,
)
# Generate initial samples
x0 = rng.randn(size=(100, dims))
# Run the sampler
chain, history = sampler.sample(x0, n_steps=500, rng=rng)
Note: the tpCN step falls back to numpy for fitting the Student-t distribution
Functional API
minipcn also supports explicit functional RNG state via
Sampler.sample_functional(...). This is the path to use for JAX compilation
or any workflow where RNG state must be threaded explicitly.
The functional API does not take an RNG object but a backend and state:
import jax
import jax.numpy as jnp
from minipcn import Sampler
from orng.functional import create_functional_backend
dims = 4
rng_backend = create_functional_backend("jax")
rng_state = rng_backend.init_state(seed=42, generator=None)
x0, rng_state = rng_backend.normal(
rng_state,
loc=0.0,
scale=1.0,
size=(32, dims),
dtype=jnp.float32,
)
def log_prob_fn(x):
return -0.5 * jnp.sum(x**2, axis=-1)
sampler = Sampler(
log_prob_fn=log_prob_fn,
dims=dims,
step_fn="pcn",
xp=jnp,
)
samples, history, next_rng_state = sampler.sample_functional(
x0,
n_steps=8,
rng_state=rng_state,
verbose=False,
return_last_only=True,
)
sample_functional(...) returns (chain, history, next_rng_state).
To use it under jax.jit, thread the state through the compiled function:
@jax.jit
def
run(x, state):
samples, history, next_state = sampler.sample_functional(
x,
n_steps=8,
rng_state=state,
verbose=False,
return_last_only=True,
)
return samples, history, next_state
samples, history, rng_state = run(x0, rng_state)
The backend for sample_functional(...) is inferred from xp. For example:
xp=npuses the NumPy functional backendxp=jax.numpyuses the JAX functional backendxp=torchuses the PyTorch functional backend
Use sample(...) for stateful RNG objects and sample_functional(...) when
you want explicit RNG state.
Citing minipcn
If you use minipcn in your work, please cite our DOI
If using the tpcn kernel, please also cite Grumitt et al
Metadata
Release files for minipcn 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| minipcn-0.2.1.tar.gz | 22.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| minipcn-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.8 kB
Release files / minipcn-0.2.1.tar.gz
| Download URL | minipcn-0.2.1.tar.gz |
|---|---|
| Size | 22.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ab27456b9618ff0a7cd393f292f3cece0b052823dfc96d4083efa30aef545da3
|
|
BLAKE2b-256 checksum How to use checksums |
9fae9eb8b19fe7620f94b8b841157ad4f4c8ef97e1d3c800c794da904aaa0400
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 27, 2026.
Transparency logRelease files / minipcn-0.2.1-py3-none-any.whl
| Download URL | minipcn-0.2.1-py3-none-any.whl |
|---|---|
| Size | 15.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9fd31d08d1b7bfe72db61966861ab765bef693576010d5a42b7e647d1a64b85e
|
|
BLAKE2b-256 checksum How to use checksums |
a181a5a68533e58f32751d1304d8b4b2029197d9f5826d30deb81e85167181ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 27, 2026.
Transparency log