示例#1
0
        public void DynamicConstructorTest()
        {
            var dist = UnivariateDistributionInfo.CreateInstance <HypergeometricDistribution>();

            Assert.AreEqual(1, dist.PopulationSize);
            Assert.AreEqual(0, dist.PopulationSuccess);
            Assert.AreEqual(1, dist.SampleSize);
            Assert.AreEqual(0, dist.Support.Min);
            Assert.AreEqual(0, dist.Support.Max);
        }
示例#2
0
        public void MedianTest2()
        {
            var target = UnivariateDistributionInfo.CreateInstance <ParetoDistribution>();

            Assert.AreEqual(1, target.Alpha);
            Assert.AreEqual(1, target.Scale);

            double median = target.Median;

            Assert.AreEqual(2, target.Median);

            Assert.AreEqual(median, target.InverseDistributionFunction(0.5), 1e-6);
        }
        public void pdf()
        {
            NegativeBinomialDistribution dist = UnivariateDistributionInfo.CreateInstance <NegativeBinomialDistribution>();

            Assert.AreEqual(0.5, dist.ProbabilityOfSuccess);
            Assert.AreEqual(1, dist.NumberOfFailures);

            double median = dist.Median;

            Assert.AreEqual(0, median);

            int middle = (int)median;

            double pdf  = dist.ProbabilityMassFunction(middle);
            double lpdf = dist.LogProbabilityMassFunction(middle);

            Assert.AreEqual(Math.Log(pdf), lpdf, 1e-10);
            Assert.AreEqual(pdf, Math.Exp(lpdf), 1e-10);
        }
