public void ConstructorTest()
{
// Create a new mixture containing two Normal distributions
Mixture<NormalDistribution> mix = new Mixture<NormalDistribution>(
new NormalDistribution(2, 1), new NormalDistribution(5, 1));
// Common measures
double mean = mix.Mean; // 3.5
double median = mix.Median; // 3.4999998506015895
double var = mix.Variance; // 3.25
// Cumulative distribution functions
double cdf = mix.DistributionFunction(x: 4.2); // 0.59897597553494908
double ccdf = mix.ComplementaryDistributionFunction(x: 4.2); // 0.40102402446505092
// Probability mass functions
double pmf1 = mix.ProbabilityDensityFunction(x: 1.2); // 0.14499174984363708
double pmf2 = mix.ProbabilityDensityFunction(x: 2.3); // 0.19590437513747333
double pmf3 = mix.ProbabilityDensityFunction(x: 3.7); // 0.13270883471234715
double lpmf = mix.LogProbabilityDensityFunction(x: 4.2); // -1.8165661905848629
// Quantile function
double icdf1 = mix.InverseDistributionFunction(p: 0.17); // 1.5866611690305095
double icdf2 = mix.InverseDistributionFunction(p: 0.46); // 3.1968506765456883
double icdf3 = mix.InverseDistributionFunction(p: 0.87); // 5.6437596300843076
// Hazard (failure rate) functions
double hf = mix.HazardFunction(x: 4.2); // 0.40541978256972522
double chf = mix.CumulativeHazardFunction(x: 4.2); // 0.91373394208601633
// String representation:
// Mixture(x; 0.5 * N(x; μ = 5, σ² = 1) + 0.5 * N(x; μ = 5, σ² = 1))
string str = mix.ToString(CultureInfo.InvariantCulture);
Assert.AreEqual(3.5, mean);
Assert.AreEqual(3.4999998506015895, median, 1e-10);
Assert.AreEqual(3.25, var, 1e-10);
Assert.AreEqual(0.91373394208601633, chf, 1e-10);
Assert.AreEqual(0.59897597553494908, cdf, 1e-10);
Assert.AreEqual(0.14499174984363708, pmf1, 1e-10);
Assert.AreEqual(0.19590437513747333, pmf2, 1e-10);
Assert.AreEqual(0.13270883471234715, pmf3, 1e-10);
Assert.AreEqual(-1.8165661905848629, lpmf, 1e-10);
Assert.AreEqual(0.40541978256972522, hf, 1e-10);
Assert.AreEqual(0.40102402446505092, ccdf, 1e-10);
Assert.AreEqual(1.5866611690305092, icdf1, 1e-10);
Assert.AreEqual(3.1968506765456883, icdf2, 1e-10);
Assert.AreEqual(5.6437596300843076, icdf3, 1e-10);
Assert.AreEqual("Mixture(x; 0.5*N(x; μ = 2, σ² = 1) + 0.5*N(x; μ = 5, σ² = 1))", str);
Assert.IsFalse(double.IsNaN(icdf1));
var range1 = mix.GetRange(0.95);
var range2 = mix.GetRange(0.99);
var range3 = mix.GetRange(0.01);
Assert.AreEqual(0.71839556342582434, range1.Min, 1e-10);
Assert.AreEqual(6.2816044312576365, range1.Max, 1e-10);
Assert.AreEqual(-0.053753308211290443, range2.Min, 1e-10);
Assert.AreEqual(7.0537533150666105, range2.Max, 1e-10);
Assert.AreEqual(-0.053753308211289402, range3.Min, 1e-10);
Assert.AreEqual(7.0537533150666105, range3.Max, 1e-10);
}