From 849008eb5b9bf8a4695e7e54f94771ad29d83c04 Mon Sep 17 00:00:00 2001 From: Matteo Lepur Date: Fri, 11 Jan 2019 14:17:50 -0800 Subject: [PATCH 1/2] add Multinomial and modify Examples --- .../java/blang/distributions/Multinomial.bl | 42 +++++++++++++++++++ src/test/java/blang/Examples.xtend | 14 +++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/blang/distributions/Multinomial.bl diff --git a/src/main/java/blang/distributions/Multinomial.bl b/src/main/java/blang/distributions/Multinomial.bl new file mode 100644 index 00000000..0585c559 --- /dev/null +++ b/src/main/java/blang/distributions/Multinomial.bl @@ -0,0 +1,42 @@ +package blang.distributions + +import static bayonet.distributions.Multinomial.sampleMultinomial + +/** A generalization of a Binomial Distribution. Value \in \mathbb{R}^n\). */ +model Multinomial { + /** Number of successes for each of the \(n\) categories. */ + random List numberofSuccesses + + /** Vector of probabilities \((p_0, p_1, \dots, p_{n-1})\) for each of the \(n\) categories. */ + param Simplex probabilities + + /** The number of independent trials. Value in \(k > 0\) */ + param IntVar numberofTrials + + laws{ + + logf(numberofTrials) { return logFactorial(numberofTrials) } + + logf(numberofSuccesses, probabilities, numberofTrials) { + var sum0 = 0.0 + for (int i: 0..< numberofSuccesses.size()) { + if (probabilities.get(i) < 0.0 || probabilities.get(i) > 1.0) return NEGATIVE_INFINITY + if (numberofSuccesses.get(i) < 0.0) return NEGATIVE_INFINITY + if (numberofTrials <= 0 || numberofSuccesses.get(i) < numberofTrials) return NEGATIVE_INFINITY + sum0 += (numberofSuccesses.get(i) * log(probabilities.get(i))) + return sum0 + } + } + + logf(numberofSuccesses, probabilities, numberofTrials) { + var sum1 = 0.0 + for (int i: 0..< numberofSuccesses.size()) { + if (numberofSuccesses.get(i) < 0) return NEGATIVE_INFINITY + if (numberofTrials <= 0 || numberofSuccesses.get(i) < numberofTrials) return NEGATIVE_INFINITY + sum1 += logFactorial(numberofSuccesses.get(i)) + return sum1 + } + } + } + generate(rand) {sampleMultinomial(rand, probabilities.vectorToArray)} +} \ No newline at end of file diff --git a/src/test/java/blang/Examples.xtend b/src/test/java/blang/Examples.xtend index 687da75a..2f0b651a 100644 --- a/src/test/java/blang/Examples.xtend +++ b/src/test/java/blang/Examples.xtend @@ -11,6 +11,7 @@ import blang.distributions.DiscreteUniform import blang.distributions.Exponential import blang.distributions.Gamma import blang.distributions.Geometric +import blang.distributions.Multinomial import blang.distributions.MultivariateNormal import blang.distributions.Normal import blang.distributions.Poisson @@ -77,6 +78,18 @@ class Examples { public val List> all = new ArrayList +<<<<<<< HEAD + public val multinomial = add( + new Multinomial.Builder() + .setProbabilities(fixedSimplex(0.2,0.3,0.5)) + .setNumberofTrials(fixedInt(3)) + .setNumberofSuccesses(latentIntList(3)) + .build, + listHash + ) + + +======= public val betaBinomial = add( new BetaBinomial.Builder() .setAlpha(fixedReal(1.0)) @@ -151,6 +164,7 @@ class Examples { [getRealization().doubleValue] ) +>>>>>>> ae08a0f7e151d9aed07eb9b0f126d335a9fb3b9f public val geometric = add( new Geometric.Builder() .setP(fixedReal(0.5)) From ffec8cfcfa93f643b366ab92454e556c3bb4e768 Mon Sep 17 00:00:00 2001 From: Matteo Lepur Date: Fri, 11 Jan 2019 14:26:49 -0800 Subject: [PATCH 2/2] Modify examples --- src/test/java/blang/Examples.xtend | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/test/java/blang/Examples.xtend b/src/test/java/blang/Examples.xtend index 2f0b651a..0d2b0b0d 100644 --- a/src/test/java/blang/Examples.xtend +++ b/src/test/java/blang/Examples.xtend @@ -11,7 +11,6 @@ import blang.distributions.DiscreteUniform import blang.distributions.Exponential import blang.distributions.Gamma import blang.distributions.Geometric -import blang.distributions.Multinomial import blang.distributions.MultivariateNormal import blang.distributions.Normal import blang.distributions.Poisson @@ -78,18 +77,6 @@ class Examples { public val List> all = new ArrayList -<<<<<<< HEAD - public val multinomial = add( - new Multinomial.Builder() - .setProbabilities(fixedSimplex(0.2,0.3,0.5)) - .setNumberofTrials(fixedInt(3)) - .setNumberofSuccesses(latentIntList(3)) - .build, - listHash - ) - - -======= public val betaBinomial = add( new BetaBinomial.Builder() .setAlpha(fixedReal(1.0)) @@ -99,7 +86,16 @@ class Examples { .build, intRealizationSquared ) - + + public val multinomial = add( + new Multinomial.Builder() + .setProbabilities(fixedSimplex(0.2,0.3,0.5)) + .setNumberofTrials(fixedInt(3)) + .setNumberofSuccesses(latentIntList(3)) + .build, + listHash + ) + public val hyperGeometric = add( new HyperGeometric.Builder() .setNumberOfDraws(fixedInt(3)) @@ -164,7 +160,6 @@ class Examples { [getRealization().doubleValue] ) ->>>>>>> ae08a0f7e151d9aed07eb9b0f126d335a9fb3b9f public val geometric = add( new Geometric.Builder() .setP(fixedReal(0.5))