/// <summary>
        /// Probability density function
        /// </summary>
        public double Pdf(double x)
        {
            if (x < 0 || x > 1)
            {
                return(0);
            }

            if (x < 1e-9)
            {
                if (Alpha > 1)
                {
                    return(0);
                }
                if (Abs(Alpha - 1) < 1e-9)
                {
                    return(Beta);
                }
                return(double.PositiveInfinity);
            }

            if (x > 1 - 1e-9)
            {
                if (Beta > 1)
                {
                    return(0);
                }
                if (Abs(Beta - 1) < 1e-9)
                {
                    return(Alpha);
                }
                return(double.PositiveInfinity);
            }

            return(Exp((Alpha - 1) * Log(x) + (Beta - 1) * Log(1 - x) - BetaFunction.CompleteLogValue(Alpha, Beta)));
        }
        public void BetaCompleteLogValue()
        {
            var comparer = new AbsoluteEqualityComparer(0.0000001);

            for (int a = 1; a <= 20; a++)
            {
                for (int b = 1; b <= 20; b++)
                {
                    double actual   = BetaFunction.CompleteLogValue(a, b);
                    double expected = Math.Log(Factorial(a - 1) * Factorial(b - 1) / Factorial(a + b - 1));
                    Assert.Equal(expected, actual, comparer);
                }
            }
        }