示例#4
0
        public void exhaustive_screening_test()
        {
            var passed = new HashSet <UnivariateDistributionInfo>();
            var todo   = new HashSet <UnivariateDistributionInfo>(UnivariateDistributionInfo.GetUnivariateDistributions());

            // Enumerate all distributions in the framework
            foreach (var distribution in UnivariateDistributionInfo.GetUnivariateDistributions())
            {
                todo.Remove(distribution);

                Type   type  = distribution.DistributionType;
                string name  = distribution.Name;
                bool   built = false;

                if (type == typeof(GeneralContinuousDistribution) ||
                    type == typeof(EmpiricalDistribution) ||
                    type == typeof(Mixture <>) ||
                    type == typeof(GeneralDiscreteDistribution))    // TODO: add support for vector ranges (e.g. IntegerVector(length: 3))
                {
                    continue;
                }

                // Enumerate all possible ways to construct each distribution
                foreach (var constructor in distribution.GetConstructors())
                {
                    if (!constructor.IsBuildable)
                    {
                        continue;
                    }

                    // Build the argument list
                    var arguments = new Dictionary <DistributionParameterInfo, object>();

                    // Select the minimum value for the parameters
                    foreach (var parameter in constructor.GetParameters())
                    {
                        arguments[parameter] = parameter.Range.Min;
                    }

                    IUnivariateDistribution dist;
                    dist = distribution.CreateInstance(arguments);

                    //// Re-build the argument list
                    //arguments.Clear();

                    //// Select the maximum value for the parameters
                    //foreach (var parameter in constructor.GetParameters())
                    //    arguments[parameter] = parameter.Range.Max;

                    //dist = distribution.Activate(arguments);


                    // Re-build the argument list
                    arguments.Clear();

                    // Select the default value for the parameters
                    foreach (var parameter in constructor.GetParameters())
                    {
                        arguments[parameter] = parameter.DefaultValue;
                    }

                    dist = distribution.CreateInstance(arguments);

                    built = true;


                    if (dist is ShapiroWilkDistribution) // tested in ShapiroWilkDistributionTest.cs
                    {
                        continue;
                    }
                    if (dist is HypergeometricDistribution) // tested in HypergeometricDistributionDistributionTest.cs
                    {
                        continue;
                    }
                    if (dist is EmpiricalHazardDistribution) // tested in EmpiricalHazardDistributionest.cs
                    {
                        continue;
                    }
                    if (dist is DegenerateDistribution) // tested in EmpiricalHazardDistributionest.cs
                    {
                        continue;
                    }

                    double icdf0 = dist.InverseDistributionFunction(0);
                    double icdf1 = dist.InverseDistributionFunction(1);


                    Assert.AreEqual(dist.Support.Min, icdf0);
                    Assert.AreEqual(dist.Support.Max, icdf1);

                    var range = dist.GetRange(1.0);
                    Assert.AreEqual(dist.Support.Min, range.Min);
                    Assert.AreEqual(dist.Support.Max, range.Max);

                    double middle = 0.5;
                    if (!(dist is WrappedCauchyDistribution ||
                          dist is SymmetricGeometricDistribution)) // exclude distributions that do not support cdf
                    {
                        double icdf05 = dist.InverseDistributionFunction(0.5);
                        Assert.AreEqual(dist.Median, icdf05, 1e-5);
                        middle = dist.Median;
                        Assert.AreEqual(middle, icdf05, 1e-5);

                        double ccdf = dist.ComplementaryDistributionFunction(middle);
                        double cdfm = dist.DistributionFunction(middle);
                        Assert.AreEqual(cdfm, 1 - ccdf, 1e-5);

                        if (dist is AndersonDarlingDistribution)
                        {
                            continue; // tested in AndersonDarlingDistributionTest.cs
                        }
                        if (dist is RademacherDistribution)
                        {
                            continue; // tested in RademacherDistributionTest.cs
                        }
                        if (dist is MannWhitneyDistribution)
                        {
                            continue; // tested in MannWhitneyDistributionTest.cs
                        }
                        if (dist is BernoulliDistribution)
                        {
                            continue; // tested in BernoulliDistributionTest.cs
                        }
                        if (dist is DegenerateDistribution)
                        {
                            continue; // tested in DegenerateDistributionTest.cs
                        }
                        if (dist is RademacherDistribution)
                        {
                            continue; // tested in RademacherDistributionTest.cs
                        }
                        double[] percentiles = Vector.Range(0.0, 1.0, stepSize: 0.1);
                        for (int i = 0; i < percentiles.Length; i++)
                        {
                            double x      = percentiles[i];
                            double icdf   = dist.InverseDistributionFunction(x);
                            double cdf    = dist.DistributionFunction(icdf);
                            double iicdf  = dist.InverseDistributionFunction(cdf);
                            double iiicdf = dist.DistributionFunction(iicdf);

                            if (distribution.IsDiscrete)
                            {
                                Assert.AreEqual(iicdf, icdf, 1e-5);
                                Assert.AreEqual(iiicdf, cdf, 1e-5);
                            }
                            else
                            {
                                Assert.AreEqual(iicdf, icdf, 1e-5);
                                Assert.AreEqual(x, cdf, 1e-5);
                                Assert.AreEqual(iiicdf, cdf, 1e-5);
                            }
                        }
                    }

                    if (!(dist is GrubbDistribution ||
                          dist is KolmogorovSmirnovDistribution)) // exclude distributions that do not support pdf
                    {
                        double pdf  = dist.ProbabilityFunction(middle);
                        double lpdf = dist.LogProbabilityFunction(middle);
                        Assert.AreEqual(Math.Log(pdf), lpdf, 1e-10);
                        Assert.AreEqual(pdf, Math.Exp(lpdf), 1e-10);
                    }

                    Assert.Throws <ArgumentOutOfRangeException>(() => dist.InverseDistributionFunction(0.0 - 1e-15));
                    Assert.Throws <ArgumentOutOfRangeException>(() => dist.InverseDistributionFunction(1.0 + 1e-15));
                }

                Assert.IsTrue(built);
                passed.Add(distribution);
            }
        }