public void ConstructorTest()
{
// Create a Categorical distribution for 3 symbols, in which
// the first and second symbol have 25% chance of appearing,
// and the third symbol has 50% chance of appearing.
// 1st 2nd 3rd
double[] probabilities = { 0.25, 0.25, 0.50 };
var dist = new GeneralDiscreteDistribution(probabilities);
double mean = dist.Mean; // 1.25
double median = dist.Median; // 1.00
double var = dist.Variance; // 0.6875
double cdf = dist.DistributionFunction(k: 2); // 1
double pdf1 = dist.ProbabilityMassFunction(k: 0); // 0.25
double pdf2 = dist.ProbabilityMassFunction(k: 1); // 0.25
double pdf3 = dist.ProbabilityMassFunction(k: 2); // 0.50
double lpdf = dist.LogProbabilityMassFunction(k: 2); // -0.69314718055994529
double ccdf = dist.ComplementaryDistributionFunction(k: 2); // 0.0
int icdf1 = dist.InverseDistributionFunction(p: 0.17); // 0
int icdf2 = dist.InverseDistributionFunction(p: 0.39); // 1
int icdf3 = dist.InverseDistributionFunction(p: 0.56); // 2
double hf = dist.HazardFunction(x: 0); // 0.33333333333333331
double chf = dist.CumulativeHazardFunction(x: 0); // 0.2876820724517809
string str = dist.ToString(CultureInfo.InvariantCulture); // "Categorical(x; p = { 0.25, 0.25, 0.5 })"
Assert.AreEqual(1.25, mean);
Assert.AreEqual(1.00, median);
Assert.AreEqual(0.6875, var);
Assert.AreEqual(0.2876820724517809, chf, 1e-10);
Assert.AreEqual(1.0, cdf);
Assert.AreEqual(0.25, pdf1);
Assert.AreEqual(0.25, pdf2);
Assert.AreEqual(0.5, pdf3);
Assert.AreEqual(-0.69314718055994529, lpdf);
Assert.AreEqual(0.33333333333333331, hf, 1e-10);
Assert.AreEqual(0.0, ccdf);
Assert.AreEqual(0, icdf1);
Assert.AreEqual(1, icdf2);
Assert.AreEqual(2, icdf3);
Assert.AreEqual("Categorical(x; p = { 0.25, 0.25, 0.5 })", str);
var range1 = dist.GetRange(0.95);
var range2 = dist.GetRange(0.99);
var range3 = dist.GetRange(0.01);
Assert.AreEqual(0, range1.Min);
Assert.AreEqual(2, range1.Max);
Assert.AreEqual(0, range2.Min);
Assert.AreEqual(2, range2.Max);
Assert.AreEqual(0, range3.Min);
Assert.AreEqual(2, range3.Max);
}