59
var _ Counter = (*cmSketch)(nil)
60
61
>
func NewCMSketchCounter(params CMSketchParams, src rand.Source, topKProvider topKFunc) *cmSketch {
cmsketch.go
62
>
params.D = max(1, params.D)
63
>
params.W = max(1, params.W)
64
>
params.Grow.SkipRateDecay = max(1_000, params.Grow.SkipRateDecay)
65
>
numRows := params.D + 1 // + 1 for shadow row
66
>
return &cmSketch{
67
>
params: params,
68
>
seed0: maphash.MakeSeed(),
69
>
seeds: makeSeeds(numRows, src),
70
>
cells: make([]uint32, params.W*numRows),
71
>
shadowRow: 0,
72
>
src: src,
73
>
topKProvider: topKProvider,
74
>
}
75
>
}
76
78
>
if inc < 0 {
79
return base // we don't handle negatives here
80
}
81
83
>
indexes := make([]int, numRows)
84
>
s.fillIndexes(key, indexes)
85
>
86
>
current := s.getByIndexes(indexes)
87
>
pass := max(base, current+inc)
88
>
s.skips += s.ensureByIndexes(indexes, pass)
89
>
90
>
if s.incs++; s.incs > s.params.Grow.SkipRateDecay {
92
>
s.skips >>= 1
93
>
s.incs >>= 1
94
>
}
95
96
>
if s.reseedOps++; s.params.Reseed.Interval > 0 && s.reseedOps >= s.params.Reseed.Interval {
cmsketch.go
97
s.reseed()
98
s.reseedOps = 0
99
}
100
102
}
103