Expose options to change the RNG being used 💬 by Caio 8 years ago (log)
This patch creates a new public interface `TDigestRNG` and exposes two new options: - tdigest.RandomNumberGenerator(TDigestRNG) - tdigest.LocalRandomNumberGenerator(seed)
This patch creates a new public interface `TDigestRNG` and exposes two new options: - tdigest.RandomNumberGenerator(TDigestRNG) - tdigest.LocalRandomNumberGenerator(seed)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package tdigest
import "errors"
type tdigestOption func(*TDigest) error
// Compression sets the digest compression
//
// The compression parameter rules the threshold in which samples are
// merged together - the more often distinct samples are merged the more
// precision is lost. Compression should be tuned according to your data
// distribution, but a value of 100 (the default) is often good enough.
//
// A higher compression value means holding more centroids in memory
// (thus: better precision), which means a bigger serialization payload,
// higher memory footprint and slower addition of new samples.
//
// Compression must be a value greater of equal to 1, will yield an
// error otherwise.
func Compression(compression uint32) tdigestOption {
return func(t *TDigest) error {
if compression < 1 {
return errors.New("Compression should be >= 1")
}
t.compression = float64(compression)
return nil
}
}
// RandomNumberGenerator sets the RNG to be used internally
//
// This allows changing which random number source is used when using
// the TDigest structure (rngs are used when deciding which candidate
// centroid to merge with and when compressing or merging with
// another digest for it increases accuracy). This functionality is
// particularly useful for testing or when you want to disconnect
// your sample collection from the (default) shared random source
// to minimize lock contention.
func RandomNumberGenerator(rng TDigestRNG) tdigestOption {
return func(t *TDigest) error {
t.rng = rng
return nil
}
}
// LocalRandomNumberGenerator makes the TDigest use the default
// `math/random` functions but with an unshared source that is
// seeded with the given `seed` parameter.
func LocalRandomNumberGenerator(seed int64) tdigestOption {
return RandomNumberGenerator(newLocalRNG(seed))
}
|