Inheritance: MultivariateDiscreteDistribution
        public void LogProbabilityMassFunctionTest()
        {
            MultivariateDiscreteDistribution target = new MultinomialDistribution(5, 0.25, 0.25, 0.25, 0.25);

            int[] observation = { 1, 1, 1, 2 };

            double expected = System.Math.Log(target.ProbabilityMassFunction(observation));
            double actual = target.LogProbabilityMassFunction(observation);

            Assert.AreEqual(expected, actual, 1e-6);
        }
        public void ProbabilityMassFunctionTest()
        {
            MultinomialDistribution dist = new MultinomialDistribution(5, 0.25, 0.25, 0.25, 0.25);

            int[] observation = { 1, 1, 1, 2 };

            double actual = dist.ProbabilityMassFunction(observation);
            double expected = 0.05859375;

            Assert.AreEqual(expected, actual, 1e-6);
        }
        public void ConstructorTest()
        {

            int numberOfTrials = 5; 
            double[] probabilities = { 0.25, 0.75 };

            // Create a new Multinomial distribution with 5 trials for 2 symbols
            var dist = new MultinomialDistribution(numberOfTrials, probabilities);

            int dimensions = dist.Dimension; // 2

            double[] mean = dist.Mean;     // {  1.25, 3.75 }
            double[] median = dist.Median; // {  1.25, 3.75 }
            double[] var = dist.Variance;  // { -0.9375, -0.9375 }

            double pdf1 = dist.ProbabilityMassFunction(new[] { 2, 3 }); // 0.26367187499999994
            double pdf2 = dist.ProbabilityMassFunction(new[] { 1, 4 }); // 0.3955078125
            double pdf3 = dist.ProbabilityMassFunction(new[] { 5, 0 }); // 0.0009765625
            double lpdf = dist.LogProbabilityMassFunction(new[] { 1, 4 }); // -0.9275847384929139


            string str = dist.ToString(CultureInfo.InvariantCulture); 
            // output is "Multinomial(x; n = 5, p = { 0.25, 0.75 })"

            Assert.AreEqual(1.25, mean[0]);
            Assert.AreEqual(3.75, mean[1]);
            Assert.AreEqual(1.25, median[0]);
            Assert.AreEqual(3.75, median[1]);
            Assert.AreEqual(-0.9375, var[0]);
            Assert.AreEqual(-0.9375, var[1]);
            Assert.AreEqual(0.26367187499999994, pdf1);
            Assert.AreEqual(0.3955078125, pdf2);
            Assert.AreEqual(0.0009765625, pdf3);
            Assert.AreEqual(-0.9275847384929139, lpdf);
            Assert.AreEqual("Multinomial(x; n = 5, p = { 0.25, 0.75 })", str);
        }
        public void FitTest()
        {
            MultinomialDistribution dist = new MultinomialDistribution(7, new double[2]);

            double[][] observation =
            { 
                new double[] { 0, 2 },
                new double[] { 1, 2 },
                new double[] { 5, 1 },
            };

            dist.Fit(observation);

            Assert.AreEqual(dist.Probabilities[0], 0.857142857142857, 0.000000001);
            Assert.AreEqual(dist.Probabilities[1], 0.714285714285714, 0.000000001);
        }
        public void ProbabilityMassFunctionTest2()
        {
            // Example from http://onlinestatbook.com/2/probability/multinomial.html

            MultinomialDistribution dist = new MultinomialDistribution(12, 0.40, 0.35, 0.25);

            int[] observation = { 7, 2, 3 };

            double actual = dist.ProbabilityMassFunction(observation);
            double expected = 0.02483712;

            Assert.AreEqual(expected, actual, 1e-6);
        }