diff --git a/src/Distributions.jl b/src/Distributions.jl index 82f85e881e..b445207741 100644 --- a/src/Distributions.jl +++ b/src/Distributions.jl @@ -70,6 +70,7 @@ export Cosine, DiagNormal, DiagNormalCanon, + Dirac, Dirichlet, DirichletMultinomial, DiscreteUniform, diff --git a/src/univariate/discrete/dirac.jl b/src/univariate/discrete/dirac.jl new file mode 100644 index 0000000000..5a6adac6a4 --- /dev/null +++ b/src/univariate/discrete/dirac.jl @@ -0,0 +1,30 @@ +""" + Dirac(value) + +A *Dirac distribution* is parametrized by its only value, and takes its value with probability 1. + +```julia +d = Dirac(2.0) # Dirac distribution with value = 2. +rand(d) # Always returns the same value +``` +""" +struct Dirac{T} <: DiscreteUnivariateDistribution + value::T +end + +eltype(::Dirac{T}) where {T} = T +rand(rng::AbstractRNG, d::Dirac) = d.value +pdf(d::Dirac, x::Real) = x == d.value ? 1.0 : 0.0 +cdf(d::Dirac, x::Real) = x < d.value ? 0.0 : 1.0 +quantile(d::Dirac{T}, p) where {T} = 0 <= p <= 1 ? d.value : T(NaN) +minimum(d::Dirac) = d.value +maximum(d::Dirac) = d.value +insupport(d::Dirac, x) = x == d.value +mean(d::Dirac) = d.value +var(d::Dirac) = 0.0 +mode(d::Dirac) = d.value +skewness(d::Dirac) = 0.0 +kurtosis(d::Dirac) = 0.0 +entropy(d::Dirac) = 0.0 +mgf(d::Dirac, t) = exp(t * d.value) +cf(d::Dirac, t) = exp(im * t * d.value) diff --git a/src/univariates.jl b/src/univariates.jl index 1b6a2e9fa1..c0b46e6f30 100644 --- a/src/univariates.jl +++ b/src/univariates.jl @@ -553,6 +553,7 @@ const discrete_distributions = [ "bernoulli", "betabinomial", "binomial", + "dirac", "discreteuniform", "discretenonparametric", "categorical", diff --git a/test/dirac.jl b/test/dirac.jl new file mode 100644 index 0000000000..73a6fbced9 --- /dev/null +++ b/test/dirac.jl @@ -0,0 +1,20 @@ +using Distributions +using Test + +@testset "Dirac tests" begin + for val in [3, 3.0] + d = Dirac(val) + @test minimum(d) == val + @test maximum(d) == val + @test pdf(d, val - 1) == 0 + @test pdf(d, val) == 1 + @test pdf(d, val + 1) == 0 + @test cdf(d, val - 1) == 0 + @test cdf(d, val) == 1 + @test cdf(d, val + 1) == 1 + @test quantile(d, 0) == val + @test quantile(d, 0.5) == val + @test quantile(d, 1) == val + @test rand(d) == val + end +end diff --git a/test/runtests.jl b/test/runtests.jl index 12a808e48b..abdff2e5ce 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -6,6 +6,7 @@ using Random using StatsBase const tests = [ + "dirac", "truncate", "truncnormal", "truncated_exponential",