public void WeightedEmpiricalDistributionConstructorTest2()
{
double[] original = { 5, 5, 1, 4, 1, 2, 2, 3, 3, 3, 4, 3, 3, 3, 4, 3, 2, 3 };
var distribution = new EmpiricalDistribution(original);
double[] weights = { 2, 1, 1, 1, 2, 3, 1, 3, 1, 1, 1, 1 };
double[] samples = { 5, 1, 4, 1, 2, 3, 4, 3, 4, 3, 2, 3 };
weights = weights.Divide(weights.Sum());
var target = new EmpiricalDistribution(samples, weights, distribution.Smoothing);
Assert.AreEqual(distribution.Mean, target.Mean);
Assert.AreEqual(distribution.Median, target.Median);
Assert.AreEqual(distribution.Mode, target.Mode);
Assert.AreEqual(distribution.Quartiles.Min, target.Quartiles.Min);
Assert.AreEqual(distribution.Quartiles.Max, target.Quartiles.Max);
Assert.AreEqual(distribution.Smoothing, target.Smoothing);
Assert.AreEqual(1.1685534824642432, target.StandardDeviation);
Assert.AreEqual(distribution.Support.Min, target.Support.Min);
Assert.AreEqual(distribution.Support.Max, target.Support.Max);
Assert.AreEqual(1.3655172413793104, target.Variance);
Assert.AreEqual(target.Weights, weights);
Assert.AreEqual(target.Samples, samples);
for (double x = 0; x < 6; x += 0.1)
{
double actual, expected;
expected = distribution.ComplementaryDistributionFunction(x);
actual = target.ComplementaryDistributionFunction(x);
Assert.AreEqual(expected, actual, 1e-15);
expected = distribution.CumulativeHazardFunction(x);
actual = target.CumulativeHazardFunction(x);
Assert.AreEqual(expected, actual, 1e-15);
expected = distribution.DistributionFunction(x);
actual = target.DistributionFunction(x);
Assert.AreEqual(expected, actual, 1e-15);
expected = distribution.HazardFunction(x);
actual = target.HazardFunction(x);
Assert.AreEqual(expected, actual, 1e-14);
expected = distribution.InverseDistributionFunction(Accord.Math.Tools.Scale(0, 6, 0, 1, x));
actual = target.InverseDistributionFunction(Accord.Math.Tools.Scale(0, 6, 0, 1, x));
Assert.AreEqual(expected, actual, 1e-14);
expected = distribution.LogProbabilityDensityFunction(x);
actual = target.LogProbabilityDensityFunction(x);
Assert.AreEqual(expected, actual, 1e-15);
expected = distribution.ProbabilityDensityFunction(x);
actual = target.ProbabilityDensityFunction(x);
Assert.AreEqual(expected, actual, 1e-15);
expected = distribution.QuantileDensityFunction(Accord.Math.Tools.Scale(0, 6, 0, 1, x));
actual = target.QuantileDensityFunction(Accord.Math.Tools.Scale(0, 6, 0, 1, x));
Assert.AreEqual(expected, actual, 1e-10);
}
}