From 05d9e6710138e7acfabe85a1e860801c5e92cc0a Mon Sep 17 00:00:00 2001 From: Francesco Alemanno <50984334+francescoalemanno@users.noreply.github.com> Date: Fri, 19 Jun 2020 00:51:10 +0200 Subject: [PATCH] basic Priors (#2) * add Distributions and Random * add Factored Distribution * add tests * remove test dependencies * specialization for faster code * add tests for mixed value support --- .gitignore | 1 + Project.toml | 8 ++++-- src/ApproxInferenceBase.jl | 4 ++- src/priors.jl | 56 ++++++++++++++++++++++++++++++++++++++ test/runtests.jl | 18 ++++++++++++ 5 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 src/priors.jl diff --git a/.gitignore b/.gitignore index ddb6fb9..1383349 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.jl.mem /deps/deps.jl /docs/build +Manifest.toml diff --git a/Project.toml b/Project.toml index 0f871a6..82f9fd8 100644 --- a/Project.toml +++ b/Project.toml @@ -4,12 +4,14 @@ authors = ["Johanni Brea "] version = "0.1.0" [deps] +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[compat] +julia = "^1" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] test = ["Test"] - -[compat] -julia = "^1" diff --git a/src/ApproxInferenceBase.jl b/src/ApproxInferenceBase.jl index a2177a2..8c9808b 100644 --- a/src/ApproxInferenceBase.jl +++ b/src/ApproxInferenceBase.jl @@ -1,3 +1,5 @@ module ApproxInferenceBase - + using Distributions + using Random + include("priors.jl") end # module diff --git a/src/priors.jl b/src/priors.jl new file mode 100644 index 0000000..68a5b24 --- /dev/null +++ b/src/priors.jl @@ -0,0 +1,56 @@ +import Distributions.pdf, Distributions.logpdf, Random.rand, Base.length + +struct MixedSupport <: ValueSupport; end + +""" + Factored{N} <: Distribution{Multivariate, MixedSupport} + +a `Distribution` type that can be used to combine multiple `UnivariateDistribution`'s and sample from them. + +Example: it can be used as `prior = Factored(Normal(0,1), Uniform(-1,1))` +""" +struct Factored{N}<:Distribution{Multivariate,MixedSupport} + p::NTuple{N,UnivariateDistribution} + Factored(args::UnivariateDistribution...) = new{length(args)}(args) +end +""" + pdf(d::Factored, x) = begin + +Function to evaluate the pdf of a `Factored` distribution object +""" +function pdf(d::Factored{N},x) where N + s=pdf(d.p[1],x[1]) + for i in 2:N + s*=pdf(d.p[i],x[i]) + end + s +end + +""" + logpdf(d::Factored, x) = begin + +Function to evaluate the logpdf of a `Factored` distribution object +""" +function logpdf(d::Factored{N},x) where N + s=logpdf(d.p[1],x[1]) + for i in 2:N + s+=logpdf(d.p[i],x[i]) + end + s +end + +""" + rand(rng::AbstractRNG, factoreddist::Factored) + +function to sample one element from a `Factored` object +""" +rand(rng::AbstractRNG,factoreddist::Factored{N}) where N = ntuple(i->rand(rng,factoreddist.p[i]),Val(N)) + +""" + length(p::Factored) = begin + +returns the number of distributions contained in `p`. +""" +length(p::Factored{N}) where N = N + +export Factored diff --git a/test/runtests.jl b/test/runtests.jl index a94d3b6..c3d59bd 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,2 +1,20 @@ using ApproxInferenceBase using Test +using Distributions +using Random + +@testset "Factored" begin + d=Factored(Uniform(0,1),Uniform(100,101)) + @test all((0,100) .<= rand(d) .<= (1,101)) + @test pdf(d,(0.0,0.0)) == 0.0 + @test pdf(d,(0.5,100.5)) == 1.0 + @test logpdf(d,(0.5,100.5)) == 0.0 + @test logpdf(d,(0.0,0.0)) == -Inf + @test length(d) == 2 + m=Factored(Uniform(0.00,1.0),DiscreteUniform(1,2)) + sample=rand(m) + @test 0