private void VerifyPercsWithAbsoluteEpsilon(double[] a, SampleStream s, IReadOnlyList <QuantileEpsilonPair> targets) { foreach (var target in targets) { double n = a.Length; int k = (int)(target.Quantile * n); if (k < 1) { k = 1; } int lower = (int)((target.Quantile - target.Epsilon) * n); if (lower < 1) { lower = 1; } int upper = (int)Math.Ceiling((target.Quantile + target.Epsilon) * n); if (upper > a.Length) { upper = a.Length; } double w = a[k - 1]; double min = a[lower - 1]; double max = a[upper - 1]; double g = s.Query(target.Quantile); Assert.True(g >= min, $"q={target.Quantile}: want {w} [{min}, {max}], got {g}"); Assert.True(g <= max, $"q={target.Quantile}: want {w} [{min}, {max}], got {g}"); } }
public void TestDefaults() { var q = new SampleStream(Invariants.Targeted(new[] { new QuantileEpsilonPair(0.99d, 0.001d) })); double g = q.Query(0.99); Assert.Equal(double.NaN, g); }
public void TestUncompressedOne() { var q = new SampleStream(Invariants.Targeted(new[] { new QuantileEpsilonPair(0.99d, 0.001d) })); q.InsertRange(new[] { 3.14 }); double g = q.Query(0.90); Assert.Equal(3.14, g); }
private void VerifyHighPercsWithRelativeEpsilon(double[] a, SampleStream s) { Array.Sort(a); foreach (double qu in _highQuantiles) { double n = a.Length; int k = (int)(qu * n); int lowerRank = (int)((1 - ((1 + _relativeEpsilon) * (1 - qu))) * n); int upperRank = (int)Math.Ceiling((1 - ((1 - _relativeEpsilon) * (1 - qu))) * n); double w = a[k - 1]; double min = a[lowerRank - 1]; double max = a[upperRank - 1]; double g = s.Query(qu); Assert.True(g >= min, $"q={qu}: want {w} [{min}, {max}], got {g}"); Assert.True(g <= max, $"q={qu}: want {w} [{min}, {max}], got {g}"); } }