Skip to main content

Crate fugue

Crate fugue 

Source
Expand description
Fugue

Β§Fugue

A type-safe, monadic probabilistic programming library for Rust β€” pre-1.0 and actively developed

Compose models in direct style; listen backwards with pluggable interpreters and state-of-the-art inference. Learn it interactively at fugue.run.

Rust Crates.io Dev Docs User Docs License: MIT CI codecov Downloads Zotero Discord Ask DeepWiki

Supported Rust: 1.87+ β€’ Platforms: Linux / macOS / Windows β€’ Crate: fugue-ppl on crates.io

§✨ Features

  • Monadic PPL: Compose probabilistic programs using pure functional abstractions
  • Type-Safe Distributions: 17 built-in probability distributions with natural return types
  • Multiple Inference Methods: MCMC, HMC, SMC, Variational Inference, ABC
  • Comprehensive Diagnostics: R-hat convergence, effective sample size, validation
  • Numerically Stable: Log-space computations throughout for robust probability arithmetic
  • Ergonomic Macros: Do-notation (prob!), vectorization (plate!), addressing (addr!)

Β§πŸ€” Why Fugue?

  • πŸ”’ Type-safe distributions: natural return types (Bernoulli β†’ bool, Poisson/Binomial β†’ u64, Categorical β†’ usize)
  • 🧩 Direct-style, monadic design: compose Model<T> values with bind/map for explicit, readable control flow
  • πŸ”Œ Pluggable interpreters: prior sampling, replay, scoring, and safe variants
  • πŸ“Š Diagnostics: R-hat, ESS, validation utilities, and a structured error taxonomy (see error)
  • ⚑ Performance-minded: O(1), allocation-free address clones (Arc<str> with a cached hash) and numerically stable log-space computations

Β§πŸ“¦ Distributions

Bernoulli, Beta, Binomial, Categorical, Cauchy, ChiSquared, DiscreteUniform, Exponential, Gamma, InverseGamma, Laplace, LogNormal, Normal, Poisson, StudentT, Uniform, Weibull β€” 17 in total, each with natural return types and validated parameters.

Β§πŸ§ͺ Where Fugue stands today

Fugue is 0.2.x: pre-1.0, actively developed, with no SemVer stability guarantee yet and a single primary maintainer (see Roadmap, below). It’s extensively tested β€” hundreds of unit, integration, and property-based tests, including statistical regression tests against closed-form posteriors β€” but that’s not the same claim as β€œproduction-ready.” Treat it as a serious, honestly-scoped research-grade PPL: pin an exact version, read the CHANGELOG before upgrading, and expect breaking API changes between 0.x releases as the design settles.

Β§πŸ“¦ Installation

[dependencies]
fugue-ppl = "0.2.0"

Β§Quickstart

cargo add fugue-ppl

Β§πŸ’‘ Example

use fugue::*;
use rand::rngs::StdRng;
use rand::SeedableRng;

// Run inference with model defined in closure
let mut rng = StdRng::seed_from_u64(42);
let samples = adaptive_mcmc_chain(&mut rng, || {
    prob! {
        let mu <- sample(addr!("mu"), Normal::new(0.0, 1.0).unwrap());
        observe(addr!("y"), Normal::new(mu, 0.5).unwrap(), 1.2);
        pure(mu)
    }
}, 1000, 500);

let mu_values: Vec<f64> = samples.iter()
    .filter_map(|(_, trace)| trace.get_f64(&addr!("mu")))
    .collect();

Β§πŸ“š Documentation

  • User Guide - Comprehensive tutorials and examples
  • Explorables - Interactive, touchable essays: drag a prior and watch the posterior re-form, roll HMC across a landscape
  • Playground - Write prob! models in the browser and run real inference, compiled to WASM
  • API Reference - Complete API documentation
  • Examples - See the examples/ directory, including one runnable example per inference method:
    • adaptive_mcmc_chain - most foundation/statistical-modeling examples (e.g. bayesian_coin_flip.rs)
    • hmc_chain (HMC) - see the hmc module rustdoc for a runnable doctest
    • adaptive_smc (SMC) - examples/smc_inference.rs
    • abc_smc_weighted (ABC) - examples/abc_inference.rs
    • optimize_meanfield_vi_with_config (VI) - examples/vi_inference.rs
  • References - Zotero library for Fugue

