randomApply
This commit is contained in:
parent
a0aeaaef09
commit
45792ba620
|
@ -645,3 +645,25 @@ proc union*(store: BlobStore; sets: varargs[BlobSet]): BlobSet =
|
||||||
assert(not bs.isnil)
|
assert(not bs.isnil)
|
||||||
bs.apply(freshInsert)
|
bs.apply(freshInsert)
|
||||||
result = fresh
|
result = fresh
|
||||||
|
|
||||||
|
import random
|
||||||
|
|
||||||
|
proc randomApply*(store: BlobStore; trie: BlobSet; seed: int64;
|
||||||
|
f: proc(id: BlobId; size: BiggestInt)) =
|
||||||
|
## Apply to random leaf if the set is not empty.
|
||||||
|
var
|
||||||
|
rng = initRand(seed)
|
||||||
|
retry = 0
|
||||||
|
trie = trie
|
||||||
|
i = rng.rand(countSetBits(trie.bitmap)-1)
|
||||||
|
while trie.bitmap != 0:
|
||||||
|
let next = trie.table[i]
|
||||||
|
case next.kind
|
||||||
|
of leafNode:
|
||||||
|
f(next.blob, next.size)
|
||||||
|
break
|
||||||
|
of coldNode:
|
||||||
|
trie.table[i] = store.load(next.setId)
|
||||||
|
of hotNode:
|
||||||
|
trie = next
|
||||||
|
i = rng.rand(countSetBits(trie.bitmap)-1)
|
||||||
|
|
|
@ -41,7 +41,7 @@ suite "store":
|
||||||
let
|
let
|
||||||
name = $i
|
name = $i
|
||||||
blob = blobHash name
|
blob = blobHash name
|
||||||
bs = insert(bs, name, blob, 0)
|
bs = insert(bs, name, blob, i)
|
||||||
setId = commit(client, bs).setId
|
setId = commit(client, bs).setId
|
||||||
|
|
||||||
test "load":
|
test "load":
|
||||||
|
@ -60,3 +60,6 @@ suite "store":
|
||||||
echo "inserted ", name, " - ", name.toKey
|
echo "inserted ", name, " - ", name.toKey
|
||||||
echo "applied ", name, " - ", ($(i xor 0x8000)).toKey
|
echo "applied ", name, " - ", ($(i xor 0x8000)).toKey
|
||||||
raiseAssert("apply succedded for a key not inserted")
|
raiseAssert("apply succedded for a key not inserted")
|
||||||
|
for i in 1..count:
|
||||||
|
store.randomApply(bs, i) do (id: BlobId; size: BiggestInt):
|
||||||
|
echo "randomApply: ", id, " ", size
|
||||||
|
|
Loading…
Reference in New Issue
Block a user