Feature flags
Cargo features in stochastic-rs — what each one pulls in, how they propagate across the workspace, and which features your crates need.
Feature flags
Cargo features in this workspace are opt-in. The default build links no GPU, no BLAS, no Python, no neural surrogates — just the pure Rust core.
The matrix
| Feature | Owner crate | Pulls in | Use when |
|---|---|---|---|
ai | umbrella | stochastic-rs-ai, candle-core | NN volatility surrogates |
cuda | -stochastic | cudarc + cuFFT + NVRTC | NVIDIA GPU: FGN / fBM (cuFFT) and the Euler engine kernels for Gbm / Ou / Cir (Cuda backend, f32 or f64) |
metal | -stochastic | metal | Apple GPU: FGN / fBM and the Euler engine in hand-written MSL (Metal backend, f32) |
accelerate | -stochastic | Apple vDSP (system framework) | macOS CPU-FFT FGN / fBM (Accelerate backend; a host device for every process) |
python | -py (cdylib) | pyo3, numpy | Building the wheel via maturin |
ai-metal | umbrella | candle-core/metal | candle's Metal back-end for surrogate training (ai::device::best_available); CUDA comes from candle-core/cuda in the consuming manifest |
ai, metal, cuda, accelerate | -py | the sub-crate features above | Source-build extras of the Python module (maturin develop --features …): the surrogates + calibrate_surrogate, and the device back-ends behind the process classes' device=; none of them is in the published wheels |
hotpath | umbrella | tracing-subscriber | Hot-path profiling helpers |
dual-stream-rng | -core, -distributions | none (additive) | ~2–6 % bulk Normal-Ziggurat speedup on Apple Silicon (Exp at parity) — see seeding |
The GPU / accelerator features above select a sampling backend chosen at compile
time with .on::<B>() — see the Backends concept page.
Propagation
A feature on the umbrella stochastic-rs crate maps to a feature on the
relevant sub-crate. Example from the umbrella Cargo.toml:
[features]
default = []
ai = ["stochastic-rs-ai"]
cuda = ["dep:cudarc", "stochastic-rs-stochastic/cuda"]
metal = ["dep:metal", "stochastic-rs-stochastic/metal"]
dual-stream-rng = [
"stochastic-rs-core/dual-stream-rng",
"stochastic-rs-distributions/dual-stream-rng",
]If you depend on a sub-crate directly (recommended for lean builds), you enable the feature on that sub-crate:
stochastic-rs-stats = { version = "3.0.0-beta.3" }Common gotchas
- Linear algebra needs no feature at all. Cholesky, SVD, eigen and
least squares run on the pure-Rust
faerand are always compiled in; the BLAS-backed feature flag from 2.x was removed in 3.0. cudarequires the CUDA toolkit on the build machine. CI builds do not install it by default.aiis heavy. It pulls incandle-core, which is a substantial ML stack. Only enable when you actually need NN surrogates.
Defining a new feature
When adding a new optional dependency, follow the feature-flag-management SKILL. The short version:
- Add the feature on the owner sub-crate (where the optional dependency lives).
- Re-export the feature on the umbrella via
feature_x = ["stochastic-rs-sub/feature_x"]. - Update the matrix above and the per-feature CI job.
- Add a
cfg-gated module so default builds don't pull in the dep.
Seeding & RNG
The uniform `new(args, &seed)` constructor pattern, the `SeedExt` strategies (`Unseeded` / `Deterministic`), in-place reseeding, and dual-stream RNG.
Sampling backends
Compile-time device selection through `.on::<B>()` and `with_backend(handle)` — the `Backend` marker, its capability subtraits, one fallback rule.