§🌱 Ecosystem

  • Fugue Evo β€” evolution as Bayesian inference: CMA-ES, NSGA-II, island models, and estimation-of-distribution algorithms on the same foundations, with its own interactive docs and live playground at evo.fugue.run

§🀝 Community

Β§πŸ—ΊοΈ Roadmap

This project is an ongoing exploration of probabilistic programming in Rust. While many pieces are production-leaning, parts may not be 100% complete or correct yet. I’m steadily working toward a more robust implementation and broader feature set.

Planned focus areas:

  • Strengthening core correctness and numerical stability
  • Expanding distribution and inference coverage
  • API refinements and stability guarantees
  • Improved documentation, diagnostics, and examples

API stability / SemVer policy: Fugue follows Cargo’s pre-1.0 SemVer convention: any 0.x.y -> 0.(x+1).0 bump may contain breaking changes, and 0.x.y -> 0.x.(y+1) is additive/non-breaking. There is no 1.0 stability commitment yet; always pin an exact version and read the CHANGELOG before upgrading the minor version.

§🀝 Contributing

Contributions welcome! See our contributing guidelines.

git clone https://github.com/alexnodeland/fugue.git
cd fugue && cargo test

Β§πŸ“„ License

Licensed under the MIT License.

Β§πŸ”— Citation

If you use Fugue in your research, please cite:

