|
| 1 | +module TestLogUniform |
| 2 | +using Test |
| 3 | +using Distributions |
| 4 | +import Random |
| 5 | + |
| 6 | +@testset "LogUniform" begin |
| 7 | + rng = Random.MersenneTwister(0) |
| 8 | + |
| 9 | + @test pdf(LogUniform(1f0, 2f0), 1) isa Float32 |
| 10 | + @test pdf(LogUniform(1, 2), 1f0) isa Float32 |
| 11 | + @test pdf(LogUniform(1, 2), 1) isa Float64 |
| 12 | + @test quantile(LogUniform(1, 2), 1) isa Float64 |
| 13 | + @test quantile(LogUniform(1, 2), 1f0) isa Float32 |
| 14 | + @testset "$f" for f in [pdf, cdf, quantile, logpdf, logcdf] |
| 15 | + @test @inferred(f(LogUniform(1,2), 1)) isa Float64 |
| 16 | + @test @inferred(f(LogUniform(1,2), 1.0)) isa Float64 |
| 17 | + @test @inferred(f(LogUniform(1.0,2), 1.0)) isa Float64 |
| 18 | + @test @inferred(f(LogUniform(1.0f0,2), 1)) isa Float32 |
| 19 | + @test @inferred(f(LogUniform(1.0f0,2), 1f0)) isa Float32 |
| 20 | + @test @inferred(f(LogUniform(1,2), 1f0)) isa Float32 |
| 21 | + end |
| 22 | + |
| 23 | + d = LogUniform(1,10) |
| 24 | + @test eltype(d) === Float64 |
| 25 | + @test 1 <= rand(rng, d) <= 10 |
| 26 | + @test rand(rng, d) isa eltype(d) |
| 27 | + @test @inferred(quantile(d, 0)) ≈ 1 |
| 28 | + @test quantile(d, 0.5) ≈ sqrt(10) # geomean |
| 29 | + @test quantile(d, 1) ≈ 10 |
| 30 | + @test mode(d) ≈ 1 |
| 31 | + @test !insupport(d, 0) |
| 32 | + @test @inferred(minimum(d)) === 1 |
| 33 | + @test @inferred(maximum(d)) === 10 |
| 34 | + @test partype(d) === Int |
| 35 | + @test truncated(d, 2, 14) === LogUniform(2,10) |
| 36 | + |
| 37 | + # numbers obtained by calling scipy.stats.loguniform |
| 38 | + @test @inferred(std(d) ) ≈ 2.49399867607628 |
| 39 | + @test @inferred(mean(d) ) ≈ 3.908650337129266 |
| 40 | + @test @inferred(pdf(d, 1.0001)) ≈ 0.43425105679757203 |
| 41 | + @test @inferred(pdf(d, 5 )) ≈ 0.08685889638065035 |
| 42 | + @test @inferred(pdf(d, 9.9999)) ≈ 0.04342988248915007 |
| 43 | + @test @inferred(cdf(d, 1.0001)) ≈ 4.342727686266485e-05 |
| 44 | + @test @inferred(cdf(d, 5 )) ≈ 0.6989700043360187 |
| 45 | + @test @inferred(cdf(d, 9.9999)) ≈ 0.999995657033466 |
| 46 | + @test @inferred(median(d) ) ≈ 3.1622776601683795 |
| 47 | + @test @inferred(logpdf(d, 5) ) ≈ -2.443470357682056 |
| 48 | + |
| 49 | + for _ in 1:10 |
| 50 | + lo = rand(rng) |
| 51 | + hi = lo + 10*rand(rng) |
| 52 | + dist = LogUniform(lo,hi) |
| 53 | + q = rand(rng) |
| 54 | + @test cdf(dist, quantile(dist, q)) ≈ q |
| 55 | + |
| 56 | + u = Uniform(log(lo), log(hi)) |
| 57 | + @test exp(quantile(u, q)) ≈ quantile(dist, q) |
| 58 | + @test exp(median(u)) ≈ median(dist) |
| 59 | + x = rand(rng, dist) |
| 60 | + @test cdf(u, log(x)) ≈ cdf(dist, x) |
| 61 | + |
| 62 | + @test @inferred(entropy(dist)) ≈ Distributions.expectation(dist, x->-logpdf(dist,x)) |
| 63 | + end |
| 64 | + |
| 65 | + @test kldivergence(LogUniform(1,2), LogUniform(1,2)) ≈ 0 atol=100eps(Float64) |
| 66 | + @test isfinite(kldivergence(LogUniform(1,2), LogUniform(1,10))) |
| 67 | + @test kldivergence(LogUniform(1.1,10), LogUniform(1,2)) === Inf |
| 68 | + @test kldivergence(LogUniform(0.1,10), LogUniform(1,2)) === Inf |
| 69 | + @test kldivergence(LogUniform(0.1,1), LogUniform(1,2)) === Inf |
| 70 | + @test @inferred(kldivergence(LogUniform(0.1f0,1), LogUniform(1,2))) === Inf32 |
| 71 | + |
| 72 | + for _ in 1:10 |
| 73 | + aq = 10*rand(rng) |
| 74 | + ap = aq + 10*rand(rng) |
| 75 | + bp = ap + 10*rand(rng) |
| 76 | + bq = bp + 10*rand(rng) |
| 77 | + p = LogUniform(ap, bp) |
| 78 | + q = LogUniform(aq, bq) |
| 79 | + @test @inferred(kldivergence(p, q)) ≈ |
| 80 | + kldivergence(Uniform(log(ap), log(bp)), Uniform(log(aq), log(bq))) |
| 81 | + end |
| 82 | +end |
| 83 | + |
| 84 | + |
| 85 | +end#module |
0 commit comments