simsam
Sim(ple)sam(ple) — a Rust library for sampling from custom discrete and continuous distributions.
Define distributions by PDF or CDF (closures, histograms, location-scale transforms, truncation, or simsym symbolic expressions), then draw samples via inverse transform sampling — similar to SciPy rv_continuous.
Features
Sampling
sample()/sample_with_rng()— inverse transform (default: bisection + Newton)BuildOptions::with_hermite(n)— fast PPF table (SciPystats.sampling-style numerical inversion)BuildOptions::with_tdr()— transformed density rejection (TDR); automatic numerical dPDF when only PDF is givenfrom_pdf_dpdf_fn— explicit dPDF for TDR (log-concave hat construction)rand::distr::Distributionintegration- Multivariate sampling: rejection sampling, Metropolis–Hastings (MH), Gibbs, HMC
- Multivariate CDF approximation via Monte Carlo
- Gaussian copula for correlated samples from arbitrary 1D marginals
Choosing a 1D sampler
| Goal | Method |
|---|---|
Default / need accurate ppf |
BuildOptions::default() (inverse transform) |
| Many samples, smooth unimodal CDF | BuildOptions::default().with_hermite(128) |
| Have PDF (+ optional dPDF), rejection-friendly density | BuildOptions::default().with_tdr() |
Note: ppf, mean, and other statistics always use numerical inverse CDF even when TDR is selected for sample().
Distribution API (SciPy-like)
| Method | Description |
|---|---|
pdf, logpdf |
Density (when PDF is available) |
cdf, logcdf |
Cumulative distribution |
sf, logsf, isf |
Survival functions |
ppf |
Percent point function (inverse CDF) |
mean, var, std, median |
Summary statistics |
entropy, expect, interval |
Entropy, E[f(X)], confidence interval |
Constructors
| simsam | SciPy analogue |
|---|---|
from_pdf_fn / from_cdf_fn |
Subclass rv_continuous |
from_pdf_dpdf_fn |
TDR with explicit dPDF |
from_histogram |
rv_histogram |
from_pdf_loc_scale |
loc / scale parameters |
Truncated |
Truncate to sub-interval |
SymbolicContinuous |
Custom _pdf + symbolic CAS (via simsym) |
DiscreteSampler::from_pmf |
rv_discrete(values=...) |
Cargo features
- Default: no symbolic dependency
symbolic: enablesSymbolicContinuousandSymbolicPdfNd
Examples
PDF + statistics
use ;
let support = new.unwrap;
let dist = from_pdf_fn.unwrap;
let x = dist.sample.unwrap;
let m = dist.mean.unwrap; // 0.75
let v = dist.var.unwrap;
let = dist.interval.unwrap;
Fast Hermite sampling
use ;
let opts = default.with_hermite;
let dist = from_pdf_fn_with_options.unwrap;
for _ in 0..10_000
TDR sampling
use ;
let support = new.unwrap;
let dist = from_pdf_fn_with_options
.unwrap;
Histogram
use ;
let edges = vec!;
let counts = vec!;
let dist = from_histogram.unwrap;
Location-scale
use ;
let base = new.unwrap;
let dist = from_pdf_loc_scale.unwrap;
// Y = 10 + 2 * Uniform(0, 1) on [10, 12]
Symbolic (simsym)
use ;
use *;
let x = symbol;
let pdf = rational * x;
let sym = with_defaults.unwrap;
let dist = sym.sampler.unwrap;
Run (symbolic examples are gated):
Multivariate: rejection sampling (2D uniform)
Multivariate: Metropolis–Hastings (2D uniform)
Multivariate: HMC (2D truncated Gaussian; numeric gradient)
Multivariate: Gibbs (independent uniforms via conditionals)
Multivariate: CDF approximation (Monte Carlo)
Copula: Gaussian copula with custom marginals
Conditional factorization sampler
Multivariate symbolic HMC (symbolic gradient)
Python
Python bindings live in python/ as a separate maturin/PyO3 crate. The root Rust crate has no PyO3 dependency, so cargo publish from the repo root is unchanged.
Setup
Usage
=
=
=
=
Optional simsym symbolic PDFs (requires building with the symbolic Cargo feature):
=
See python/README.md for the full Python API.
Limitations
- Finite support required; use a wide interval +
Truncatedfor partial ranges. - Unimodal CDF assumed for inverse transform on continuous distributions.
- No built-in catalog of named distributions (use
rand_distr/statrs), multivariate laws, KDE, orfit(data).
License
BSD-3-Clause — see LICENSE.