From 96834c0de78aeb3fd6a602dfb2f8429f84715ed7 Mon Sep 17 00:00:00 2001 From: Giorgio Sgarbi Date: Wed, 21 Nov 2018 05:05:01 -0800 Subject: [PATCH] add pareto distribution --- .../java/blang/distributions/Generators.java | 9 ++++++++ src/main/java/blang/distributions/Pareto.bl | 23 +++++++++++++++++++ .../doc/contents/BuiltInDistributions.xtend | 2 ++ src/test/java/blang/Examples.xtend | 10 ++++++++ 4 files changed, 44 insertions(+) create mode 100644 src/main/java/blang/distributions/Pareto.bl diff --git a/src/main/java/blang/distributions/Generators.java b/src/main/java/blang/distributions/Generators.java index 27c3428e..88f9a41f 100644 --- a/src/main/java/blang/distributions/Generators.java +++ b/src/main/java/blang/distributions/Generators.java @@ -6,6 +6,7 @@ import org.apache.commons.math3.distribution.GammaDistribution; import org.apache.commons.math3.distribution.PoissonDistribution; import org.apache.commons.math3.distribution.TDistribution; +import org.apache.commons.math3.distribution.ParetoDistribution; import bayonet.math.NumericalUtils; import blang.types.DenseSimplex; @@ -28,6 +29,14 @@ public static double halfstudentt(Random random, double nu, double sigma) { double t = studentt(random, nu); return Math.abs(t) * sigma; } + + /** */ + public static double pareto(Random random, double scale, double shape) + { + double result = new ParetoDistribution(generator(random), scale, shape).sample(); + return result; + } + /** */ public static double chisquared(Random random, int nu) { diff --git a/src/main/java/blang/distributions/Pareto.bl b/src/main/java/blang/distributions/Pareto.bl new file mode 100644 index 00000000..f4fa4e85 --- /dev/null +++ b/src/main/java/blang/distributions/Pareto.bl @@ -0,0 +1,23 @@ +package blang.distributions +// Pareto distribution +// support: (scale, \infty) + +model Pareto { + random RealVar realization + + param RealVar scale, shape + + laws { + logf(realization, scale, shape) { + if (scale <= 0) return NEGATIVE_INFINITY + if (shape <= 0) return NEGATIVE_INFINITY + if (realization < scale) return NEGATIVE_INFINITY + return log(shape) + shape * log(scale) - (shape + 1) * log(realization) + } + } + + generate(rand) { + rand.pareto(scale, shape) + } + +} \ No newline at end of file diff --git a/src/main/java/blang/runtime/internals/doc/contents/BuiltInDistributions.xtend b/src/main/java/blang/runtime/internals/doc/contents/BuiltInDistributions.xtend index d9178159..80eda5cb 100644 --- a/src/main/java/blang/runtime/internals/doc/contents/BuiltInDistributions.xtend +++ b/src/main/java/blang/runtime/internals/doc/contents/BuiltInDistributions.xtend @@ -25,6 +25,7 @@ import blang.distributions.StudentT import blang.distributions.HalfStudentT import blang.distributions.ChiSquared import blang.distributions.YuleSimon +import blang.distributions.Pareto class BuiltInDistributions { @@ -51,6 +52,7 @@ class BuiltInDistributions { documentClass(StudentT) documentClass(HalfStudentT) documentClass(ChiSquared) + documentClass(Pareto) ] section("Multivariate") [ diff --git a/src/test/java/blang/Examples.xtend b/src/test/java/blang/Examples.xtend index dd2ca70b..30efdff3 100644 --- a/src/test/java/blang/Examples.xtend +++ b/src/test/java/blang/Examples.xtend @@ -62,6 +62,7 @@ import blang.validation.internals.fixtures.DynamicNormalMixture import blang.distributions.NegativeBinomialMeanParam import blang.distributions.GammaMeanParam import blang.distributions.YuleSimon +import blang.distributions.Pareto class Examples { @@ -125,6 +126,15 @@ class Examples { realRealizationSquared ) + public val pareto = add( + new Pareto.Builder() + .setScale(fixedReal(2.1)) + .setShape(fixedReal(1.5)) + .setRealization(latentReal) + .build, + realRealizationSquared + ) + public val bern = add( new Bernoulli.Builder()