From 0a6abf73e74eda1ad6f6b6d5eb001e5dd4c3d1a1 Mon Sep 17 00:00:00 2001 From: Jurgen Van Gael Date: Sat, 15 Aug 2009 01:18:23 +0800 Subject: [PATCH] Added Dirichlet unit tests Fixed typo in CommonDistributionTests.cs Signed-off-by: jvangael Signed-off-by: jvangael --- .../Distributions/Multivariate/Dirichlet.cs | 32 ++++- .../CommonDistributionTests.cs | 2 +- .../Multivariate/DirichletTests.cs | 136 ++++++++++++++++-- 3 files changed, 151 insertions(+), 19 deletions(-) diff --git a/src/Numerics/Distributions/Multivariate/Dirichlet.cs b/src/Numerics/Distributions/Multivariate/Dirichlet.cs index dc059e93..3f7fa0de 100644 --- a/src/Numerics/Distributions/Multivariate/Dirichlet.cs +++ b/src/Numerics/Distributions/Multivariate/Dirichlet.cs @@ -26,7 +26,7 @@ // OTHER DEALINGS IN THE SOFTWARE. // -namespace dnAnalytics.Statistics.Distributions +namespace MathNet.Numerics.Distributions { using System; using Properties; @@ -43,7 +43,7 @@ namespace dnAnalytics.Statistics.Distributions public class Dirichlet { // The Dirichlet distribution parameters. - private readonly double[] _alpha; + private double[] _alpha; /// /// The distribution's random number generator. @@ -106,6 +106,8 @@ namespace dnAnalytics.Statistics.Distributions { return false; } + + return true; } /// @@ -115,11 +117,12 @@ namespace dnAnalytics.Statistics.Distributions /// When the parameters don't pass the function. private void SetParameters(double[] alpha) { - if (Control.CheckDistributionParameters && !IsValidParameterSet(alpha) && ! alpha.Length == _alpha.Length) + if (Control.CheckDistributionParameters && !IsValidParameterSet(alpha)) { throw new ArgumentOutOfRangeException(Resources.InvalidDistributionParameters); } + _alpha = new double[alpha.Length]; for (int i = 0; i < alpha.Length; i++) { _alpha[i] = alpha[i]; @@ -143,11 +146,18 @@ namespace dnAnalytics.Statistics.Distributions } /// - /// The parameters of the Dirichlet distribution. + /// Gets or sets the parameters of the Dirichlet distribution. /// public double[] Alpha { - get { return _alpha; } + get + { + return _alpha; + } + set + { + SetParameters(value); + } } /// @@ -171,7 +181,17 @@ namespace dnAnalytics.Statistics.Distributions /// public double[] Mean { - get { return _alpha / AlphaSum; } + get + { + double sum = AlphaSum; + double[] parm = new double[Dimension]; + for (int i = 0; i < Dimension; i++) + { + parm[i] = _alpha[i] / sum; + } + + return parm; + } } /// diff --git a/src/UnitTests/DistributionTests/CommonDistributionTests.cs b/src/UnitTests/DistributionTests/CommonDistributionTests.cs index 8adf6d33..ed3e3240 100644 --- a/src/UnitTests/DistributionTests/CommonDistributionTests.cs +++ b/src/UnitTests/DistributionTests/CommonDistributionTests.cs @@ -54,7 +54,7 @@ namespace MathNet.Numerics.UnitTests.DistributionTests [Row(1)] [Row(2)] [Row(3)] - public void CanCreateNormal(int i) + public void ValidateThatUnivariateDistributionsHaveRandomSource(int i) { Assert.IsNotNull(dists[i].RandomSource); } diff --git a/src/UnitTests/DistributionTests/Multivariate/DirichletTests.cs b/src/UnitTests/DistributionTests/Multivariate/DirichletTests.cs index f16a52dd..c31899a4 100644 --- a/src/UnitTests/DistributionTests/Multivariate/DirichletTests.cs +++ b/src/UnitTests/DistributionTests/Multivariate/DirichletTests.cs @@ -26,37 +26,149 @@ // OTHER DEALINGS IN THE SOFTWARE. // -namespace dnAnalytics.Tests.Statistics.Distributions +namespace MathNet.Numerics.UnitTests.DistributionTests { - using dnAnalytics.Statistics.Distributions; - using NUnit.Framework; + using System; + using System.Linq; + using MbUnit.Framework; + using MathNet.Numerics.Distributions; [TestFixture] public class DirichletTests { - private const double mAcceptableError = 1e-12; + [SetUp] + public void SetUp() + { + Control.CheckDistributionParameters = true; + } [Test] - public void SymmetricDirichlet() + public void CanCreateSymmetricDirichlet() { Dirichlet d = new Dirichlet(0.3, 5); for (int i = 0; i < 5; i++) { - Assert.AreEqual(0.3, d.Mean[i], mAcceptableError); - Assert.AreEqual(0.3 * (1.5 - 0.3) / (1.5 * 1.5 * 2.5), d.Variance[i], mAcceptableError); + Assert.AreEqual(0.3, d.Alpha[i]); + } + } + + [Test] + public void CanCreateDirichlet() + { + double[] alpha = new double[10]; + for (int i = 0; i < 10; i++) + { + alpha[i] = i; + } + + Dirichlet d = new Dirichlet(alpha); + + for (int i = 0; i < 5; i++) + { + Assert.AreEqual(i, d.Alpha[i]); + } + } + + [Test] + [Row(0.0)] + [Row(-0.1)] + [ExpectedException(typeof(ArgumentOutOfRangeException))] + public void FailCreateDirichlet(double alpha) + { + Dirichlet d = new Dirichlet(alpha, 5); + } + + [Test] + public void HasRandomSource(int i) + { + Dirichlet d = new Dirichlet(0.3, 5); + Assert.IsNotNull(d.RandomSource); + } + + [Test] + public void CanSetRandomSource(int i) + { + Dirichlet d = new Dirichlet(0.3, 5); + d.RandomSource = new Random(); + } + + [Test] + [ExpectedException(typeof(ArgumentNullException))] + public void FailSetRandomSourceWithNullReference(int i) + { + Dirichlet d = new Dirichlet(0.3, 5); + d.RandomSource = null; + } + + [Test] + public void CanGetDimension() + { + Dirichlet d = new Dirichlet(0.3, 10); + Assert.AreEqual(10, d.Dimension); + } + + [Test] + public void CanGetAlpha() + { + Dirichlet d = new Dirichlet(0.3, 10); + + double[] alpha = new double[10]; + for (int i = 0; i < 10; i++) + { + Assert.AreEqual(0.3, d.Alpha[i]); } } [Test] - public void GetSetRNG() + public void CanSetAlpha() + { + Dirichlet d = new Dirichlet(0.3, 10); + + double[] alpha = new double[10]; + for (int i = 0; i < 10; i++) + { + alpha[i] = i; + } + + d.Alpha = alpha; + } + + [Test] + public void ValidateMean() { Dirichlet d = new Dirichlet(0.3, 5); - // Try getting the random number generator. - System.Random rnd = d.RandomNumberGenerator; - // Try setting the random number generator. - d.RandomNumberGenerator = new System.Random(); + for (int i = 0; i < 5; i++) + { + AssertHelpers.AlmostEqual(0.3/1.5, d.Mean[i], 15); + } + } + + [Test] + public void ValidateVariance() + { + double[] alpha = new double[10]; + double sum = 0.0; + for (int i = 0; i < 10; i++) + { + alpha[i] = i; + sum += i; + } + + Dirichlet d = new Dirichlet(alpha); + + for (int i = 0; i < 10; i++) + { + AssertHelpers.AlmostEqual(i * (sum - i) / (sum * sum * (sum + 1.0)), d.Variance[i], 15); + } + } + + [Test] + public void Sample() + { + Dirichlet d = new Dirichlet(1.0, 5); + double[] s = d.Sample(); } } } \ No newline at end of file