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.choice(size=n, p=p, replace=False) f = function([p, n], m, allow_input_downcast=True) n_elements = 100 n_selected = 10 mean_rtol = 0.0005 rng = np.random.default_rng(12345) pvals = rng.integers(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 test_target_parameter(): srng = MRG_RandomStream() pvals = np.array([[0.98, 0.01, 0.01], [0.01, 0.49, 0.50]]) def basic_target_parameter_test(x): f = function([], x) assert isinstance(f(), np.ndarray) basic_target_parameter_test(srng.uniform((3, 2), target="cpu")) basic_target_parameter_test(srng.normal((3, 2), target="cpu")) basic_target_parameter_test(srng.truncated_normal((3, 2), target="cpu")) basic_target_parameter_test(srng.binomial((3, 2), target="cpu")) basic_target_parameter_test( srng.multinomial(pvals=pvals.astype("float32"), target="cpu")) basic_target_parameter_test( srng.choice(p=pvals.astype("float32"), replace=False, target="cpu")) basic_target_parameter_test( srng.multinomial_wo_replacement(pvals=pvals.astype("float32"), target="cpu"))
def test_undefined_grad(): srng = MRG_RandomStream(seed=1234) # checking uniform distribution low = scalar() out = srng.uniform((), low=low) with pytest.raises(NullTypeGradError): grad(out, low) high = scalar() out = srng.uniform((), low=0, high=high) with pytest.raises(NullTypeGradError): grad(out, high) out = srng.uniform((), low=low, high=high) with pytest.raises(NullTypeGradError): grad(out, (low, high)) # checking binomial distribution prob = scalar() out = srng.binomial((), p=prob) with pytest.raises(NullTypeGradError): grad(out, prob) # checking multinomial distribution prob1 = scalar() prob2 = scalar() p = [as_tensor_variable([prob1, 0.5, 0.25])] out = srng.multinomial(size=None, pvals=p, n=4)[0] with pytest.raises(NullTypeGradError): grad(at_sum(out), prob1) p = [as_tensor_variable([prob1, prob2])] out = srng.multinomial(size=None, pvals=p, n=4)[0] with pytest.raises(NullTypeGradError): grad(at_sum(out), (prob1, prob2)) # checking choice p = [as_tensor_variable([prob1, prob2, 0.1, 0.2])] out = srng.choice(a=None, size=1, p=p, replace=False)[0] with pytest.raises(NullTypeGradError): grad(out[0], (prob1, prob2)) p = [as_tensor_variable([prob1, prob2])] out = srng.choice(a=None, size=1, p=p, replace=False)[0] with pytest.raises(NullTypeGradError): grad(out[0], (prob1, prob2)) p = [as_tensor_variable([prob1, 0.2, 0.3])] out = srng.choice(a=None, size=1, p=p, replace=False)[0] with pytest.raises(NullTypeGradError): grad(out[0], prob1) # checking normal distribution avg = scalar() out = srng.normal((), avg=avg) with pytest.raises(NullTypeGradError): grad(out, avg) std = scalar() out = srng.normal((), avg=0, std=std) with pytest.raises(NullTypeGradError): grad(out, std) out = srng.normal((), avg=avg, std=std) with pytest.raises(NullTypeGradError): grad(out, (avg, std)) # checking truncated normal distribution avg = scalar() out = srng.truncated_normal((), avg=avg) with pytest.raises(NullTypeGradError): grad(out, avg) std = scalar() out = srng.truncated_normal((), avg=0, std=std) with pytest.raises(NullTypeGradError): grad(out, std) out = srng.truncated_normal((), avg=avg, std=std) with pytest.raises(NullTypeGradError): grad(out, (avg, std))