Skip to content

Commit a31c55a

Browse files
committed
changed some defaults for neverdist and gave it a description
1 parent af32a5a commit a31c55a

File tree

3 files changed

+96
-7
lines changed

3 files changed

+96
-7
lines changed

src/distributions/neverdist.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import Distributions: params, partype, mean, median, mode, var, skewness, kurtos
44
import Distributions: pdf, logpdf, cdf, ccdf, quantile, mgf, cf
55
import Base: rand
66

7+
"""
8+
Never{T}()
9+
10+
This distribution represents a point mass at infinity.
11+
"""
712
struct Never{T<:Real} <: ContinuousUnivariateDistribution
813
Never{T}() where {T<:Real} = new{T}()
914
end
@@ -23,10 +28,10 @@ logpdf(d::Never{T}, x::Real) where {T<:Real} = -Inf
2328
cdf(d::Never{T}, x::Real) where {T<:Real} = zero(x)
2429
ccdf(d::Never{T}, x::Real) where {T<:Real} = one(x)
2530
quantile(d::Never{T}, q::Real) where {T<:Real} = typemax(T)
26-
mgf(d::Never{T}, x::Real) where {T<:Real} = zero(x)
31+
mgf(d::Never{T}, x::Real) where {T<:Real} = x <= 0 ? zero(x) : Inf
2732
cf(d::Never{T}, x::Real) where {T<:Real} = zero(x)
2833
rand(rng::Random.AbstractRNG, d::Never{T}) where {T} = typemax(T)
2934

30-
function Random.rand!(rng::Random.AbstractRNG, d::Never{T}, arr::AbstractArray) where {T}
35+
function Random.rand!(rng::Random.AbstractRNG, d::Never{T}, arr::AbstractArray{<:Real}) where {T}
3136
arr .= typemax(T)
3237
end

test/runtests.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ using CompetingClocks
22
using SafeTestsets
33
using Test
44

5+
# Run the "test_neverdist.jl" tests by calling:
6+
# ```bash
7+
# julia --project -e 'using Pkg;Pkg.test(; test_args = ["neverdist"])'`
8+
# ```
9+
510
# Not tests. These are helper functions for tests.
611
include("vas.jl")
712
include("test_utility.jl")
@@ -20,6 +25,7 @@ all_tests = [
2025
"test_keyedprefixsearch.jl",
2126
"test_likelihood.jl",
2227
"test_multiple_direct.jl",
28+
"test_neverdist.jl",
2329
"test_nrtransition.jl",
2430
"test_petri.jl",
2531
"test_prefixsearch.jl",

test/test_neverdist.jl

Lines changed: 83 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,88 @@
11
using CompetingClocks
22

3-
@safetestset never_fair = "Never fair weather" begin
3+
@safetestset never_fair = "Never distribution" begin
44
using CompetingClocks: Never
5+
using Distributions: params, partype, mean, median, mode, var, skewness, kurtosis
6+
using Distributions: pdf, logpdf, cdf, ccdf, quantile, mgf, cf
7+
using Random
58

6-
n = Never()
7-
p = params(n)
8-
@test p == ()
9-
@test isa(n, Never)
9+
@testset "construction" begin
10+
n = Never()
11+
@test isa(n, Never{Float64})
12+
@test params(n) == ()
13+
@test partype(n) == Float64
14+
15+
n32 = Never{Float32}()
16+
@test isa(n32, Never{Float32})
17+
@test partype(n32) == Float32
18+
end
19+
20+
@testset "moments and statistics" begin
21+
n = Never()
22+
@test mean(n) == typemax(Float64)
23+
@test median(n) == typemax(Float64)
24+
@test mode(n) == typemax(Float64)
25+
@test var(n) == typemax(Float64)
26+
@test skewness(n) == 0.0
27+
@test kurtosis(n) == 0.0
28+
end
29+
30+
@testset "probability functions" begin
31+
n = Never()
32+
# pdf is 0 everywhere - no probability mass at any finite point
33+
@test pdf(n, 0.0) == 0.0
34+
@test pdf(n, 1.0) == 0.0
35+
@test pdf(n, 1e100) == 0.0
36+
37+
# logpdf is -Inf everywhere
38+
@test logpdf(n, 0.0) == -Inf
39+
@test logpdf(n, 1.0) == -Inf
40+
41+
# cdf is 0 everywhere - event never occurs by any finite time
42+
@test cdf(n, 0.0) == 0.0
43+
@test cdf(n, 1e100) == 0.0
44+
45+
# ccdf is 1 everywhere - survival is certain
46+
@test ccdf(n, 0.0) == 1.0
47+
@test ccdf(n, 1e100) == 1.0
48+
49+
# quantile is always typemax - any quantile maps to "infinity"
50+
@test quantile(n, 0.0) == typemax(Float64)
51+
@test quantile(n, 0.5) == typemax(Float64)
52+
@test quantile(n, 1.0) == typemax(Float64)
53+
end
54+
55+
@testset "transforms" begin
56+
n = Never()
57+
# mgf: M(t) = E[e^{tX}] for X=∞
58+
# t <= 0: e^{t·∞} = 0
59+
# t > 0: e^{t·∞} = ∞
60+
@test mgf(n, -1.0) == 0.0
61+
@test mgf(n, 0.0) == 0.0
62+
@test mgf(n, 1.0) == Inf
63+
64+
# cf is undefined for X=∞, returning 0 as sentinel
65+
@test cf(n, 1.0) == 0.0
66+
end
67+
68+
@testset "random sampling" begin
69+
n = Never()
70+
rng = Random.MersenneTwister(42)
71+
72+
# Single sample
73+
@test rand(rng, n) == typemax(Float64)
74+
75+
# Array sampling
76+
arr = zeros(5)
77+
Random.rand!(rng, n, arr)
78+
@test all(x -> x == typemax(Float64), arr)
79+
end
80+
81+
@testset "type stability" begin
82+
n32 = Never{Float32}()
83+
@test mean(n32) == typemax(Float32)
84+
@test typeof(mean(n32)) == Float32
85+
@test skewness(n32) == 0.0f0
86+
@test typeof(skewness(n32)) == Float32
87+
end
1088
end

0 commit comments

Comments
 (0)