@software{fugue2026,
  title = {Fugue: Monadic Probabilistic Programming for Rust},
  author = {Alexander Nodeland},
  url = {https://github.com/alexnodeland/fugue},
  version = {0.2.0},
  year = {2026}
}

Or refer to the β€œInternal” collection in Zotero to generate a bibliography.

Re-exportsΒ§

pub use core::address::Address;
pub use core::distribution::Bernoulli;
pub use core::distribution::Beta;
pub use core::distribution::Binomial;
pub use core::distribution::Categorical;
pub use core::distribution::Cauchy;
pub use core::distribution::ChiSquared;
pub use core::distribution::DiscreteUniform;
pub use core::distribution::Distribution;
pub use core::distribution::Exponential;
pub use core::distribution::Gamma;
pub use core::distribution::InverseGamma;
pub use core::distribution::Laplace;
pub use core::distribution::LogNormal;
pub use core::distribution::Normal;
pub use core::distribution::Poisson;
pub use core::distribution::StudentT;
pub use core::distribution::Uniform;
pub use core::distribution::Weibull;
pub use core::model::factor;
pub use core::model::guard;
pub use core::model::observe;
pub use core::model::pure;
pub use core::model::sample;
pub use core::model::sample_bool;
pub use core::model::sample_f64;
pub use core::model::sample_i64;
pub use core::model::sample_u64;
pub use core::model::sample_usize;
pub use core::model::sequence_vec;
pub use core::model::traverse_vec;
pub use core::model::zip;
pub use core::model::Model;
pub use core::model::ModelExt;
pub use core::model::SampleType;
pub use runtime::handler::Handler;
pub use runtime::interpreters::score_given_trace_reconciled;
pub use runtime::interpreters::PriorHandler;
pub use runtime::interpreters::ReconcileReport;
pub use runtime::interpreters::ReplayHandler;
pub use runtime::interpreters::SafeReplayHandler;
pub use runtime::interpreters::SafeScoreGivenTrace;
pub use runtime::interpreters::ScoreGivenTrace;
pub use runtime::trace::Choice;
pub use runtime::trace::ChoiceValue;
pub use runtime::trace::Trace;
pub use core::numerical::log1p_exp;
pub use core::numerical::log_sum_exp;
pub use core::numerical::normalize_log_probs;
pub use core::numerical::safe_ln;
pub use error::ErrorCategory;
pub use error::ErrorCode;
pub use error::ErrorContext;
pub use error::FugueError;
pub use error::FugueResult;
pub use error::Validate;
pub use inference::abc::abc_rejection;
pub use inference::abc::abc_scalar_summary;
pub use inference::abc::abc_smc;
pub use inference::abc::DistanceFunction;
pub use inference::abc::EuclideanDistance;
pub use inference::diagnostics::classic_r_hat_f64;
pub use inference::diagnostics::extract_bool_values;
pub use inference::diagnostics::extract_f64_values;
pub use inference::diagnostics::extract_i64_values;
pub use inference::diagnostics::extract_u64_values;
pub use inference::diagnostics::extract_usize_values;
pub use inference::diagnostics::print_diagnostics;
pub use inference::diagnostics::r_hat_f64;
pub use inference::diagnostics::summarize_f64_parameter;
pub use inference::diagnostics::Diagnostics;
pub use inference::diagnostics::ParameterSummary;
pub use inference::hmc::hmc_chain;
pub use inference::hmc::HMCConfig;
pub use inference::hmc::HmcSession;
pub use inference::hmc::HmcStepInfo;
pub use inference::hmc::LeapfrogPoint;
pub use inference::mcmc_utils::effective_sample_size_mcmc;
pub use inference::mcmc_utils::effective_sample_size_multichain;
pub use inference::mcmc_utils::geweke_diagnostic;
pub use inference::mcmc_utils::DiminishingAdaptation;
pub use inference::mh::adaptive_mcmc_chain;
pub use inference::mh::adaptive_mcmc_chain_with_overrides;
pub use inference::mh::adaptive_single_site_mh;
pub use inference::mh::block_regeneration_mh;
pub use inference::mh::SiteProposal;
pub use inference::smc::adaptive_smc;
pub use inference::smc::adaptive_smc_with_kernel;
pub use inference::smc::decode_particle;
pub use inference::smc::decode_particles;
pub use inference::smc::effective_sample_size;
pub use inference::smc::multinomial_resample;
pub use inference::smc::normalize_particles;
pub use inference::smc::rejuvenate_particles;
pub use inference::smc::resample_particles;
pub use inference::smc::smc_prior_particles;
pub use inference::smc::stratified_resample;
pub use inference::smc::systematic_resample;
pub use inference::smc::try_decode_particle;
pub use inference::smc::CrossoverKernel;
pub use inference::smc::NoKernel;
pub use inference::smc::Particle;
pub use inference::smc::PopulationKernel;
pub use inference::smc::ResamplingMethod;
pub use inference::smc::SMCConfig;
pub use inference::smc::SMCResult;
pub use inference::validation::ks_test_distribution;
pub use inference::validation::test_conjugate_beta_bernoulli_model;
pub use inference::validation::test_conjugate_normal_model;
pub use inference::validation::ConjugateBetaBernoulliConfig;
pub use inference::validation::ConjugateNormalConfig;
pub use inference::validation::ValidationResult;
pub use inference::vi::elbo_with_guide;
pub use inference::vi::optimize_meanfield_vi;
pub use inference::vi::MeanFieldGuide;
pub use inference::vi::VariationalParam;

ModulesΒ§

core
core module
error
Error handling for probabilistic programming operations.
inference
inference module
macros
macros module
runtime
Runtime System: Probabilistic Model Execution Engine

MacrosΒ§

addr
Create an address for naming random variables and observation sites. This macro provides a convenient way to create Address instances with human-readable names and optional indices. The macro supports two forms:
invalid_params
Create an InvalidParameters error with optional context.
plate
Plate notation for replicating models over ranges.
prob
Probabilistic programming macro, used to define probabilistic programs with do-notation.
scoped_addr
Enhanced address macro with scoping support.
trace_error
Create a TraceError with optional context.