diff --git a/TDigest.Tests/Tests.cs b/TDigest.Tests/Tests.cs index e4708d4..1fd886b 100644 --- a/TDigest.Tests/Tests.cs +++ b/TDigest.Tests/Tests.cs @@ -47,6 +47,34 @@ public void TestUniformDistribution() { Assert.IsTrue(avgError < .0005); } + [TestMethod] + public void TestWeightedDistribution() + { + Random r = new Random(); + + TDigest digest = new TDigest(); + List actual = new List(); + for (int i = 0; i < 10000; i++) + { + var v = r.NextDouble(); + var w = r.Next(1, 10); + digest.Add(v, w); + for (int j = 0; j < w; j++) + { + actual.Add(v); + } + } + + actual.Sort(); + Assert.AreEqual(actual.Count, digest.Count); + + Assert.IsTrue(GetAvgError(actual, digest) < .01); + Assert.IsTrue(MaxIsEqual(actual, digest)); + Assert.IsTrue(MinIsEqual(actual, digest)); + var avgError = GetAvgPercentileError(actual, digest); + Assert.IsTrue(avgError < .0005); + } + [TestMethod] public void TestConstantValue() { Random r = new Random(); diff --git a/TDigest/TDigest.cs b/TDigest/TDigest.cs index 9f7c0ed..037d508 100644 --- a/TDigest/TDigest.cs +++ b/TDigest/TDigest.cs @@ -154,7 +154,7 @@ public void Add(double value, double weight = 1) { Max = value; } else { - _newAvg = _oldAvg + (value - _oldAvg) / _count; + _newAvg = _oldAvg + (value - _oldAvg) * weight / _count; _oldAvg = _newAvg; Max = value > Max ? value : Max; Min = value < Min ? value : Min;