From cae40516a11d10675c3eeeaaf59ef0cfe15cc654 Mon Sep 17 00:00:00 2001 From: Ray Kim Date: Tue, 13 Aug 2024 21:27:27 +0100 Subject: [PATCH 01/12] fix type stability of sampling from `Chisq`, `TDist`, `Gamma` --- src/samplers/gamma.jl | 2 +- src/univariate/continuous/exponential.jl | 2 +- src/univariate/continuous/tdist.jl | 2 +- test/univariate/continuous/chisq.jl | 10 ++++-- test/univariate/continuous/gamma.jl | 40 +++++++++++++++--------- test/univariate/continuous/tdist.jl | 19 ++++++++--- 6 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/samplers/gamma.jl b/src/samplers/gamma.jl index 9a40da98a3..1cd62f22ba 100644 --- a/src/samplers/gamma.jl +++ b/src/samplers/gamma.jl @@ -225,6 +225,6 @@ end function rand(rng::AbstractRNG, s::GammaIPSampler) x = rand(rng, s.s) - e = randexp(rng) + e = randexp(rng, typeof(x)) x*exp(s.nia*e) end diff --git a/src/univariate/continuous/exponential.jl b/src/univariate/continuous/exponential.jl index d1c487057f..86b546025d 100644 --- a/src/univariate/continuous/exponential.jl +++ b/src/univariate/continuous/exponential.jl @@ -105,7 +105,7 @@ cf(d::Exponential, t::Real) = 1/(1 - t * im * scale(d)) #### Sampling -rand(rng::AbstractRNG, d::Exponential) = xval(d, randexp(rng)) +rand(rng::AbstractRNG, d::Exponential{T}) where {T} = xval(d, randexp(rng, T)) #### Fit model diff --git a/src/univariate/continuous/tdist.jl b/src/univariate/continuous/tdist.jl index 4e55e8cfbc..a4b50ef090 100644 --- a/src/univariate/continuous/tdist.jl +++ b/src/univariate/continuous/tdist.jl @@ -82,7 +82,7 @@ end function rand(rng::AbstractRNG, d::TDist) ν = d.ν z = sqrt(rand(rng, Chisq{typeof(ν)}(ν)) / ν) - return randn(rng) / (isinf(ν) ? one(z) : z) + return randn(rng, typeof(ν)) / (isinf(ν) ? one(z) : z) end function cf(d::TDist{T}, t::Real) where T <: Real diff --git a/test/univariate/continuous/chisq.jl b/test/univariate/continuous/chisq.jl index 156bcdb5fa..604f2c04cb 100644 --- a/test/univariate/continuous/chisq.jl +++ b/test/univariate/continuous/chisq.jl @@ -1,2 +1,8 @@ -test_cgf(Chisq(1), (0.49, -1, -100, -1f6)) -test_cgf(Chisq(3), (0.49, -1, -100, -1f6)) + +@testset "Chisq" begin + test_cgf(Chisq(1), (0.49, -1, -100, -1.0f6)) + test_cgf(Chisq(3), (0.49, -1, -100, -1.0f6)) + + @test rand(Chisq(1.0)) isa Float64 + @test rand(Chisq(1.0f0)) isa Float32 +end diff --git a/test/univariate/continuous/gamma.jl b/test/univariate/continuous/gamma.jl index 3937af191e..b9830fc686 100644 --- a/test/univariate/continuous/gamma.jl +++ b/test/univariate/continuous/gamma.jl @@ -1,25 +1,35 @@ using Test, Distributions, OffsetArrays -test_cgf(Gamma(1 ,1 ), (0.9, -1, -100f0, -1e6)) -test_cgf(Gamma(10 ,1 ), (0.9, -1, -100f0, -1e6)) -test_cgf(Gamma(0.2, 10), (0.08, -1, -100f0, -1e6)) +@testset "Gamma" begin + test_cgf(Gamma(1, 1), (0.9, -1, -100.0f0, -1e6)) + test_cgf(Gamma(10, 1), (0.9, -1, -100.0f0, -1e6)) + test_cgf(Gamma(0.2, 10), (0.08, -1, -100.0f0, -1e6)) -@testset "Gamma suffstats and OffsetArrays" begin - a = rand(Gamma(), 11) - wa = 1.0:11.0 + @testset "Gamma suffstats and OffsetArrays" begin + a = rand(Gamma(), 11) + wa = 1.0:11.0 - resulta = @inferred(suffstats(Gamma, a)) + resulta = @inferred(suffstats(Gamma, a)) - resultwa = @inferred(suffstats(Gamma, a, wa)) + resultwa = @inferred(suffstats(Gamma, a, wa)) - b = OffsetArray(a, -5:5) - wb = OffsetArray(wa, -5:5) + b = OffsetArray(a, -5:5) + wb = OffsetArray(wa, -5:5) - resultb = @inferred(suffstats(Gamma, b)) - @test resulta == resultb + resultb = @inferred(suffstats(Gamma, b)) + @test resulta == resultb - resultwb = @inferred(suffstats(Gamma, b, wb)) - @test resultwa == resultwb + resultwb = @inferred(suffstats(Gamma, b, wb)) + @test resultwa == resultwb - @test_throws DimensionMismatch suffstats(Gamma, a, wb) + @test_throws DimensionMismatch suffstats(Gamma, a, wb) + end + + @test rand(Gamma(1.0, 1.0)) isa Float64 + @test rand(Gamma(0.5, 1.0)) isa Float64 + @test rand(Gamma(2.0, 1.0)) isa Float64 + + @test rand(Gamma(1.0f0, 1.0f0)) isa Float32 + @test rand(Gamma(0.5f0, 1.0f0)) isa Float32 + @test rand(Gamma(2.0f0, 1.0f0)) isa Float32 end diff --git a/test/univariate/continuous/tdist.jl b/test/univariate/continuous/tdist.jl index 16fab2812c..cf4e1827fe 100644 --- a/test/univariate/continuous/tdist.jl +++ b/test/univariate/continuous/tdist.jl @@ -3,10 +3,19 @@ using ForwardDiff using Test -@testset "Type stability of `rand` (#1614)" begin - if VERSION >= v"1.9.0-DEV.348" - # randn(::BigFloat) was only added in https://github.com/JuliaLang/julia/pull/44714 - @inferred(rand(TDist(big"1.0"))) +@testset "TDist" begin + @testset "Type stability of `rand` (#1614)" begin + if VERSION >= v"1.9.0-DEV.348" + # randn(::BigFloat) was only added in https://github.com/JuliaLang/julia/pull/44714 + @inferred(rand(TDist(big"1.0"))) + end + @inferred(rand(TDist(ForwardDiff.Dual(1.0)))) + end - @inferred(rand(TDist(ForwardDiff.Dual(1.0)))) + + @test rand(TDist(1.0)) isa Float64 + @test rand(TDist(1.0f0)) isa Float32 + + @test entropy(TDist(1.0)) isa Float64 + @test entropy(TDist(1.0f0)) isa Float32 end From 22486bf5fbb077998f5326207bf5ba2a64dd9902 Mon Sep 17 00:00:00 2001 From: Kyurae Kim Date: Sun, 18 Aug 2024 01:12:12 +0100 Subject: [PATCH 02/12] fix remove type specification in `rand(Exponential)` Co-authored-by: David Widmann --- src/univariate/continuous/exponential.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/univariate/continuous/exponential.jl b/src/univariate/continuous/exponential.jl index 86b546025d..d1c487057f 100644 --- a/src/univariate/continuous/exponential.jl +++ b/src/univariate/continuous/exponential.jl @@ -105,7 +105,7 @@ cf(d::Exponential, t::Real) = 1/(1 - t * im * scale(d)) #### Sampling -rand(rng::AbstractRNG, d::Exponential{T}) where {T} = xval(d, randexp(rng, T)) +rand(rng::AbstractRNG, d::Exponential) = xval(d, randexp(rng)) #### Fit model From 0bcbccbe0a6f2fdc983d4e84e652a39b4ad71705 Mon Sep 17 00:00:00 2001 From: Kyurae Kim Date: Sun, 18 Aug 2024 01:12:50 +0100 Subject: [PATCH 03/12] fix type specificaton in `rand(TDist)` Co-authored-by: David Widmann --- src/univariate/continuous/tdist.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/univariate/continuous/tdist.jl b/src/univariate/continuous/tdist.jl index a4b50ef090..873925c3eb 100644 --- a/src/univariate/continuous/tdist.jl +++ b/src/univariate/continuous/tdist.jl @@ -82,7 +82,7 @@ end function rand(rng::AbstractRNG, d::TDist) ν = d.ν z = sqrt(rand(rng, Chisq{typeof(ν)}(ν)) / ν) - return randn(rng, typeof(ν)) / (isinf(ν) ? one(z) : z) + return randn(rng, typeof(z)) / (isinf(ν) ? one(z) : z) end function cf(d::TDist{T}, t::Real) where T <: Real From 232999b8712fc82db72c8592d15fdead5b8b2b12 Mon Sep 17 00:00:00 2001 From: Ray Kim Date: Sun, 18 Aug 2024 01:14:31 +0100 Subject: [PATCH 04/12] fix remove type test for `rand(Chisq)` --- test/univariate/continuous/chisq.jl | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/univariate/continuous/chisq.jl b/test/univariate/continuous/chisq.jl index 604f2c04cb..8eefdd11a3 100644 --- a/test/univariate/continuous/chisq.jl +++ b/test/univariate/continuous/chisq.jl @@ -2,7 +2,4 @@ @testset "Chisq" begin test_cgf(Chisq(1), (0.49, -1, -100, -1.0f6)) test_cgf(Chisq(3), (0.49, -1, -100, -1.0f6)) - - @test rand(Chisq(1.0)) isa Float64 - @test rand(Chisq(1.0f0)) isa Float32 end From f3985fd1fa5890c5f08e305c648097e5c445e2ef Mon Sep 17 00:00:00 2001 From: Ray Kim Date: Thu, 22 Aug 2024 22:04:16 +0100 Subject: [PATCH 05/12] fix make `Exponential` use the `Normal` sampling type policy --- src/univariate/continuous/exponential.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/univariate/continuous/exponential.jl b/src/univariate/continuous/exponential.jl index d1c487057f..ec2d00e798 100644 --- a/src/univariate/continuous/exponential.jl +++ b/src/univariate/continuous/exponential.jl @@ -105,7 +105,7 @@ cf(d::Exponential, t::Real) = 1/(1 - t * im * scale(d)) #### Sampling -rand(rng::AbstractRNG, d::Exponential) = xval(d, randexp(rng)) +rand(rng::AbstractRNG, d::Exponential) = xval(d, randexp(rng, float(T))) #### Fit model From 46f715d6ed1a7c9e89931a0a079b598e5677685c Mon Sep 17 00:00:00 2001 From: Ray Kim Date: Thu, 22 Aug 2024 22:05:22 +0100 Subject: [PATCH 06/12] fix missing type signature --- src/univariate/continuous/exponential.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/univariate/continuous/exponential.jl b/src/univariate/continuous/exponential.jl index ec2d00e798..2668729ea8 100644 --- a/src/univariate/continuous/exponential.jl +++ b/src/univariate/continuous/exponential.jl @@ -105,7 +105,7 @@ cf(d::Exponential, t::Real) = 1/(1 - t * im * scale(d)) #### Sampling -rand(rng::AbstractRNG, d::Exponential) = xval(d, randexp(rng, float(T))) +rand(rng::AbstractRNG, d::Exponential) where {T} = xval(d, randexp(rng, float(T))) #### Fit model From d421262d86256b88f82c0134baa60177e808d174 Mon Sep 17 00:00:00 2001 From: Kyurae Kim Date: Thu, 22 Aug 2024 22:18:17 +0100 Subject: [PATCH 07/12] fix type signature for `rand(Exponential)` Co-authored-by: David Widmann --- src/univariate/continuous/exponential.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/univariate/continuous/exponential.jl b/src/univariate/continuous/exponential.jl index 2668729ea8..573a469b07 100644 --- a/src/univariate/continuous/exponential.jl +++ b/src/univariate/continuous/exponential.jl @@ -105,7 +105,7 @@ cf(d::Exponential, t::Real) = 1/(1 - t * im * scale(d)) #### Sampling -rand(rng::AbstractRNG, d::Exponential) where {T} = xval(d, randexp(rng, float(T))) +rand(rng::AbstractRNG, d::Exponential{T}) where {T} = xval(d, randexp(rng, float(T))) #### Fit model From d1ce42af3bc53b0919242e64911af69023987c8d Mon Sep 17 00:00:00 2001 From: Kyurae Kim Date: Fri, 23 Aug 2024 19:33:00 +0100 Subject: [PATCH 08/12] fix use `@inferred` in tests for `Gamma` Co-authored-by: David Widmann --- test/univariate/continuous/gamma.jl | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/test/univariate/continuous/gamma.jl b/test/univariate/continuous/gamma.jl index b9830fc686..8c1887786e 100644 --- a/test/univariate/continuous/gamma.jl +++ b/test/univariate/continuous/gamma.jl @@ -25,11 +25,9 @@ using Test, Distributions, OffsetArrays @test_throws DimensionMismatch suffstats(Gamma, a, wb) end - @test rand(Gamma(1.0, 1.0)) isa Float64 - @test rand(Gamma(0.5, 1.0)) isa Float64 - @test rand(Gamma(2.0, 1.0)) isa Float64 - - @test rand(Gamma(1.0f0, 1.0f0)) isa Float32 - @test rand(Gamma(0.5f0, 1.0f0)) isa Float32 - @test rand(Gamma(2.0f0, 1.0f0)) isa Float32 + for T in (Float32, Float64) + @test @inferred(rand(Gamma(T(1), T(1)))) isa T + @test @inferred(rand(Gamma(1/T(2), T(1)))) isa T + @test @inferred(rand(Gamma(T(2), T(1)))) isa T + end end From a3622b74db307c196e2584763d4a3d133e5c14f1 Mon Sep 17 00:00:00 2001 From: Kyurae Kim Date: Fri, 23 Aug 2024 19:33:12 +0100 Subject: [PATCH 09/12] fix use `@inferred` in tests for `TDist` Co-authored-by: David Widmann --- test/univariate/continuous/tdist.jl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/univariate/continuous/tdist.jl b/test/univariate/continuous/tdist.jl index cf4e1827fe..077be786e6 100644 --- a/test/univariate/continuous/tdist.jl +++ b/test/univariate/continuous/tdist.jl @@ -13,9 +13,8 @@ using Test end - @test rand(TDist(1.0)) isa Float64 - @test rand(TDist(1.0f0)) isa Float32 - - @test entropy(TDist(1.0)) isa Float64 - @test entropy(TDist(1.0f0)) isa Float32 + for T in (Float32, Float64) + @test @inferred(rand(TDist(T(1)))) isa T + @test @inferred(entropy(TDist(T(1)))) isa T + end end From 9a786d53f36bd6ec002faaf145a7835ee2fdc9fd Mon Sep 17 00:00:00 2001 From: Ray Kim Date: Fri, 23 Aug 2024 19:36:31 +0100 Subject: [PATCH 10/12] add type stability tests for `rand(Exponential)` --- test/univariate/continuous/exponential.jl | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/univariate/continuous/exponential.jl b/test/univariate/continuous/exponential.jl index 6704554a79..191528fd7e 100644 --- a/test/univariate/continuous/exponential.jl +++ b/test/univariate/continuous/exponential.jl @@ -1,4 +1,10 @@ -test_cgf(Exponential(1), (0.9, -1, -100f0, -1e6)) -test_cgf(Exponential(0.91), (0.9, -1, -100f0, -1e6)) -test_cgf(Exponential(10 ), (0.08, -1, -100f0, -1e6)) +@testset "Exponential" begin + test_cgf(Exponential(1), (0.9, -1, -100f0, -1e6)) + test_cgf(Exponential(0.91), (0.9, -1, -100f0, -1e6)) + test_cgf(Exponential(10 ), (0.08, -1, -100f0, -1e6)) + + for T in (Float32, Float64) + @test @inferred(rand(Exponential(T(1)))) isa T + end +end From eb1602d1cba3782314831ffec76e9a53919a6136 Mon Sep 17 00:00:00 2001 From: Ray Kim Date: Fri, 23 Aug 2024 19:37:52 +0100 Subject: [PATCH 11/12] add type stability test for `rand(Chisq)` --- test/univariate/continuous/chisq.jl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/univariate/continuous/chisq.jl b/test/univariate/continuous/chisq.jl index 8eefdd11a3..534b7aaf09 100644 --- a/test/univariate/continuous/chisq.jl +++ b/test/univariate/continuous/chisq.jl @@ -2,4 +2,8 @@ @testset "Chisq" begin test_cgf(Chisq(1), (0.49, -1, -100, -1.0f6)) test_cgf(Chisq(3), (0.49, -1, -100, -1.0f6)) + + for T in (Float32, Float64) + @test @inferred(rand(Chisq(T(1)))) isa T + end end From 2091cd741eb40a60dbf6f455818c98a948fde823 Mon Sep 17 00:00:00 2001 From: Ray Kim Date: Fri, 23 Aug 2024 19:55:33 +0100 Subject: [PATCH 12/12] fix remove type stability test for `entropy(TDist)` (not stable) --- test/univariate/continuous/tdist.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/test/univariate/continuous/tdist.jl b/test/univariate/continuous/tdist.jl index 077be786e6..127b992434 100644 --- a/test/univariate/continuous/tdist.jl +++ b/test/univariate/continuous/tdist.jl @@ -15,6 +15,5 @@ using Test for T in (Float32, Float64) @test @inferred(rand(TDist(T(1)))) isa T - @test @inferred(entropy(TDist(T(1)))) isa T end end