def sampler(self): if self.__sampler is None: assert self.bias is not None assert 0 < self.bias < 1 self.__sampler = cu.Sampler( [self.bias**i for i in range(len(self.element_strategies))]) return self.__sampler
def __init__(self, allow_infinity, allow_nan): SearchStrategy.__init__(self) assert isinstance(allow_infinity, bool) assert isinstance(allow_nan, bool) self.allow_infinity = allow_infinity self.allow_nan = allow_nan self.nasty_floats = [f for f in NASTY_FLOATS if self.permitted(f)] weights = [0.2 * len(self.nasty_floats)] + [0.8] * len(self.nasty_floats) self.sampler = d.Sampler(weights)
def __init__(self, strategies, bias=None): SearchStrategy.__init__(self) strategies = tuple(strategies) self.original_strategies = list(strategies) self.__element_strategies = None self.bias = bias self.__in_branches = False if bias is not None: assert 0 < bias < 1 self.sampler = cu.Sampler( [bias ** i for i in range(len(strategies))]) else: self.sampler = None
def __init__(self, allow_infinity, allow_nan, width): SearchStrategy.__init__(self) assert isinstance(allow_infinity, bool) assert isinstance(allow_nan, bool) assert width in (16, 32, 64) self.allow_infinity = allow_infinity self.allow_nan = allow_nan self.width = width self.nasty_floats = [ float_of(f, self.width) for f in NASTY_FLOATS if self.permitted(f) ] weights = [0.2 * len(self.nasty_floats)] + [0.8] * len(self.nasty_floats) self.sampler = d.Sampler(weights)
def test_sampler_distribution(weights): total = sum(weights) n = len(weights) assume(total > 0) probabilities = [w / total for w in weights] sampler = cu.Sampler(weights) calculated = [Fraction(0)] * n for base, alternate, p_alternate in sampler.table: calculated[base] += (1 - p_alternate) / n calculated[alternate] += p_alternate / n assert probabilities == calculated
def test_gives_the_correct_probabilities(): weights = [Fraction(1), Fraction(9)] total = sum(weights) probabilities = [w / total for w in weights] sampler = cu.Sampler(probabilities) assert cu.Sampler(weights).table == sampler.table counts = [0] * len(weights) i = 0 while i < 2**16: data = ConjectureData.for_buffer(int_to_bytes(i, 2)) try: c = sampler.sample(data) counts[c] += 1 assert probabilities[c] >= Fraction(counts[c], 2**16) except StopTest: pass if 1 in data.forced_indices: i += 256 else: i += 1
class WideRangeIntStrategy(SearchStrategy): distribution = d.Sampler([4.0, 8.0, 1.0, 1.0, 0.5]) sizes = [8, 16, 32, 64, 128] def __repr__(self): return "WideRangeIntStrategy()" def do_draw(self, data): size = self.sizes[self.distribution.sample(data)] r = data.draw_bits(size) sign = r & 1 r >>= 1 if sign: r = -r return int(r)
def test_sampler_distribution(weights): total = sum(weights) n = len(weights) assume(total > 0) probabilities = [w / total for w in weights] sampler = cu.Sampler(weights) calculated = [Fraction(0)] * n for base, alternate, p_alternate in sampler.table: calculated[base] += (1 - p_alternate) / n calculated[alternate] += p_alternate / n for expected, actual in zip(probabilities, calculated): if isinstance(actual, Fraction): assert expected == actual else: assert abs(expected - actual) < 0.001
def test_sampler_shrinks(): sampler = cu.Sampler([4.0, 8.0, 1.0, 1.0, 0.5]) assert sampler.sample(ConjectureData.for_buffer([0] * 3)) == 0
def test_sampler_does_not_draw_minimum_if_zero(): sampler = cu.Sampler([0, 2, 47]) assert sampler.sample(ConjectureData.for_buffer([0, 0])) != 0