def test_select_proportional_to_weight(self): # Tests that multinomial_wo_replacement selects elements, on average, # proportional to the their probabilities th_rng = RandomStream(12345) p = fmatrix() n = iscalar() m = th_rng.multinomial_wo_replacement(pvals=p, n=n) f = function([p, n], m, allow_input_downcast=True) n_elements = 100 n_selected = 10 mean_rtol = 0.0005 np.random.seed(12345) pvals = np.random.randint(1, 100, (1, n_elements)).astype(config.floatX) pvals /= pvals.sum(1) avg_pvals = np.zeros((n_elements,), dtype=config.floatX) for rep in range(10000): res = f(pvals, n_selected) res = np.squeeze(res) avg_pvals[res] += 1 avg_pvals /= avg_pvals.sum() avg_diff = np.mean(abs(avg_pvals - pvals)) assert avg_diff < mean_rtol
def set_at_rng(new_rng): """ Set the package-level random number generator. Parameters ---------- new_rng: `aesara.tensor.random.utils.RandomStream` instance The random number generator to use. """ # pylint: disable=global-statement global _at_rng # pylint: enable=global-statement if isinstance(new_rng, int): new_rng = RandomStream(new_rng) _at_rng = new_rng
def test_fail_select_alot(self): # Tests that multinomial_wo_replacement fails when asked to sample more # elements than the actual number of elements th_rng = RandomStream(12345) p = fmatrix() n = iscalar() m = th_rng.multinomial_wo_replacement(pvals=p, n=n) f = function([p, n], m, allow_input_downcast=True) n_elements = 100 n_selected = 200 np.random.seed(12345) pvals = np.random.randint(1, 100, (1, n_elements)).astype(config.floatX) pvals /= pvals.sum(1) with pytest.raises(ValueError): f(pvals, n_selected)
def at_rng(random_seed=None): """ Get the package-level random number generator or new with specified seed. Parameters ---------- random_seed: int If not None returns *new* aesara random generator without replacing package global one Returns ------- `aesara.tensor.random.utils.RandomStream` instance `aesara.tensor.random.utils.RandomStream` instance passed to the most recent call of `set_at_rng` """ if random_seed is None: return _at_rng else: ret = RandomStream(random_seed) return ret
def test_select_distinct(self): # Tests that multinomial_wo_replacement always selects distinct elements th_rng = RandomStream(12345) p = fmatrix() n = iscalar() m = th_rng.multinomial_wo_replacement(pvals=p, n=n) f = function([p, n], m, allow_input_downcast=True) n_elements = 1000 all_indices = range(n_elements) np.random.seed(12345) for i in [5, 10, 50, 100, 500, n_elements]: pvals = np.random.randint(1, 100, (1, n_elements)).astype(config.floatX) pvals /= pvals.sum(1) res = f(pvals, i) res = np.squeeze(res) assert len(res) == i assert np.all(np.in1d(np.unique(res), all_indices)), res
---------- gen: generator that implements __next__ (py3) or next (py2) method and yields np.arrays with same types default: np.array with the same type as generator produces Returns ------- TensorVariable It has 2 new methods - var.set_gen(gen): sets new generator - var.set_default(value): sets new default value (None erases default value) """ return GeneratorOp(gen, default)() _at_rng = RandomStream() def at_rng(random_seed=None): """ Get the package-level random number generator or new with specified seed. Parameters ---------- random_seed: int If not None returns *new* aesara random generator without replacing package global one Returns ------- `aesara.tensor.random.utils.RandomStream` instance
def setup_method(self): nr.seed(self.random_seed) self.old_aet_rng = aet_rng() set_aet_rng(RandomStream(self.random_seed))
---------- gen: generator that implements __next__ (py3) or next (py2) method and yields np.arrays with same types default: np.array with the same type as generator produces Returns ------- TensorVariable It has 2 new methods - var.set_gen(gen): sets new generator - var.set_default(value): sets new default value (None erases default value) """ return GeneratorOp(gen, default)() _aet_rng = RandomStream() def aet_rng(random_seed=None): """ Get the package-level random number generator or new with specified seed. Parameters ---------- random_seed: int If not None returns *new* aesara random generator without replacing package global one Returns ------- `aesara.tensor.random.utils.RandomStream` instance