7 | 7 |
)
|
8 | 8 |
|
9 | 9 |
var (
|
10 | |
Targets = []Target{
|
11 | |
{Quantile: 0.01, Epsilon: 0.001},
|
12 | |
{Quantile: 0.10, Epsilon: 0.01},
|
13 | |
{Quantile: 0.50, Epsilon: 0.05},
|
14 | |
{Quantile: 0.90, Epsilon: 0.01},
|
15 | |
{Quantile: 0.99, Epsilon: 0.001},
|
|
10 |
Targets = map[float64]float64{
|
|
11 |
0.01: 0.001,
|
|
12 |
0.10: 0.01,
|
|
13 |
0.50: 0.05,
|
|
14 |
0.90: 0.01,
|
|
15 |
0.99: 0.001,
|
16 | 16 |
}
|
17 | |
TargetsSmallEpsilon = []Target{
|
18 | |
{Quantile: 0.01, Epsilon: 0.0001},
|
19 | |
{Quantile: 0.10, Epsilon: 0.001},
|
20 | |
{Quantile: 0.50, Epsilon: 0.005},
|
21 | |
{Quantile: 0.90, Epsilon: 0.001},
|
22 | |
{Quantile: 0.99, Epsilon: 0.0001},
|
|
17 |
TargetsSmallEpsilon = map[float64]float64{
|
|
18 |
0.01: 0.0001,
|
|
19 |
0.10: 0.001,
|
|
20 |
0.50: 0.005,
|
|
21 |
0.90: 0.001,
|
|
22 |
0.99: 0.0001,
|
23 | 23 |
}
|
24 | 24 |
LowQuantiles = []float64{0.01, 0.1, 0.5}
|
25 | 25 |
HighQuantiles = []float64{0.99, 0.9, 0.5}
|
|
29 | 29 |
|
30 | 30 |
func verifyPercsWithAbsoluteEpsilon(t *testing.T, a []float64, s *Stream) {
|
31 | 31 |
sort.Float64s(a)
|
32 | |
for _, tt := range Targets {
|
|
32 |
for quantile, epsilon := range Targets {
|
33 | 33 |
n := float64(len(a))
|
34 | |
k := int(tt.Quantile * n)
|
35 | |
lower := int((tt.Quantile - tt.Epsilon) * n)
|
|
34 |
k := int(quantile * n)
|
|
35 |
lower := int((quantile - epsilon) * n)
|
36 | 36 |
if lower < 1 {
|
37 | 37 |
lower = 1
|
38 | 38 |
}
|
39 | |
upper := int(math.Ceil((tt.Quantile + tt.Epsilon) * n))
|
|
39 |
upper := int(math.Ceil((quantile + epsilon) * n))
|
40 | 40 |
if upper > len(a) {
|
41 | 41 |
upper = len(a)
|
42 | 42 |
}
|
43 | 43 |
w, min, max := a[k-1], a[lower-1], a[upper-1]
|
44 | |
if g := s.Query(tt.Quantile); g < min || g > max {
|
45 | |
t.Errorf("q=%f: want %v [%f,%f], got %v", tt.Quantile, w, min, max, g)
|
|
44 |
if g := s.Query(quantile); g < min || g > max {
|
|
45 |
t.Errorf("q=%f: want %v [%f,%f], got %v", quantile, w, min, max, g)
|
46 | 46 |
}
|
47 | 47 |
}
|
48 | 48 |
}
|
|
93 | 93 |
|
94 | 94 |
func TestTargetedQuery(t *testing.T) {
|
95 | 95 |
rand.Seed(42)
|
96 | |
s := NewTargeted(Targets...)
|
|
96 |
s := NewTargeted(Targets)
|
97 | 97 |
a := populateStream(s)
|
98 | 98 |
verifyPercsWithAbsoluteEpsilon(t, a, s)
|
99 | 99 |
}
|
|
114 | 114 |
|
115 | 115 |
func TestTargetedMerge(t *testing.T) {
|
116 | 116 |
rand.Seed(42)
|
117 | |
s1 := NewTargeted(Targets...)
|
118 | |
s2 := NewTargeted(Targets...)
|
|
117 |
s1 := NewTargeted(Targets)
|
|
118 |
s2 := NewTargeted(Targets)
|
119 | 119 |
a := populateStream(s1)
|
120 | 120 |
a = append(a, populateStream(s2)...)
|
121 | 121 |
s1.Merge(s2.Samples())
|
|
143 | 143 |
}
|
144 | 144 |
|
145 | 145 |
func TestUncompressed(t *testing.T) {
|
146 | |
q := NewTargeted(Targets...)
|
|
146 |
q := NewTargeted(Targets)
|
147 | 147 |
for i := 100; i > 0; i-- {
|
148 | 148 |
q.Insert(float64(i))
|
149 | 149 |
}
|
|
151 | 151 |
t.Errorf("want count 100, got %d", g)
|
152 | 152 |
}
|
153 | 153 |
// Before compression, Query should have 100% accuracy.
|
154 | |
for _, tt := range Targets {
|
155 | |
w := tt.Quantile * 100
|
156 | |
if g := q.Query(tt.Quantile); g != w {
|
|
154 |
for quantile := range Targets {
|
|
155 |
w := quantile * 100
|
|
156 |
if g := q.Query(quantile); g != w {
|
157 | 157 |
t.Errorf("want %f, got %f", w, g)
|
158 | 158 |
}
|
159 | 159 |
}
|
160 | 160 |
}
|
161 | 161 |
|
162 | 162 |
func TestUncompressedSamples(t *testing.T) {
|
163 | |
q := NewTargeted(Target{0.99, 0.001})
|
|
163 |
q := NewTargeted(map[float64]float64{0.99: 0.001})
|
164 | 164 |
for i := 1; i <= 100; i++ {
|
165 | 165 |
q.Insert(float64(i))
|
166 | 166 |
}
|
|
170 | 170 |
}
|
171 | 171 |
|
172 | 172 |
func TestUncompressedOne(t *testing.T) {
|
173 | |
q := NewTargeted(Target{0.90, 0.01})
|
|
173 |
q := NewTargeted(map[float64]float64{0.99: 0.01})
|
174 | 174 |
q.Insert(3.14)
|
175 | 175 |
if g := q.Query(0.90); g != 3.14 {
|
176 | 176 |
t.Error("want PI, got", g)
|
|
178 | 178 |
}
|
179 | 179 |
|
180 | 180 |
func TestDefaults(t *testing.T) {
|
181 | |
if g := NewTargeted(Target{0.99, 0.001}).Query(0.99); g != 0 {
|
|
181 |
if g := NewTargeted(map[float64]float64{0.99: 0.001}).Query(0.99); g != 0 {
|
182 | 182 |
t.Errorf("want 0, got %f", g)
|
183 | 183 |
}
|
184 | 184 |
}
|