WeightedRandom.Backend behaviour (weighted_random v1.0.0-alpha.0)

Copy Markdown View Source

WeightedRandom.Backend offers a contract to all who implement it:

  1. The main WeightedRandom package presents a novel interface for generating a list of probabilities (floats that can be summed to equal exactly 1.0).
  2. The custom Backend module decides what to do with those probabilities once they are generated.

Summary

Callbacks

Optionally provide the opts kwli

weights is a list of floats which, if summed, would equal exactly 1.0. Each float represents the probability of being selected in the random sample.

Given the struct returned by preprocess/2, return a list of random indices equal to count.

Types

fraction()

@type fraction() :: {numerator :: integer(), denominator :: integer()}

fractions()

@type fractions() :: [fraction()]

index()

@type index() :: integer()

indices()

@type indices() :: [index()]

opts()

@type opts() :: keyword()

percentage()

@type percentage() :: float()

probability()

@type probability() :: fraction() | percentage()

t()

@type t() :: %WeightedRandom.Backend{
  backend: atom(),
  outcomes: list(),
  table: struct()
}

table()

@type table() :: struct()

Callbacks

options()

(optional)
@callback options() :: keyword()

Optionally provide the opts kwli

preprocess(probabilities, opts)

@callback preprocess(probabilities :: [{probability(), index()}], opts()) :: table()

weights is a list of floats which, if summed, would equal exactly 1.0. Each float represents the probability of being selected in the random sample.

So if given [0.25, 0.25, 0.5], then index 2 is twice as likely to be sampled as index 1.

This function must return some kind of struct that will later be passed into take/2.

take(table, count)

@callback take(table :: struct(), count :: integer()) :: indices :: [index :: integer()]

Given the struct returned by preprocess/2, return a list of random indices equal to count.

Functions

preprocess(backend, outcomes, probabilities, opts)

take(map, count)