ReservoirSampler

ReservoirSampler

Mojo struct 🡭

ReservoirSampler

@memory_only
struct ReservoirSampler[T: Copyable & Deinitable]

Sample N items from a stream of unknown length.

Sample all the elements, this should retain the order since we always automatically take the first N elements.

from std.random import seed
from std.testing import assert_equal

from extramojo.stats.sampling import ReservoirSampler

# Set the global random seed
seed(42)

var sampler = ReservoirSampler[Int](10)

var items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for item in items:
    sampler.insert(item)
assert_equal(sampler.reservoir, items)

Sample only a subset of the input list.

var sampler = ReservoirSampler[Int](5)

for item in items:
    sampler.insert(item)
assert_equal(len(sampler.reservoir), 5)
assert_equal(sampler.reservoir, [0, 9, 2, 3, 7])

Sample only a single element.

var sampler = ReservoirSampler[Int](1)

for item in items:
    sampler.insert(item)
assert_equal(len(sampler.reservoir), 1)
assert_equal(sampler.reservoir, [6])

Sample more elements than are in the input stream.

var sampler = ReservoirSampler[Int](11)

for item in items:
    sampler.insert(item)
assert_equal(len(sampler.reservoir), 10)
assert_equal(sampler.reservoir, items)

Sample zero elements

var sampler = ReservoirSampler[Int](0)

for item in items:
    sampler.insert(item)
assert_equal(len(sampler.reservoir), 0)
assert_equal(sampler.reservoir, List[Int]())

Parameters

  • T (Copyable & Deinitable)

Fields

  • reservoir (List[T])
  • values_to_collect (Int)
  • seen_values (Int)

Implemented traits

AnyType, Copyable, Deinitable, Movable

Methods

 

__init__

def __init__(out self, values_to_collect: Int)

DetailsArgs:

  • values_to_collect (Int)
  • self (Self)

Returns:

Self

insert

def insert(mut self, item: T)

Add an element.The element will be tested for addition to the reservoir.

Args:

  • self (Self)
  • item (T)