distributions

Probability distributions and functions in Nim

Pure Nim score 15/100 · tests present · no docs generated

Summary

Latest Version 2.0.0
License Apache-2.0
CI Status Failing
Downloads 0
Last Indexed 2026-09-01 07:19

Authors

  • ayman albaz

Installation

nimble install distributions
choosenim install distributions
git clone https://github.com/ayman-albaz/distributions

OS Compatibility

Platform Linux macOS Windows FreeBSD OpenBSD NetBSD Android iOS WASM Embedded
distributions - - - - - - -

Dependencies

Package Version Optional
nim >= 2.0.0 No
special_functions >= 1.0.0 No
results >= 0.5.1 No

Source

Repository https://github.com/ayman-albaz/distributions
Homepage https://github.com/ayman-albaz/distributions
Registry Source nimble_official

README

Linux Build Status (Github Actions) License

Distributions

Distributions is a Nim library for probability distributions and their functions. Generic over float32 and float64.

Supported Distributions

Distribution Nim Command
Bernoulli initBernoulliDistribution(p = 0.5)
Beta initBetaDistribution(alpha = 2.0, beta = 2.0)
Binomial initBinomialDistribution(n = 10, p = 0.5)
Chisquare initChi2Distribution[float64](df = 1)
F initFDistribution[float64](df1 = 3, df2 = 5)
Gamma initGammaDistribution(k = 2.0, theta = 1.0)
Negative Binomial initNegativeBinomialDistribution(r = 10, p = 0.5)
Normal initNormalDistribution(mu = 0.0, sigma = 1.0)
Poisson initPoissonDistribution(lambda = 10.0)
t initTDistribution(df = 3.0)
Uniform Continuous initUniformContinuousDistribution(a = 0.0, b = 1.0)
Uniform Discrete initUniformDiscreteDistribution[float64](a = 0, b = 1)

Type parameter defaults to float64 and is inferred from float arguments. Distributions with only int parameters (Chi2, F, UniformDiscrete) require an explicit type, e.g. initChi2Distribution[float64](1). For float32, pass float32 literals: initNormalDistribution(0.0'f32, 1.0'f32). The t-distribution accepts a non-integer df: T parameter, so type inference works: initTDistribution(3.5) infers float64.

Distribution objects expose their parameters as public fields (d.p, d.n, d.df, d.mu, d.sigma, d.lambda, d.alpha, d.beta, d.k, d.theta, d.r, d.a, d.b), so d.p is the success probability of a Bernoulli/Binomial/NegativeBinomial while the quantile argument of ppf is q.

Supported Functions

Constructors return Result — use .get() (or ? propagation) with import std/results. Fallible moments (F.mean/variance/mode, t.mean/variance, Beta.mode, Bernoulli.mode) also return Result. Discrete ppf (Binomial, NegativeBinomial, Poisson, UniformDiscrete) and the NegativeBinomial/Poisson median return Result too (the non-convergence safety net is err(DistError.NotConverged), unreachable for valid parameters).

import std/results

let d = initNormalDistribution(0.0, 1.0).get()
discard d.mean()     # Mean
discard d.median()   # Median
discard d.mode()     # Mode
discard d.pdf(x)     # Probability density function
discard d.pmf(k)     # Probability mass function (discrete distributions)
discard d.cdf(x)     # Cumulative distribution function
discard d.sf(x)      # Survival function (1 - cdf)
discard d.ppf(q)     # Percent point function (quantile, inverse CDF)

# Sampling (all distributions)
import std/random
var r = initRand(0xDEADBEEF)
discard initNormalDistribution(0.0, 1.0).get().sample(r)  # continuous → float64
discard initPoissonDistribution(5.0).get().sample(r)      # discrete → int

Accuracy

~1e-13 relative where convergent (float64); ~1e-5 (float32).

Requirements

Install

nimble install distributions

TODO

  • Add more distributions on an as-needed basis.
  • Add fit, CF, skewness functions.

Performance, feature, and documentation PR's are always welcome.

Contact

I can be reached at aymanalbaz98@gmail.com