Skip to content

Distributions

Nautilus.Distributions provides functions for 12 probability distribution families.

DistributionPDFCDFSurvivalInverse CDFSample
Normalnormal_pdfnormal_cdfnormal_inv_cdfnormal_sample
LogNormallognormal_pdflognormal_cdflognormal_inv_cdflognormal_sample
Uniformuniform_pdfuniform_cdfuniform_inv_cdfuniform_sample
Exponentialexponential_pdfexponential_cdfexponential_inv_cdfexponential_sample
Gammagamma_pdfgamma_cdfgamma_sfgamma_inv_cdfgamma_sample
Chi-squaredchi_squared_pdfchi_squared_cdfchi_squared_sfchi_squared_inv_cdfchi_squared_sample
Student-tstudent_t_pdfstudent_t_cdfstudent_t_sample
Poissonpoisson_pmfpoisson_cdf
Binomialbinomial_pmfbinomial_cdf
Betabeta_pdfbeta_cdf
Ff_pdff_cdf
Weibullweibull_pdfweibull_cdfweibull_inv_cdf

Only the gamma family has a survival function. For the other families, get the upper tail from the symmetry of the distribution, if it has one. Do not calculate 1 - cdf, which loses the full tail to 0.5 * ulp(1.0).

  • Standard normal: normal_cdf(neg(z), 0, 1) is the exact upper tail at z.
  • Student-t: student_t_cdf(neg(t), df) is the exact upper tail at t for all df, because the distribution is symmetric about zero. The identity also applies at df <= 1, where the mean does not exist.
  • Non-standard normal: reflect the mean and the point. The upper tail of N(mu, sigma) at x is Phi((mu - x) / sigma), so write normal_cdf(neg(x), neg(mean), std). If you negate only the point, the result is Phi((-x - mu) / sigma), which is a different value. For N(10, 2) at x = 13, that call returns 6.6e-31, but the correct value is 0.0668.

See Right-tail accuracy.

  • Normal: (x, mean, std), even for the standard normal
  • Gamma: (x, shape, scale), SciPy's convention, not (x, shape, rate)
  • Exponential: (x, rate), unlike SciPy's scale = 1/rate
  • Chi-squared: (x, df) where df is degrees of freedom
  • Student-t: (x, df)
  • Poisson: (k, lambda) where k is the count
  • Binomial: (k, n, p) where n is trials and p is probability
  • Beta: (x, a, b) where a, b are shape parameters
  • F: (x, d1, d2) where d1 and d2 are the numerator and denominator degrees of freedom
  • Weibull: (x, shape, scale) where shape is k and scale is lambda

Discrete counts and trial numbers are f32 values, not integers. Each family page lists its parameter domain and what an invalid parameter returns; several families do not check their parameters at all.

The seven _sample functions take a key as their first argument:

def normal_sample[n](k: key, template: tensor[n, f32], mean: f32, std: f32) -> tensor[n, f32]

The template tensor determines the output shape. The actual values in the template are ignored; only its shape is used. See Sampling with explicit keys for key derivation, methods, and the gamma, chi-squared, and Student-t sampling limits.

import Nautilus.Distributions (normal_pdf, normal_cdf, normal_inv_cdf)
import Nautilus.Distributions (gamma_cdf, student_t_cdf, chi_squared_cdf)
import Nautilus.Distributions (poisson_cdf, binomial_cdf, beta_cdf)

normal_cdf and normal_inv_cdf appear in Black-Scholes pricing, value-at-risk computation, and hypothesis testing. gamma_cdf and student_t_cdf underpin chi-squared and t-test p-values through the Nautilus.Testing module.