From b88158edeccd5b924b66c9a08ffd7fcb987f2fae Mon Sep 17 00:00:00 2001 From: Branden J Brown Date: Thu, 8 Aug 2024 18:07:06 -0500 Subject: [PATCH] brain/kvbrain: use efficient sequence sampler --- brain/kvbrain/speak.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/brain/kvbrain/speak.go b/brain/kvbrain/speak.go index f9eb552..7537f6a 100644 --- a/brain/kvbrain/speak.go +++ b/brain/kvbrain/speak.go @@ -56,8 +56,9 @@ func (br *Brain) next(b []byte, prompt []string, opts badger.IteratorOptions) ([ // smaller contexts. var ( key []byte - m uint64 + skip brain.Skip picked int + n uint64 ) b = appendPrefix(b, prompt) if len(prompt) == 0 { @@ -71,19 +72,15 @@ func (br *Brain) next(b []byte, prompt []string, opts badger.IteratorOptions) ([ defer it.Close() it.Seek(b) for it.ValidForPrefix(b) { - // We generate a uniform variate per key, then choose the key - // that gets the maximum variate. - // TODO(zeph): gumbel distribution - u := rand.Uint64() - if m <= u { + if n == 0 { item := it.Item() // TODO(zeph): for #43, check deleted uuids so we never // pick a message that has been deleted key = item.KeyCopy(key[:0]) - m = u - picked++ + n = skip.N(rand.Uint64(), rand.Uint64()) } it.Next() + n-- } return nil })