From 0217b7d13f282347ac16043b753bee9bd32a5ea8 Mon Sep 17 00:00:00 2001 From: Mykola Lukashchuk Date: Sat, 11 May 2024 20:51:14 +0200 Subject: [PATCH 1/2] feat: implement stable log bessel function --- Project.toml | 2 ++ src/ClosedFormExpectations.jl | 1 + src/expressions/LogBesselk.jl | 11 +++++++++++ test/Normal/mean_test.jl | 15 +++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 src/expressions/LogBesselk.jl diff --git a/Project.toml b/Project.toml index dda54a6..221221e 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,7 @@ authors = ["Mykola Lukashchuk and contributors"] version = "0.2.0" [deps] +Bessels = "0e736298-9ec6-45e8-9647-e4fc86a2fe38" Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" ExponentialFamily = "62312e5e-252a-4322-ace9-a5f4bf9b357b" LogExpFunctions = "2ab3a3ac-af41-5b50-aa03-7779005ae688" @@ -12,6 +13,7 @@ StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" [compat] Aqua = "0.8.4" +Bessels = "0.2.8" CpuId = "0.3.1" Distributions = "0.25" ExponentialFamily = "1.4.1" diff --git a/src/ClosedFormExpectations.jl b/src/ClosedFormExpectations.jl index 720043e..bd058a4 100644 --- a/src/ClosedFormExpectations.jl +++ b/src/ClosedFormExpectations.jl @@ -48,6 +48,7 @@ include("expressions/Square.jl") include("expressions/Power.jl") include("expressions/xlog2x.jl") include("expressions/Abs.jl") +include("expressions/LogBesselk.jl") # rules for computing expectations include("Exponential/Exponential.jl") diff --git a/src/expressions/LogBesselk.jl b/src/expressions/LogBesselk.jl new file mode 100644 index 0000000..032b85c --- /dev/null +++ b/src/expressions/LogBesselk.jl @@ -0,0 +1,11 @@ +export LogBesselk + +import Bessels: besselkx + +struct LogBesselk <: Expression + ν::Number +end + +function (f::LogBesselk)(x) + return log(besselkx(f.ν, x)) - x +end \ No newline at end of file diff --git a/test/Normal/mean_test.jl b/test/Normal/mean_test.jl index aa0fe47..fdfa8eb 100644 --- a/test/Normal/mean_test.jl +++ b/test/Normal/mean_test.jl @@ -47,4 +47,19 @@ end @test log(0.5*1/θ) - 1/θ * value ≈ value_laplace end +end + +@testitem "mean(::ClosedFormExpectation, ::LogBesselk, ::Normal)" begin + using Distributions + using ClosedFormExpectations + using StableRNGs + + include("../test_utils.jl") + rng = StableRNG(123) + for _ in 1:10 + μ, σ = rand(rng)*10, rand(rng)*5 + ν = rand(rng)*10 + value = mean(ClosedFormExpectation(), LogBesselk(1), Normal(μ, σ)) + central_limit_theorem_test(ClosedFormExpectation(), LogBesselk(1), Normal(μ, σ)) + end end \ No newline at end of file From 1efb9f88052a1dbc32f3b9cc951fd1b58369b349 Mon Sep 17 00:00:00 2001 From: Mykola Lukashchuk Date: Sat, 11 May 2024 20:52:30 +0200 Subject: [PATCH 2/2] fix: remove wrong test --- test/Normal/mean_test.jl | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/test/Normal/mean_test.jl b/test/Normal/mean_test.jl index fdfa8eb..ee2bf51 100644 --- a/test/Normal/mean_test.jl +++ b/test/Normal/mean_test.jl @@ -48,18 +48,3 @@ end end end - -@testitem "mean(::ClosedFormExpectation, ::LogBesselk, ::Normal)" begin - using Distributions - using ClosedFormExpectations - using StableRNGs - - include("../test_utils.jl") - rng = StableRNG(123) - for _ in 1:10 - μ, σ = rand(rng)*10, rand(rng)*5 - ν = rand(rng)*10 - value = mean(ClosedFormExpectation(), LogBesselk(1), Normal(μ, σ)) - central_limit_theorem_test(ClosedFormExpectation(), LogBesselk(1), Normal(μ, σ)) - end -end \ No newline at end of file